From 87a408a8466134c9c329871d921a8d8a8a76b126 Mon Sep 17 00:00:00 2001 From: Bradford Wetmore Date: Fri, 22 Aug 2008 18:48:00 -0700 Subject: [PATCH 001/292] 6497740: Limit the size of RSA public keys Reviewed-by: andreas, valeriep, vinnie --- .../security/pkcs11/P11KeyPairGenerator.java | 59 +++++--- .../sun/security/pkcs11/P11KeyStore.java | 11 ++ .../sun/security/pkcs11/P11RSAKeyFactory.java | 20 ++- .../sun/security/pkcs11/SunPKCS11.java | 89 ++++++++---- .../sun/security/rsa/RSAKeyFactory.java | 135 +++++++++++------- .../sun/security/rsa/RSAKeyPairGenerator.java | 59 ++++---- .../security/rsa/RSAPrivateCrtKeyImpl.java | 7 +- .../sun/security/rsa/RSAPrivateKeyImpl.java | 4 +- .../sun/security/rsa/RSAPublicKeyImpl.java | 9 +- .../security/mscapi/RSAKeyPairGenerator.java | 44 +++--- .../sun/security/mscapi/RSASignature.java | 30 ++-- 11 files changed, 299 insertions(+), 168 deletions(-) diff --git a/jdk/src/share/classes/sun/security/pkcs11/P11KeyPairGenerator.java b/jdk/src/share/classes/sun/security/pkcs11/P11KeyPairGenerator.java index 701e104d529..1027df9ddb7 100644 --- a/jdk/src/share/classes/sun/security/pkcs11/P11KeyPairGenerator.java +++ b/jdk/src/share/classes/sun/security/pkcs11/P11KeyPairGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 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 @@ -38,6 +38,8 @@ import static sun.security.pkcs11.TemplateManager.*; import sun.security.pkcs11.wrapper.*; import static sun.security.pkcs11.wrapper.PKCS11Constants.*; +import sun.security.rsa.RSAKeyFactory; + /** * KeyPairGenerator implementation class. This class currently supports * RSA, DSA, DH, and EC. @@ -66,7 +68,7 @@ final class P11KeyPairGenerator extends KeyPairGeneratorSpi { private AlgorithmParameterSpec params; // for RSA, selected or default value of public exponent, always valid - private BigInteger rsaPublicExponent; + private BigInteger rsaPublicExponent = RSAKeyGenParameterSpec.F4; // SecureRandom instance, if specified in init private SecureRandom random; @@ -88,19 +90,19 @@ final class P11KeyPairGenerator extends KeyPairGeneratorSpi { public void initialize(int keySize, SecureRandom random) { token.ensureValid(); try { - checkKeySize(keySize); + checkKeySize(keySize, null); } catch (InvalidAlgorithmParameterException e) { throw new InvalidParameterException(e.getMessage()); } this.keySize = keySize; this.params = null; this.random = random; - this.rsaPublicExponent = RSAKeyGenParameterSpec.F4; if (algorithm.equals("EC")) { params = P11ECKeyFactory.getECParameterSpec(keySize); if (params == null) { - throw new InvalidParameterException - ("No EC parameters available for key size " + keySize + " bits"); + throw new InvalidParameterException( + "No EC parameters available for key size " + + keySize + " bits"); } } } @@ -115,8 +117,10 @@ final class P11KeyPairGenerator extends KeyPairGeneratorSpi { ("DHParameterSpec required for Diffie-Hellman"); } DHParameterSpec dhParams = (DHParameterSpec)params; - this.keySize = dhParams.getP().bitLength(); - this.params = params; + int tmpKeySize = dhParams.getP().bitLength(); + checkKeySize(tmpKeySize, dhParams); + this.keySize = tmpKeySize; + this.params = dhParams; // XXX sanity check params } else if (algorithm.equals("RSA")) { if (params instanceof RSAKeyGenParameterSpec == false) { @@ -124,7 +128,9 @@ final class P11KeyPairGenerator extends KeyPairGeneratorSpi { ("RSAKeyGenParameterSpec required for RSA"); } RSAKeyGenParameterSpec rsaParams = (RSAKeyGenParameterSpec)params; - this.keySize = rsaParams.getKeysize(); + int tmpKeySize = rsaParams.getKeysize(); + checkKeySize(tmpKeySize, rsaParams); + this.keySize = tmpKeySize; this.params = null; this.rsaPublicExponent = rsaParams.getPublicExponent(); // XXX sanity check params @@ -134,13 +140,16 @@ final class P11KeyPairGenerator extends KeyPairGeneratorSpi { ("DSAParameterSpec required for DSA"); } DSAParameterSpec dsaParams = (DSAParameterSpec)params; - this.keySize = dsaParams.getP().bitLength(); - this.params = params; + int tmpKeySize = dsaParams.getP().bitLength(); + checkKeySize(tmpKeySize, dsaParams); + this.keySize = tmpKeySize; + this.params = dsaParams; // XXX sanity check params } else if (algorithm.equals("EC")) { ECParameterSpec ecParams; if (params instanceof ECParameterSpec) { - ecParams = P11ECKeyFactory.getECParameterSpec((ECParameterSpec)params); + ecParams = P11ECKeyFactory.getECParameterSpec( + (ECParameterSpec)params); if (ecParams == null) { throw new InvalidAlgorithmParameterException ("Unsupported curve: " + params); @@ -156,16 +165,17 @@ final class P11KeyPairGenerator extends KeyPairGeneratorSpi { throw new InvalidAlgorithmParameterException ("ECParameterSpec or ECGenParameterSpec required for EC"); } - this.keySize = ecParams.getCurve().getField().getFieldSize(); + int tmpKeySize = ecParams.getCurve().getField().getFieldSize(); + checkKeySize(tmpKeySize, ecParams); + this.keySize = tmpKeySize; this.params = ecParams; } else { throw new ProviderException("Unknown algorithm: " + algorithm); } this.random = random; - checkKeySize(keySize); } - private void checkKeySize(int keySize) + private void checkKeySize(int keySize, AlgorithmParameterSpec params) throws InvalidAlgorithmParameterException { if (algorithm.equals("EC")) { if (keySize < 112) { @@ -178,13 +188,28 @@ final class P11KeyPairGenerator extends KeyPairGeneratorSpi { ("Key size must be at most 2048 bit"); } return; + } else if (algorithm.equals("RSA")) { + BigInteger tmpExponent = rsaPublicExponent; + if (params != null) { + // Already tested for instanceof RSAKeyGenParameterSpec above + tmpExponent = + ((RSAKeyGenParameterSpec)params).getPublicExponent(); + } + try { + // This provider supports 64K or less. + RSAKeyFactory.checkKeyLengths(keySize, tmpExponent, + 512, 64 * 1024); + } catch (InvalidKeyException e) { + throw new InvalidAlgorithmParameterException(e.getMessage()); + } + return; } + if (keySize < 512) { throw new InvalidAlgorithmParameterException ("Key size must be at least 512 bit"); } - if (algorithm.equals("RSA") || - (algorithm.equals("DH") && (params != null))) { + if (algorithm.equals("DH") && (params != null)) { // sanity check, nobody really wants keys this large if (keySize > 64 * 1024) { throw new InvalidAlgorithmParameterException diff --git a/jdk/src/share/classes/sun/security/pkcs11/P11KeyStore.java b/jdk/src/share/classes/sun/security/pkcs11/P11KeyStore.java index 839a2f3ba64..b0e20711dc8 100644 --- a/jdk/src/share/classes/sun/security/pkcs11/P11KeyStore.java +++ b/jdk/src/share/classes/sun/security/pkcs11/P11KeyStore.java @@ -80,6 +80,8 @@ import static sun.security.pkcs11.P11Util.*; import sun.security.pkcs11.wrapper.*; import static sun.security.pkcs11.wrapper.PKCS11Constants.*; +import sun.security.rsa.RSAKeyFactory; + final class P11KeyStore extends KeyStoreSpi { private static final CK_ATTRIBUTE ATTR_CLASS_CERT = @@ -1328,6 +1330,15 @@ final class P11KeyStore extends KeyStoreSpi { BigInteger modulus = attrs[0].getBigInteger(); keyLength = modulus.bitLength(); + // This check will combine our "don't care" values here + // with the system-wide min/max values. + try { + RSAKeyFactory.checkKeyLengths(keyLength, null, + -1, Integer.MAX_VALUE); + } catch (InvalidKeyException e) { + throw new KeyStoreException(e.getMessage()); + } + return P11Key.privateKey(session, oHandle, keyType, diff --git a/jdk/src/share/classes/sun/security/pkcs11/P11RSAKeyFactory.java b/jdk/src/share/classes/sun/security/pkcs11/P11RSAKeyFactory.java index 5f3cbbf93c9..1bd764d326e 100644 --- a/jdk/src/share/classes/sun/security/pkcs11/P11RSAKeyFactory.java +++ b/jdk/src/share/classes/sun/security/pkcs11/P11RSAKeyFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 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 @@ -35,6 +35,8 @@ import static sun.security.pkcs11.TemplateManager.*; import sun.security.pkcs11.wrapper.*; import static sun.security.pkcs11.wrapper.PKCS11Constants.*; +import sun.security.rsa.RSAKeyFactory; + /** * RSA KeyFactory implemenation. * @@ -131,6 +133,9 @@ final class P11RSAKeyFactory extends P11KeyFactory { } catch (PKCS11Exception e) { throw new InvalidKeySpecException ("Could not create RSA public key", e); + } catch (InvalidKeyException e) { + throw new InvalidKeySpecException + ("Could not create RSA public key", e); } } @@ -175,11 +180,15 @@ final class P11RSAKeyFactory extends P11KeyFactory { } catch (PKCS11Exception e) { throw new InvalidKeySpecException ("Could not create RSA private key", e); + } catch (InvalidKeyException e) { + throw new InvalidKeySpecException + ("Could not create RSA private key", e); } } private PublicKey generatePublic(BigInteger n, BigInteger e) - throws PKCS11Exception { + throws PKCS11Exception, InvalidKeyException { + RSAKeyFactory.checkKeyLengths(n.bitLength(), e, -1, 64 * 1024); CK_ATTRIBUTE[] attributes = new CK_ATTRIBUTE[] { new CK_ATTRIBUTE(CKA_CLASS, CKO_PUBLIC_KEY), new CK_ATTRIBUTE(CKA_KEY_TYPE, CKK_RSA), @@ -200,7 +209,8 @@ final class P11RSAKeyFactory extends P11KeyFactory { } private PrivateKey generatePrivate(BigInteger n, BigInteger d) - throws PKCS11Exception { + throws PKCS11Exception, InvalidKeyException { + RSAKeyFactory.checkKeyLengths(n.bitLength(), null, -1, 64 * 1024); CK_ATTRIBUTE[] attributes = new CK_ATTRIBUTE[] { new CK_ATTRIBUTE(CKA_CLASS, CKO_PRIVATE_KEY), new CK_ATTRIBUTE(CKA_KEY_TYPE, CKK_RSA), @@ -222,7 +232,9 @@ final class P11RSAKeyFactory extends P11KeyFactory { private PrivateKey generatePrivate(BigInteger n, BigInteger e, BigInteger d, BigInteger p, BigInteger q, BigInteger pe, - BigInteger qe, BigInteger coeff) throws PKCS11Exception { + BigInteger qe, BigInteger coeff) throws PKCS11Exception, + InvalidKeyException { + RSAKeyFactory.checkKeyLengths(n.bitLength(), e, -1, 64 * 1024); CK_ATTRIBUTE[] attributes = new CK_ATTRIBUTE[] { new CK_ATTRIBUTE(CKA_CLASS, CKO_PRIVATE_KEY), new CK_ATTRIBUTE(CKA_KEY_TYPE, CKK_RSA), diff --git a/jdk/src/share/classes/sun/security/pkcs11/SunPKCS11.java b/jdk/src/share/classes/sun/security/pkcs11/SunPKCS11.java index b6eb1c258f4..6d0e045f2ee 100644 --- a/jdk/src/share/classes/sun/security/pkcs11/SunPKCS11.java +++ b/jdk/src/share/classes/sun/security/pkcs11/SunPKCS11.java @@ -120,11 +120,13 @@ public final class SunPKCS11 extends AuthProvider { } /** - * @deprecated use new SunPKCS11(String) or new SunPKCS11(InputStream) instead + * @deprecated use new SunPKCS11(String) or new SunPKCS11(InputStream) + * instead */ @Deprecated public SunPKCS11(String configName, InputStream configStream) { - super("SunPKCS11-" + Config.getConfig(configName, configStream).getName(), + super("SunPKCS11-" + + Config.getConfig(configName, configStream).getName(), 1.7d, Config.getConfig(configName, configStream).getDescription()); this.configName = configName; this.config = Config.removeConfig(configName); @@ -153,7 +155,8 @@ public final class SunPKCS11 extends AuthProvider { // // If we are in Secmod mode and configured to use either the // nssKeyStore or the nssTrustAnchors module, we automatically - // switch to using the NSS trust attributes for trusted certs (KeyStore). + // switch to using the NSS trust attributes for trusted certs + // (KeyStore). // if (useSecmod) { @@ -168,33 +171,40 @@ public final class SunPKCS11 extends AuthProvider { if (secmod.isInitialized()) { if (nssSecmodDirectory != null) { String s = secmod.getConfigDir(); - if ((s != null) && (s.equals(nssSecmodDirectory) == false)) { + if ((s != null) && + (s.equals(nssSecmodDirectory) == false)) { throw new ProviderException("Secmod directory " + nssSecmodDirectory - + " invalid, NSS already initialized with " + s); + + " invalid, NSS already initialized with " + + s); } } if (nssLibraryDirectory != null) { String s = secmod.getLibDir(); - if ((s != null) && (s.equals(nssLibraryDirectory) == false)) { + if ((s != null) && + (s.equals(nssLibraryDirectory) == false)) { throw new ProviderException("NSS library directory " + nssLibraryDirectory - + " invalid, NSS already initialized with " + s); + + " invalid, NSS already initialized with " + + s); } } } else { if (nssDbMode != DbMode.NO_DB) { if (nssSecmodDirectory == null) { - throw new ProviderException("Secmod not initialized and " - + "nssSecmodDirectory not specified"); + throw new ProviderException( + "Secmod not initialized and " + + "nssSecmodDirectory not specified"); } } else { if (nssSecmodDirectory != null) { - throw new ProviderException - ("nssSecmodDirectory must not be specified in noDb mode"); + throw new ProviderException( + "nssSecmodDirectory must not be " + + "specified in noDb mode"); } } - secmod.initialize(nssDbMode, nssSecmodDirectory, nssLibraryDirectory); + secmod.initialize(nssDbMode, nssSecmodDirectory, + nssLibraryDirectory); } } catch (IOException e) { // XXX which exception to throw @@ -211,7 +221,8 @@ public final class SunPKCS11 extends AuthProvider { if (nssModule != null) { moduleName = "fips"; } else { - moduleName = (nssDbMode == DbMode.NO_DB) ? "crypto" : "keystore"; + moduleName = (nssDbMode == DbMode.NO_DB) ? + "crypto" : "keystore"; } } if (moduleName.equals("fips")) { @@ -253,10 +264,12 @@ public final class SunPKCS11 extends AuthProvider { + ": only " + k + " external NSS modules available"); } } else { - throw new ProviderException("Unknown NSS module: " + moduleName); + throw new ProviderException( + "Unknown NSS module: " + moduleName); } if (nssModule == null) { - throw new ProviderException("NSS module not available: " + moduleName); + throw new ProviderException( + "NSS module not available: " + moduleName); } if (nssModule.hasInitializedProvider()) { throw new ProviderException("Secmod module already configured"); @@ -296,8 +309,9 @@ public final class SunPKCS11 extends AuthProvider { initArgs.flags = CKF_OS_LOCKING_OK; PKCS11 tmpPKCS11; try { - tmpPKCS11 = PKCS11.getInstance - (library, functionList, initArgs, config.getOmitInitialize()); + tmpPKCS11 = PKCS11.getInstance( + library, functionList, initArgs, + config.getOmitInitialize()); } catch (PKCS11Exception e) { if (debug != null) { debug.println("Multi-threaded initialization failed: " + e); @@ -312,8 +326,8 @@ public final class SunPKCS11 extends AuthProvider { } else { initArgs.flags = 0; } - tmpPKCS11 = PKCS11.getInstance - (library, functionList, initArgs, config.getOmitInitialize()); + tmpPKCS11 = PKCS11.getInstance(library, + functionList, initArgs, config.getOmitInitialize()); } p11 = tmpPKCS11; @@ -336,8 +350,10 @@ public final class SunPKCS11 extends AuthProvider { System.out.println("Slots with tokens: " + toString(slots)); } if (slotID < 0) { - if ((slotListIndex < 0) || (slotListIndex >= slots.length)) { - throw new ProviderException("slotListIndex is " + slotListIndex + if ((slotListIndex < 0) + || (slotListIndex >= slots.length)) { + throw new ProviderException("slotListIndex is " + + slotListIndex + " but token only has " + slots.length + " slots"); } slotID = slots[slotListIndex]; @@ -575,12 +591,15 @@ public final class SunPKCS11 extends AuthProvider { d(KF, "DH", P11DHKeyFactory, s("DiffieHellman"), m(CKM_DH_PKCS_KEY_PAIR_GEN, CKM_DH_PKCS_DERIVE)); d(KF, "EC", P11DHKeyFactory, - m(CKM_EC_KEY_PAIR_GEN, CKM_ECDH1_DERIVE, CKM_ECDSA, CKM_ECDSA_SHA1)); + m(CKM_EC_KEY_PAIR_GEN, CKM_ECDH1_DERIVE, + CKM_ECDSA, CKM_ECDSA_SHA1)); // AlgorithmParameters for EC. // Only needed until we have an EC implementation in the SUN provider. - d(AGP, "EC", "sun.security.ec.ECParameters", s("1.2.840.10045.2.1"), - m(CKM_EC_KEY_PAIR_GEN, CKM_ECDH1_DERIVE, CKM_ECDSA, CKM_ECDSA_SHA1)); + d(AGP, "EC", "sun.security.ec.ECParameters", + s("1.2.840.10045.2.1"), + m(CKM_EC_KEY_PAIR_GEN, CKM_ECDH1_DERIVE, + CKM_ECDSA, CKM_ECDSA_SHA1)); d(KA, "DH", P11KeyAgreement, s("DiffieHellman"), m(CKM_DH_PKCS_DERIVE)); @@ -654,12 +673,16 @@ public final class SunPKCS11 extends AuthProvider { d(SIG, "SHA512withRSA", P11Signature, m(CKM_SHA512_RSA_PKCS, CKM_RSA_PKCS, CKM_RSA_X_509)); - d(KG, "SunTlsRsaPremasterSecret", "sun.security.pkcs11.P11TlsRsaPremasterSecretGenerator", + d(KG, "SunTlsRsaPremasterSecret", + "sun.security.pkcs11.P11TlsRsaPremasterSecretGenerator", m(CKM_SSL3_PRE_MASTER_KEY_GEN, CKM_TLS_PRE_MASTER_KEY_GEN)); - d(KG, "SunTlsMasterSecret", "sun.security.pkcs11.P11TlsMasterSecretGenerator", + d(KG, "SunTlsMasterSecret", + "sun.security.pkcs11.P11TlsMasterSecretGenerator", m(CKM_SSL3_MASTER_KEY_DERIVE, CKM_TLS_MASTER_KEY_DERIVE, - CKM_SSL3_MASTER_KEY_DERIVE_DH, CKM_TLS_MASTER_KEY_DERIVE_DH)); - d(KG, "SunTlsKeyMaterial", "sun.security.pkcs11.P11TlsKeyMaterialGenerator", + CKM_SSL3_MASTER_KEY_DERIVE_DH, + CKM_TLS_MASTER_KEY_DERIVE_DH)); + d(KG, "SunTlsKeyMaterial", + "sun.security.pkcs11.P11TlsKeyMaterialGenerator", m(CKM_SSL3_KEY_AND_MAC_DERIVE, CKM_TLS_KEY_AND_MAC_DERIVE)); d(KG, "SunTlsPrf", "sun.security.pkcs11.P11TlsPrfGenerator", m(CKM_TLS_PRF, CKM_NSS_TLS_PRF_GENERAL)); @@ -773,6 +796,13 @@ public final class SunPKCS11 extends AuthProvider { System.out.println(token.tokenInfo); } long[] supportedMechanisms = p11.C_GetMechanismList(slotID); + + // Create a map from the various Descriptors to the "most + // preferred" mechanism that was defined during the + // static initialization. For example, DES/CBC/PKCS5Padding + // could be mapped to CKM_DES_CBC_PAD or CKM_DES_CBC. Prefer + // the earliest entry. When asked for "DES/CBC/PKCS5Padding", we + // return a CKM_DES_CBC_PAD. final Map supportedAlgs = new HashMap(); for (int i = 0; i < supportedMechanisms.length; i++) { @@ -807,6 +837,9 @@ public final class SunPKCS11 extends AuthProvider { supportedAlgs.put(d, integerMech); continue; } + // See if there is something "more preferred" + // than what we currently have in the supportedAlgs + // map. int intOldMech = oldMech.intValue(); for (int j = 0; j < d.mechanisms.length; j++) { int nextMech = d.mechanisms[j]; diff --git a/jdk/src/share/classes/sun/security/rsa/RSAKeyFactory.java b/jdk/src/share/classes/sun/security/rsa/RSAKeyFactory.java index 17ce8cde639..d877f28fb54 100644 --- a/jdk/src/share/classes/sun/security/rsa/RSAKeyFactory.java +++ b/jdk/src/share/classes/sun/security/rsa/RSAKeyFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 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 @@ -31,6 +31,8 @@ import java.security.*; import java.security.interfaces.*; import java.security.spec.*; +import sun.security.action.GetPropertyAction; + /** * KeyFactory for RSA keys. Keys must be instances of PublicKey or PrivateKey * and getAlgorithm() must return "RSA". For such keys, it supports conversion @@ -68,6 +70,24 @@ public final class RSAKeyFactory extends KeyFactorySpi { private final static Class x509KeySpecClass = X509EncodedKeySpec.class; private final static Class pkcs8KeySpecClass = PKCS8EncodedKeySpec.class; + public final static int MIN_MODLEN = 512; + public final static int MAX_MODLEN = 16384; + + /* + * If the modulus length is above this value, restrict the size of + * the exponent to something that can be reasonably computed. We + * could simply hardcode the exp len to something like 64 bits, but + * this approach allows flexibility in case impls would like to use + * larger module and exponent values. + */ + public final static int MAX_MODLEN_RESTRICT_EXP = 3072; + public final static int MAX_RESTRICTED_EXPLEN = 64; + + private static final boolean restrictExpLen = + "true".equalsIgnoreCase(AccessController.doPrivileged( + new GetPropertyAction( + "sun.security.rsa.restrictRSAExponent", "true"))); + // instance used for static translateKey(); private final static RSAKeyFactory INSTANCE = new RSAKeyFactory(); @@ -76,74 +96,79 @@ public final class RSAKeyFactory extends KeyFactorySpi { } /** - * Static method to convert Key into a useable instance of - * RSAPublicKey or RSAPrivate(Crt)Key. Check the key and convert it - * to a SunRsaSign key if necessary. If the key is not an RSA key - * or cannot be used, throw an InvalidKeyException. - * - * The difference between this method and engineTranslateKey() is that - * we do not convert keys of other providers that are already an - * instance of RSAPublicKey or RSAPrivate(Crt)Key. + * Static method to convert Key into an instance of RSAPublicKeyImpl + * or RSAPrivate(Crt)KeyImpl. If the key is not an RSA key or cannot be + * used, throw an InvalidKeyException. * * Used by RSASignature and RSACipher. */ public static RSAKey toRSAKey(Key key) throws InvalidKeyException { - if (key instanceof RSAKey) { - RSAKey rsaKey = (RSAKey)key; - checkKey(rsaKey); - return rsaKey; + if ((key instanceof RSAPrivateKeyImpl) || + (key instanceof RSAPrivateCrtKeyImpl) || + (key instanceof RSAPublicKeyImpl)) { + return (RSAKey)key; } else { return (RSAKey)INSTANCE.engineTranslateKey(key); } } - /** - * Check that the given RSA key is valid. + /* + * Single test entry point for all of the mechanisms in the SunRsaSign + * provider (RSA*KeyImpls). All of the tests are the same. + * + * For compatibility, we round up to the nearest byte here: + * some Key impls might pass in a value within a byte of the + * real value. */ - private static void checkKey(RSAKey key) throws InvalidKeyException { - // check for subinterfaces, omit additional checks for our keys - if (key instanceof RSAPublicKey) { - if (key instanceof RSAPublicKeyImpl) { - return; - } - } else if (key instanceof RSAPrivateKey) { - if ((key instanceof RSAPrivateCrtKeyImpl) - || (key instanceof RSAPrivateKeyImpl)) { - return; - } - } else { - throw new InvalidKeyException("Neither a public nor a private key"); - } - // RSAKey does not extend Key, so we need to do a cast - String keyAlg = ((Key)key).getAlgorithm(); - if (keyAlg.equals("RSA") == false) { - throw new InvalidKeyException("Not an RSA key: " + keyAlg); - } - BigInteger modulus; - // some providers implement RSAKey for keys where the values are - // not accessible (although they should). Detect those here - // for a more graceful failure. - try { - modulus = key.getModulus(); - if (modulus == null) { - throw new InvalidKeyException("Modulus is missing"); - } - } catch (RuntimeException e) { - throw new InvalidKeyException(e); - } - checkKeyLength(modulus); + static void checkRSAProviderKeyLengths(int modulusLen, BigInteger exponent) + throws InvalidKeyException { + checkKeyLengths(((modulusLen + 7) & ~7), exponent, + RSAKeyFactory.MIN_MODLEN, Integer.MAX_VALUE); } /** - * Check the length of the modulus of an RSA key. We only support keys - * at least 505 bits long. + * Check the length of an RSA key modulus/exponent to make sure it + * is not too short or long. Some impls have their own min and + * max key sizes that may or may not match with a system defined value. + * + * @param modulusLen the bit length of the RSA modulus. + * @param exponent the RSA exponent + * @param minModulusLen if > 0, check to see if modulusLen is at + * least this long, otherwise unused. + * @param maxModulusLen caller will allow this max number of bits. + * Allow the smaller of the system-defined maximum and this param. + * + * @throws InvalidKeyException if any of the values are unacceptable. */ - static void checkKeyLength(BigInteger modulus) throws InvalidKeyException { - if (modulus.bitLength() < 505) { - // some providers may generate slightly shorter keys - // accept them if the encoding is at least 64 bytes long - throw new InvalidKeyException - ("RSA keys must be at least 512 bits long"); + public static void checkKeyLengths(int modulusLen, BigInteger exponent, + int minModulusLen, int maxModulusLen) throws InvalidKeyException { + + if ((minModulusLen > 0) && (modulusLen < (minModulusLen))) { + throw new InvalidKeyException( "RSA keys must be at least " + + minModulusLen + " bits long"); + } + + // Even though our policy file may allow this, we don't want + // either value (mod/exp) to be too big. + + int maxLen = Math.min(maxModulusLen, MAX_MODLEN); + + // If a RSAPrivateKey/RSAPublicKey, make sure the + // modulus len isn't too big. + if (modulusLen > maxLen) { + throw new InvalidKeyException( + "RSA keys must be no longer than " + maxLen + " bits"); + } + + // If a RSAPublicKey, make sure the exponent isn't too big. + if (restrictExpLen && (exponent != null) && + (modulusLen > MAX_MODLEN_RESTRICT_EXP) && + (exponent.bitLength() > MAX_RESTRICTED_EXPLEN)) { + throw new InvalidKeyException( + "RSA exponents can be no longer than " + + MAX_RESTRICTED_EXPLEN + " bits " + + " if modulus is greater than " + + MAX_MODLEN_RESTRICT_EXP + " bits"); } } diff --git a/jdk/src/share/classes/sun/security/rsa/RSAKeyPairGenerator.java b/jdk/src/share/classes/sun/security/rsa/RSAKeyPairGenerator.java index f800dec543b..2898a3d1f51 100644 --- a/jdk/src/share/classes/sun/security/rsa/RSAKeyPairGenerator.java +++ b/jdk/src/share/classes/sun/security/rsa/RSAKeyPairGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 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 @@ -47,7 +47,7 @@ public final class RSAKeyPairGenerator extends KeyPairGeneratorSpi { // public exponent to use private BigInteger publicExponent; - // size of the key to generate, >= 512 + // size of the key to generate, >= RSAKeyFactory.MIN_MODLEN private int keySize; // PRNG to use @@ -60,15 +60,16 @@ public final class RSAKeyPairGenerator extends KeyPairGeneratorSpi { // initialize the generator. See JCA doc public void initialize(int keySize, SecureRandom random) { - if (keySize < 512) { - throw new InvalidParameterException - ("Key size must be at least 512 bits"); - } - if (keySize > 64 * 1024) { - // do not allow unreasonably large key sizes, probably user error - throw new InvalidParameterException - ("Key size must be 65536 bits or less"); + + // do not allow unreasonably small or large key sizes, + // probably user error + try { + RSAKeyFactory.checkKeyLengths(keySize, RSAKeyGenParameterSpec.F4, + 512, 64 * 1024); + } catch (InvalidKeyException e) { + throw new InvalidParameterException(e.getMessage()); } + this.keySize = keySize; this.random = random; this.publicExponent = RSAKeyGenParameterSpec.F4; @@ -77,35 +78,41 @@ public final class RSAKeyPairGenerator extends KeyPairGeneratorSpi { // second initialize method. See JCA doc. public void initialize(AlgorithmParameterSpec params, SecureRandom random) throws InvalidAlgorithmParameterException { + if (params instanceof RSAKeyGenParameterSpec == false) { throw new InvalidAlgorithmParameterException ("Params must be instance of RSAKeyGenParameterSpec"); } + RSAKeyGenParameterSpec rsaSpec = (RSAKeyGenParameterSpec)params; - keySize = rsaSpec.getKeysize(); - publicExponent = rsaSpec.getPublicExponent(); - this.random = random; - if (keySize < 512) { - throw new InvalidAlgorithmParameterException - ("Key size must be at least 512 bits"); - } - if (keySize > 64 * 1024) { - // do not allow unreasonably large key sizes, probably user error - throw new InvalidAlgorithmParameterException - ("Key size must be 65536 bits or less"); - } - if (publicExponent == null) { - publicExponent = RSAKeyGenParameterSpec.F4; + int tmpKeySize = rsaSpec.getKeysize(); + BigInteger tmpPublicExponent = rsaSpec.getPublicExponent(); + + if (tmpPublicExponent == null) { + tmpPublicExponent = RSAKeyGenParameterSpec.F4; } else { - if (publicExponent.compareTo(RSAKeyGenParameterSpec.F0) < 0) { + if (tmpPublicExponent.compareTo(RSAKeyGenParameterSpec.F0) < 0) { throw new InvalidAlgorithmParameterException ("Public exponent must be 3 or larger"); } - if (publicExponent.bitLength() > keySize) { + if (tmpPublicExponent.bitLength() > tmpKeySize) { throw new InvalidAlgorithmParameterException ("Public exponent must be smaller than key size"); } } + + // do not allow unreasonably large key sizes, probably user error + try { + RSAKeyFactory.checkKeyLengths(tmpKeySize, tmpPublicExponent, + 512, 64 * 1024); + } catch (InvalidKeyException e) { + throw new InvalidAlgorithmParameterException( + "Invalid key sizes", e); + } + + this.keySize = tmpKeySize; + this.publicExponent = tmpPublicExponent; + this.random = random; } // generate the keypair. See JCA doc diff --git a/jdk/src/share/classes/sun/security/rsa/RSAPrivateCrtKeyImpl.java b/jdk/src/share/classes/sun/security/rsa/RSAPrivateCrtKeyImpl.java index ac296b49f60..640972a2495 100644 --- a/jdk/src/share/classes/sun/security/rsa/RSAPrivateCrtKeyImpl.java +++ b/jdk/src/share/classes/sun/security/rsa/RSAPrivateCrtKeyImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 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 @@ -89,7 +89,7 @@ public final class RSAPrivateCrtKeyImpl */ RSAPrivateCrtKeyImpl(byte[] encoded) throws InvalidKeyException { decode(encoded); - RSAKeyFactory.checkKeyLength(n); + RSAKeyFactory.checkRSAProviderKeyLengths(n.bitLength(), e); } /** @@ -107,7 +107,8 @@ public final class RSAPrivateCrtKeyImpl this.pe = pe; this.qe = qe; this.coeff = coeff; - RSAKeyFactory.checkKeyLength(n); + RSAKeyFactory.checkRSAProviderKeyLengths(n.bitLength(), e); + // generate the encoding algid = rsaId; try { diff --git a/jdk/src/share/classes/sun/security/rsa/RSAPrivateKeyImpl.java b/jdk/src/share/classes/sun/security/rsa/RSAPrivateKeyImpl.java index 1f883f4205d..860e7706bc9 100644 --- a/jdk/src/share/classes/sun/security/rsa/RSAPrivateKeyImpl.java +++ b/jdk/src/share/classes/sun/security/rsa/RSAPrivateKeyImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 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 @@ -61,7 +61,7 @@ public final class RSAPrivateKeyImpl extends PKCS8Key implements RSAPrivateKey { RSAPrivateKeyImpl(BigInteger n, BigInteger d) throws InvalidKeyException { this.n = n; this.d = d; - RSAKeyFactory.checkKeyLength(n); + RSAKeyFactory.checkRSAProviderKeyLengths(n.bitLength(), null); // generate the encoding algid = RSAPrivateCrtKeyImpl.rsaId; try { diff --git a/jdk/src/share/classes/sun/security/rsa/RSAPublicKeyImpl.java b/jdk/src/share/classes/sun/security/rsa/RSAPublicKeyImpl.java index c500ca2dee4..6db08f6a393 100644 --- a/jdk/src/share/classes/sun/security/rsa/RSAPublicKeyImpl.java +++ b/jdk/src/share/classes/sun/security/rsa/RSAPublicKeyImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 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 @@ -56,10 +56,11 @@ public final class RSAPublicKeyImpl extends X509Key implements RSAPublicKey { * Construct a key from its components. Used by the * RSAKeyFactory and the RSAKeyPairGenerator. */ - public RSAPublicKeyImpl(BigInteger n, BigInteger e) throws InvalidKeyException { + public RSAPublicKeyImpl(BigInteger n, BigInteger e) + throws InvalidKeyException { this.n = n; this.e = e; - RSAKeyFactory.checkKeyLength(n); + RSAKeyFactory.checkRSAProviderKeyLengths(n.bitLength(), e); // generate the encoding algid = RSAPrivateCrtKeyImpl.rsaId; try { @@ -80,7 +81,7 @@ public final class RSAPublicKeyImpl extends X509Key implements RSAPublicKey { */ public RSAPublicKeyImpl(byte[] encoded) throws InvalidKeyException { decode(encoded); - RSAKeyFactory.checkKeyLength(n); + RSAKeyFactory.checkRSAProviderKeyLengths(n.bitLength(), e); } // see JCA doc diff --git a/jdk/src/windows/classes/sun/security/mscapi/RSAKeyPairGenerator.java b/jdk/src/windows/classes/sun/security/mscapi/RSAKeyPairGenerator.java index 146d7c1632d..44dd25ab8cd 100644 --- a/jdk/src/windows/classes/sun/security/mscapi/RSAKeyPairGenerator.java +++ b/jdk/src/windows/classes/sun/security/mscapi/RSAKeyPairGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright 2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 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 @@ -31,6 +31,7 @@ import java.security.spec.AlgorithmParameterSpec; import java.security.spec.RSAKeyGenParameterSpec; import sun.security.jca.JCAUtil; +import sun.security.rsa.RSAKeyFactory; /** * RSA keypair generator. @@ -43,8 +44,8 @@ import sun.security.jca.JCAUtil; public final class RSAKeyPairGenerator extends KeyPairGeneratorSpi { // Supported by Microsoft Base, Strong and Enhanced Cryptographic Providers - private static final int KEY_SIZE_MIN = 512; // disallow MSCAPI min. of 384 - private static final int KEY_SIZE_MAX = 16384; + static final int KEY_SIZE_MIN = 512; // disallow MSCAPI min. of 384 + static final int KEY_SIZE_MAX = 16384; private static final int KEY_SIZE_DEFAULT = 1024; // size of the key to generate, KEY_SIZE_MIN <= keySize <= KEY_SIZE_MAX @@ -59,7 +60,14 @@ public final class RSAKeyPairGenerator extends KeyPairGeneratorSpi { // random is always ignored public void initialize(int keySize, SecureRandom random) { - checkKeySize(keySize); + try { + RSAKeyFactory.checkKeyLengths(keySize, null, + KEY_SIZE_MIN, KEY_SIZE_MAX); + } catch (InvalidKeyException e) { + throw new InvalidParameterException(e.getMessage()); + } + + this.keySize = keySize; } // second initialize method. See JCA doc @@ -67,21 +75,31 @@ public final class RSAKeyPairGenerator extends KeyPairGeneratorSpi { public void initialize(AlgorithmParameterSpec params, SecureRandom random) throws InvalidAlgorithmParameterException { + int tmpSize; if (params == null) { - checkKeySize(KEY_SIZE_DEFAULT); - + tmpSize = KEY_SIZE_DEFAULT; } else if (params instanceof RSAKeyGenParameterSpec) { if (((RSAKeyGenParameterSpec) params).getPublicExponent() != null) { throw new InvalidAlgorithmParameterException ("Exponent parameter is not supported"); } - checkKeySize(((RSAKeyGenParameterSpec) params).getKeysize()); + tmpSize = ((RSAKeyGenParameterSpec) params).getKeysize(); } else { throw new InvalidAlgorithmParameterException ("Params must be an instance of RSAKeyGenParameterSpec"); } + + try { + RSAKeyFactory.checkKeyLengths(tmpSize, null, + KEY_SIZE_MIN, KEY_SIZE_MAX); + } catch (InvalidKeyException e) { + throw new InvalidAlgorithmParameterException( + "Invalid Key sizes", e); + } + + this.keySize = tmpSize; } // generate the keypair. See JCA doc @@ -95,18 +113,6 @@ public final class RSAKeyPairGenerator extends KeyPairGeneratorSpi { return new KeyPair(keys.getPublic(), keys.getPrivate()); } - private void checkKeySize(int keySize) throws InvalidParameterException { - if (keySize < KEY_SIZE_MIN) { - throw new InvalidParameterException - ("Key size must be at least " + KEY_SIZE_MIN + " bits"); - } - if (keySize > KEY_SIZE_MAX) { - throw new InvalidParameterException - ("Key size must be " + KEY_SIZE_MAX + " bits or less"); - } - this.keySize = keySize; - } - private static native RSAKeyPair generateRSAKeyPair(int keySize, String keyContainerName); } diff --git a/jdk/src/windows/classes/sun/security/mscapi/RSASignature.java b/jdk/src/windows/classes/sun/security/mscapi/RSASignature.java index 606423d53a4..982e1836a7d 100644 --- a/jdk/src/windows/classes/sun/security/mscapi/RSASignature.java +++ b/jdk/src/windows/classes/sun/security/mscapi/RSASignature.java @@ -1,5 +1,5 @@ /* - * Copyright 2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 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 @@ -38,6 +38,9 @@ import java.security.SecureRandom; import java.security.Signature; import java.security.SignatureSpi; import java.security.SignatureException; +import java.math.BigInteger; + +import sun.security.rsa.RSAKeyFactory; /** * RSA signature implementation. Supports RSA signing using PKCS#1 v1.5 padding. @@ -124,7 +127,16 @@ abstract class RSASignature extends java.security.SignatureSpi // convert key to MSCAPI format - byte[] modulusBytes = rsaKey.getModulus().toByteArray(); + BigInteger modulus = rsaKey.getModulus(); + BigInteger exponent = rsaKey.getPublicExponent(); + + // Check against the local and global values to make sure + // the sizes are ok. Round up to the nearest byte. + RSAKeyFactory.checkKeyLengths(((modulus.bitLength() + 7) & ~7), + exponent, -1, RSAKeyPairGenerator.KEY_SIZE_MAX); + + byte[] modulusBytes = modulus.toByteArray(); + byte[] exponentBytes = exponent.toByteArray(); // Adjust key length due to sign bit int keyBitLength = (modulusBytes[0] == 0) @@ -132,8 +144,7 @@ abstract class RSASignature extends java.security.SignatureSpi : modulusBytes.length * 8; byte[] keyBlob = generatePublicKeyBlob( - keyBitLength, modulusBytes, - rsaKey.getPublicExponent().toByteArray()); + keyBitLength, modulusBytes, exponentBytes); publicKey = importPublicKey(keyBlob, keyBitLength); @@ -166,12 +177,11 @@ abstract class RSASignature extends java.security.SignatureSpi } privateKey = (sun.security.mscapi.RSAPrivateKey) key; - // Determine byte length from bit length - int keySize = (privateKey.bitLength() + 7) >> 3; - - if (keySize < 64) - throw new InvalidKeyException( - "RSA keys must be at least 512 bits long"); + // Check against the local and global values to make sure + // the sizes are ok. Round up to nearest byte. + RSAKeyFactory.checkKeyLengths(((privateKey.bitLength() + 7) & ~7), + null, RSAKeyPairGenerator.KEY_SIZE_MIN, + RSAKeyPairGenerator.KEY_SIZE_MAX); if (needsReset) { messageDigest.reset(); From 6aab63dd371dfeb79ce7c3a9c70fd1758c7c4a9f Mon Sep 17 00:00:00 2001 From: Weijun Wang Date: Wed, 1 Oct 2008 10:01:45 +0800 Subject: [PATCH 002/292] 6588160: jaas krb5 client leaks OS-level UDP sockets (all platforms) Reviewed-by: jccollet, chegar --- .../classes/sun/security/krb5/KrbKdcReq.java | 38 ++++++++++--------- .../sun/security/krb5/internal/UDPClient.java | 3 ++ 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/jdk/src/share/classes/sun/security/krb5/KrbKdcReq.java b/jdk/src/share/classes/sun/security/krb5/KrbKdcReq.java index e9ff9cc04d5..259aedd66fa 100644 --- a/jdk/src/share/classes/sun/security/krb5/KrbKdcReq.java +++ b/jdk/src/share/classes/sun/security/krb5/KrbKdcReq.java @@ -274,27 +274,31 @@ public abstract class KrbKdcReq { + ",Attempt =" + i + ", #bytes=" + obuf.length); } - /* - * Send the data to the kdc. - */ + try { + /* + * Send the data to the kdc. + */ kdcClient.send(obuf); - /* - * And get a response. - */ - try { - ibuf = kdcClient.receive(); - break; - } catch (SocketTimeoutException se) { - if (DEBUG) { - System.out.println ("SocketTimeOutException with " + - "attempt: " + i); - } - if (i == DEFAULT_KDC_RETRY_LIMIT) { - ibuf = null; - throw se; + /* + * And get a response. + */ + try { + ibuf = kdcClient.receive(); + break; + } catch (SocketTimeoutException se) { + if (DEBUG) { + System.out.println ("SocketTimeOutException with " + + "attempt: " + i); + } + if (i == DEFAULT_KDC_RETRY_LIMIT) { + ibuf = null; + throw se; + } } + } finally { + kdcClient.close(); } } } diff --git a/jdk/src/share/classes/sun/security/krb5/internal/UDPClient.java b/jdk/src/share/classes/sun/security/krb5/internal/UDPClient.java index c9e440f1ef7..670df9210df 100644 --- a/jdk/src/share/classes/sun/security/krb5/internal/UDPClient.java +++ b/jdk/src/share/classes/sun/security/krb5/internal/UDPClient.java @@ -93,4 +93,7 @@ public class UDPClient { return data; } + public void close() { + dgSocket.close(); + } } From 3a7a9cc5577bd4ad27ae072ccd9b3bf65c637c02 Mon Sep 17 00:00:00 2001 From: Kumar Srinivasan Date: Thu, 4 Sep 2008 09:43:32 -0700 Subject: [PATCH 003/292] 6733959: Insufficient checks for "Main-Class" manifest entry in JAR files Fixes a buffer overrun problem with a very long Main-Class attribute. Reviewed-by: darcy --- jdk/src/share/bin/emessages.h | 1 + jdk/src/share/bin/java.c | 10 ++- jdk/test/tools/launcher/MultipleJRE.sh | 82 ++++++++++++++++++----- jdk/test/tools/launcher/ZipMeUp.java | 91 ++++++++++++++++++++++++++ 4 files changed, 164 insertions(+), 20 deletions(-) create mode 100644 jdk/test/tools/launcher/ZipMeUp.java diff --git a/jdk/src/share/bin/emessages.h b/jdk/src/share/bin/emessages.h index 03824bba5d1..6bfb8e16614 100644 --- a/jdk/src/share/bin/emessages.h +++ b/jdk/src/share/bin/emessages.h @@ -54,6 +54,7 @@ #define CLS_ERROR2 "Error: Failed to load Main Class: %s\n%s" #define CLS_ERROR3 "Error: No main method found in specified class.\n" GEN_ERROR #define CLS_ERROR4 "Error: Main method not public\n" GEN_ERROR +#define CLS_ERROR5 "Error: main-class: attribute exceeds system limits of %d bytes\n" GEN_ERROR #define CFG_WARN1 "Warning: %s VM not supported; %s VM will be used" #define CFG_WARN2 "Warning: No leading - on line %d of `%s'" diff --git a/jdk/src/share/bin/java.c b/jdk/src/share/bin/java.c index f7cbcdc95bc..b351fe3aa83 100644 --- a/jdk/src/share/bin/java.c +++ b/jdk/src/share/bin/java.c @@ -987,8 +987,14 @@ SelectVersion(int argc, char **argv, char **main_class) * to avoid locating, expanding and parsing the manifest extra * times. */ - if (info.main_class != NULL) - (void)JLI_StrCat(env_entry, info.main_class); + if (info.main_class != NULL) { + if (JLI_StrLen(info.main_class) <= MAXNAMELEN) { + (void)JLI_StrCat(env_entry, info.main_class); + } else { + ReportErrorMessage(CLS_ERROR5, MAXNAMELEN); + exit(1); + } + } (void)putenv(env_entry); ExecJRE(jre, new_argv); JLI_FreeManifest(); diff --git a/jdk/test/tools/launcher/MultipleJRE.sh b/jdk/test/tools/launcher/MultipleJRE.sh index b3e1cf764ed..a6dfaaa5253 100644 --- a/jdk/test/tools/launcher/MultipleJRE.sh +++ b/jdk/test/tools/launcher/MultipleJRE.sh @@ -1,14 +1,14 @@ # @test MultipleJRE.sh -# @bug 4811102 4953711 4955505 4956301 4991229 4998210 5018605 6387069 +# @bug 4811102 4953711 4955505 4956301 4991229 4998210 5018605 6387069 6733959 # @build PrintVersion # @build UglyPrintVersion +# @build ZipMeUp # @run shell MultipleJRE.sh # @summary Verify Multiple JRE version support # @author Joseph E. Kowalski - # -# Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2003-2008 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 @@ -49,10 +49,25 @@ then exit 1 fi +JAVAEXE="$TESTJAVA/bin/java" JAVA="$TESTJAVA/bin/java -classpath $TESTCLASSES" JAR="$TESTJAVA/bin/jar" OS=`uname -s`; +# +# Tests whether we are on windows (true) or not. +# +IsWindows() { + case "$OS" in + Windows* | CYGWIN* ) + printf "true" + ;; + * ) + printf "false" + ;; + esac +} + # # Shell routine to test for the proper rejection of syntactically incorrect # version specifications. @@ -139,7 +154,6 @@ CreateUglyJar() { $PACKAGE/UglyPrintVersion.class } - # # Constructs a jar file with a fair number of "zip directory" entries and # the MANIFEST.MF entry at or near the end of that directory to validate @@ -262,6 +276,29 @@ LaunchVM() { fi } +# Tests very long Main-Class attribute in the jar +TestLongMainClass() { + JVER=$1 + if [ "$JVER" = "mklink" ]; then + JVER=XX + JDKXX=jdk/j2re$JVER + rm -rf jdk + mkdir jdk + ln -s $TESTJAVA $JDKXX + JAVA_VERSION_PATH="`pwd`/jdk" + export JAVA_VERSION_PATH + fi + $JAVAEXE -cp $TESTCLASSES ZipMeUp UglyBetty.jar 4097 + message="`$JAVAEXE -version:$JVER -jar UglyBetty.jar 2>&1`" + echo $message | grep "Error: main-class: attribute exceeds system limits" > /dev/null 2>&1 + if [ $? -ne 0 ]; then + printf "Long manifest test did not get expected error" + exit 1 + fi + unset JAVA_VERSION_PATH + rm -rf jdk +} + # # Main test sequence starts here # @@ -280,14 +317,11 @@ CreateJar "" "" LaunchVM "" "${RELEASE}" CreateJar "" "0" LaunchVM "" "${RELEASE}" -case "$OS" in - Windows* | CYGWIN* ) - MAXIMUM_PATH=255; - ;; - *) - MAXIMUM_PATH=1024; - ;; -esac +if [ `IsWindows` = "true" ]; then + MAXIMUM_PATH=255; +else + MAXIMUM_PATH=1024; +fi PATH_LENGTH=`printf "%s" "$UGLYCLASS" | wc -c` if [ ${PATH_LENGTH} -lt ${MAXIMUM_PATH} ]; then @@ -346,7 +380,6 @@ if [ -x /usr/bin/zipnote ]; then LaunchVM "" "${RELEASE}" fi - # # Throw some syntactically challenged (illegal) version specifiers at # the interface. Failure (of the launcher) is success for the test. @@ -357,15 +390,28 @@ TestSyntax "1.2.3-" # Ends with a separator TestSyntax "1.2+.3" # Embedded modifier TestSyntax "1.2.4+&1.2*&1++" # Long and invalid +# On windows we see if there is another jre installed, usually +# there is, then we test using that, otherwise links are created +# to get through to SelectVersion. +if [ `IsWindows` = "false" ]; then + TestLongMainClass "mklink" +else + $JAVAEXE -version:1.0+ + if [ $? -eq 0 ]; then + TestLongMainClass "1.0+" + else + printf "Warning: TestLongMainClass skipped as there is no" + printf "viable MJRE installed.\n" + fi +fi + # # Because scribbling in the registry can be rather destructive, only a # subset of the tests are run on Windows. # -case "$OS" in - Windows* | CYGWIN* ) - exit 0; - ;; -esac +if [ `IsWindows` = "true" ]; then + exit 0; +fi # # Additional version specifiers containing spaces. (Sigh, unable to diff --git a/jdk/test/tools/launcher/ZipMeUp.java b/jdk/test/tools/launcher/ZipMeUp.java new file mode 100644 index 00000000000..84d3f186e7e --- /dev/null +++ b/jdk/test/tools/launcher/ZipMeUp.java @@ -0,0 +1,91 @@ +/* + * Copyright 2008 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. + */ + +/** + * A simple class to create our erring Jar with a very long Main-Class + * attribute in the manifest. + */ +import java.io.ByteArrayOutputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.PrintStream; +import java.util.zip.CRC32; +import java.util.zip.CheckedOutputStream; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; +public class ZipMeUp { + + static final CRC32 crc = new CRC32(); + + private static String SOME_KLASS = ".Some"; + + static byte[] getManifestAsBytes(int nchars) throws IOException { + crc.reset(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + CheckedOutputStream cos = new CheckedOutputStream(baos, crc); + PrintStream ps = new PrintStream(cos); + ps.println("Manifest-Version: 1.0"); + ps.print("Main-Class: "); + for (int i = 0 ; i < nchars - SOME_KLASS.length() ; i++) { + ps.print(i%10); + } + ps.println(SOME_KLASS); + cos.flush(); + cos.close(); + ps.close(); + return baos.toByteArray(); + } + + /** + * The arguments are: filename_to_create length + * @param args + * @throws java.lang.Exception + */ + public static void main(String...args) throws Exception { + FileOutputStream fos = new FileOutputStream(args[0]); + ZipOutputStream zos = new ZipOutputStream(fos); + byte[] manifest = getManifestAsBytes(Integer.parseInt(args[1])); + ZipEntry ze = new ZipEntry("META-INF/MANIFEST.MF"); + ze.setMethod(ZipEntry.STORED); + ze.setSize(manifest.length); + ze.setCompressedSize(manifest.length); + ze.setCrc(crc.getValue()); + ze.setTime(System.currentTimeMillis()); + zos.putNextEntry(ze); + zos.write(manifest); + zos.flush(); + + // add a zero length class + ze = new ZipEntry(SOME_KLASS + ".class"); + ze.setMethod(ZipEntry.STORED); + ze.setSize(0); + ze.setCompressedSize(0); + ze.setCrc(0); + ze.setTime(System.currentTimeMillis()); + zos.putNextEntry(ze); + zos.flush(); + zos.closeEntry(); + zos.close(); + System.exit(0); + } +} From 3729356740fb70966397e582528db89a60e0824e Mon Sep 17 00:00:00 2001 From: Masayoshi Okutsu Date: Thu, 2 Oct 2008 16:49:33 +0900 Subject: [PATCH 004/292] 6734167: Calendar.readObject allows elevation of privileges Reviewed-by: peytoia --- jdk/src/share/classes/java/util/Calendar.java | 54 ++++++++++++++----- 1 file changed, 42 insertions(+), 12 deletions(-) diff --git a/jdk/src/share/classes/java/util/Calendar.java b/jdk/src/share/classes/java/util/Calendar.java index e1f65e6a885..072de9e142f 100644 --- a/jdk/src/share/classes/java/util/Calendar.java +++ b/jdk/src/share/classes/java/util/Calendar.java @@ -41,9 +41,14 @@ package java.util; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; +import java.io.OptionalDataException; import java.io.Serializable; +import java.security.AccessControlContext; import java.security.AccessController; +import java.security.PermissionCollection; +import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; +import java.security.ProtectionDomain; import java.text.DateFormat; import java.text.DateFormatSymbols; import sun.util.BuddhistCalendar; @@ -2626,6 +2631,18 @@ public abstract class Calendar implements Serializable, Cloneable, Comparable() { + public ZoneInfo run() throws Exception { + return (ZoneInfo) input.readObject(); + } + }, + CalendarAccessControlContext.INSTANCE); + } catch (PrivilegedActionException pae) { + Exception e = pae.getException(); + if (!(e instanceof OptionalDataException)) { + if (e instanceof RuntimeException) { + throw (RuntimeException) e; + } else if (e instanceof IOException) { + throw (IOException) e; + } else if (e instanceof ClassNotFoundException) { + throw (ClassNotFoundException) e; + } + throw new RuntimeException(e); } - } catch (Exception e) { + } + if (zi != null) { + zone = zi; } // If the deserialized object has a SimpleTimeZone, try to @@ -2674,9 +2704,9 @@ public abstract class Calendar implements Serializable, Cloneable, Comparable Date: Thu, 2 Oct 2008 20:37:43 +0400 Subject: [PATCH 005/292] 6726779: ConvolveOp on USHORT raster can cause the JVM crash Reviewed-by: igor, prr --- .../native/sun/awt/medialib/awt_ImagingLib.c | 38 +++----- .../awt/image/ConvolveOp/EdgeNoOpCrash.java | 95 +++++++++++++++++++ 2 files changed, 107 insertions(+), 26 deletions(-) create mode 100644 jdk/test/java/awt/image/ConvolveOp/EdgeNoOpCrash.java diff --git a/jdk/src/share/native/sun/awt/medialib/awt_ImagingLib.c b/jdk/src/share/native/sun/awt/medialib/awt_ImagingLib.c index 681f26290b8..157827fef29 100644 --- a/jdk/src/share/native/sun/awt/medialib/awt_ImagingLib.c +++ b/jdk/src/share/native/sun/awt/medialib/awt_ImagingLib.c @@ -216,6 +216,16 @@ printMedialibError(int status) { #endif /* ! DEBUG */ +static int +getMlibEdgeHint(jint edgeHint) { + switch (edgeHint) { + case java_awt_image_ConvolveOp_EDGE_NO_OP: + return MLIB_EDGE_DST_COPY_SRC; + case java_awt_image_ConvolveOp_EDGE_ZERO_FILL: + default: + return MLIB_EDGE_DST_FILL_ZERO; + } +} /*************************************************************************** * External Functions * @@ -400,22 +410,10 @@ Java_sun_awt_image_ImagingLib_convolveBI(JNIEnv *env, jobject this, } } - if (edgeHint == java_awt_image_ConvolveOp_EDGE_NO_OP) { - int kw2 = kwidth>>1; - int kh2 = kheight>>1; - int bsize = mlib_ImageGetChannels(src)* - (mlib_ImageGetType(src) == MLIB_BYTE ? 1 : 2); - - void *dstDataP = mlib_ImageGetData(dst); - void *srcDataP = mlib_ImageGetData(src); - /* REMIND: Copy a smaller area */ - memcpy(dstDataP, srcDataP, dst->width*dst->height*bsize); - } - cmask = (1<channels)-1; status = (*sMlibFns[MLIB_CONVMxN].fptr)(dst, src, kdata, w, h, (w-1)/2, (h-1)/2, scale, cmask, - MLIB_EDGE_DST_NO_WRITE); + getMlibEdgeHint(edgeHint)); if (status != MLIB_SUCCESS) { printMedialibError(status); @@ -660,22 +658,10 @@ Java_sun_awt_image_ImagingLib_convolveRaster(JNIEnv *env, jobject this, } } - if (edgeHint == java_awt_image_ConvolveOp_EDGE_NO_OP) { - int kw2 = kwidth>>1; - int kh2 = kheight>>1; - int bsize = mlib_ImageGetChannels(src)* - (mlib_ImageGetType(src) == MLIB_BYTE ? 1 : 2); - - void *dstDataP = mlib_ImageGetData(dst); - void *srcDataP = mlib_ImageGetData(src); - /* REMIND: Copy a smaller area */ - memcpy(dstDataP, srcDataP, dst->width*dst->height*bsize); - } - cmask = (1<channels)-1; status = (*sMlibFns[MLIB_CONVMxN].fptr)(dst, src, kdata, w, h, (w-1)/2, (h-1)/2, scale, cmask, - MLIB_EDGE_DST_NO_WRITE); + getMlibEdgeHint(edgeHint)); if (status != MLIB_SUCCESS) { printMedialibError(status); diff --git a/jdk/test/java/awt/image/ConvolveOp/EdgeNoOpCrash.java b/jdk/test/java/awt/image/ConvolveOp/EdgeNoOpCrash.java new file mode 100644 index 00000000000..5e1d2eb3f66 --- /dev/null +++ b/jdk/test/java/awt/image/ConvolveOp/EdgeNoOpCrash.java @@ -0,0 +1,95 @@ +/* + * Copyright 2008 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 6726779 + * @summary Test verifies that ConvolveOp with the EDGE_NO_OP edge condition + * does not cause JVM crash if size of source raster elements is + * greather than size of the destination raster element. + * + * @run main EdgeNoOpCrash + */ +import java.awt.Point; +import java.awt.image.ConvolveOp; +import java.awt.image.DataBuffer; +import java.awt.image.ImagingOpException; +import java.awt.image.Kernel; +import java.awt.image.Raster; +import java.awt.image.WritableRaster; +import java.util.Arrays; + +public class EdgeNoOpCrash { + private static final int w = 3000; + private static final int h = 200; + + public static void main(String[] args) { + crashTest(); + } + + private static void crashTest() { + Raster src = createSrcRaster(); + WritableRaster dst = createDstRaster(); + ConvolveOp op = createConvolveOp(ConvolveOp.EDGE_NO_OP); + try { + op.filter(src, dst); + } catch (ImagingOpException e) { + /* + * The test pair of source and destination rasters + * may cause failure of the medialib convolution routine, + * so this exception is expected. + * + * The JVM crash is the only manifestation of this + * test failure. + */ + } + System.out.println("Test PASSED."); + } + + private static Raster createSrcRaster() { + WritableRaster r = Raster.createInterleavedRaster(DataBuffer.TYPE_USHORT, + w, h, 4, new Point(0, 0)); + + return r; + } + + private static WritableRaster createDstRaster() { + WritableRaster r = Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, + w, h, 4, new Point(0, 0)); + + return r; + } + + private static ConvolveOp createConvolveOp(int edgeHint) { + final int kw = 3; + final int kh = 3; + float[] kdata = new float[kw * kh]; + float v = 1f / kdata.length; + Arrays.fill(kdata, v); + + Kernel k = new Kernel(kw, kh, kdata); + ConvolveOp op = new ConvolveOp(k, edgeHint, null); + + return op; + } +} \ No newline at end of file From 01bf9872448b93153ab539f370858bf830c3fd7d Mon Sep 17 00:00:00 2001 From: Alan Bateman Date: Thu, 9 Oct 2008 21:12:56 +0100 Subject: [PATCH 006/292] 6721753: File.createTempFile produces guessable file names Reviewed-by: sherman --- jdk/src/share/classes/java/io/File.java | 54 ++++++++++++------------- 1 file changed, 26 insertions(+), 28 deletions(-) diff --git a/jdk/src/share/classes/java/io/File.java b/jdk/src/share/classes/java/io/File.java index 7c58136a44d..8433c75d488 100644 --- a/jdk/src/share/classes/java/io/File.java +++ b/jdk/src/share/classes/java/io/File.java @@ -33,9 +33,9 @@ import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Map; import java.util.Hashtable; -import java.util.Random; import java.security.AccessController; import java.security.AccessControlException; +import java.security.SecureRandom; import sun.security.action.GetPropertyAction; @@ -1678,28 +1678,28 @@ public class File /* -- Temporary files -- */ - private static final Object tmpFileLock = new Object(); + // lazy initialization of SecureRandom and temporary file directory + private static class LazyInitialization { + static final SecureRandom random = new SecureRandom(); - private static int counter = -1; /* Protected by tmpFileLock */ + static final String temporaryDirectory = temporaryDirectory(); + static String temporaryDirectory() { + return fs.normalize( + AccessController.doPrivileged( + new GetPropertyAction("java.io.tmpdir"))); + } + } private static File generateFile(String prefix, String suffix, File dir) throws IOException { - if (counter == -1) { - counter = new Random().nextInt() & 0xffff; + long n = LazyInitialization.random.nextLong(); + if (n == Long.MIN_VALUE) { + n = 0; // corner case + } else { + n = Math.abs(n); } - counter++; - return new File(dir, prefix + Integer.toString(counter) + suffix); - } - - private static String tmpdir; /* Protected by tmpFileLock */ - - private static String getTempDir() { - if (tmpdir == null) - tmpdir = fs.normalize( - AccessController.doPrivileged( - new GetPropertyAction("java.io.tmpdir"))); - return tmpdir; + return new File(dir, prefix + Long.toString(n) + suffix); } private static boolean checkAndCreate(String filename, SecurityManager sm) @@ -1795,18 +1795,16 @@ public class File if (prefix.length() < 3) throw new IllegalArgumentException("Prefix string too short"); String s = (suffix == null) ? ".tmp" : suffix; - synchronized (tmpFileLock) { - if (directory == null) { - String tmpDir = getTempDir(); - directory = new File(tmpDir, fs.prefixLength(tmpDir)); - } - SecurityManager sm = System.getSecurityManager(); - File f; - do { - f = generateFile(prefix, s, directory); - } while (!checkAndCreate(f.getPath(), sm)); - return f; + if (directory == null) { + String tmpDir = LazyInitialization.temporaryDirectory(); + directory = new File(tmpDir, fs.prefixLength(tmpDir)); } + SecurityManager sm = System.getSecurityManager(); + File f; + do { + f = generateFile(prefix, s, directory); + } while (!checkAndCreate(f.getPath(), sm)); + return f; } /** From 92992b2e764bc12439d30b28c4161445e86db0bb Mon Sep 17 00:00:00 2001 From: Kumar Srinivasan Date: Fri, 17 Oct 2008 09:43:30 -0700 Subject: [PATCH 007/292] 6755943: Java JAR Pack200 Decompression should enforce stricter header checks Fixes a core dump when fed with a faulty pack file and related malicious take over Reviewed-by: jrose --- jdk/make/common/shared/Defs-windows.gmk | 4 + .../com/sun/java/util/jar/pack/bytes.cpp | 6 +- .../com/sun/java/util/jar/pack/defines.h | 10 +- .../com/sun/java/util/jar/pack/main.cpp | 4 +- .../com/sun/java/util/jar/pack/unpack.cpp | 24 +- .../com/sun/java/util/jar/pack/unpack.h | 4 +- .../com/sun/java/util/jar/pack/utils.cpp | 11 +- .../native/com/sun/java/util/jar/pack/utils.h | 22 +- .../tools/pack200/MemoryAllocatorTest.java | 369 ++++++++++++++++++ 9 files changed, 423 insertions(+), 31 deletions(-) create mode 100644 jdk/test/tools/pack200/MemoryAllocatorTest.java diff --git a/jdk/make/common/shared/Defs-windows.gmk b/jdk/make/common/shared/Defs-windows.gmk index 250604136bc..d829a41853e 100644 --- a/jdk/make/common/shared/Defs-windows.gmk +++ b/jdk/make/common/shared/Defs-windows.gmk @@ -539,6 +539,7 @@ else WSCRIPT :=$(call FileExists,$(_WSCRIPT1),$(_WSCRIPT2)) endif WSCRIPT:=$(call AltCheckSpaces,WSCRIPT) +WSCRIPT += -B # CSCRIPT: path to cscript.exe (used in creating install bundles) ifdef ALT_CSCRIPT @@ -561,6 +562,9 @@ else MSIVAL2 :=$(call FileExists,$(_MSIVAL2_1),$(_MSIVAL2_2)) endif MSIVAL2:=$(call AltCheckSpaces,MSIVAL2) +ifdef SKIP_MSIVAL2 + MSIVAL2 := $(ECHO) +endif # LOGOCUB: path to cub file for (used in validating install msi files) ifdef ALT_LOGOCUB diff --git a/jdk/src/share/native/com/sun/java/util/jar/pack/bytes.cpp b/jdk/src/share/native/com/sun/java/util/jar/pack/bytes.cpp index 95c3dde66e9..36843061354 100644 --- a/jdk/src/share/native/com/sun/java/util/jar/pack/bytes.cpp +++ b/jdk/src/share/native/com/sun/java/util/jar/pack/bytes.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 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 @@ -56,7 +56,7 @@ void bytes::realloc(size_t len_) { return; } byte* oldptr = ptr; - ptr = (byte*)::realloc(ptr, len_+1); + ptr = (len_ >= PSIZE_MAX) ? null : (byte*)::realloc(ptr, len_+1); if (ptr != null) { mtrace('r', oldptr, 0); mtrace('m', ptr, len_+1); @@ -126,7 +126,7 @@ const char* bytes::string() { // Make sure there are 'o' bytes beyond the fill pointer, // advance the fill pointer, and return the old fill pointer. byte* fillbytes::grow(size_t s) { - size_t nlen = b.len+s; + size_t nlen = add_size(b.len, s); if (nlen <= allocated) { b.len = nlen; return limit()-s; diff --git a/jdk/src/share/native/com/sun/java/util/jar/pack/defines.h b/jdk/src/share/native/com/sun/java/util/jar/pack/defines.h index 19f7567e7bc..f780f247b2a 100644 --- a/jdk/src/share/native/com/sun/java/util/jar/pack/defines.h +++ b/jdk/src/share/native/com/sun/java/util/jar/pack/defines.h @@ -1,5 +1,5 @@ /* - * Copyright 2001-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 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 @@ -47,11 +47,13 @@ #define NOT_PRODUCT(xxx) #define assert(p) (0) #define printcr false && +#define VERSION_STRING "%s version %s\n" #else #define IF_PRODUCT(xxx) #define NOT_PRODUCT(xxx) xxx #define assert(p) ((p) || (assert_failed(#p), 1)) #define printcr u->verbose && u->printcr_if_verbose +#define VERSION_STRING "%s version non-product %s\n" extern "C" void breakpoint(); extern void assert_failed(const char*); #define BREAK (breakpoint()) @@ -79,9 +81,9 @@ extern void assert_failed(const char*); #define lengthof(array) (sizeof(array)/sizeof(array[0])) -#define NEW(T, n) (T*) must_malloc(sizeof(T)*(n)) -#define U_NEW(T, n) (T*) u->alloc(sizeof(T)*(n)) -#define T_NEW(T, n) (T*) u->temp_alloc(sizeof(T)*(n)) +#define NEW(T, n) (T*) must_malloc(scale_size(n, sizeof(T))) +#define U_NEW(T, n) (T*) u->alloc(scale_size(n, sizeof(T))) +#define T_NEW(T, n) (T*) u->temp_alloc(scale_size(n, sizeof(T))) // bytes and byte arrays diff --git a/jdk/src/share/native/com/sun/java/util/jar/pack/main.cpp b/jdk/src/share/native/com/sun/java/util/jar/pack/main.cpp index 9e216cd19c7..234a6009da5 100644 --- a/jdk/src/share/native/com/sun/java/util/jar/pack/main.cpp +++ b/jdk/src/share/native/com/sun/java/util/jar/pack/main.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 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 @@ -300,7 +300,7 @@ int unpacker::run(int argc, char **argv) { case 'J': argp += 1; break; // skip ignored -Jxxx parameter case 'V': - fprintf(u.errstrm, "%s version %s\n", nbasename(argv[0]), sccsver); + fprintf(u.errstrm, VERSION_STRING, nbasename(argv[0]), sccsver); exit(0); case 'h': diff --git a/jdk/src/share/native/com/sun/java/util/jar/pack/unpack.cpp b/jdk/src/share/native/com/sun/java/util/jar/pack/unpack.cpp index 6480da70021..08fbbc2aa4a 100644 --- a/jdk/src/share/native/com/sun/java/util/jar/pack/unpack.cpp +++ b/jdk/src/share/native/com/sun/java/util/jar/pack/unpack.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 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 @@ -618,18 +618,17 @@ void unpacker::read_file_header() { if ((archive_options & AO_HAVE_FILE_HEADERS) != 0) { uint hi = hdr.getInt(); uint lo = hdr.getInt(); - archive_size = band::makeLong(hi, lo); + julong x = band::makeLong(hi, lo); + archive_size = (size_t) x; + if (archive_size != x) { + // Silly size specified; force overflow. + archive_size = PSIZE_MAX+1; + } hdrVals += 2; } else { hdrValsSkipped += 2; } - if (archive_size != (size_t)archive_size) { - // Silly size specified. - abort("archive too large"); - return; - } - // Now we can size the whole archive. // Read everything else into a mega-buffer. rp = hdr.rp; @@ -643,8 +642,8 @@ void unpacker::read_file_header() { abort("EOF reading fixed input buffer"); return; } - } else if (archive_size > 0) { - input.set(U_NEW(byte, (size_t) header_size_0 + archive_size + C_SLOP), + } else if (archive_size != 0) { + input.set(U_NEW(byte, add_size(header_size_0, archive_size, C_SLOP)), (size_t) header_size_0 + archive_size); assert(input.limit()[0] == 0); // Move all the bytes we read initially into the real buffer. @@ -654,7 +653,6 @@ void unpacker::read_file_header() { } else { // It's more complicated and painful. // A zero archive_size means that we must read until EOF. - assert(archive_size == 0); input.init(CHUNK*2); CHECK; input.b.len = input.allocated; @@ -664,7 +662,7 @@ void unpacker::read_file_header() { rplimit += header_size; while (ensure_input(input.limit() - rp)) { size_t dataSoFar = input_remaining(); - size_t nextSize = dataSoFar + CHUNK; + size_t nextSize = add_size(dataSoFar, CHUNK); input.ensureSize(nextSize); CHECK; input.b.len = input.allocated; @@ -949,10 +947,12 @@ void unpacker::read_Utf8_values(entry* cpMap, int len) { // First band: Read lengths of shared prefixes. if (len > PREFIX_SKIP_2) cp_Utf8_prefix.readData(len - PREFIX_SKIP_2); + NOT_PRODUCT(else cp_Utf8_prefix.readData(0)); // for asserts // Second band: Read lengths of unshared suffixes: if (len > SUFFIX_SKIP_1) cp_Utf8_suffix.readData(len - SUFFIX_SKIP_1); + NOT_PRODUCT(else cp_Utf8_suffix.readData(0)); // for asserts bytes* allsuffixes = T_NEW(bytes, len); CHECK; diff --git a/jdk/src/share/native/com/sun/java/util/jar/pack/unpack.h b/jdk/src/share/native/com/sun/java/util/jar/pack/unpack.h index 7ab8e07b2ac..03e2edadcd3 100644 --- a/jdk/src/share/native/com/sun/java/util/jar/pack/unpack.h +++ b/jdk/src/share/native/com/sun/java/util/jar/pack/unpack.h @@ -1,5 +1,5 @@ /* - * Copyright 2002-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 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 @@ -204,7 +204,7 @@ struct unpacker { // archive header fields int magic, minver, majver; - julong archive_size; + size_t archive_size; int archive_next_count, archive_options, archive_modtime; int band_headers_size; int file_count, attr_definition_count, ic_count, class_count; diff --git a/jdk/src/share/native/com/sun/java/util/jar/pack/utils.cpp b/jdk/src/share/native/com/sun/java/util/jar/pack/utils.cpp index 4f45c84b524..8a88dcd961e 100644 --- a/jdk/src/share/native/com/sun/java/util/jar/pack/utils.cpp +++ b/jdk/src/share/native/com/sun/java/util/jar/pack/utils.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 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 @@ -46,14 +46,13 @@ #include "unpack.h" -void* must_malloc(int size) { - int msize = size; - assert(size >= 0); +void* must_malloc(size_t size) { + size_t msize = size; #ifdef USE_MTRACE - if (msize < sizeof(int)) + if (msize >= 0 && msize < sizeof(int)) msize = sizeof(int); // see 0xbaadf00d below #endif - void* ptr = malloc(msize); + void* ptr = (msize > PSIZE_MAX) ? null : malloc(msize); if (ptr != null) { memset(ptr, 0, size); } else { diff --git a/jdk/src/share/native/com/sun/java/util/jar/pack/utils.h b/jdk/src/share/native/com/sun/java/util/jar/pack/utils.h index 6176634bcaf..cc211400eac 100644 --- a/jdk/src/share/native/com/sun/java/util/jar/pack/utils.h +++ b/jdk/src/share/native/com/sun/java/util/jar/pack/utils.h @@ -1,5 +1,5 @@ /* - * Copyright 2001-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 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 @@ -25,13 +25,31 @@ //Definitions of our util functions -void* must_malloc(int size); +void* must_malloc(size_t size); #ifndef USE_MTRACE #define mtrace(c, ptr, size) (0) #else void mtrace(char c, void* ptr, size_t size); #endif +// overflow management +#define OVERFLOW ((size_t)-1) +#define PSIZE_MAX (OVERFLOW/2) /* normal size limit */ + +inline size_t scale_size(size_t size, size_t scale) { + return (size > PSIZE_MAX / scale) ? OVERFLOW : size * scale; +} + +inline size_t add_size(size_t size1, size_t size2) { + return ((size1 | size2 | (size1 + size2)) > PSIZE_MAX) + ? OVERFLOW + : size1 + size2; +} + +inline size_t add_size(size_t size1, size_t size2, int size3) { + return add_size(add_size(size1, size2), size3); +} + // These may be expensive, because they have to go via Java TSD, // if the optional u argument is missing. struct unpacker; diff --git a/jdk/test/tools/pack200/MemoryAllocatorTest.java b/jdk/test/tools/pack200/MemoryAllocatorTest.java new file mode 100644 index 00000000000..6015a4e470d --- /dev/null +++ b/jdk/test/tools/pack200/MemoryAllocatorTest.java @@ -0,0 +1,369 @@ +/* + * Copyright 2008 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 6755943 + * @summary Checks any memory overruns in archive length. + * @run main/timeout=1200 MemoryAllocatorTest + */ +import java.io.BufferedReader; +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.RandomAccessFile; +import java.nio.MappedByteBuffer; +import java.nio.channels.FileChannel; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class MemoryAllocatorTest { + + /* + * The smallest possible pack file with 1 empty resource + */ + static int[] magic = { + 0xCA, 0xFE, 0xD0, 0x0D + }; + static int[] version_info = { + 0x07, // minor + 0x96 // major + }; + static int[] option = { + 0x10 + }; + static int[] size_hi = { + 0x00 + }; + static int[] size_lo_ulong = { + 0xFF, 0xFC, 0xFC, 0xFC, 0xFC // ULONG_MAX 0xFFFFFFFF + }; + static int[] size_lo_correct = { + 0x17 + }; + static int[] data = { + 0x00, 0xEC, 0xDA, 0xDE, 0xF8, 0x45, 0x01, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x31, 0x01, 0x00 + }; + // End of pack file data + + static final String JAVA_HOME = System.getProperty("java.home"); + + static final boolean debug = Boolean.getBoolean("MemoryAllocatorTest.Debug"); + static final boolean WINDOWS = System.getProperty("os.name").startsWith("Windows"); + static final boolean LINUX = System.getProperty("os.name").startsWith("Linux"); + static final boolean SIXTYFOUR_BIT = System.getProperty("sun.arch.data.model", "32").equals("64"); + static final private int EXPECTED_EXIT_CODE = (WINDOWS) ? -1 : 255; + + static int testExitValue = 0; + + static byte[] bytes(int[] a) { + byte[] b = new byte[a.length]; + for (int i = 0; i < b.length; i++) { + b[i] = (byte) a[i]; + } + return b; + } + + static void createPackFile(boolean good, File packFile) throws IOException { + FileOutputStream fos = new FileOutputStream(packFile); + fos.write(bytes(magic)); + fos.write(bytes(version_info)); + fos.write(bytes(option)); + fos.write(bytes(size_hi)); + if (good) { + fos.write(bytes(size_lo_correct)); + } else { + fos.write(bytes(size_lo_ulong)); + } + fos.write(bytes(data)); + } + + /* + * This method modifies the LSB of the size_lo for various wicked + * values between MAXINT-0x3F and MAXINT. + */ + static int modifyPackFile(File packFile) throws IOException { + RandomAccessFile raf = new RandomAccessFile(packFile, "rws"); + long len = packFile.length(); + FileChannel fc = raf.getChannel(); + MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_WRITE, 0, len); + int pos = magic.length + version_info.length + option.length + + size_hi.length; + byte value = bb.get(pos); + value--; + bb.position(pos); + bb.put(value); + bb.force(); + fc.truncate(len); + fc.close(); + return value & 0xFF; + } + + static String getUnpack200Cmd() throws Exception { + File binDir = new File(JAVA_HOME, "bin"); + File unpack200File = WINDOWS + ? new File(binDir, "unpack200.exe") + : new File(binDir, "unpack200"); + + String cmd = unpack200File.getAbsolutePath(); + if (!unpack200File.canExecute()) { + throw new Exception("please check" + + cmd + " exists and is executable"); + } + return cmd; + } + + static TestResult runUnpacker(File packFile) throws Exception { + if (!packFile.exists()) { + throw new Exception("please check" + packFile + " exists"); + } + ArrayList alist = new ArrayList(); + ProcessBuilder pb = new ProcessBuilder(getUnpack200Cmd(), + packFile.getName(), "testout.jar"); + Map env = pb.environment(); + pb.directory(new File(".")); + int retval = 0; + try { + pb.redirectErrorStream(true); + Process p = pb.start(); + BufferedReader rd = new BufferedReader( + new InputStreamReader(p.getInputStream()), 8192); + String in = rd.readLine(); + while (in != null) { + alist.add(in); + System.out.println(in); + in = rd.readLine(); + } + retval = p.waitFor(); + p.destroy(); + } catch (Exception ex) { + ex.printStackTrace(); + throw new RuntimeException(ex.getMessage()); + } + return new TestResult("", retval, alist); + } + + /* + * The debug version builds of unpack200 call abort(3) which might set + * an unexpected return value, therefore this test is to determine + * if we are using a product or non-product build and check the + * return value appropriately. + */ + static boolean isNonProductVersion() throws Exception { + ArrayList alist = new ArrayList(); + ProcessBuilder pb = new ProcessBuilder(getUnpack200Cmd(), "--version"); + Map env = pb.environment(); + pb.directory(new File(".")); + int retval = 0; + try { + pb.redirectErrorStream(true); + Process p = pb.start(); + BufferedReader rd = new BufferedReader( + new InputStreamReader(p.getInputStream()), 8192); + String in = rd.readLine(); + while (in != null) { + alist.add(in); + System.out.println(in); + in = rd.readLine(); + } + retval = p.waitFor(); + p.destroy(); + } catch (Exception ex) { + ex.printStackTrace(); + throw new RuntimeException(ex.getMessage()); + } + for (String x : alist) { + if (x.contains("non-product")) { + return true; + } + } + return false; + } + + /** + * @param args the command line arguments + * @throws java.lang.Exception + */ + public static void main(String[] args) throws Exception { + + File packFile = new File("tiny.pack"); + boolean isNPVersion = isNonProductVersion(); + + // Create a good pack file and test if everything is ok + createPackFile(true, packFile); + TestResult tr = runUnpacker(packFile); + tr.setDescription("a good pack file"); + tr.checkPositive(); + tr.isOK(); + System.out.println(tr); + + /* + * jprt systems on windows and linux seem to have abundant memory + * therefore can take a very long time to run, and even if it does + * the error message is not accurate for us to discern if the test + * passess successfully. + */ + if (SIXTYFOUR_BIT && (LINUX || WINDOWS)) { + System.out.println("Warning: Windows/Linux 64bit tests passes vacuously"); + return; + } + + /* + * debug builds call abort, the exit code under these conditions + * are not really relevant. + */ + if (isNPVersion) { + System.out.println("Warning: non-product build: exit values not checked"); + } + + // create a bad pack file + createPackFile(false, packFile); + tr = runUnpacker(packFile); + tr.setDescription("a wicked pack file"); + tr.contains("Native allocation failed"); + if(!isNPVersion) { + tr.checkValue(EXPECTED_EXIT_CODE); + } + System.out.println(tr); + int value = modifyPackFile(packFile); + tr.setDescription("value=" + value); + + // continue creating bad pack files by modifying the specimen pack file. + while (value >= 0xc0) { + tr = runUnpacker(packFile); + tr.contains("Native allocation failed"); + if (!isNPVersion) { + tr.checkValue(EXPECTED_EXIT_CODE); + } + tr.setDescription("wicked value=0x" + + Integer.toHexString(value & 0xFF)); + System.out.println(tr); + value = modifyPackFile(packFile); + } + if (testExitValue != 0) { + throw new Exception("Pack200 archive length tests(" + + testExitValue + ") failed "); + } else { + System.out.println("All tests pass"); + } + } + + /* + * A class to encapsulate the test results and stuff, with some ease + * of use methods to check the test results. + */ + static class TestResult { + + StringBuilder status; + int exitValue; + List testOutput; + String description; + + public TestResult(String str, int rv, List oList) { + status = new StringBuilder(str); + exitValue = rv; + testOutput = oList; + } + + void setDescription(String description) { + this.description = description; + } + + void checkValue(int value) { + if (exitValue != value) { + status = + status.append(" Error: test expected exit value " + + value + "got " + exitValue); + testExitValue++; + } + } + + void checkNegative() { + if (exitValue == 0) { + status = status.append( + " Error: test did not expect 0 exit value"); + + testExitValue++; + } + } + + void checkPositive() { + if (exitValue != 0) { + status = status.append( + " Error: test did not return 0 exit value"); + testExitValue++; + } + } + + boolean isOK() { + return exitValue == 0; + } + + boolean isZeroOutput() { + if (!testOutput.isEmpty()) { + status = status.append(" Error: No message from cmd please"); + testExitValue++; + return false; + } + return true; + } + + boolean isNotZeroOutput() { + if (testOutput.isEmpty()) { + status = status.append(" Error: Missing message"); + testExitValue++; + return false; + } + return true; + } + + public String toString() { + if (debug) { + for (String x : testOutput) { + status = status.append(x + "\n"); + } + } + if (description != null) { + status.insert(0, description); + } + return status.append("\nexitValue = " + exitValue).toString(); + } + + boolean contains(String str) { + for (String x : testOutput) { + if (x.contains(str)) { + return true; + } + } + status = status.append(" Error: string <" + str + "> not found "); + testExitValue++; + return false; + } + } +} From b44236abdf1aea0dbd9fdcf04fe621c5dd7117e3 Mon Sep 17 00:00:00 2001 From: Andrew Brygin Date: Wed, 3 Dec 2008 13:34:50 +0300 Subject: [PATCH 008/292] 6766136: corrupted gif image may cause crash in java splashscreen library Reviewed-by: prr, art --- .../awt/splashscreen/splashscreen_gfx_impl.h | 2 +- .../sun/awt/splashscreen/splashscreen_gif.c | 92 +++++++++++++++---- 2 files changed, 76 insertions(+), 18 deletions(-) diff --git a/jdk/src/share/native/sun/awt/splashscreen/splashscreen_gfx_impl.h b/jdk/src/share/native/sun/awt/splashscreen/splashscreen_gfx_impl.h index 1c55702fe73..32f7d4e2e47 100644 --- a/jdk/src/share/native/sun/awt/splashscreen/splashscreen_gfx_impl.h +++ b/jdk/src/share/native/sun/awt/splashscreen/splashscreen_gfx_impl.h @@ -31,7 +31,7 @@ /* here come some very simple macros */ /* advance a pointer p by sizeof(type)*n bytes */ -#define INCPN(type,p,n) ((p) = (type*)(p)+n) +#define INCPN(type,p,n) ((p) = (type*)(p)+(n)) /* advance a pointer by sizeof(type) */ #define INCP(type,p) INCPN(type,(p),1) diff --git a/jdk/src/share/native/sun/awt/splashscreen/splashscreen_gif.c b/jdk/src/share/native/sun/awt/splashscreen/splashscreen_gif.c index f6d9acb0c36..71bc3a3b39d 100644 --- a/jdk/src/share/native/sun/awt/splashscreen/splashscreen_gif.c +++ b/jdk/src/share/native/sun/awt/splashscreen/splashscreen_gif.c @@ -53,6 +53,10 @@ static const char szNetscape20ext[11] = "NETSCAPE2.0"; // convert libungif samples to our ones #define MAKE_QUAD_GIF(c,a) MAKE_QUAD((c).Red, (c).Green, (c).Blue, (a)) +#define SAFE_TO_ALLOC(c, sz) \ + (((c) > 0) && ((sz) > 0) && \ + ((0xffffffffu / ((unsigned int)(c))) > (unsigned int)(sz))) + /* stdio FILE* and memory input functions for libungif */ int SplashStreamGifInputFunc(GifFileType * gif, GifByteType * buf, int n) @@ -62,6 +66,15 @@ SplashStreamGifInputFunc(GifFileType * gif, GifByteType * buf, int n) return rc; } +/* These macro help to ensure that we only take part of frame that fits into + logical screen. */ + +/* Ensure that p belongs to [pmin, pmax) interval. Returns fixed point (if fix is needed) */ +#define FIX_POINT(p, pmin, pmax) ( ((p) < (pmin)) ? (pmin) : (((p) > (pmax)) ? (pmax) : (p))) +/* Ensures that line starting at point p does not exceed boundary pmax. + Returns fixed length (if fix is needed) */ +#define FIX_LENGTH(p, len, pmax) ( ((p) + (len)) > (pmax) ? ((pmax) - (p)) : (len)) + int SplashDecodeGif(Splash * splash, GifFileType * gif) { @@ -70,6 +83,7 @@ SplashDecodeGif(Splash * splash, GifFileType * gif) byte_t *pBitmapBits, *pOldBitmapBits; int i, j; int imageIndex; + int cx, cy, cw, ch; /* clamped coordinates */ const int interlacedOffset[] = { 0, 4, 2, 1, 0 }; /* The way Interlaced image should. */ const int interlacedJumps[] = { 8, 8, 4, 2, 1 }; /* be read - offsets and jumps... */ @@ -79,14 +93,31 @@ SplashDecodeGif(Splash * splash, GifFileType * gif) SplashCleanup(splash); + if (!SAFE_TO_ALLOC(gif->SWidth, splash->imageFormat.depthBytes)) { + return 0; + } stride = gif->SWidth * splash->imageFormat.depthBytes; if (splash->byteAlignment > 1) stride = (stride + splash->byteAlignment - 1) & ~(splash->byteAlignment - 1); + if (!SAFE_TO_ALLOC(gif->SHeight, stride)) { + return 0; + } + + if (!SAFE_TO_ALLOC(gif->ImageCount, sizeof(SplashImage*))) { + return 0; + } bufferSize = stride * gif->SHeight; pBitmapBits = (byte_t *) malloc(bufferSize); + if (!pBitmapBits) { + return 0; + } pOldBitmapBits = (byte_t *) malloc(bufferSize); + if (!pOldBitmapBits) { + free(pBitmapBits); + return 0; + } memset(pBitmapBits, 0, bufferSize); splash->width = gif->SWidth; @@ -94,6 +125,11 @@ SplashDecodeGif(Splash * splash, GifFileType * gif) splash->frameCount = gif->ImageCount; splash->frames = (SplashImage *) malloc(sizeof(SplashImage) * gif->ImageCount); + if (!splash->frames) { + free(pBitmapBits); + free(pOldBitmapBits); + return 0; + } memset(splash->frames, 0, sizeof(SplashImage) * gif->ImageCount); splash->loopCount = 1; @@ -109,6 +145,11 @@ SplashDecodeGif(Splash * splash, GifFileType * gif) int colorCount = 0; rgbquad_t colorMapBuf[SPLASH_COLOR_MAP_SIZE]; + cx = FIX_POINT(desc->Left, 0, gif->SWidth); + cy = FIX_POINT(desc->Top, 0, gif->SHeight); + cw = FIX_LENGTH(desc->Left, desc->Width, gif->SWidth); + ch = FIX_LENGTH(desc->Top, desc->Height, gif->SHeight); + if (colorMap) { if (colorMap->ColorCount <= SPLASH_COLOR_MAP_SIZE) { colorCount = colorMap->ColorCount; @@ -195,13 +236,22 @@ SplashDecodeGif(Splash * splash, GifFileType * gif) for (; pass < npass; ++pass) { int jump = interlacedJumps[pass]; int ofs = interlacedOffset[pass]; - int numLines = (desc->Height + jump - 1 - ofs) / jump; + /* Number of source lines for current pass */ + int numPassLines = (desc->Height + jump - ofs - 1) / jump; + /* Number of lines that fits to dest buffer */ + int numLines = (ch + jump - ofs - 1) / jump; initRect(&srcRect, 0, 0, desc->Width, numLines, 1, desc->Width, pSrc, &srcFormat); - initRect(&dstRect, desc->Left, desc->Top + ofs, desc->Width, - numLines, jump, stride, pBitmapBits, &splash->imageFormat); - pSrc += convertRect(&srcRect, &dstRect, CVT_ALPHATEST); + + if (numLines > 0) { + initRect(&dstRect, cx, cy + ofs, cw, + numLines , jump, stride, pBitmapBits, &splash->imageFormat); + + pSrc += convertRect(&srcRect, &dstRect, CVT_ALPHATEST); + } + // skip extra source data + pSrc += (numPassLines - numLines) * srcRect.stride; } } @@ -209,6 +259,12 @@ SplashDecodeGif(Splash * splash, GifFileType * gif) splash->frames[imageIndex].bitmapBits = (rgbquad_t *) malloc(bufferSize); + if (!splash->frames[imageIndex].bitmapBits) { + free(pBitmapBits); + free(pOldBitmapBits); + /* Assuming that callee will take care of splash frames we have already allocated */ + return 0; + } memcpy(splash->frames[imageIndex].bitmapBits, pBitmapBits, bufferSize); SplashInitFrameShape(splash, imageIndex); @@ -224,27 +280,29 @@ SplashDecodeGif(Splash * splash, GifFileType * gif) { ImageRect dstRect; rgbquad_t fillColor = 0; // 0 is transparent - if (transparentColor < 0) { + + if (transparentColor > 0) { fillColor= MAKE_QUAD_GIF( colorMap->Colors[gif->SBackGroundColor], 0xff); } - initRect(&dstRect, desc->Left, desc->Top, - desc->Width, desc->Height, 1, stride, - pBitmapBits, &splash->imageFormat); + initRect(&dstRect, + cx, cy, cw, ch, + 1, stride, + pBitmapBits, &splash->imageFormat); fillRect(fillColor, &dstRect); } break; case GIF_DISPOSE_RESTORE: { - - int lineSize = desc->Width * splash->imageFormat.depthBytes; - - for (j = 0; j < desc->Height; j++) { - int lineIndex = stride * (j + desc->Top) + - desc->Left * splash->imageFormat.depthBytes; - - memcpy(pBitmapBits + lineIndex, pOldBitmapBits + lineIndex, - lineSize); + int lineSize = cw * splash->imageFormat.depthBytes; + if (lineSize > 0) { + int lineOffset = cx * splash->imageFormat.depthBytes; + int lineIndex = cy * stride + lineOffset; + for (j=0; j Date: Fri, 12 Dec 2008 17:38:14 +0300 Subject: [PATCH 009/292] 5106550: PNG writer merge standard metadata fails for TextEntry sans #IMPLIED attributes Reviewed-by: igor, prr --- .../sun/imageio/plugins/png/PNGMetadata.java | 93 +++++++++++++------ .../plugins/png/MergeStdCommentTest.java | 64 +++++++++++++ 2 files changed, 131 insertions(+), 26 deletions(-) create mode 100644 jdk/test/javax/imageio/plugins/png/MergeStdCommentTest.java diff --git a/jdk/src/share/classes/com/sun/imageio/plugins/png/PNGMetadata.java b/jdk/src/share/classes/com/sun/imageio/plugins/png/PNGMetadata.java index 5475fc79651..23281fe5330 100644 --- a/jdk/src/share/classes/com/sun/imageio/plugins/png/PNGMetadata.java +++ b/jdk/src/share/classes/com/sun/imageio/plugins/png/PNGMetadata.java @@ -1040,7 +1040,7 @@ public class PNGMetadata extends IIOMetadata implements Cloneable { node.setAttribute("language", iTXt_languageTag.get(i)); if (iTXt_compressionFlag.get(i)) { - node.setAttribute("compression", "deflate"); + node.setAttribute("compression", "zip"); } else { node.setAttribute("compression", "none"); } @@ -1052,7 +1052,7 @@ public class PNGMetadata extends IIOMetadata implements Cloneable { node = new IIOMetadataNode("TextEntry"); node.setAttribute("keyword", (String)zTXt_keyword.get(i)); node.setAttribute("value", (String)zTXt_text.get(i)); - node.setAttribute("compression", "deflate"); + node.setAttribute("compression", "zip"); text_node.appendChild(node); } @@ -1421,26 +1421,30 @@ public class PNGMetadata extends IIOMetadata implements Cloneable { } String keyword = getAttribute(iTXt_node, "keyword"); - iTXt_keyword.add(keyword); + if (isValidKeyword(keyword)) { + iTXt_keyword.add(keyword); - boolean compressionFlag = - getBooleanAttribute(iTXt_node, "compressionFlag"); - iTXt_compressionFlag.add(Boolean.valueOf(compressionFlag)); + boolean compressionFlag = + getBooleanAttribute(iTXt_node, "compressionFlag"); + iTXt_compressionFlag.add(Boolean.valueOf(compressionFlag)); - String compressionMethod = - getAttribute(iTXt_node, "compressionMethod"); - iTXt_compressionMethod.add(Integer.valueOf(compressionMethod)); + String compressionMethod = + getAttribute(iTXt_node, "compressionMethod"); + iTXt_compressionMethod.add(Integer.valueOf(compressionMethod)); - String languageTag = - getAttribute(iTXt_node, "languageTag"); - iTXt_languageTag.add(languageTag); + String languageTag = + getAttribute(iTXt_node, "languageTag"); + iTXt_languageTag.add(languageTag); - String translatedKeyword = - getAttribute(iTXt_node, "translatedKeyword"); - iTXt_translatedKeyword.add(translatedKeyword); + String translatedKeyword = + getAttribute(iTXt_node, "translatedKeyword"); + iTXt_translatedKeyword.add(translatedKeyword); - String text = getAttribute(iTXt_node, "text"); - iTXt_text.add(text); + String text = getAttribute(iTXt_node, "text"); + iTXt_text.add(text); + + } + // silently skip invalid text entry iTXt_node = iTXt_node.getNextSibling(); } @@ -1692,11 +1696,45 @@ public class PNGMetadata extends IIOMetadata implements Cloneable { } } - private boolean isISOLatin(String s) { + /* + * Accrding to PNG spec, keywords are restricted to 1 to 79 bytes + * in length. Keywords shall contain only printable Latin-1 characters + * and spaces; To reduce the chances for human misreading of a keyword, + * leading spaces, trailing spaces, and consecutive spaces are not + * permitted in keywords. + * + * See: http://www.w3.org/TR/PNG/#11keywords + */ + private boolean isValidKeyword(String s) { + int len = s.length(); + if (len < 1 || len >= 80) { + return false; + } + if (s.startsWith(" ") || s.endsWith(" ") || s.contains(" ")) { + return false; + } + return isISOLatin(s, false); + } + + /* + * According to PNG spec, keyword shall contain only printable + * Latin-1 [ISO-8859-1] characters and spaces; that is, only + * character codes 32-126 and 161-255 decimal are allowed. + * For Latin-1 value fields the 0x10 (linefeed) control + * character is aloowed too. + * + * See: http://www.w3.org/TR/PNG/#11keywords + */ + private boolean isISOLatin(String s, boolean isLineFeedAllowed) { int len = s.length(); for (int i = 0; i < len; i++) { - if (s.charAt(i) > 255) { - return false; + char c = s.charAt(i); + if (c < 32 || c > 255 || (c > 126 && c < 161)) { + // not printable. Check whether this is an allowed + // control char + if (!isLineFeedAllowed || c != 0x10) { + return false; + } } } return true; @@ -1929,19 +1967,22 @@ public class PNGMetadata extends IIOMetadata implements Cloneable { while (child != null) { String childName = child.getNodeName(); if (childName.equals("TextEntry")) { - String keyword = getAttribute(child, "keyword"); + String keyword = + getAttribute(child, "keyword", "", false); String value = getAttribute(child, "value"); - String encoding = getAttribute(child, "encoding"); - String language = getAttribute(child, "language"); + String language = + getAttribute(child, "language", "", false); String compression = - getAttribute(child, "compression"); + getAttribute(child, "compression", "none", false); - if (isISOLatin(value)) { + if (!isValidKeyword(keyword)) { + // Just ignore this node, PNG requires keywords + } else if (isISOLatin(value, true)) { if (compression.equals("zip")) { // Use a zTXt node zTXt_keyword.add(keyword); zTXt_text.add(value); - zTXt_compressionMethod.add(new Integer(0)); + zTXt_compressionMethod.add(Integer.valueOf(0)); } else { // Use a tEXt node tEXt_keyword.add(keyword); diff --git a/jdk/test/javax/imageio/plugins/png/MergeStdCommentTest.java b/jdk/test/javax/imageio/plugins/png/MergeStdCommentTest.java new file mode 100644 index 00000000000..21a7c5f10d0 --- /dev/null +++ b/jdk/test/javax/imageio/plugins/png/MergeStdCommentTest.java @@ -0,0 +1,64 @@ +/* + * Copyright 2008 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 5106550 + * @summary Merge a comment using the standard metdata format + * and only a minimal set of attributes + */ + +import java.awt.image.BufferedImage; +import javax.imageio.ImageIO; +import javax.imageio.ImageTypeSpecifier; +import javax.imageio.ImageWriter; +import javax.imageio.metadata.IIOMetadata; +import org.w3c.dom.DOMImplementation; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.bootstrap.DOMImplementationRegistry; + +public class MergeStdCommentTest { + + public static void main(String[] args) throws Exception { + String format = "javax_imageio_1.0"; + BufferedImage img = + new BufferedImage(16, 16, BufferedImage.TYPE_INT_RGB); + ImageWriter iw = ImageIO.getImageWritersByMIMEType("image/png").next(); + IIOMetadata meta = + iw.getDefaultImageMetadata(new ImageTypeSpecifier(img), null); + DOMImplementationRegistry registry; + registry = DOMImplementationRegistry.newInstance(); + DOMImplementation impl = registry.getDOMImplementation("XML 3.0"); + Document doc = impl.createDocument(null, format, null); + Element root, text, entry; + root = doc.getDocumentElement(); + root.appendChild(text = doc.createElement("Text")); + text.appendChild(entry = doc.createElement("TextEntry")); + // keyword isn't #REQUIRED by the standard metadata format. + // However, it is required by the PNG format, so we include it here. + entry.setAttribute("keyword", "Comment"); + entry.setAttribute("value", "Some demo comment"); + meta.mergeTree(format, root); + } +} From 8848b3ab632432de85c70173dc26a4bdc2790479 Mon Sep 17 00:00:00 2001 From: Igor Nekrestyanov Date: Wed, 17 Dec 2008 22:00:37 +0300 Subject: [PATCH 010/292] 6761791: Crash in the FontManager code due to use of JNIEnv saved by another thread Reviewed-by: bae, prr --- .../share/native/sun/font/freetypeScaler.c | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/jdk/src/share/native/sun/font/freetypeScaler.c b/jdk/src/share/native/sun/font/freetypeScaler.c index 59c1a180c29..4028d4d97c4 100644 --- a/jdk/src/share/native/sun/font/freetypeScaler.c +++ b/jdk/src/share/native/sun/font/freetypeScaler.c @@ -394,12 +394,14 @@ static int setupFTContext(JNIEnv *env, scalerInfo->env = env; scalerInfo->font2D = font2D; - FT_Set_Transform(scalerInfo->face, &context->transform, NULL); + if (context != NULL) { + FT_Set_Transform(scalerInfo->face, &context->transform, NULL); - errCode = FT_Set_Char_Size(scalerInfo->face, 0, context->ptsz, 72, 72); + errCode = FT_Set_Char_Size(scalerInfo->face, 0, context->ptsz, 72, 72); - if (errCode == 0) { - errCode = FT_Activate_Size(scalerInfo->face->size); + if (errCode == 0) { + errCode = FT_Activate_Size(scalerInfo->face->size); + } } return errCode; @@ -885,6 +887,14 @@ Java_sun_font_FreetypeFontScaler_disposeNativeScaler( JNIEnv *env, jobject scaler, jlong pScaler) { FTScalerInfo* scalerInfo = (FTScalerInfo *) jlong_to_ptr(pScaler); + /* Freetype functions *may* cause callback to java + that can use cached values. Make sure our cache is up to date. + NB: scaler context is not important at this point, can use NULL. */ + int errCode = setupFTContext(env, scaler, scalerInfo, NULL); + if (errCode) { + return; + } + freeNativeResources(env, scalerInfo); } @@ -932,12 +942,21 @@ Java_sun_font_FreetypeFontScaler_getGlyphCodeNative( JNIEnv *env, jobject scaler, jlong pScaler, jchar charCode) { FTScalerInfo* scalerInfo = (FTScalerInfo *) jlong_to_ptr(pScaler); + int errCode; if (scaler == NULL || scalerInfo->face == NULL) { /* bad/null scaler */ invalidateJavaScaler(env, scaler, scalerInfo); return 0; } + /* Freetype functions *may* cause callback to java + that can use cached values. Make sure our cache is up to date. + Scaler context is not important here, can use NULL. */ + errCode = setupFTContext(env, scaler, scalerInfo, NULL); + if (errCode) { + return 0; + } + return FT_Get_Char_Index(scalerInfo->face, charCode); } From 5b1de891b340083d3bc451e8c56c318634193994 Mon Sep 17 00:00:00 2001 From: Phil Race Date: Thu, 18 Dec 2008 11:25:09 -0800 Subject: [PATCH 011/292] 6708137: Remove obsolete fontconfig.98.properties from JDK 7 Reviewed-by: jgodinez, naoto --- jdk/make/sun/awt/Makefile | 3 +- .../sun/awt/windows/WFontConfiguration.java | 16 +- .../sun/awt/windows/fontconfig.98.properties | 241 ------------------ .../sun/awt/windows/fontconfig.Me.properties | 241 ------------------ 4 files changed, 5 insertions(+), 496 deletions(-) delete mode 100644 jdk/src/windows/classes/sun/awt/windows/fontconfig.98.properties delete mode 100644 jdk/src/windows/classes/sun/awt/windows/fontconfig.Me.properties diff --git a/jdk/make/sun/awt/Makefile b/jdk/make/sun/awt/Makefile index ed35dcd2bdf..3f9fa64eb11 100644 --- a/jdk/make/sun/awt/Makefile +++ b/jdk/make/sun/awt/Makefile @@ -333,8 +333,7 @@ ifeq ($(PLATFORM), windows) FONTCONFIGS_SRC = $(PLATFORM_SRC)/classes/sun/awt/windows _FONTCONFIGS = \ - fontconfig.properties \ - fontconfig.98.properties + fontconfig.properties FONTCONFIGS_SRC_PREFIX = diff --git a/jdk/src/windows/classes/sun/awt/windows/WFontConfiguration.java b/jdk/src/windows/classes/sun/awt/windows/WFontConfiguration.java index 4f2f8324ae4..2c7b00124a7 100644 --- a/jdk/src/windows/classes/sun/awt/windows/WFontConfiguration.java +++ b/jdk/src/windows/classes/sun/awt/windows/WFontConfiguration.java @@ -61,18 +61,10 @@ public class WFontConfiguration extends FontConfiguration { * been opened and its fonts loaded. * Also note this usage is only enabled if a private flag is set. */ - if ("98".equals(osName) || "Me".equals(osName)) { - localeMap.put("dialoginput.plain.japanese", "\uff2d\uff33 \u660e\u671d"); - localeMap.put("dialoginput.bold.japanese", "\uff2d\uff33 \u660e\u671d"); - localeMap.put("dialoginput.italic.japanese", "\uff2d\uff33 \u660e\u671d"); - localeMap.put("dialoginput.bolditalic.japanese", "\uff2d\uff33 \u660e\u671d"); - } else { - - localeMap.put("dialoginput.plain.japanese", "MS Mincho"); - localeMap.put("dialoginput.bold.japanese", "MS Mincho"); - localeMap.put("dialoginput.italic.japanese", "MS Mincho"); - localeMap.put("dialoginput.bolditalic.japanese", "MS Mincho"); - } + localeMap.put("dialoginput.plain.japanese", "MS Mincho"); + localeMap.put("dialoginput.bold.japanese", "MS Mincho"); + localeMap.put("dialoginput.italic.japanese", "MS Mincho"); + localeMap.put("dialoginput.bolditalic.japanese", "MS Mincho"); } reorderMap = new HashMap(); reorderMap.put("UTF-8.hi", "devanagari"); diff --git a/jdk/src/windows/classes/sun/awt/windows/fontconfig.98.properties b/jdk/src/windows/classes/sun/awt/windows/fontconfig.98.properties deleted file mode 100644 index 8d69d410e25..00000000000 --- a/jdk/src/windows/classes/sun/awt/windows/fontconfig.98.properties +++ /dev/null @@ -1,241 +0,0 @@ -# -# -# Copyright 2003-2004 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. -# - -# Version - -version=1 - -# Component Font Mappings - -allfonts.chinese-ms936=SimSun -allfonts.dingbats=Wingdings -allfonts.lucida=Lucida Sans Regular -allfonts.symbol=Symbol -allfonts.thai=Lucida Sans Regular - -serif.plain.alphabetic=Times New Roman -serif.plain.chinese-ms950=MingLiU -serif.plain.hebrew=David -serif.plain.japanese=\uff2d\uff33 \u660e\u671d -serif.plain.korean=Batang - -serif.bold.alphabetic=Times New Roman Bold -serif.bold.chinese-ms950=PMingLiU -serif.bold.hebrew=David Bold -serif.bold.japanese=\uff2d\uff33 \u660e\u671d -serif.bold.korean=Batang - -serif.italic.alphabetic=Times New Roman Italic -serif.italic.chinese-ms950=PMingLiU -serif.italic.hebrew=David -serif.italic.japanese=\uff2d\uff33 \u660e\u671d -serif.italic.korean=Batang - -serif.bolditalic.alphabetic=Times New Roman Bold Italic -serif.bolditalic.chinese-ms950=PMingLiU -serif.bolditalic.hebrew=David Bold -serif.bolditalic.japanese=\uff2d\uff33 \u660e\u671d -serif.bolditalic.korean=Batang - -sansserif.plain.alphabetic=Arial -sansserif.plain.chinese-ms950=MingLiU -sansserif.plain.hebrew=David -sansserif.plain.japanese=\uff2d\uff33 \u30b4\u30b7\u30c3\u30af -sansserif.plain.korean=Gulim - -sansserif.bold.alphabetic=Arial Bold -sansserif.bold.chinese-ms950=PMingLiU -sansserif.bold.hebrew=David Bold -sansserif.bold.japanese=\uff2d\uff33 \u30b4\u30b7\u30c3\u30af -sansserif.bold.korean=Gulim - -sansserif.italic.alphabetic=Arial Italic -sansserif.italic.chinese-ms950=PMingLiU -sansserif.italic.hebrew=David -sansserif.italic.japanese=\uff2d\uff33 \u30b4\u30b7\u30c3\u30af -sansserif.italic.korean=Gulim - -sansserif.bolditalic.alphabetic=Arial Bold Italic -sansserif.bolditalic.chinese-ms950=PMingLiU -sansserif.bolditalic.hebrew=David Bold -sansserif.bolditalic.japanese=\uff2d\uff33 \u30b4\u30b7\u30c3\u30af -sansserif.bolditalic.korean=Gulim - -monospaced.plain.alphabetic=Courier New -monospaced.plain.chinese-ms950=MingLiU -monospaced.plain.hebrew=David -monospaced.plain.japanese=\uff2d\uff33 \u30b4\u30b7\u30c3\u30af -monospaced.plain.korean=GulimChe - -monospaced.bold.alphabetic=Courier New Bold -monospaced.bold.chinese-ms950=PMingLiU -monospaced.bold.hebrew=David Bold -monospaced.bold.japanese=\uff2d\uff33 \u30b4\u30b7\u30c3\u30af -monospaced.bold.korean=GulimChe - -monospaced.italic.alphabetic=Courier New Italic -monospaced.italic.chinese-ms950=PMingLiU -monospaced.italic.hebrew=David -monospaced.italic.japanese=\uff2d\uff33 \u30b4\u30b7\u30c3\u30af -monospaced.italic.korean=GulimChe - -monospaced.bolditalic.alphabetic=Courier New Bold Italic -monospaced.bolditalic.chinese-ms950=PMingLiU -monospaced.bolditalic.hebrew=David Bold -monospaced.bolditalic.japanese=\uff2d\uff33 \u30b4\u30b7\u30c3\u30af -monospaced.bolditalic.korean=GulimChe - -dialog.plain.alphabetic=Arial -dialog.plain.chinese-ms950=MingLiU -dialog.plain.hebrew=David -dialog.plain.japanese=\uff2d\uff33 \u30b4\u30b7\u30c3\u30af -dialog.plain.korean=Gulim - -dialog.bold.alphabetic=Arial Bold -dialog.bold.chinese-ms950=PMingLiU -dialog.bold.hebrew=David Bold -dialog.bold.japanese=\uff2d\uff33 \u30b4\u30b7\u30c3\u30af -dialog.bold.korean=Gulim - -dialog.italic.alphabetic=Arial Italic -dialog.italic.chinese-ms950=PMingLiU -dialog.italic.hebrew=David -dialog.italic.japanese=\uff2d\uff33 \u30b4\u30b7\u30c3\u30af -dialog.italic.korean=Gulim - -dialog.bolditalic.alphabetic=Arial Bold Italic -dialog.bolditalic.chinese-ms950=PMingLiU -dialog.bolditalic.hebrew=David Bold -dialog.bolditalic.japanese=\uff2d\uff33 \u30b4\u30b7\u30c3\u30af -dialog.bolditalic.korean=Gulim - -dialoginput.plain.alphabetic=Courier New -dialoginput.plain.chinese-ms950=MingLiU -dialoginput.plain.hebrew=David -dialoginput.plain.japanese=\uff2d\uff33 \u30b4\u30b7\u30c3\u30af -dialoginput.plain.korean=Gulim - -dialoginput.bold.alphabetic=Courier New Bold -dialoginput.bold.chinese-ms950=PMingLiU -dialoginput.bold.hebrew=David Bold -dialoginput.bold.japanese=\uff2d\uff33 \u30b4\u30b7\u30c3\u30af -dialoginput.bold.korean=Gulim - -dialoginput.italic.alphabetic=Courier New Italic -dialoginput.italic.chinese-ms950=PMingLiU -dialoginput.italic.hebrew=David -dialoginput.italic.japanese=\uff2d\uff33 \u30b4\u30b7\u30c3\u30af -dialoginput.italic.korean=Gulim - -dialoginput.bolditalic.alphabetic=Courier New Bold Italic -dialoginput.bolditalic.chinese-ms950=PMingLiU -dialoginput.bolditalic.hebrew=David Bold -dialoginput.bolditalic.japanese=\uff2d\uff33 \u30b4\u30b7\u30c3\u30af -dialoginput.bolditalic.korean=Gulim - -# Search Sequences - -sequence.allfonts=alphabetic/default,dingbats,symbol - -sequence.serif.GBK=alphabetic/1252,chinese-ms936,dingbats,symbol -sequence.sansserif.GBK=alphabetic/1252,chinese-ms936,dingbats,symbol -sequence.monospaced.GBK=chinese-ms936,alphabetic/1252,dingbats,symbol -sequence.dialog.GBK=alphabetic/1252,chinese-ms936,dingbats,symbol -sequence.dialoginput.GBK=alphabetic/1252,chinese-ms936,dingbats,symbol - -sequence.serif.x-windows-950=alphabetic/1252,chinese-ms950,dingbats,symbol -sequence.sansserif.x-windows-950=alphabetic/1252,chinese-ms950,dingbats,symbol -sequence.monospaced.x-windows-950=chinese-ms950,alphabetic/1252,dingbats,symbol -sequence.dialog.x-windows-950=alphabetic/1252,chinese-ms950,dingbats,symbol -sequence.dialoginput.x-windows-950=alphabetic/1252,chinese-ms950,dingbats,symbol - -sequence.allfonts.windows-1255=hebrew,alphabetic/1252,dingbats,symbol - -sequence.serif.windows-31j=alphabetic/1252,japanese,dingbats,symbol -sequence.sansserif.windows-31j=alphabetic/1252,japanese,dingbats,symbol -sequence.monospaced.windows-31j=japanese,alphabetic/1252,dingbats,symbol -sequence.dialog.windows-31j=alphabetic/1252,japanese,dingbats,symbol -sequence.dialoginput.windows-31j=alphabetic/1252,japanese,dingbats,symbol - -sequence.serif.x-windows-949=alphabetic/1252,korean,dingbats,symbol -sequence.sansserif.x-windows-949=alphabetic/1252,korean,dingbats,symbol -sequence.monospaced.x-windows-949=korean,alphabetic/1252,dingbats,symbol -sequence.dialog.x-windows-949=alphabetic/1252,korean,dingbats,symbol -sequence.dialoginput.x-windows-949=alphabetic/1252,korean,dingbats,symbol - -sequence.allfonts.x-windows-874=alphabetic/1252,thai,dingbats,symbol - -sequence.fallback=lucida - -# Exclusion Ranges - -exclusion.alphabetic=0700-1e9f,1f00-20ab,20ad-f8ff -exclusion.hebrew=0041-005a,0060-007a,007f-00ff,20ac-20ac - -# Monospaced to Proportional width variant mapping -# (Experimental private syntax) -proportional.\uff2d\uff33_\u30b4\u30b7\u30c3\u30af=\uff2d\uff33 \uff30\u30b4\u30b7\u30c3\u30af -proportional.\uff2d\uff33_\u660e\u671d=\uff2d\uff33 \uff30\u660e\u671d -proportional.MingLiU=PMingLiU - -# Font File Names - -filename.Arial=ARIAL.TTF -filename.Arial_Bold=ARIALBD.TTF -filename.Arial_Italic=ARIALI.TTF -filename.Arial_Bold_Italic=ARIALBI.TTF - -filename.Courier_New=COUR.TTF -filename.Courier_New_Bold=COURBD.TTF -filename.Courier_New_Italic=COURI.TTF -filename.Courier_New_Bold_Italic=COURBI.TTF - -filename.Times_New_Roman=TIMES.TTF -filename.Times_New_Roman_Bold=TIMESBD.TTF -filename.Times_New_Roman_Italic=TIMESI.TTF -filename.Times_New_Roman_Bold_Italic=TIMESBI.TTF - -filename.SimSun=SIMSUN.TTF - -filename.MingLiU=MINGLIU.TTC -filename.PMingLiU=MINGLIU.TTC - -filename.David=DAVID.TTF -filename.David_Bold=DAVIDBD.TTF - -filename.\uff2d\uff33_\u660e\u671d=MSMINCHO.TTC -filename.\uff2d\uff33_\uff30\u660e\u671d=MSMINCHO.TTC -filename.\uff2d\uff33_\u30b4\u30b7\u30c3\u30af=MSGOTHIC.TTC -filename.\uff2d\uff33_\uff30\u30b4\u30b7\u30c3\u30af=MSGOTHIC.TTC - -filename.Gulim=gulim.TTC -filename.Batang=batang.TTC -filename.GulimChe=gulim.TTC - -filename.Lucida_Sans_Regular=LucidaSansRegular.ttf -filename.Symbol=SYMBOL.TTF -filename.Wingdings=WINGDING.TTF - diff --git a/jdk/src/windows/classes/sun/awt/windows/fontconfig.Me.properties b/jdk/src/windows/classes/sun/awt/windows/fontconfig.Me.properties deleted file mode 100644 index 8d69d410e25..00000000000 --- a/jdk/src/windows/classes/sun/awt/windows/fontconfig.Me.properties +++ /dev/null @@ -1,241 +0,0 @@ -# -# -# Copyright 2003-2004 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. -# - -# Version - -version=1 - -# Component Font Mappings - -allfonts.chinese-ms936=SimSun -allfonts.dingbats=Wingdings -allfonts.lucida=Lucida Sans Regular -allfonts.symbol=Symbol -allfonts.thai=Lucida Sans Regular - -serif.plain.alphabetic=Times New Roman -serif.plain.chinese-ms950=MingLiU -serif.plain.hebrew=David -serif.plain.japanese=\uff2d\uff33 \u660e\u671d -serif.plain.korean=Batang - -serif.bold.alphabetic=Times New Roman Bold -serif.bold.chinese-ms950=PMingLiU -serif.bold.hebrew=David Bold -serif.bold.japanese=\uff2d\uff33 \u660e\u671d -serif.bold.korean=Batang - -serif.italic.alphabetic=Times New Roman Italic -serif.italic.chinese-ms950=PMingLiU -serif.italic.hebrew=David -serif.italic.japanese=\uff2d\uff33 \u660e\u671d -serif.italic.korean=Batang - -serif.bolditalic.alphabetic=Times New Roman Bold Italic -serif.bolditalic.chinese-ms950=PMingLiU -serif.bolditalic.hebrew=David Bold -serif.bolditalic.japanese=\uff2d\uff33 \u660e\u671d -serif.bolditalic.korean=Batang - -sansserif.plain.alphabetic=Arial -sansserif.plain.chinese-ms950=MingLiU -sansserif.plain.hebrew=David -sansserif.plain.japanese=\uff2d\uff33 \u30b4\u30b7\u30c3\u30af -sansserif.plain.korean=Gulim - -sansserif.bold.alphabetic=Arial Bold -sansserif.bold.chinese-ms950=PMingLiU -sansserif.bold.hebrew=David Bold -sansserif.bold.japanese=\uff2d\uff33 \u30b4\u30b7\u30c3\u30af -sansserif.bold.korean=Gulim - -sansserif.italic.alphabetic=Arial Italic -sansserif.italic.chinese-ms950=PMingLiU -sansserif.italic.hebrew=David -sansserif.italic.japanese=\uff2d\uff33 \u30b4\u30b7\u30c3\u30af -sansserif.italic.korean=Gulim - -sansserif.bolditalic.alphabetic=Arial Bold Italic -sansserif.bolditalic.chinese-ms950=PMingLiU -sansserif.bolditalic.hebrew=David Bold -sansserif.bolditalic.japanese=\uff2d\uff33 \u30b4\u30b7\u30c3\u30af -sansserif.bolditalic.korean=Gulim - -monospaced.plain.alphabetic=Courier New -monospaced.plain.chinese-ms950=MingLiU -monospaced.plain.hebrew=David -monospaced.plain.japanese=\uff2d\uff33 \u30b4\u30b7\u30c3\u30af -monospaced.plain.korean=GulimChe - -monospaced.bold.alphabetic=Courier New Bold -monospaced.bold.chinese-ms950=PMingLiU -monospaced.bold.hebrew=David Bold -monospaced.bold.japanese=\uff2d\uff33 \u30b4\u30b7\u30c3\u30af -monospaced.bold.korean=GulimChe - -monospaced.italic.alphabetic=Courier New Italic -monospaced.italic.chinese-ms950=PMingLiU -monospaced.italic.hebrew=David -monospaced.italic.japanese=\uff2d\uff33 \u30b4\u30b7\u30c3\u30af -monospaced.italic.korean=GulimChe - -monospaced.bolditalic.alphabetic=Courier New Bold Italic -monospaced.bolditalic.chinese-ms950=PMingLiU -monospaced.bolditalic.hebrew=David Bold -monospaced.bolditalic.japanese=\uff2d\uff33 \u30b4\u30b7\u30c3\u30af -monospaced.bolditalic.korean=GulimChe - -dialog.plain.alphabetic=Arial -dialog.plain.chinese-ms950=MingLiU -dialog.plain.hebrew=David -dialog.plain.japanese=\uff2d\uff33 \u30b4\u30b7\u30c3\u30af -dialog.plain.korean=Gulim - -dialog.bold.alphabetic=Arial Bold -dialog.bold.chinese-ms950=PMingLiU -dialog.bold.hebrew=David Bold -dialog.bold.japanese=\uff2d\uff33 \u30b4\u30b7\u30c3\u30af -dialog.bold.korean=Gulim - -dialog.italic.alphabetic=Arial Italic -dialog.italic.chinese-ms950=PMingLiU -dialog.italic.hebrew=David -dialog.italic.japanese=\uff2d\uff33 \u30b4\u30b7\u30c3\u30af -dialog.italic.korean=Gulim - -dialog.bolditalic.alphabetic=Arial Bold Italic -dialog.bolditalic.chinese-ms950=PMingLiU -dialog.bolditalic.hebrew=David Bold -dialog.bolditalic.japanese=\uff2d\uff33 \u30b4\u30b7\u30c3\u30af -dialog.bolditalic.korean=Gulim - -dialoginput.plain.alphabetic=Courier New -dialoginput.plain.chinese-ms950=MingLiU -dialoginput.plain.hebrew=David -dialoginput.plain.japanese=\uff2d\uff33 \u30b4\u30b7\u30c3\u30af -dialoginput.plain.korean=Gulim - -dialoginput.bold.alphabetic=Courier New Bold -dialoginput.bold.chinese-ms950=PMingLiU -dialoginput.bold.hebrew=David Bold -dialoginput.bold.japanese=\uff2d\uff33 \u30b4\u30b7\u30c3\u30af -dialoginput.bold.korean=Gulim - -dialoginput.italic.alphabetic=Courier New Italic -dialoginput.italic.chinese-ms950=PMingLiU -dialoginput.italic.hebrew=David -dialoginput.italic.japanese=\uff2d\uff33 \u30b4\u30b7\u30c3\u30af -dialoginput.italic.korean=Gulim - -dialoginput.bolditalic.alphabetic=Courier New Bold Italic -dialoginput.bolditalic.chinese-ms950=PMingLiU -dialoginput.bolditalic.hebrew=David Bold -dialoginput.bolditalic.japanese=\uff2d\uff33 \u30b4\u30b7\u30c3\u30af -dialoginput.bolditalic.korean=Gulim - -# Search Sequences - -sequence.allfonts=alphabetic/default,dingbats,symbol - -sequence.serif.GBK=alphabetic/1252,chinese-ms936,dingbats,symbol -sequence.sansserif.GBK=alphabetic/1252,chinese-ms936,dingbats,symbol -sequence.monospaced.GBK=chinese-ms936,alphabetic/1252,dingbats,symbol -sequence.dialog.GBK=alphabetic/1252,chinese-ms936,dingbats,symbol -sequence.dialoginput.GBK=alphabetic/1252,chinese-ms936,dingbats,symbol - -sequence.serif.x-windows-950=alphabetic/1252,chinese-ms950,dingbats,symbol -sequence.sansserif.x-windows-950=alphabetic/1252,chinese-ms950,dingbats,symbol -sequence.monospaced.x-windows-950=chinese-ms950,alphabetic/1252,dingbats,symbol -sequence.dialog.x-windows-950=alphabetic/1252,chinese-ms950,dingbats,symbol -sequence.dialoginput.x-windows-950=alphabetic/1252,chinese-ms950,dingbats,symbol - -sequence.allfonts.windows-1255=hebrew,alphabetic/1252,dingbats,symbol - -sequence.serif.windows-31j=alphabetic/1252,japanese,dingbats,symbol -sequence.sansserif.windows-31j=alphabetic/1252,japanese,dingbats,symbol -sequence.monospaced.windows-31j=japanese,alphabetic/1252,dingbats,symbol -sequence.dialog.windows-31j=alphabetic/1252,japanese,dingbats,symbol -sequence.dialoginput.windows-31j=alphabetic/1252,japanese,dingbats,symbol - -sequence.serif.x-windows-949=alphabetic/1252,korean,dingbats,symbol -sequence.sansserif.x-windows-949=alphabetic/1252,korean,dingbats,symbol -sequence.monospaced.x-windows-949=korean,alphabetic/1252,dingbats,symbol -sequence.dialog.x-windows-949=alphabetic/1252,korean,dingbats,symbol -sequence.dialoginput.x-windows-949=alphabetic/1252,korean,dingbats,symbol - -sequence.allfonts.x-windows-874=alphabetic/1252,thai,dingbats,symbol - -sequence.fallback=lucida - -# Exclusion Ranges - -exclusion.alphabetic=0700-1e9f,1f00-20ab,20ad-f8ff -exclusion.hebrew=0041-005a,0060-007a,007f-00ff,20ac-20ac - -# Monospaced to Proportional width variant mapping -# (Experimental private syntax) -proportional.\uff2d\uff33_\u30b4\u30b7\u30c3\u30af=\uff2d\uff33 \uff30\u30b4\u30b7\u30c3\u30af -proportional.\uff2d\uff33_\u660e\u671d=\uff2d\uff33 \uff30\u660e\u671d -proportional.MingLiU=PMingLiU - -# Font File Names - -filename.Arial=ARIAL.TTF -filename.Arial_Bold=ARIALBD.TTF -filename.Arial_Italic=ARIALI.TTF -filename.Arial_Bold_Italic=ARIALBI.TTF - -filename.Courier_New=COUR.TTF -filename.Courier_New_Bold=COURBD.TTF -filename.Courier_New_Italic=COURI.TTF -filename.Courier_New_Bold_Italic=COURBI.TTF - -filename.Times_New_Roman=TIMES.TTF -filename.Times_New_Roman_Bold=TIMESBD.TTF -filename.Times_New_Roman_Italic=TIMESI.TTF -filename.Times_New_Roman_Bold_Italic=TIMESBI.TTF - -filename.SimSun=SIMSUN.TTF - -filename.MingLiU=MINGLIU.TTC -filename.PMingLiU=MINGLIU.TTC - -filename.David=DAVID.TTF -filename.David_Bold=DAVIDBD.TTF - -filename.\uff2d\uff33_\u660e\u671d=MSMINCHO.TTC -filename.\uff2d\uff33_\uff30\u660e\u671d=MSMINCHO.TTC -filename.\uff2d\uff33_\u30b4\u30b7\u30c3\u30af=MSGOTHIC.TTC -filename.\uff2d\uff33_\uff30\u30b4\u30b7\u30c3\u30af=MSGOTHIC.TTC - -filename.Gulim=gulim.TTC -filename.Batang=batang.TTC -filename.GulimChe=gulim.TTC - -filename.Lucida_Sans_Regular=LucidaSansRegular.ttf -filename.Symbol=SYMBOL.TTF -filename.Wingdings=WINGDING.TTF - From fa5248c9db8c661b898ff4e9e03433128b2534c4 Mon Sep 17 00:00:00 2001 From: Phil Race Date: Wed, 24 Dec 2008 09:53:52 -0800 Subject: [PATCH 012/292] 6728838: Native memory leak in StrikeCache.java Reviewed-by: bae, igor --- jdk/src/share/classes/sun/font/StrikeCache.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/jdk/src/share/classes/sun/font/StrikeCache.java b/jdk/src/share/classes/sun/font/StrikeCache.java index 560be3af2cd..56539e7489f 100644 --- a/jdk/src/share/classes/sun/font/StrikeCache.java +++ b/jdk/src/share/classes/sun/font/StrikeCache.java @@ -232,6 +232,16 @@ public final class StrikeCache { if (disposer.pScalerContext != 0L) { freeLongMemory(new long[0], disposer.pScalerContext); } + } else if (disposer.pScalerContext != 0L) { + /* Rarely a strike may have been created that never cached + * any glyphs. In this case we still want to free the scaler + * context. + */ + if (FontManager.longAddresses) { + freeLongMemory(new long[0], disposer.pScalerContext); + } else { + freeIntMemory(new int[0], disposer.pScalerContext); + } } } From 6f0de04c8704af289dcfa836939be14c9dc0a365 Mon Sep 17 00:00:00 2001 From: Phil Race Date: Wed, 24 Dec 2008 09:57:48 -0800 Subject: [PATCH 013/292] 6752638: java.awt.GraphicsEnvironment.preferLocaleFonts() throws NPE on Linux 6755034: Legal notice repair: jdk/src/solaris/classes/sun/font/FcFontConfiguration.java Reviewed-by: bae, igor --- .../classes/java/awt/GraphicsEnvironment.java | 6 ++ .../classes/sun/awt/FontConfiguration.java | 6 +- .../classes/sun/font/FcFontConfiguration.java | 3 +- .../PreferLocaleFonts.java | 62 +++++++++++++++++++ 4 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 jdk/test/java/awt/GraphicsEnvironment/PreferLocaleFonts.java diff --git a/jdk/src/share/classes/java/awt/GraphicsEnvironment.java b/jdk/src/share/classes/java/awt/GraphicsEnvironment.java index 167db051910..cf1852e2fc0 100644 --- a/jdk/src/share/classes/java/awt/GraphicsEnvironment.java +++ b/jdk/src/share/classes/java/awt/GraphicsEnvironment.java @@ -356,6 +356,9 @@ public abstract class GraphicsEnvironment { * @since 1.5 */ public void preferLocaleFonts() { + if (!(this instanceof SunGraphicsEnvironment)) { + return; + } sun.font.FontManager.preferLocaleFonts(); } @@ -376,6 +379,9 @@ public abstract class GraphicsEnvironment { * @since 1.5 */ public void preferProportionalFonts() { + if (!(this instanceof SunGraphicsEnvironment)) { + return; + } sun.font.FontManager.preferProportionalFonts(); } diff --git a/jdk/src/share/classes/sun/awt/FontConfiguration.java b/jdk/src/share/classes/sun/awt/FontConfiguration.java index 6349aa778ea..4504af24e9d 100644 --- a/jdk/src/share/classes/sun/awt/FontConfiguration.java +++ b/jdk/src/share/classes/sun/awt/FontConfiguration.java @@ -98,7 +98,7 @@ public abstract class FontConfiguration { if (!inited) { this.preferLocaleFonts = false; this.preferPropFonts = false; - fontConfig = this; /* static initialization */ + setFontConfiguration(); readFontConfigFile(fontConfigFile); initFontConfig(); inited = true; @@ -1244,6 +1244,10 @@ public abstract class FontConfiguration { return fontConfig; } + protected void setFontConfiguration() { + fontConfig = this; /* static initialization */ + } + ////////////////////////////////////////////////////////////////////// // FontConfig data tables and the index constants in binary file // ////////////////////////////////////////////////////////////////////// diff --git a/jdk/src/solaris/classes/sun/font/FcFontConfiguration.java b/jdk/src/solaris/classes/sun/font/FcFontConfiguration.java index fe2e5dbf836..95154df0a47 100644 --- a/jdk/src/solaris/classes/sun/font/FcFontConfiguration.java +++ b/jdk/src/solaris/classes/sun/font/FcFontConfiguration.java @@ -15,7 +15,7 @@ * accompanied this code). * * You should have received a copy of the GNU General Public License version - * along with this work; if not, write to the Free Software Foundation, + * 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, @@ -87,6 +87,7 @@ public class FcFontConfiguration extends FontConfiguration { return true; } + setFontConfiguration(); readFcInfo(); if (fcCompFonts == null) { fcCompFonts = FontManager.loadFontConfig(); diff --git a/jdk/test/java/awt/GraphicsEnvironment/PreferLocaleFonts.java b/jdk/test/java/awt/GraphicsEnvironment/PreferLocaleFonts.java new file mode 100644 index 00000000000..3d8cb5934f5 --- /dev/null +++ b/jdk/test/java/awt/GraphicsEnvironment/PreferLocaleFonts.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2008 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 6752638 + * @summary Test no NPE calling preferLocaleFonts() on custom GE. + * @run main PreferLocaleFonts + */ + +import java.util.*; +import java.awt.*; +import java.awt.image.*; + +public class PreferLocaleFonts extends GraphicsEnvironment { + + public static void main(String args[]) { +(new PreferLocaleFonts()).preferLocaleFonts(); + } + public PreferLocaleFonts() { + super(); + } + public Graphics2D createGraphics(BufferedImage image) { + return null; + } + public String[] getAvailableFontFamilyNames(Locale locale) { + return null; + } + public String[] getAvailableFontFamilyNames() { + return null; + } + public Font[] getAllFonts() { + return null; + } + public GraphicsDevice getDefaultScreenDevice() throws HeadlessException { + return null; + } + public GraphicsDevice[] getScreenDevices() throws HeadlessException { + return null; + } +} + From 14b56dc3a014d3fff31c3f724c37680f12674c0b Mon Sep 17 00:00:00 2001 From: Phil Race Date: Wed, 24 Dec 2008 15:48:59 -0800 Subject: [PATCH 014/292] 6652463: MediaSize constructors allow to redefine the mapping of standard MediaSizeName values Reviewed-by: igor, jgodinez --- .../print/attribute/standard/MediaSize.java | 12 +++-- .../print/attribute/MediaMappingsTest.java | 48 +++++++++++++++++++ 2 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 jdk/test/javax/print/attribute/MediaMappingsTest.java diff --git a/jdk/src/share/classes/javax/print/attribute/standard/MediaSize.java b/jdk/src/share/classes/javax/print/attribute/standard/MediaSize.java index 55cd1aed923..3b6262d2387 100644 --- a/jdk/src/share/classes/javax/print/attribute/standard/MediaSize.java +++ b/jdk/src/share/classes/javax/print/attribute/standard/MediaSize.java @@ -123,8 +123,10 @@ public class MediaSize extends Size2DSyntax implements Attribute { if (x > y) { throw new IllegalArgumentException("X dimension > Y dimension"); } - mediaName = media; - mediaMap.put(mediaName, this); + if (media != null && mediaMap.get(media) == null) { + mediaName = media; + mediaMap.put(mediaName, this); + } sizeVector.add(this); } @@ -147,8 +149,10 @@ public class MediaSize extends Size2DSyntax implements Attribute { if (x > y) { throw new IllegalArgumentException("X dimension > Y dimension"); } - mediaName = media; - mediaMap.put(mediaName, this); + if (media != null && mediaMap.get(media) == null) { + mediaName = media; + mediaMap.put(mediaName, this); + } sizeVector.add(this); } diff --git a/jdk/test/javax/print/attribute/MediaMappingsTest.java b/jdk/test/javax/print/attribute/MediaMappingsTest.java new file mode 100644 index 00000000000..16110d8a49e --- /dev/null +++ b/jdk/test/javax/print/attribute/MediaMappingsTest.java @@ -0,0 +1,48 @@ +/* + * Copyright 2008 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 6652463 + * @summary Verify media size-> media mappings can't be altered + * @run main MediaMappingsTest +*/ + +import javax.print.attribute.standard.MediaSize; +import javax.print.attribute.standard.MediaSizeName; + +public class MediaMappingsTest { + + public static void main(String args[]) { + MediaSize sizeA = MediaSize.getMediaSizeForName(MediaSizeName.A); + new MediaSize(1.0f, 2.0f, MediaSize.MM, MediaSizeName.A); + if (!sizeA.equals(MediaSize.getMediaSizeForName(MediaSizeName.A))) { + throw new RuntimeException("mapping changed"); + } + MediaSize sizeB = MediaSize.getMediaSizeForName(MediaSizeName.B); + new MediaSize(1, 2, MediaSize.MM, MediaSizeName.B); + if (!sizeB.equals(MediaSize.getMediaSizeForName(MediaSizeName.B))) { + throw new RuntimeException("mapping changed"); + } + } +} From e33cec202fee549a07071d2472b26bc4806908d9 Mon Sep 17 00:00:00 2001 From: Weijun Wang Date: Tue, 30 Dec 2008 10:42:45 +0800 Subject: [PATCH 015/292] 6717680: LdapCtx does not close the connection if initialization fails Reviewed-by: vinnie, xuelei --- jdk/src/share/classes/com/sun/jndi/ldap/LdapCtx.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/jdk/src/share/classes/com/sun/jndi/ldap/LdapCtx.java b/jdk/src/share/classes/com/sun/jndi/ldap/LdapCtx.java index bec6fd0e761..5f9462c5931 100644 --- a/jdk/src/share/classes/com/sun/jndi/ldap/LdapCtx.java +++ b/jdk/src/share/classes/com/sun/jndi/ldap/LdapCtx.java @@ -302,7 +302,16 @@ final public class LdapCtx extends ComponentDirContext schemaTrees = new Hashtable(11, 0.75f); initEnv(); - connect(false); + try { + connect(false); + } catch (NamingException e) { + try { + close(); + } catch (Exception e2) { + // Nothing + } + throw e; + } } LdapCtx(LdapCtx existing, String newDN) throws NamingException { From c357cbe4e01b7eb44b24191232e0fa099796bb73 Mon Sep 17 00:00:00 2001 From: Phil Race Date: Mon, 5 Jan 2009 11:28:43 -0800 Subject: [PATCH 016/292] 6632886: Font.createFont can be persuaded to leak temporary files 6522586: Enforce limits on Font creation 6652929: Font.createFont(int,File) trusts File.getPath Reviewed-by: igor --- jdk/src/share/classes/java/awt/Font.java | 177 ++++++++++++------ .../classes/sun/font/CreatedFontTracker.java | 54 ++++++ jdk/src/share/classes/sun/font/FileFont.java | 17 +- .../share/classes/sun/font/FontManager.java | 11 +- jdk/test/java/awt/FontClass/CreateFont/A.ttf | Bin 0 -> 2348 bytes .../awt/FontClass/CreateFont/BigFont.java | 139 ++++++++++++++ .../awt/FontClass/CreateFont/DeleteFont.java | 83 ++++++++ .../awt/FontClass/CreateFont/DeleteFont.sh | 66 +++++++ .../awt/FontClass/CreateFont/bigfont.html | 48 +++++ .../CreateFont/fileaccess/FontFile.java | 83 ++++++++ 10 files changed, 616 insertions(+), 62 deletions(-) create mode 100644 jdk/src/share/classes/sun/font/CreatedFontTracker.java create mode 100644 jdk/test/java/awt/FontClass/CreateFont/A.ttf create mode 100644 jdk/test/java/awt/FontClass/CreateFont/BigFont.java create mode 100644 jdk/test/java/awt/FontClass/CreateFont/DeleteFont.java create mode 100644 jdk/test/java/awt/FontClass/CreateFont/DeleteFont.sh create mode 100644 jdk/test/java/awt/FontClass/CreateFont/bigfont.html create mode 100644 jdk/test/java/awt/FontClass/CreateFont/fileaccess/FontFile.java diff --git a/jdk/src/share/classes/java/awt/Font.java b/jdk/src/share/classes/java/awt/Font.java index 8dc5938d411..3ed40325b04 100644 --- a/jdk/src/share/classes/java/awt/Font.java +++ b/jdk/src/share/classes/java/awt/Font.java @@ -37,6 +37,8 @@ import java.awt.geom.Rectangle2D; import java.awt.peer.FontPeer; import java.io.*; import java.lang.ref.SoftReference; +import java.security.AccessController; +import java.security.PrivilegedExceptionAction; import java.text.AttributedCharacterIterator.Attribute; import java.text.CharacterIterator; import java.text.StringCharacterIterator; @@ -51,6 +53,7 @@ import sun.font.AttributeMap; import sun.font.AttributeValues; import sun.font.EAttribute; import sun.font.CompositeFont; +import sun.font.CreatedFontTracker; import sun.font.Font2D; import sun.font.Font2DHandle; import sun.font.FontManager; @@ -575,14 +578,16 @@ public class Font implements java.io.Serializable } /* used to implement Font.createFont */ - private Font(File fontFile, int fontFormat, boolean isCopy) + private Font(File fontFile, int fontFormat, + boolean isCopy, CreatedFontTracker tracker) throws FontFormatException { this.createdFont = true; /* Font2D instances created by this method track their font file * so that when the Font2D is GC'd it can also remove the file. */ this.font2DHandle = - FontManager.createFont2D(fontFile, fontFormat, isCopy).handle; + FontManager.createFont2D(fontFile, fontFormat, + isCopy, tracker).handle; this.name = this.font2DHandle.font2D.getFontName(Locale.getDefault()); this.style = Font.PLAIN; this.size = 1; @@ -787,6 +792,29 @@ public class Font implements java.io.Serializable return new Font(attributes); } + /** + * Used with the byte count tracker for fonts created from streams. + * If a thread can create temp files anyway, no point in counting + * font bytes. + */ + private static boolean hasTempPermission() { + + if (System.getSecurityManager() == null) { + return true; + } + File f = null; + boolean hasPerm = false; + try { + f = File.createTempFile("+~JT", ".tmp", null); + f.delete(); + f = null; + hasPerm = true; + } catch (Throwable t) { + /* inc. any kind of SecurityException */ + } + return hasPerm; + } + /** * Returns a new Font using the specified font type * and input data. The new Font is @@ -822,58 +850,96 @@ public class Font implements java.io.Serializable fontFormat != Font.TYPE1_FONT) { throw new IllegalArgumentException ("font format not recognized"); } - final InputStream fStream = fontStream; - Object ret = java.security.AccessController.doPrivileged( - new java.security.PrivilegedAction() { - public Object run() { - File tFile = null; - FileOutputStream outStream = null; - try { - tFile = File.createTempFile("+~JF", ".tmp", null); - /* Temp file deleted by font shutdown hook */ - BufferedInputStream inStream = - new BufferedInputStream(fStream); - outStream = new FileOutputStream(tFile); - int bytesRead = 0; - int bufSize = 8192; - byte [] buf = new byte[bufSize]; - while (bytesRead != -1) { - try { - bytesRead = inStream.read(buf, 0, bufSize); - } catch (Throwable t) { - throw new IOException(); - } - if (bytesRead != -1) { - outStream.write(buf, 0, bytesRead); - } - } - /* don't close the input stream */ - outStream.close(); - } catch (IOException e) { - if (outStream != null) { - try { - outStream.close(); - } catch (Exception e1) { - } - } - if (tFile != null) { - try { - tFile.delete(); - } catch (Exception e2) { - } - } - return e; - } - return tFile; - } - }); + boolean copiedFontData = false; - if (ret instanceof File) { - return new Font((File)ret, fontFormat, true); - } else if (ret instanceof IOException) { - throw (IOException)ret; - } else { - throw new FontFormatException("Couldn't access font stream"); + try { + final File tFile = AccessController.doPrivileged( + new PrivilegedExceptionAction() { + public File run() throws IOException { + return File.createTempFile("+~JF", ".tmp", null); + } + } + ); + + int totalSize = 0; + CreatedFontTracker tracker = null; + try { + final OutputStream outStream = + AccessController.doPrivileged( + new PrivilegedExceptionAction() { + public OutputStream run() throws IOException { + return new FileOutputStream(tFile); + } + } + ); + if (!hasTempPermission()) { + tracker = CreatedFontTracker.getTracker(); + } + try { + byte[] buf = new byte[8192]; + for (;;) { + int bytesRead = fontStream.read(buf); + if (bytesRead < 0) { + break; + } + if (tracker != null) { + if (totalSize+bytesRead > tracker.MAX_FILE_SIZE) { + throw new IOException("File too big."); + } + if (totalSize+tracker.getNumBytes() > + tracker.MAX_TOTAL_BYTES) + { + throw new IOException("Total files too big."); + } + totalSize += bytesRead; + tracker.addBytes(bytesRead); + } + outStream.write(buf, 0, bytesRead); + } + /* don't close the input stream */ + } finally { + outStream.close(); + } + /* After all references to a Font2D are dropped, the file + * will be removed. To support long-lived AppContexts, + * we need to then decrement the byte count by the size + * of the file. + * If the data isn't a valid font, the implementation will + * delete the tmp file and decrement the byte count + * in the tracker object before returning from the + * constructor, so we can set 'copiedFontData' to true here + * without waiting for the results of that constructor. + */ + copiedFontData = true; + Font font = new Font(tFile, fontFormat, true, tracker); + return font; + } finally { + if (!copiedFontData) { + if (tracker != null) { + tracker.subBytes(totalSize); + } + AccessController.doPrivileged( + new PrivilegedExceptionAction() { + public Void run() { + tFile.delete(); + return null; + } + } + ); + } + } + } catch (Throwable t) { + if (t instanceof FontFormatException) { + throw (FontFormatException)t; + } + if (t instanceof IOException) { + throw (IOException)t; + } + Throwable cause = t.getCause(); + if (cause instanceof FontFormatException) { + throw (FontFormatException)cause; + } + throw new IOException("Problem reading font data."); } } @@ -913,6 +979,9 @@ public class Font implements java.io.Serializable */ public static Font createFont(int fontFormat, File fontFile) throws java.awt.FontFormatException, java.io.IOException { + + fontFile = new File(fontFile.getPath()); + if (fontFormat != Font.TRUETYPE_FONT && fontFormat != Font.TYPE1_FONT) { throw new IllegalArgumentException ("font format not recognized"); @@ -926,7 +995,7 @@ public class Font implements java.io.Serializable if (!fontFile.canRead()) { throw new IOException("Can't read " + fontFile); } - return new Font(fontFile, fontFormat, false); + return new Font(fontFile, fontFormat, false, null); } /** diff --git a/jdk/src/share/classes/sun/font/CreatedFontTracker.java b/jdk/src/share/classes/sun/font/CreatedFontTracker.java new file mode 100644 index 00000000000..741337d5b19 --- /dev/null +++ b/jdk/src/share/classes/sun/font/CreatedFontTracker.java @@ -0,0 +1,54 @@ +/* + * Copyright 2008 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. + */ + +package sun.font; + +public class CreatedFontTracker { + + public static final int MAX_FILE_SIZE = 32 * 1024 * 1024; + public static final int MAX_TOTAL_BYTES = 10 * MAX_FILE_SIZE; + + static int numBytes; + static CreatedFontTracker tracker; + + public static synchronized CreatedFontTracker getTracker() { + if (tracker == null) { + tracker = new CreatedFontTracker(); + } + return tracker; + } + + public synchronized int getNumBytes() { + return numBytes; + } + + public synchronized void addBytes(int sz) { + numBytes += sz; + } + + public synchronized void subBytes(int sz) { + numBytes -= sz; + } +} diff --git a/jdk/src/share/classes/sun/font/FileFont.java b/jdk/src/share/classes/sun/font/FileFont.java index b6a2099d2a4..5aad11b2acd 100644 --- a/jdk/src/share/classes/sun/font/FileFont.java +++ b/jdk/src/share/classes/sun/font/FileFont.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 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 @@ -125,9 +125,9 @@ public abstract class FileFont extends PhysicalFont { return true; } - void setFileToRemove(File file) { + void setFileToRemove(File file, CreatedFontTracker tracker) { Disposer.addObjectRecord(this, - new CreatedFontFileDisposerRecord(file)); + new CreatedFontFileDisposerRecord(file, tracker)); } /* This is called when a font scaler is determined to @@ -246,12 +246,16 @@ public abstract class FileFont extends PhysicalFont { return getScaler().getUnitsPerEm(); } - private static class CreatedFontFileDisposerRecord implements DisposerRecord { + private static class CreatedFontFileDisposerRecord + implements DisposerRecord { File fontFile = null; + CreatedFontTracker tracker; - private CreatedFontFileDisposerRecord(File file) { + private CreatedFontFileDisposerRecord(File file, + CreatedFontTracker tracker) { fontFile = file; + this.tracker = tracker; } public void dispose() { @@ -260,6 +264,9 @@ public abstract class FileFont extends PhysicalFont { public Object run() { if (fontFile != null) { try { + if (tracker != null) { + tracker.subBytes((int)fontFile.length()); + } /* REMIND: is it possible that the file is * still open? It will be closed when the * font2D is disposed but could this code diff --git a/jdk/src/share/classes/sun/font/FontManager.java b/jdk/src/share/classes/sun/font/FontManager.java index 09f181f12c2..29d14047fbd 100644 --- a/jdk/src/share/classes/sun/font/FontManager.java +++ b/jdk/src/share/classes/sun/font/FontManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 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 @@ -2347,12 +2347,14 @@ public final class FontManager { static Vector tmpFontFiles = null; public static Font2D createFont2D(File fontFile, int fontFormat, - boolean isCopy) + boolean isCopy, + CreatedFontTracker tracker) throws FontFormatException { String fontFilePath = fontFile.getPath(); FileFont font2D = null; final File fFile = fontFile; + final CreatedFontTracker _tracker = tracker; try { switch (fontFormat) { case Font.TRUETYPE_FONT: @@ -2369,6 +2371,9 @@ public final class FontManager { java.security.AccessController.doPrivileged( new java.security.PrivilegedAction() { public Object run() { + if (_tracker != null) { + _tracker.subBytes((int)fFile.length()); + } fFile.delete(); return null; } @@ -2377,7 +2382,7 @@ public final class FontManager { throw(e); } if (isCopy) { - font2D.setFileToRemove(fontFile); + font2D.setFileToRemove(fontFile, tracker); synchronized (FontManager.class) { if (tmpFontFiles == null) { diff --git a/jdk/test/java/awt/FontClass/CreateFont/A.ttf b/jdk/test/java/awt/FontClass/CreateFont/A.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f80f5c3d569c810493a9fbaf7141a63831733764 GIT binary patch literal 2348 zcmbVO&2JM&6n``O>5tg!+OZ8Ju*6B67Kmdzu@eZ5A>f26!6qam0n%iX7&}rN8^;NW z+5=T7qF*Yg66&Fss;9P53qs;ULRDG`Rh4>aFTHT!*gt^wfH3Zx-EDxNwrbyc=KX$e z-p>4HcXq}=0Kf@tz`=Uzcqo$kYWxcTS;gpybnn3Mz}LUrL%xDMHj~$i@CUsNAl^lO ze`dL?-W<7o8h~3zUU#OL&A%P}K81V@xhFfndS=h!XE^{~0igZ4+5F0tmS7P;`UKlA zS4NH^stYxw-~>G5-UMwH8a6;yvys2kN_zyd8_5G-GYpUZ^(_ z0R<*aOu+%mCgz|Y)=kV~4(pYf07p%0~3&8)Wj4dD43Xo zM)=gkJmy?5u>b)gn^**yoHeo0KL>=jVBbu?ferlzHuM|V&~IQvzkv%oE)mw{@ z)ALk(@U0LYSt!qy=QFb~qG!!v<~+N9D3e{9*Ge#iBnwLz)S&ct$%EQVsgTdi&S@_w zQ#bAz#2#i)LILu+z&YgqDi1R@3Hzt9Iz!=bsH+S9?@*l(f-qho=z^{d;hO|Ng23+O z!|FAz>2N^H`2)GBLwj(Y$5HEU*a}V(C2+E2T)=~vut<_95`xR_!`r0#&f(mljo%H9 zCSlhNfyeqfr5L}?^H>9g9?ZYVskoLTIFV3^EGH~f;yD7Mz;RUId5}b&P{OhGoLmmY z{m|1L>Q*Z3M?&2dB$aLmw~-^cJGe0ABRTC_VrZ<>6~6;=b-i;u>e}gQin;Vq^)!L7tF(X_-gOujyG`qats(Gw%X$A^v$BoDRGDU4xg z3}YBd4@A5ma{C*&qpxtCazD3!8&x{^-RXYbB5xOJ8u@)5-oKC308vcEJ)w$%moB$L zLX{B8#!9KQzG(1bsMVaF0@}0F)7bQy#6Ux^xuZQE5G8~R#e7}{#afRy8i~g`+5-&| zHr9F=^F<^F(eq+auX{W3d41k!EE);Mg3Up1tw##_g1)#Em(T^##c7J~sI}H{({0KA z-j_R^t}QB0M5S)0XMQ}L=?b^o=;+`MDsekCJE9)TT*aOmpXm`_JF_>RFSMVX1LPrFW4L%88ih_kJsHFRWl@0Y z8{jd}rdmW!FpKSzO?n$HLEYBO9kGt>fEZcBeHhOvv|h7CCwfIN$1roer%js>>j@8w zP0{~Oc|0L_JY(@7LeFNP!og}4xe5n#&*mk9h?v6+K_5cFTDAxR2!g;_Mdn4$CSjT= z@pjYK$P!4B%sUJ(I4v^Bc$Z>j-YU4P7O+^X;!8H>ZKB&|1*_F2dhE>GrP>-B*labD z*YrMz9qe|8>~}Kn)K49985L1_m%fLJJ~BMH2NAXb;MvY9!=8Img9mztAi-ve-!qy~ z<2(ℜyHe$X3A=a4KE;YvWT*tD?oL)h8oIhlkqO(__Z&$MRa%9hh`>|BkPR{a1h+ zzaGW4_0-c8?qKZQQFBDRhf}MasAB@-4w~9ff>bwAkBE3W81tZb0w=(VZDVi?+sL1^ CwQRot literal 0 HcmV?d00001 diff --git a/jdk/test/java/awt/FontClass/CreateFont/BigFont.java b/jdk/test/java/awt/FontClass/CreateFont/BigFont.java new file mode 100644 index 00000000000..c14802485bc --- /dev/null +++ b/jdk/test/java/awt/FontClass/CreateFont/BigFont.java @@ -0,0 +1,139 @@ +/* + * Copyright 2008 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. + */ + +import java.applet.*; +import java.awt.*; +import java.io.*; +import java.net.*; + +public class BigFont extends Applet { + + static private class SizedInputStream extends InputStream { + + int size; + int cnt = 0; + + SizedInputStream(int size) { + this.size = size; + } + + public int read() { + if (cnt < size) { + cnt++; + return 0; + } else { + return -1; + } + } + + public int getCurrentSize() { + return cnt; + } + } + + String id; + String fileName; + + public void init() { + id = getParameter("number"); + fileName = getParameter("font"); + + System.out.println("Applet " + id + " "+ + Thread.currentThread().getThreadGroup()); + // Larger than size for a single font. + int fontSize = 64 * 1000 * 1000; + SizedInputStream sis = new SizedInputStream(fontSize); + try { + Font font = Font.createFont(Font.TRUETYPE_FONT, sis); + } catch (Throwable t) { + if (t instanceof FontFormatException || + fontSize <= sis.getCurrentSize()) + { + System.out.println(sis.getCurrentSize()); + System.out.println(t); + throw new RuntimeException("Allowed file to be too large."); + } + } + // The following part of the test was verified manually but + // is impractical to enable because it requires a fairly large + // valid font to be part of the test, and we can't easily include + // that, nor dependably reference one from the applet environment. + /* + if (fileName == null) { + return; + } + int size = getFileSize(fileName); + if (size == 0) { + return; + } + int fontCnt = 1000 * 1000 * 1000 / size; + loadMany(size, fontCnt, fileName); + System.gc(); System.gc(); + fontCnt = fontCnt / 2; + System.out.println("Applet " + id + " load more."); + loadMany(size, fontCnt, fileName); + */ + System.out.println("Applet " + id + " finished."); + } + + int getFileSize(String fileName) { + try { + URL url = new URL(getCodeBase(), fileName); + InputStream inStream = url.openStream(); + BufferedInputStream fontStream = new BufferedInputStream(inStream); + int size = 0; + while (fontStream.read() != -1) { + size++; + } + fontStream.close(); + return size; + } catch (IOException e) { + return 0; + } + + } + void loadMany(int oneFont, int fontCnt, String fileName) { + System.out.println("fontcnt= " + fontCnt); + Font[] fonts = new Font[fontCnt]; + int totalSize = 0; + boolean gotException = false; + for (int i=0; i + + + + Test Font Creation Limits + + +
+ + + + + + + + +
+ + + diff --git a/jdk/test/java/awt/FontClass/CreateFont/fileaccess/FontFile.java b/jdk/test/java/awt/FontClass/CreateFont/fileaccess/FontFile.java new file mode 100644 index 00000000000..44419748903 --- /dev/null +++ b/jdk/test/java/awt/FontClass/CreateFont/fileaccess/FontFile.java @@ -0,0 +1,83 @@ +/* + * Copyright 2008 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 6652929 + * @summary verify handling of File.getPath() + */ + +import java.awt.*; +import java.io.*; + +public class FontFile { + public static void main(String[] args) throws Exception { + String sep = System.getProperty("file.separator"); + String fname = ".." + sep + "A.ttf"; + String dir = System.getProperty("test.src"); + if (dir != null) { + fname = dir + sep + fname; + } + final String name = fname; + System.out.println("Will try to access " + name); + if (!(new File(name)).canRead()) { + System.out.println("File not available : can't run test"); + return; + } + System.out.println("File is available. Verify no access under SM"); + + System.setSecurityManager(new SecurityManager()); + + + // Check cannot read file. + try { + new FileInputStream(name); + throw new Error("Something wrong with test environment"); + } catch (SecurityException exc) { + // Good. + } + + try { + Font font = Font.createFont(Font.TRUETYPE_FONT, + new File("nosuchfile") { + private boolean read; + @Override public String getPath() { + if (read) { + return name; + } else { + read = true; + return "somefile"; + } + } + @Override public boolean canRead() { + return true; + } + } + ); + System.err.println(font.getFontName()); + throw new RuntimeException("No expected exception"); + } catch (IOException e) { + System.err.println("Test passed."); + } + } +} From a0930ff4d46ce23e6b298e862857768afd6d9d15 Mon Sep 17 00:00:00 2001 From: Phil Race Date: Tue, 6 Jan 2009 13:52:03 -0800 Subject: [PATCH 017/292] 6785424: SecurityException locating physical fonts on Windows Terminal Server Reviewed-by: campbell, jgodinez --- .../share/classes/sun/font/FontManager.java | 21 +++++--- jdk/test/java/awt/FontClass/FontAccess.java | 48 +++++++++++++++++++ 2 files changed, 63 insertions(+), 6 deletions(-) create mode 100644 jdk/test/java/awt/FontClass/FontAccess.java diff --git a/jdk/src/share/classes/sun/font/FontManager.java b/jdk/src/share/classes/sun/font/FontManager.java index f709f381ada..a8b721daffc 100644 --- a/jdk/src/share/classes/sun/font/FontManager.java +++ b/jdk/src/share/classes/sun/font/FontManager.java @@ -1601,18 +1601,27 @@ public final class FontManager { /* Path may be absolute or a base file name relative to one of * the platform font directories */ - private static String getPathName(String s) { + private static String getPathName(final String s) { File f = new File(s); if (f.isAbsolute()) { return s; } else if (pathDirs.length==1) { return pathDirs[0] + File.separator + s; } else { - for (int p=0; p() { + public String run() { + for (int p=0; p Date: Mon, 12 Jan 2009 16:02:47 -0800 Subject: [PATCH 018/292] 6752622: java.awt.Font.getPeer throws "java.lang.InternalError: Not implemented" on Linux Reviewed-by: igor, yan --- jdk/src/solaris/classes/sun/awt/X11/XFontPeer.java | 7 ------- jdk/src/solaris/classes/sun/font/FcFontConfiguration.java | 2 +- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/jdk/src/solaris/classes/sun/awt/X11/XFontPeer.java b/jdk/src/solaris/classes/sun/awt/X11/XFontPeer.java index 62044ace53e..3d03a2503aa 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XFontPeer.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XFontPeer.java @@ -27,9 +27,6 @@ package sun.awt.X11; import sun.awt.PlatformFont; import java.awt.GraphicsEnvironment; -/* FIX ME */ -import sun.awt.motif.MFontConfiguration; - public class XFontPeer extends PlatformFont { /* @@ -51,10 +48,6 @@ public class XFontPeer extends PlatformFont { public XFontPeer(String name, int style){ super(name, style); - - if (fontConfig != null){ - xfsname = ((MFontConfiguration) fontConfig).getMotifFontSet(familyName, style); - } } protected char getMissingGlyphCharacter() { diff --git a/jdk/src/solaris/classes/sun/font/FcFontConfiguration.java b/jdk/src/solaris/classes/sun/font/FcFontConfiguration.java index 95154df0a47..a34fed02e15 100644 --- a/jdk/src/solaris/classes/sun/font/FcFontConfiguration.java +++ b/jdk/src/solaris/classes/sun/font/FcFontConfiguration.java @@ -173,7 +173,7 @@ public class FcFontConfiguration extends FontConfiguration { @Override public FontDescriptor[] getFontDescriptors(String fontName, int style) { - throw new InternalError("Not implemented"); + return new FontDescriptor[0]; } @Override From bf4d190698d0b36f90af28f05ef856b7d03ffd52 Mon Sep 17 00:00:00 2001 From: Martin von Gagern Date: Tue, 13 Jan 2009 16:55:12 +0300 Subject: [PATCH 019/292] 5082756: Image I/O plug-ins set metadata boolean attributes to "true" or "false" Reviewed-by: igor, prr --- .../imageio/plugins/gif/GIFImageMetadata.java | 6 +- .../sun/imageio/plugins/gif/GIFMetadata.java | 9 +- .../plugins/gif/GIFStreamMetadata.java | 2 +- .../imageio/plugins/jpeg/JPEGMetadata.java | 2 +- .../sun/imageio/plugins/png/PNGMetadata.java | 13 +- .../imageio/metadata/IIOMetadataFormat.java | 8 +- .../imageio/metadata/BooleanAttributes.java | 202 ++++++++++++++++++ .../javax/imageio/plugins/png/ITXtTest.java | 2 +- 8 files changed, 224 insertions(+), 20 deletions(-) create mode 100644 jdk/test/javax/imageio/metadata/BooleanAttributes.java diff --git a/jdk/src/share/classes/com/sun/imageio/plugins/gif/GIFImageMetadata.java b/jdk/src/share/classes/com/sun/imageio/plugins/gif/GIFImageMetadata.java index 08da84856b7..9660d82603a 100644 --- a/jdk/src/share/classes/com/sun/imageio/plugins/gif/GIFImageMetadata.java +++ b/jdk/src/share/classes/com/sun/imageio/plugins/gif/GIFImageMetadata.java @@ -153,7 +153,7 @@ public class GIFImageMetadata extends GIFMetadata { node.setAttribute("imageWidth", Integer.toString(imageWidth)); node.setAttribute("imageHeight", Integer.toString(imageHeight)); node.setAttribute("interlaceFlag", - interlaceFlag ? "true" : "false"); + interlaceFlag ? "TRUE" : "FALSE"); root.appendChild(node); // Local color table @@ -185,9 +185,9 @@ public class GIFImageMetadata extends GIFMetadata { node.setAttribute("disposalMethod", disposalMethodNames[disposalMethod]); node.setAttribute("userInputFlag", - userInputFlag ? "true" : "false"); + userInputFlag ? "TRUE" : "FALSE"); node.setAttribute("transparentColorFlag", - transparentColorFlag ? "true" : "false"); + transparentColorFlag ? "TRUE" : "FALSE"); node.setAttribute("delayTime", Integer.toString(delayTime)); node.setAttribute("transparentColorIndex", diff --git a/jdk/src/share/classes/com/sun/imageio/plugins/gif/GIFMetadata.java b/jdk/src/share/classes/com/sun/imageio/plugins/gif/GIFMetadata.java index 42dfbd0bed9..8acdaa2db49 100644 --- a/jdk/src/share/classes/com/sun/imageio/plugins/gif/GIFMetadata.java +++ b/jdk/src/share/classes/com/sun/imageio/plugins/gif/GIFMetadata.java @@ -158,13 +158,10 @@ abstract class GIFMetadata extends IIOMetadata { } } String value = attr.getNodeValue(); - // XXX Should be able to use equals() here instead of - // equalsIgnoreCase() but some boolean attributes are incorrectly - // set to "true" or "false" by the J2SE core metadata classes - // getAsTree() method (which are duplicated above). See bug 5082756. - if (value.equalsIgnoreCase("TRUE")) { + // Allow lower case booleans for backward compatibility, #5082756 + if (value.equals("TRUE") || value.equals("true")) { return true; - } else if (value.equalsIgnoreCase("FALSE")) { + } else if (value.equals("FALSE") || value.equals("false")) { return false; } else { fatal(node, "Attribute " + name + " must be 'TRUE' or 'FALSE'!"); diff --git a/jdk/src/share/classes/com/sun/imageio/plugins/gif/GIFStreamMetadata.java b/jdk/src/share/classes/com/sun/imageio/plugins/gif/GIFStreamMetadata.java index 0979bf3d849..bc0a784b272 100644 --- a/jdk/src/share/classes/com/sun/imageio/plugins/gif/GIFStreamMetadata.java +++ b/jdk/src/share/classes/com/sun/imageio/plugins/gif/GIFStreamMetadata.java @@ -202,7 +202,7 @@ public class GIFStreamMetadata extends GIFMetadata { compression_node.appendChild(node); node = new IIOMetadataNode("Lossless"); - node.setAttribute("value", "true"); + node.setAttribute("value", "TRUE"); compression_node.appendChild(node); // NumProgressiveScans not in stream diff --git a/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGMetadata.java b/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGMetadata.java index 7f753341c93..c84003c9f22 100644 --- a/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGMetadata.java +++ b/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGMetadata.java @@ -955,7 +955,7 @@ public class JPEGMetadata extends IIOMetadata implements Cloneable { // Lossless - false IIOMetadataNode lossless = new IIOMetadataNode("Lossless"); - lossless.setAttribute("value", "false"); + lossless.setAttribute("value", "FALSE"); compression.appendChild(lossless); // NumProgressiveScans - count sos segments diff --git a/jdk/src/share/classes/com/sun/imageio/plugins/png/PNGMetadata.java b/jdk/src/share/classes/com/sun/imageio/plugins/png/PNGMetadata.java index 23281fe5330..1ad78ad165f 100644 --- a/jdk/src/share/classes/com/sun/imageio/plugins/png/PNGMetadata.java +++ b/jdk/src/share/classes/com/sun/imageio/plugins/png/PNGMetadata.java @@ -600,7 +600,7 @@ public class PNGMetadata extends IIOMetadata implements Cloneable { IIOMetadataNode iTXt_node = new IIOMetadataNode("iTXtEntry"); iTXt_node.setAttribute("keyword", iTXt_keyword.get(i)); iTXt_node.setAttribute("compressionFlag", - iTXt_compressionFlag.get(i) ? "1" : "0"); + iTXt_compressionFlag.get(i) ? "TRUE" : "FALSE"); iTXt_node.setAttribute("compressionMethod", iTXt_compressionMethod.get(i).toString()); iTXt_node.setAttribute("languageTag", @@ -832,7 +832,7 @@ public class PNGMetadata extends IIOMetadata implements Cloneable { } node = new IIOMetadataNode("BlackIsZero"); - node.setAttribute("value", "true"); + node.setAttribute("value", "TRUE"); chroma_node.appendChild(node); if (PLTE_present) { @@ -894,7 +894,7 @@ public class PNGMetadata extends IIOMetadata implements Cloneable { compression_node.appendChild(node); node = new IIOMetadataNode("Lossless"); - node.setAttribute("value", "true"); + node.setAttribute("value", "TRUE"); compression_node.appendChild(node); node = new IIOMetadataNode("NumProgressiveScans"); @@ -1162,12 +1162,13 @@ public class PNGMetadata extends IIOMetadata implements Cloneable { } } String value = attr.getNodeValue(); - if (value.equals("true")) { + // Allow lower case booleans for backward compatibility, #5082756 + if (value.equals("TRUE") || value.equals("true")) { return true; - } else if (value.equals("false")) { + } else if (value.equals("FALSE") || value.equals("false")) { return false; } else { - fatal(node, "Attribute " + name + " must be 'true' or 'false'!"); + fatal(node, "Attribute " + name + " must be 'TRUE' or 'FALSE'!"); return false; } } diff --git a/jdk/src/share/classes/javax/imageio/metadata/IIOMetadataFormat.java b/jdk/src/share/classes/javax/imageio/metadata/IIOMetadataFormat.java index 88ea8e98756..cff46177d62 100644 --- a/jdk/src/share/classes/javax/imageio/metadata/IIOMetadataFormat.java +++ b/jdk/src/share/classes/javax/imageio/metadata/IIOMetadataFormat.java @@ -242,8 +242,12 @@ public interface IIOMetadataFormat { /** * A constant returned by getAttributeDataType - * indicating that the value of an attribute is one of 'true' or - * 'false'. + * indicating that the value of an attribute is one of the boolean + * values 'true' or 'false'. + * Attribute values of type DATATYPE_BOOLEAN should be marked as + * enumerations, and the permitted values should be the string + * literal values "TRUE" or "FALSE", although a plugin may also + * recognise lower or mixed case equivalents. */ int DATATYPE_BOOLEAN = 1; diff --git a/jdk/test/javax/imageio/metadata/BooleanAttributes.java b/jdk/test/javax/imageio/metadata/BooleanAttributes.java new file mode 100644 index 00000000000..104b12432c8 --- /dev/null +++ b/jdk/test/javax/imageio/metadata/BooleanAttributes.java @@ -0,0 +1,202 @@ +/* + * Copyright 2008 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 5082756 + * @summary ensure that boolean attributes follow ( "TRUE" | "FALSE" ) + * including correct (i.e. upper) case + * + * @run main BooleanAttributes + */ + +import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.StringReader; +import java.util.Arrays; +import java.util.List; +import javax.imageio.IIOImage; +import javax.imageio.ImageIO; +import javax.imageio.ImageReader; +import javax.imageio.ImageTypeSpecifier; +import javax.imageio.ImageWriteParam; +import javax.imageio.ImageWriter; +import javax.imageio.metadata.IIOMetadata; +import javax.imageio.stream.ImageInputStream; +import javax.imageio.stream.ImageOutputStream; +import javax.imageio.stream.MemoryCacheImageInputStream; +import javax.imageio.stream.MemoryCacheImageOutputStream; +import javax.xml.transform.Result; +import javax.xml.transform.Source; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMResult; +import javax.xml.transform.stream.StreamSource; +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathFactory; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +public class BooleanAttributes { + + private static TransformerFactory transformerFactory = + TransformerFactory.newInstance(); + + private static XPath xpathEngine = XPathFactory.newInstance().newXPath(); + + public static void main(String[] args) throws Exception { + test("image/png", false, "", + "Chroma/BlackIsZero/@value", + "Compression/Lossless/@value"); + + test("image/png", false, + "" + + "" + + "", + "iTXt/iTXtEntry/@compressionFlag"); + + test("image/png", false, + "" + + "" + + "", + "iTXt/iTXtEntry/@compressionFlag"); + + test("image/gif", false, "", + "Chroma/BlackIsZero/@value", + "Compression/Lossless/@value"); + + test("image/gif", false, + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "", + "ImageDescriptor/@interlaceFlag", + "LocalColorTable/@sortFlag", + "GraphicControlExtension/@userInputFlag", + "GraphicControlExtension/@transparentColorFlag"); + + test("image/gif", true, + "" + + "" + + "" + + "" + + "" + + "", + "GlobalColorTable/@sortFlag"); + + test("image/jpeg", false, "", + "Compression/Lossless/@value"); + } + + private static void transform(Source src, Result dst) + throws Exception + { + transformerFactory.newTransformer().transform(src, dst); + } + + private static void verify(Node meta, String[] xpaths, boolean required) + throws Exception + { + for (String xpath: xpaths) { + NodeList list = (NodeList) + xpathEngine.evaluate(xpath, meta, XPathConstants.NODESET); + if (list.getLength() == 0 && required) + throw new AssertionError("Missing value: " + xpath); + for (int i = 0; i < list.getLength(); ++i) { + String value = list.item(i).getNodeValue(); + if (!(value.equals("TRUE") || value.equals("FALSE"))) + throw new AssertionError(xpath + " has value " + value); + } + } + } + + public static void test(String mimeType, boolean useStreamMeta, + String metaXml, String... boolXpaths) + throws Exception + { + BufferedImage img = + new BufferedImage(16, 16, BufferedImage.TYPE_INT_RGB); + ImageWriter iw = ImageIO.getImageWritersByMIMEType(mimeType).next(); + ByteArrayOutputStream os = new ByteArrayOutputStream(); + ImageOutputStream ios = new MemoryCacheImageOutputStream(os); + iw.setOutput(ios); + ImageWriteParam param = null; + IIOMetadata streamMeta = iw.getDefaultStreamMetadata(param); + IIOMetadata imageMeta = + iw.getDefaultImageMetadata(new ImageTypeSpecifier(img), param); + IIOMetadata meta = useStreamMeta ? streamMeta : imageMeta; + Source src = new StreamSource(new StringReader(metaXml)); + DOMResult dst = new DOMResult(); + transform(src, dst); + Document doc = (Document)dst.getNode(); + Element node = doc.getDocumentElement(); + String metaFormat = node.getNodeName(); + + // Verify that the default metadata gets formatted correctly. + verify(meta.getAsTree(metaFormat), boolXpaths, false); + + meta.mergeTree(metaFormat, node); + + // Verify that the merged metadata gets formatte correctly. + verify(meta.getAsTree(metaFormat), boolXpaths, true); + + iw.write(streamMeta, new IIOImage(img, null, imageMeta), param); + iw.dispose(); + ios.close(); + ImageReader ir = ImageIO.getImageReader(iw); + byte[] bytes = os.toByteArray(); + if (bytes.length == 0) + throw new AssertionError("Zero length image file"); + ByteArrayInputStream is = new ByteArrayInputStream(bytes); + ImageInputStream iis = new MemoryCacheImageInputStream(is); + ir.setInput(iis); + if (useStreamMeta) meta = ir.getStreamMetadata(); + else meta = ir.getImageMetadata(0); + + // Verify again after writing and re-reading the image + verify(meta.getAsTree(metaFormat), boolXpaths, true); + } + + public static void xtest(Object... eatAnyArguments) { + System.err.println("Disabled test! Change xtest back into test!"); + } + +} diff --git a/jdk/test/javax/imageio/plugins/png/ITXtTest.java b/jdk/test/javax/imageio/plugins/png/ITXtTest.java index 9bace746227..ec81bd874ac 100644 --- a/jdk/test/javax/imageio/plugins/png/ITXtTest.java +++ b/jdk/test/javax/imageio/plugins/png/ITXtTest.java @@ -123,7 +123,7 @@ public class ITXtTest { } t.keyword = e.getAttribute("keyword"); t.isCompressed = - (Integer.valueOf(e.getAttribute("compressionFlag")).intValue() == 1); + Boolean.valueOf(e.getAttribute("compressionFlag")).booleanValue(); t.compression = Integer.valueOf(e.getAttribute("compressionMethod")).intValue(); t.language = e.getAttribute("languageTag"); From 57a1271b06b6a1cc4548fb353d8c0cf261eb0a38 Mon Sep 17 00:00:00 2001 From: Martin von Gagern Date: Tue, 13 Jan 2009 18:38:44 +0300 Subject: [PATCH 020/292] 6782079: PNG: reading metadata may cause OOM on truncated images Reviewed-by: igor, prr --- .../imageio/plugins/png/PNGImageReader.java | 45 ++-- .../imageio/plugins/png/PNGImageWriter.java | 9 +- .../sun/imageio/plugins/png/PNGMetadata.java | 43 ++-- .../imageio/plugins/png/ItxtUtf8Test.java | 241 ++++++++++++++++++ 4 files changed, 281 insertions(+), 57 deletions(-) create mode 100644 jdk/test/javax/imageio/plugins/png/ItxtUtf8Test.java diff --git a/jdk/src/share/classes/com/sun/imageio/plugins/png/PNGImageReader.java b/jdk/src/share/classes/com/sun/imageio/plugins/png/PNGImageReader.java index 84a593264be..f35165420e9 100644 --- a/jdk/src/share/classes/com/sun/imageio/plugins/png/PNGImageReader.java +++ b/jdk/src/share/classes/com/sun/imageio/plugins/png/PNGImageReader.java @@ -37,6 +37,7 @@ import java.awt.image.WritableRaster; import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.DataInputStream; +import java.io.EOFException; import java.io.InputStream; import java.io.IOException; import java.io.SequenceInputStream; @@ -59,7 +60,7 @@ import com.sun.imageio.plugins.common.SubImageInputStream; import java.io.ByteArrayOutputStream; import sun.awt.image.ByteInterleavedRaster; -class PNGImageDataEnumeration implements Enumeration { +class PNGImageDataEnumeration implements Enumeration { boolean firstTime = true; ImageInputStream stream; @@ -72,7 +73,7 @@ class PNGImageDataEnumeration implements Enumeration { int type = stream.readInt(); // skip chunk type } - public Object nextElement() { + public InputStream nextElement() { try { firstTime = false; ImageInputStream iis = new SubImageInputStream(stream, length); @@ -207,25 +208,17 @@ public class PNGImageReader extends ImageReader { resetStreamSettings(); } - private String readNullTerminatedString(String charset) throws IOException { + private String readNullTerminatedString(String charset, int maxLen) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); int b; - while ((b = stream.read()) != 0) { + int count = 0; + while ((maxLen > count++) && ((b = stream.read()) != 0)) { + if (b == -1) throw new EOFException(); baos.write(b); } return new String(baos.toByteArray(), charset); } - private String readNullTerminatedString() throws IOException { - StringBuilder b = new StringBuilder(); - int c; - - while ((c = stream.read()) != 0) { - b.append((char)c); - } - return b.toString(); - } - private void readHeader() throws IIOException { if (gotHeader) { return; @@ -434,7 +427,7 @@ public class PNGImageReader extends ImageReader { } private void parse_iCCP_chunk(int chunkLength) throws IOException { - String keyword = readNullTerminatedString(); + String keyword = readNullTerminatedString("ISO-8859-1", 80); metadata.iCCP_profileName = keyword; metadata.iCCP_compressionMethod = stream.readUnsignedByte(); @@ -450,7 +443,7 @@ public class PNGImageReader extends ImageReader { private void parse_iTXt_chunk(int chunkLength) throws IOException { long chunkStart = stream.getStreamPosition(); - String keyword = readNullTerminatedString(); + String keyword = readNullTerminatedString("ISO-8859-1", 80); metadata.iTXt_keyword.add(keyword); int compressionFlag = stream.readUnsignedByte(); @@ -459,15 +452,17 @@ public class PNGImageReader extends ImageReader { int compressionMethod = stream.readUnsignedByte(); metadata.iTXt_compressionMethod.add(Integer.valueOf(compressionMethod)); - String languageTag = readNullTerminatedString("UTF8"); + String languageTag = readNullTerminatedString("UTF8", 80); metadata.iTXt_languageTag.add(languageTag); + long pos = stream.getStreamPosition(); + int maxLen = (int)(chunkStart + chunkLength - pos); String translatedKeyword = - readNullTerminatedString("UTF8"); + readNullTerminatedString("UTF8", maxLen); metadata.iTXt_translatedKeyword.add(translatedKeyword); String text; - long pos = stream.getStreamPosition(); + pos = stream.getStreamPosition(); byte[] b = new byte[(int)(chunkStart + chunkLength - pos)]; stream.readFully(b); @@ -511,7 +506,7 @@ public class PNGImageReader extends ImageReader { private void parse_sPLT_chunk(int chunkLength) throws IOException, IIOException { - metadata.sPLT_paletteName = readNullTerminatedString(); + metadata.sPLT_paletteName = readNullTerminatedString("ISO-8859-1", 80); chunkLength -= metadata.sPLT_paletteName.length() + 1; int sampleDepth = stream.readUnsignedByte(); @@ -554,12 +549,12 @@ public class PNGImageReader extends ImageReader { } private void parse_tEXt_chunk(int chunkLength) throws IOException { - String keyword = readNullTerminatedString(); + String keyword = readNullTerminatedString("ISO-8859-1", 80); metadata.tEXt_keyword.add(keyword); byte[] b = new byte[chunkLength - keyword.length() - 1]; stream.readFully(b); - metadata.tEXt_text.add(new String(b)); + metadata.tEXt_text.add(new String(b, "ISO-8859-1")); } private void parse_tIME_chunk() throws IOException { @@ -640,7 +635,7 @@ public class PNGImageReader extends ImageReader { } private void parse_zTXt_chunk(int chunkLength) throws IOException { - String keyword = readNullTerminatedString(); + String keyword = readNullTerminatedString("ISO-8859-1", 80); metadata.zTXt_keyword.add(keyword); int method = stream.readUnsignedByte(); @@ -648,7 +643,7 @@ public class PNGImageReader extends ImageReader { byte[] b = new byte[chunkLength - keyword.length() - 2]; stream.readFully(b); - metadata.zTXt_text.add(new String(inflate(b))); + metadata.zTXt_text.add(new String(inflate(b), "ISO-8859-1")); } private void readMetadata() throws IIOException { @@ -1263,7 +1258,7 @@ public class PNGImageReader extends ImageReader { try { stream.seek(imageStartPosition); - Enumeration e = new PNGImageDataEnumeration(stream); + Enumeration e = new PNGImageDataEnumeration(stream); InputStream is = new SequenceInputStream(e); /* InflaterInputStream uses an Inflater instance which consumes diff --git a/jdk/src/share/classes/com/sun/imageio/plugins/png/PNGImageWriter.java b/jdk/src/share/classes/com/sun/imageio/plugins/png/PNGImageWriter.java index ea4233a68ea..0f9cc785f92 100644 --- a/jdk/src/share/classes/com/sun/imageio/plugins/png/PNGImageWriter.java +++ b/jdk/src/share/classes/com/sun/imageio/plugins/png/PNGImageWriter.java @@ -674,13 +674,8 @@ public class PNGImageWriter extends ImageWriter { private byte[] deflate(byte[] b) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); DeflaterOutputStream dos = new DeflaterOutputStream(baos); - - int len = b.length; - for (int i = 0; i < len; i++) { - dos.write((int)(0xff & b[i])); - } + dos.write(b); dos.close(); - return baos.toByteArray(); } @@ -736,7 +731,7 @@ public class PNGImageWriter extends ImageWriter { cs.writeByte(compressionMethod); String text = (String)textIter.next(); - cs.write(deflate(text.getBytes())); + cs.write(deflate(text.getBytes("ISO-8859-1"))); cs.finish(); } } diff --git a/jdk/src/share/classes/com/sun/imageio/plugins/png/PNGMetadata.java b/jdk/src/share/classes/com/sun/imageio/plugins/png/PNGMetadata.java index 1ad78ad165f..9da72298884 100644 --- a/jdk/src/share/classes/com/sun/imageio/plugins/png/PNGMetadata.java +++ b/jdk/src/share/classes/com/sun/imageio/plugins/png/PNGMetadata.java @@ -211,8 +211,8 @@ public class PNGMetadata extends IIOMetadata implements Cloneable { public int sRGB_renderingIntent; // tEXt chunk - public ArrayList tEXt_keyword = new ArrayList(); // 1-79 char Strings - public ArrayList tEXt_text = new ArrayList(); // Strings + public ArrayList tEXt_keyword = new ArrayList(); // 1-79 characters + public ArrayList tEXt_text = new ArrayList(); // tIME chunk public boolean tIME_present; @@ -235,13 +235,13 @@ public class PNGMetadata extends IIOMetadata implements Cloneable { public int tRNS_blue; // zTXt chunk - public ArrayList zTXt_keyword = new ArrayList(); // Strings - public ArrayList zTXt_compressionMethod = new ArrayList(); // Integers - public ArrayList zTXt_text = new ArrayList(); // Strings + public ArrayList zTXt_keyword = new ArrayList(); + public ArrayList zTXt_compressionMethod = new ArrayList(); + public ArrayList zTXt_text = new ArrayList(); // Unknown chunks - public ArrayList unknownChunkType = new ArrayList(); // Strings - public ArrayList unknownChunkData = new ArrayList(); // byte arrays + public ArrayList unknownChunkType = new ArrayList(); + public ArrayList unknownChunkData = new ArrayList(); public PNGMetadata() { super(true, @@ -426,21 +426,14 @@ public class PNGMetadata extends IIOMetadata implements Cloneable { return false; } - private ArrayList cloneBytesArrayList(ArrayList in) { + private ArrayList cloneBytesArrayList(ArrayList in) { if (in == null) { return null; } else { - ArrayList list = new ArrayList(in.size()); - Iterator iter = in.iterator(); - while (iter.hasNext()) { - Object o = iter.next(); - if (o == null) { - list.add(null); - } else { - list.add(((byte[])o).clone()); - } + ArrayList list = new ArrayList(in.size()); + for (byte[] b: in) { + list.add((b == null) ? null : (byte[])b.clone()); } - return list; } } @@ -2040,14 +2033,14 @@ public class PNGMetadata extends IIOMetadata implements Cloneable { sBIT_present = false; sPLT_present = false; sRGB_present = false; - tEXt_keyword = new ArrayList(); - tEXt_text = new ArrayList(); + tEXt_keyword = new ArrayList(); + tEXt_text = new ArrayList(); tIME_present = false; tRNS_present = false; - zTXt_keyword = new ArrayList(); - zTXt_compressionMethod = new ArrayList(); - zTXt_text = new ArrayList(); - unknownChunkType = new ArrayList(); - unknownChunkData = new ArrayList(); + zTXt_keyword = new ArrayList(); + zTXt_compressionMethod = new ArrayList(); + zTXt_text = new ArrayList(); + unknownChunkType = new ArrayList(); + unknownChunkData = new ArrayList(); } } diff --git a/jdk/test/javax/imageio/plugins/png/ItxtUtf8Test.java b/jdk/test/javax/imageio/plugins/png/ItxtUtf8Test.java new file mode 100644 index 00000000000..e35495bdee1 --- /dev/null +++ b/jdk/test/javax/imageio/plugins/png/ItxtUtf8Test.java @@ -0,0 +1,241 @@ +/* + * Copyright 2008 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 6541476 6782079 + * @summary Write and read a PNG file including an non-latin1 iTXt chunk + * Test also verifies that trunkated png images does not cause + * an OoutOfMemory error. + * + * @run main ItxtUtf8Test + * + * @run main/othervm/timeout=10 -Xmx2m ItxtUtf8Test truncate + */ + +import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.OutputStream; +import java.util.Arrays; +import java.util.List; +import javax.imageio.IIOException; +import javax.imageio.IIOImage; +import javax.imageio.ImageIO; +import javax.imageio.ImageReader; +import javax.imageio.ImageTypeSpecifier; +import javax.imageio.ImageWriter; +import javax.imageio.metadata.IIOMetadata; +import javax.imageio.stream.ImageInputStream; +import javax.imageio.stream.ImageOutputStream; +import javax.imageio.stream.MemoryCacheImageInputStream; +import javax.imageio.stream.MemoryCacheImageOutputStream; +import org.w3c.dom.DOMImplementation; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.bootstrap.DOMImplementationRegistry; + +public class ItxtUtf8Test { + + public static final String + TEXT = "\u24c9\u24d4\u24e7\u24e3" + + "\ud835\udc13\ud835\udc1e\ud835\udc31\ud835\udc2d" + + "\u24c9\u24d4\u24e7\u24e3", // a repetition for compression + VERBATIM = "\u24e5\u24d4\u24e1\u24d1\u24d0\u24e3\u24d8\u24dc", + COMPRESSED = "\u24d2\u24de\u24dc\u24df\u24e1\u24d4\u24e2\u24e2\u24d4\u24d3"; + + public static final byte[] + VBYTES = { + (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x56, // chunk length + (byte)0x69, (byte)0x54, (byte)0x58, (byte)0x74, // chunk type "iTXt" + (byte)0x76, (byte)0x65, (byte)0x72, (byte)0x62, + (byte)0x61, (byte)0x74, (byte)0x69, (byte)0x6d, // keyword "verbatim" + (byte)0x00, // separator terminating keyword + (byte)0x00, // compression flag + (byte)0x00, // compression method, must be zero + (byte)0x78, (byte)0x2d, (byte)0x63, (byte)0x69, + (byte)0x72, (byte)0x63, (byte)0x6c, (byte)0x65, + (byte)0x64, // language tag "x-circled" + (byte)0x00, // separator terminating language tag + (byte)0xe2, (byte)0x93, (byte)0xa5, // '\u24e5' + (byte)0xe2, (byte)0x93, (byte)0x94, // '\u24d4' + (byte)0xe2, (byte)0x93, (byte)0xa1, // '\u24e1' + (byte)0xe2, (byte)0x93, (byte)0x91, // '\u24d1' + (byte)0xe2, (byte)0x93, (byte)0x90, // '\u24d0' + (byte)0xe2, (byte)0x93, (byte)0xa3, // '\u24e3' + (byte)0xe2, (byte)0x93, (byte)0x98, // '\u24d8' + (byte)0xe2, (byte)0x93, (byte)0x9c, // '\u24dc' + (byte)0x00, // separator terminating the translated keyword + (byte)0xe2, (byte)0x93, (byte)0x89, // '\u24c9' + (byte)0xe2, (byte)0x93, (byte)0x94, // '\u24d4' + (byte)0xe2, (byte)0x93, (byte)0xa7, // '\u24e7' + (byte)0xe2, (byte)0x93, (byte)0xa3, // '\u24e3' + (byte)0xf0, (byte)0x9d, (byte)0x90, (byte)0x93, // '\ud835\udc13' + (byte)0xf0, (byte)0x9d, (byte)0x90, (byte)0x9e, // '\ud835\udc1e' + (byte)0xf0, (byte)0x9d, (byte)0x90, (byte)0xb1, // '\ud835\udc31' + (byte)0xf0, (byte)0x9d, (byte)0x90, (byte)0xad, // '\ud835\udc2d' + (byte)0xe2, (byte)0x93, (byte)0x89, // '\u24c9' + (byte)0xe2, (byte)0x93, (byte)0x94, // '\u24d4' + (byte)0xe2, (byte)0x93, (byte)0xa7, // '\u24e7' + (byte)0xe2, (byte)0x93, (byte)0xa3, // '\u24e3' + (byte)0xb5, (byte)0xcc, (byte)0x97, (byte)0x56 // CRC + }, + CBYTES = { + // we don't want to check the chunk length, + // as this might depend on implementation. + (byte)0x69, (byte)0x54, (byte)0x58, (byte)0x74, // chunk type "iTXt" + (byte)0x63, (byte)0x6f, (byte)0x6d, (byte)0x70, + (byte)0x72, (byte)0x65, (byte)0x73, (byte)0x73, + (byte)0x65, (byte)0x64, // keyword "compressed" + (byte)0x00, // separator terminating keyword + (byte)0x01, // compression flag + (byte)0x00, // compression method, 0=deflate + (byte)0x78, (byte)0x2d, (byte)0x63, (byte)0x69, + (byte)0x72, (byte)0x63, (byte)0x6c, (byte)0x65, + (byte)0x64, // language tag "x-circled" + (byte)0x00, // separator terminating language tag + // we don't want to check the actual compressed data, + // as this might depend on implementation. + }; +/* +*/ + + public static void main(String[] args) throws Exception { + List argList = Arrays.asList(args); + if (argList.contains("truncate")) { + try { + runTest(false, true); + throw new AssertionError("Expect an error for truncated file"); + } + catch (IIOException e) { + // expected an error for a truncated image file. + } + } + else { + runTest(argList.contains("dump"), false); + } + } + + public static void runTest(boolean dump, boolean truncate) + throws Exception + { + String format = "javax_imageio_png_1.0"; + BufferedImage img = + new BufferedImage(16, 16, BufferedImage.TYPE_INT_RGB); + ImageWriter iw = ImageIO.getImageWritersByMIMEType("image/png").next(); + ByteArrayOutputStream os = new ByteArrayOutputStream(); + ImageOutputStream ios = new MemoryCacheImageOutputStream(os); + iw.setOutput(ios); + IIOMetadata meta = + iw.getDefaultImageMetadata(new ImageTypeSpecifier(img), null); + DOMImplementationRegistry registry; + registry = DOMImplementationRegistry.newInstance(); + DOMImplementation impl = registry.getDOMImplementation("XML 3.0"); + Document doc = impl.createDocument(null, format, null); + Element root, itxt, entry; + root = doc.getDocumentElement(); + root.appendChild(itxt = doc.createElement("iTXt")); + itxt.appendChild(entry = doc.createElement("iTXtEntry")); + entry.setAttribute("keyword", "verbatim"); + entry.setAttribute("compressionFlag", "false"); + entry.setAttribute("compressionMethod", "0"); + entry.setAttribute("languageTag", "x-circled"); + entry.setAttribute("translatedKeyword", VERBATIM); + entry.setAttribute("text", TEXT); + itxt.appendChild(entry = doc.createElement("iTXtEntry")); + entry.setAttribute("keyword", "compressed"); + entry.setAttribute("compressionFlag", "true"); + entry.setAttribute("compressionMethod", "0"); + entry.setAttribute("languageTag", "x-circled"); + entry.setAttribute("translatedKeyword", COMPRESSED); + entry.setAttribute("text", TEXT); + meta.mergeTree(format, root); + iw.write(new IIOImage(img, null, meta)); + iw.dispose(); + + byte[] bytes = os.toByteArray(); + if (dump) + System.out.write(bytes); + if (findBytes(VBYTES, bytes) < 0) + throw new AssertionError("verbatim block not found"); + if (findBytes(CBYTES, bytes) < 0) + throw new AssertionError("compressed block not found"); + int length = bytes.length; + if (truncate) + length = findBytes(VBYTES, bytes) + 32; + + ImageReader ir = ImageIO.getImageReader(iw); + ByteArrayInputStream is = new ByteArrayInputStream(bytes, 0, length); + ImageInputStream iis = new MemoryCacheImageInputStream(is); + ir.setInput(iis); + meta = ir.getImageMetadata(0); + Node node = meta.getAsTree(format); + for (node = node.getFirstChild(); + !"iTXt".equals(node.getNodeName()); + node = node.getNextSibling()); + boolean verbatimSeen = false, compressedSeen = false; + for (node = node.getFirstChild(); + node != null; + node = node.getNextSibling()) { + entry = (Element)node; + String keyword = entry.getAttribute("keyword"); + String translatedKeyword = entry.getAttribute("translatedKeyword"); + String text = entry.getAttribute("text"); + if ("verbatim".equals(keyword)) { + if (verbatimSeen) throw new AssertionError("Duplicate"); + verbatimSeen = true; + if (!VERBATIM.equals(translatedKeyword)) + throw new AssertionError("Wrong translated keyword"); + if (!TEXT.equals(text)) + throw new AssertionError("Wrong text"); + } + else if ("compressed".equals(keyword)) { + if (compressedSeen) throw new AssertionError("Duplicate"); + compressedSeen = true; + if (!COMPRESSED.equals(translatedKeyword)) + throw new AssertionError("Wrong translated keyword"); + if (!TEXT.equals(text)) + throw new AssertionError("Wrong text"); + } + else { + throw new AssertionError("Unexpected keyword"); + } + } + if (!(verbatimSeen && compressedSeen)) + throw new AssertionError("Missing chunk"); + } + + private static final int findBytes(byte[] needle, byte[] haystack) { + HAYSTACK: for (int h = 0; h <= haystack.length - needle.length; ++h) { + for (int n = 0; n < needle.length; ++n) { + if (needle[n] != haystack[h + n]) { + continue HAYSTACK; + } + } + return h; + } + return -1; + } + +} From 47a5b98c7f6ad40e66f40caa5d3017a5579870c7 Mon Sep 17 00:00:00 2001 From: Andrew Brygin Date: Thu, 15 Jan 2009 13:55:30 +0300 Subject: [PATCH 021/292] 6788096: ImageIO SreamCloser causes memory leak in FX applets Reviewed-by: igor, prr --- .../com/sun/imageio/stream/StreamCloser.java | 4 + .../stream/StreamCloserLeak/run_test.sh | 205 +++++++++++++ .../stream/StreamCloserLeak/test/Main.java | 284 ++++++++++++++++++ .../stream/StreamCloserLeak/testapp/Main.java | 109 +++++++ 4 files changed, 602 insertions(+) create mode 100644 jdk/test/javax/imageio/stream/StreamCloserLeak/run_test.sh create mode 100644 jdk/test/javax/imageio/stream/StreamCloserLeak/test/Main.java create mode 100644 jdk/test/javax/imageio/stream/StreamCloserLeak/testapp/Main.java diff --git a/jdk/src/share/classes/com/sun/imageio/stream/StreamCloser.java b/jdk/src/share/classes/com/sun/imageio/stream/StreamCloser.java index f39b98eb05d..03c6ce32364 100644 --- a/jdk/src/share/classes/com/sun/imageio/stream/StreamCloser.java +++ b/jdk/src/share/classes/com/sun/imageio/stream/StreamCloser.java @@ -94,6 +94,10 @@ public class StreamCloser { tgn != null; tg = tgn, tgn = tg.getParent()); streamCloser = new Thread(tg, streamCloserRunnable); + /* Set context class loader to null in order to avoid + * keeping a strong reference to an application classloader. + */ + streamCloser.setContextClassLoader(null); Runtime.getRuntime().addShutdownHook(streamCloser); return null; } diff --git a/jdk/test/javax/imageio/stream/StreamCloserLeak/run_test.sh b/jdk/test/javax/imageio/stream/StreamCloserLeak/run_test.sh new file mode 100644 index 00000000000..af3e428cb30 --- /dev/null +++ b/jdk/test/javax/imageio/stream/StreamCloserLeak/run_test.sh @@ -0,0 +1,205 @@ +#!/bin/ksh -p +# +# Copyright 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 6788096 +# @summary Test simulates the case of multiple applets executed in +# the same VM and verifies that ImageIO shutdown hook +# StreamCloser does not cause a leak of classloaders. +# +# @build test.Main +# @build testapp.Main +# @run shell run_test.sh + +# There are several resources which need to be present before many +# shell scripts can run. Following are examples of how to check for +# many common ones. +# +# Note that the shell used is the Korn Shell, KSH +# +# Also note, it is recommended that make files NOT be used. Rather, +# put the individual commands directly into this file. That way, +# it is possible to use command line arguments and other shell tech- +# niques to find the compiler, etc on different systems. For example, +# a different path could be used depending on whether this were a +# Solaris or Win32 machine, which is more difficult (if even possible) +# in a make file. + + +# Beginning of subroutines: +status=1 + +#Call this from anywhere to fail the test with an error message +# usage: fail "reason why the test failed" +fail() + { echo "The test failed :-(" + echo "$*" 1>&2 + echo "exit status was $status" + exit $status + } #end of fail() + +#Call this from anywhere to pass the test with a message +# usage: pass "reason why the test passed if applicable" +pass() + { echo "The test passed!!!" + echo "$*" 1>&2 + exit 0 + } #end of pass() + +# end of subroutines + + +# The beginning of the script proper + +# Checking for proper OS +OS=`uname -s` +case "$OS" in + SunOS ) + VAR="One value for Sun" + DEFAULT_JDK=/usr/local/java/jdk1.2/solaris + FILESEP="/" + PATHSEP=":" + TMP="/tmp" + ;; + + Linux ) + VAR="A different value for Linux" + DEFAULT_JDK=/usr/local/java/jdk1.4/linux-i386 + FILESEP="/" + PATHSEP=":" + TMP="/tmp" + ;; + + Windows_95 | Windows_98 | Windows_NT | Windows_ME ) + VAR="A different value for Win32" + DEFAULT_JDK=/usr/local/java/jdk1.2/win32 + FILESEP="\\" + PATHSEP=";" + TMP=`cd "${SystemRoot}/Temp"; echo ${PWD}` + ;; + + # catch all other OSs + * ) + echo "Unrecognized system! $OS" + fail "Unrecognized system! $OS" + ;; +esac + +# Want this test to run standalone as well as in the harness, so do the +# following to copy the test's directory into the harness's scratch directory +# and set all appropriate variables: + +if [ -z "${TESTJAVA}" ] ; then + # TESTJAVA is not set, so the test is running stand-alone. + # TESTJAVA holds the path to the root directory of the build of the JDK + # to be tested. That is, any java files run explicitly in this shell + # should use TESTJAVA in the path to the java interpreter. + # So, we'll set this to the JDK spec'd on the command line. If none + # is given on the command line, tell the user that and use a cheesy + # default. + # THIS IS THE JDK BEING TESTED. + if [ -n "$1" ] ; + then TESTJAVA=$1 + else echo "no JDK specified on command line so using default!" + TESTJAVA=$DEFAULT_JDK + fi + TESTSRC=. + TESTCLASSES=. + STANDALONE=1; +fi +echo "JDK under test is: $TESTJAVA" + + +############### YOUR TEST CODE HERE!!!!!!! ############# + +#All files required for the test should be in the same directory with +# this file. If converting a standalone test to run with the harness, +# as long as all files are in the same directory and it returns 0 for +# pass, you should be able to cut and paste it into here and it will +# run with the test harness. + +# This is an example of running something -- test +# The stuff below catches the exit status of test then passes or fails +# this shell test as appropriate ( 0 status is considered a pass here ) + +echo "Create TestApp.jar..." + +if [ -f TestApp.jar ] ; then + rm -f TestApp.jar +fi + +${TESTJAVA}/bin/jar -cvf TestApp.jar -C ${TESTCLASSES} testapp + +if [ $? -ne "0" ] ; then + fail "Failed to create TestApp.jar" +fi + +echo "Create Test.jar..." +if [ -f Test.jar ] ; then + rm -f Test.jar +fi + +${TESTJAVA}/bin/jar -cvf Test.jar -C ${TESTCLASSES} test + +if [ $? -ne 0 ] ; then + fail "Failed to create Test.jar" +fi + +# Prepare temp dir for cahce files +mkdir ./tmp +if [ $? -ne 0 ] ; then + fail "Unable to create temp directory." +fi + +# Verify that all classoladers are destroyed +${TESTJAVA}/bin/java -cp Test.jar test.Main +if [ $? -ne 0 ] ; then + fail "Test FAILED: some classloaders weren't destroyed." +fi + + +# Verify that ImageIO shutdown hook works correcly +${TESTJAVA}/bin/java -cp Test.jar -DforgetSomeStreams=true test.Main +if [ $? -ne 0 ] ; then + fail "Test FAILED: some classloaders weren't destroyed of shutdown hook failed." +fi + +# sanity check: verify that all cache files were deleted +cache_files=`ls tmp` + +if [ "x${cache_files}" != "x" ] ; then + echo "WARNING: some cache files was not deleted: ${cache_files}" +fi + +echo "Test done." + +status=$? + +if [ $status -eq "0" ] ; then + pass "" +else + fail "Test failed due to test plugin was not found." +fi + diff --git a/jdk/test/javax/imageio/stream/StreamCloserLeak/test/Main.java b/jdk/test/javax/imageio/stream/StreamCloserLeak/test/Main.java new file mode 100644 index 00000000000..b87299967c6 --- /dev/null +++ b/jdk/test/javax/imageio/stream/StreamCloserLeak/test/Main.java @@ -0,0 +1,284 @@ +/* + * Copyright 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. + */ + +package test; + +import java.io.File; +import java.io.IOException; +import java.lang.ref.Reference; +import java.lang.ref.ReferenceQueue; +import java.lang.ref.WeakReference; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.HashMap; +import java.util.Map.Entry; +import java.util.Set; +import java.util.WeakHashMap; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.CountDownLatch; +import javax.imageio.stream.ImageInputStream; +import sun.awt.AppContext; +import sun.awt.SunToolkit; + +public class Main { + + private static ThreadGroup appsThreadGroup; + + private static WeakHashMap refs = + new WeakHashMap(); + + /** Collection to simulate forgrotten streams **/ + private static HashMap strongRefs = + new HashMap(); + + private static ConcurrentLinkedQueue problems = + new ConcurrentLinkedQueue(); + + private static AppContext mainAppContext = null; + + private static CountDownLatch doneSignal; + + private static final int gcTimeout = + Integer.getInteger("gcTimeout", 10).intValue(); + + private static boolean forgetSomeStreams = + Boolean.getBoolean("forgetSomeStreams"); + + public static void main(String[] args) throws IOException { + mainAppContext = SunToolkit.createNewAppContext(); + System.out.println("Current context class loader: " + + Thread.currentThread().getContextClassLoader()); + + appsThreadGroup = new ThreadGroup("MyAppsThreadGroup"); + + File jar = new File("TestApp.jar"); + if (!jar.exists()) { + System.out.println(jar.getAbsolutePath() + " was not found!\n" + + "Please install the jar with test application correctly!"); + throw new RuntimeException("Test failed: no TestApp.jar"); + } + + URL[] urls = new URL[]{jar.toURL()}; + + int numApps = Integer.getInteger("numApps", 20).intValue(); + + doneSignal = new CountDownLatch(numApps); + int cnt = 0; + while (cnt++ < numApps) { + launch(urls, "testapp.Main", "launch"); + + checkErrors(); + } + + System.out.println("Wait for apps completion...."); + + try { + doneSignal.await(); + } catch (InterruptedException e) { + } + + System.out.println("All apps finished."); + + System.gc(); + + System.out.flush(); + + System.out.println("Enumerate strong refs:"); + for (String is : strongRefs.keySet()) { + System.out.println("-> " + is); + } + + System.out.println("======================="); + + // wait few seconds + waitAndGC(gcTimeout); + + doneSignal = new CountDownLatch(1); + + Runnable workaround = new Runnable() { + + public void run() { + AppContext ctx = null; + try { + ctx = SunToolkit.createNewAppContext(); + } catch (Throwable e) { + // ignore... + } finally { + doneSignal.countDown(); + } + } + }; + + Thread wt = new Thread(appsThreadGroup, workaround, "Workaround"); + wt.setContextClassLoader(new MyClassLoader(urls, "workaround")); + wt.start(); + wt = null; + workaround = null; + + System.out.println("Wait for workaround completion..."); + + try { + doneSignal.await(); + } catch (InterruptedException e) { + } + + // give a chance to GC + waitAndGC(gcTimeout); + + if (!refs.isEmpty()) { + System.out.println("Classloaders still alive:"); + + for (MyClassLoader l : refs.keySet()) { + String val = refs.get(l); + + if (val == null) { + throw new RuntimeException("Test FAILED: Invalid classloader name"); + } + System.out.println("->" + val + (strongRefs.get(val) != null ? + " (has strong ref)" : "")); + if (strongRefs.get(val) == null) { + throw new RuntimeException("Test FAILED: exta class loader is detected! "); + } + } + } else { + System.out.println("No alive class loaders!!"); + } + System.out.println("Test PASSED."); + } + + private static void waitAndGC(int sec) { + int cnt = sec; + System.out.print("Wait "); + while (cnt-- > 0) { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + // do GC every 3 seconds + if (cnt % 3 == 2) { + System.gc(); + System.out.print("+"); + } else { + System.out.print("."); + } + checkErrors(); + } + System.out.println(""); + } + + private static void checkErrors() { + while (!problems.isEmpty()) { + Throwable theProblem = problems.poll(); + System.out.println("Test FAILED!"); + do { + theProblem.printStackTrace(System.out); + theProblem = theProblem.getCause(); + } while (theProblem != null); + throw new RuntimeException("Test FAILED"); + } + } + static int counter = 0; + + private static void launch(URL[] urls, final String className, + final String methodName) + { + final String uniqClassName = "testapp/Uniq" + counter; + final boolean saveStrongRef = forgetSomeStreams ? (counter % 5 == 4) : false; + + System.out.printf("%s: launch the app\n", uniqClassName); + Runnable launchIt = new Runnable() { + public void run() { + AppContext ctx = SunToolkit.createNewAppContext(); + + try { + Class appMain = + ctx.getContextClassLoader().loadClass(className); + Method launch = appMain.getDeclaredMethod(methodName, + strongRefs.getClass()); + + Constructor c = appMain.getConstructor(String.class, + problems.getClass()); + + Object o = c.newInstance(uniqClassName, problems); + + if (saveStrongRef) { + System.out.printf("%s: force strong ref\n", + uniqClassName); + launch.invoke(o, strongRefs); + } else { + HashMap empty = null; + launch.invoke(o, empty); + } + + ctx = null; + } catch (Throwable e) { + problems.add(e); + } finally { + doneSignal.countDown(); + } + } + }; + + MyClassLoader appClassLoader = new MyClassLoader(urls, uniqClassName); + + refs.put(appClassLoader, uniqClassName); + + Thread appThread = new Thread(appsThreadGroup, launchIt, + "AppThread" + counter++); + appThread.setContextClassLoader(appClassLoader); + + appThread.start(); + launchIt = null; + appThread = null; + appClassLoader = null; + } + + private static class MyClassLoader extends URLClassLoader { + + private static boolean verbose = + Boolean.getBoolean("verboseClassLoading"); + private String uniqClassName; + + public MyClassLoader(URL[] urls, String uniq) { + super(urls); + + uniqClassName = uniq; + } + + public Class loadClass(String name) throws ClassNotFoundException { + if (verbose) { + System.out.printf("%s: load class %s\n", uniqClassName, name); + } + if (uniqClassName.equals(name)) { + return Object.class; + } + return super.loadClass(name); + } + + public String toString() { + return "MyClassLoader(" + uniqClassName + ")"; + } + } +} diff --git a/jdk/test/javax/imageio/stream/StreamCloserLeak/testapp/Main.java b/jdk/test/javax/imageio/stream/StreamCloserLeak/testapp/Main.java new file mode 100644 index 00000000000..3c4bb5ec3ff --- /dev/null +++ b/jdk/test/javax/imageio/stream/StreamCloserLeak/testapp/Main.java @@ -0,0 +1,109 @@ +/* + * Copyright 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. + */ + +package testapp; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.concurrent.ConcurrentLinkedQueue; +import javax.imageio.stream.FileCacheImageInputStream; +import javax.imageio.stream.ImageInputStream; + +public class Main { + + public static void main(String[] args) { + Main o = new Main("testapp.some.class", null); + o.launch(null); + } + + private final String uniqClassName; + private final ConcurrentLinkedQueue problems; + + public Main(String uniq, ConcurrentLinkedQueue p) { + uniqClassName = uniq; + problems = p; + } + + public void launch(HashMap refs) { + System.out.printf("%s: current context class loader: %s\n", + uniqClassName, + Thread.currentThread().getContextClassLoader()); + try { + byte[] data = new byte[1024]; + ByteArrayInputStream bais = new ByteArrayInputStream(data); + MyImageInputStream iis = new MyImageInputStream(bais, + uniqClassName, + problems); + if (refs != null) { + System.out.printf("%s: added to strong store\n", + uniqClassName); + refs.put(uniqClassName, iis); + } + iis.read(); + //leave stream open : let's shutdown hook work! + } catch (IOException e) { + problems.add(e); + } + } + + private static class MyImageInputStream extends FileCacheImageInputStream { + private final String uniqClassName; + private ConcurrentLinkedQueue problems; + public MyImageInputStream(InputStream is, String uniq, + ConcurrentLinkedQueue p) throws IOException + { + super(is, new File("tmp")); + uniqClassName = uniq; + problems = p; + } + + @Override + public void close() throws IOException { + Test t = new Test(); + try { + t.doTest(uniqClassName); + } catch (Throwable e) { + problems.add(e); + } + + super.close(); + + problems = null; + } + } +} + +class Test { + public void doTest(String uniqClassName) throws ClassNotFoundException { + System.out.printf("%s: Current thread: %s\n", uniqClassName, + Thread.currentThread()); + + ClassLoader thisCL = this.getClass().getClassLoader(); + Class uniq = thisCL.loadClass(uniqClassName); + + System.out.printf("%s: test is done!\n",uniqClassName); + } +} From 8c2a336349c8ff82c6ab4484a68ca4b7dc4e11e1 Mon Sep 17 00:00:00 2001 From: Andrew Brygin Date: Fri, 23 Jan 2009 17:43:29 +0300 Subject: [PATCH 022/292] 6795544: GIFImageWriter does not write the subImage of BufferedImage to a file correctly Reviewed-by: igor, prr --- .../imageio/plugins/gif/GIFImageWriter.java | 16 +- .../plugins/gif/EncodeSubImageTest.java | 161 ++++++++++++++++++ 2 files changed, 175 insertions(+), 2 deletions(-) create mode 100644 jdk/test/javax/imageio/plugins/gif/EncodeSubImageTest.java diff --git a/jdk/src/share/classes/com/sun/imageio/plugins/gif/GIFImageWriter.java b/jdk/src/share/classes/com/sun/imageio/plugins/gif/GIFImageWriter.java index 4c7903bfe84..89f735d8793 100644 --- a/jdk/src/share/classes/com/sun/imageio/plugins/gif/GIFImageWriter.java +++ b/jdk/src/share/classes/com/sun/imageio/plugins/gif/GIFImageWriter.java @@ -55,6 +55,7 @@ import org.w3c.dom.Node; import org.w3c.dom.NodeList; import com.sun.imageio.plugins.common.LZWCompressor; import com.sun.imageio.plugins.common.PaletteBuilder; +import sun.awt.image.ByteComponentRaster; public class GIFImageWriter extends ImageWriter { private static final boolean DEBUG = false; // XXX false for release! @@ -905,10 +906,18 @@ public class GIFImageWriter extends ImageWriter { LZWCompressor compressor = new LZWCompressor(stream, initCodeSize, false); + /* At this moment we know that input image is indexed image. + * We can directly copy data iff: + * - no subsampling required (periodX = 1, periodY = 0) + * - we can access data directly (image is non-tiled, + * i.e. image data are in single block) + * - we can calculate offset in data buffer (next 3 lines) + */ boolean isOptimizedCase = periodX == 1 && periodY == 1 && - sampleModel instanceof ComponentSampleModel && image.getNumXTiles() == 1 && image.getNumYTiles() == 1 && + sampleModel instanceof ComponentSampleModel && + image.getTile(0, 0) instanceof ByteComponentRaster && image.getTile(0, 0).getDataBuffer() instanceof DataBufferByte; int numRowsWritten = 0; @@ -921,11 +930,14 @@ public class GIFImageWriter extends ImageWriter { if (DEBUG) System.out.println("Writing interlaced"); if (isOptimizedCase) { - Raster tile = image.getTile(0, 0); + ByteComponentRaster tile = + (ByteComponentRaster)image.getTile(0, 0); byte[] data = ((DataBufferByte)tile.getDataBuffer()).getData(); ComponentSampleModel csm = (ComponentSampleModel)tile.getSampleModel(); int offset = csm.getOffset(sourceXOffset, sourceYOffset, 0); + // take into account the raster data offset + offset += tile.getDataOffset(0); int lineStride = csm.getScanlineStride(); writeRowsOpt(data, offset, lineStride, compressor, diff --git a/jdk/test/javax/imageio/plugins/gif/EncodeSubImageTest.java b/jdk/test/javax/imageio/plugins/gif/EncodeSubImageTest.java new file mode 100644 index 00000000000..407242161c2 --- /dev/null +++ b/jdk/test/javax/imageio/plugins/gif/EncodeSubImageTest.java @@ -0,0 +1,161 @@ +/* + * Copyright 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 6795544 + * + * @summary Test verifes that Image I/O gif writer correctly handles + * buffered images based on translated reasters (typically + * produced by getSubImage() method). + * + * @run main EncodeSubImageTest gif + */ + +import java.awt.Color; +import java.awt.Graphics; +import java.awt.image.BufferedImage; +import java.awt.image.Raster; +import java.io.File; +import java.io.IOException; +import javax.imageio.IIOImage; +import javax.imageio.ImageIO; +import javax.imageio.ImageWriteParam; +import javax.imageio.ImageWriter; +import javax.imageio.stream.ImageOutputStream; + +public class EncodeSubImageTest { + private static String format = "gif"; + private static ImageWriter writer; + private static String file_suffix; + private static final int subSampleX = 2; + private static final int subSampleY = 2; + + public static void main(String[] args) throws IOException { + if (args.length > 0) { + format = args[0]; + } + + writer = ImageIO.getImageWritersByFormatName(format).next(); + + file_suffix =writer.getOriginatingProvider().getFileSuffixes()[0]; + + BufferedImage src = createTestImage(); + EncodeSubImageTest m1 = new EncodeSubImageTest(src); + m1.doTest("test_src"); + + BufferedImage sub = src.getSubimage(subImageOffset, subImageOffset, + src.getWidth() - 2 * subImageOffset, + src.getHeight() - 2 * subImageOffset); + EncodeSubImageTest m2 = new EncodeSubImageTest(sub); + m2.doTest("test_sub"); + } + + BufferedImage img; + + public EncodeSubImageTest(BufferedImage img) { + this.img = img; + } + + public void doTest(String prefix) throws IOException { + System.out.println(prefix); + File f = new File(prefix + file_suffix); + write(f, false); + verify(f, false); + + System.out.println(prefix + "_subsampled"); + f = new File(prefix + "_subsampled"); + write(f, true); + verify(f, true); + + System.out.println(prefix + ": Test PASSED."); + } + + private static final int subImageOffset = 10; + + private void verify(File f, boolean isSubsampled) { + BufferedImage dst = null; + try { + dst = ImageIO.read(f); + } catch (IOException e) { + throw new RuntimeException("Test FAILED: can't readin test image " + + f.getAbsolutePath(), e); + } + if (dst == null) { + throw new RuntimeException("Test FAILED: no dst image available."); + } + + checkPixel(dst, 0, 0, isSubsampled); + + checkPixel(dst, img.getWidth() / 2, img.getHeight() / 2, isSubsampled); + } + + private void checkPixel(BufferedImage dst, int x, int y, + boolean isSubsampled) + { + int dx = isSubsampled ? x / subSampleX : x; + int dy = isSubsampled ? y / subSampleY : y; + int src_rgb = img.getRGB(x, y); + System.out.printf("src_rgb: %x\n", src_rgb); + + int dst_rgb = dst.getRGB(dx, dy); + System.out.printf("dst_rgb: %x\n", dst_rgb); + + if (src_rgb != dst_rgb) { + throw new RuntimeException("Test FAILED: invalid color in dst"); + } + } + + private static BufferedImage createTestImage() { + int w = 100; + int h = 100; + + BufferedImage src = new BufferedImage(w, h, + BufferedImage.TYPE_BYTE_INDEXED); + Graphics g = src.createGraphics(); + g.setColor(Color.red); + g.fillRect(0, 0, w, h); + g.setColor(Color.green); + g.fillRect(subImageOffset, subImageOffset, + w - 2 * subImageOffset, h - 2* subImageOffset); + g.setColor(Color.blue); + g.fillRect(2 * subImageOffset, 2 * subImageOffset, + w - 4 * subImageOffset, h - 4 * subImageOffset); + g.dispose(); + + return src; + } + + private void write(File f, boolean subsample) throws IOException { + ImageOutputStream ios = ImageIO.createImageOutputStream(f); + + writer.setOutput(ios); + ImageWriteParam p = writer.getDefaultWriteParam(); + if (subsample) { + p.setSourceSubsampling(subSampleX, subSampleY, 0, 0); + } + writer.write(null, new IIOImage(img, null, null), p); + ios.close(); + writer.reset(); + } +} From 2726f2a3621dd2562d4fb660b4c3d376c65027aa Mon Sep 17 00:00:00 2001 From: Andrew Brygin Date: Fri, 23 Jan 2009 21:14:31 +0300 Subject: [PATCH 023/292] 6793818: JpegImageReader is too greedy creating color profiles Reviewed-by: igor, prr --- .../classes/java/awt/color/ICC_Profile.java | 78 +++++++++++-------- .../sun/java2d/cmm/ProfileActivator.java | 3 +- .../sun/java2d/cmm/ProfileDeferralMgr.java | 27 ++++++- 3 files changed, 71 insertions(+), 37 deletions(-) diff --git a/jdk/src/share/classes/java/awt/color/ICC_Profile.java b/jdk/src/share/classes/java/awt/color/ICC_Profile.java index 3ef8d437bb4..705d2560e1f 100644 --- a/jdk/src/share/classes/java/awt/color/ICC_Profile.java +++ b/jdk/src/share/classes/java/awt/color/ICC_Profile.java @@ -737,7 +737,7 @@ public class ICC_Profile implements Serializable { ICC_Profile(ProfileDeferralInfo pdi) { this.deferralInfo = pdi; this.profileActivator = new ProfileActivator() { - public void activate() { + public void activate() throws ProfileDataException { activateDeferredProfile(); } }; @@ -830,20 +830,16 @@ public class ICC_Profile implements Serializable { case ColorSpace.CS_sRGB: synchronized(ICC_Profile.class) { if (sRGBprofile == null) { - try { - /* - * Deferral is only used for standard profiles. - * Enabling the appropriate access privileges is handled - * at a lower level. - */ - sRGBprofile = getDeferredInstance( - new ProfileDeferralInfo("sRGB.pf", - ColorSpace.TYPE_RGB, - 3, CLASS_DISPLAY)); - } catch (IOException e) { - throw new IllegalArgumentException( - "Can't load standard profile: sRGB.pf"); - } + /* + * Deferral is only used for standard profiles. + * Enabling the appropriate access privileges is handled + * at a lower level. + */ + ProfileDeferralInfo pInfo = + new ProfileDeferralInfo("sRGB.pf", + ColorSpace.TYPE_RGB, 3, + CLASS_DISPLAY); + sRGBprofile = getDeferredInstance(pInfo); } thisProfile = sRGBprofile; } @@ -853,7 +849,11 @@ public class ICC_Profile implements Serializable { case ColorSpace.CS_CIEXYZ: synchronized(ICC_Profile.class) { if (XYZprofile == null) { - XYZprofile = getStandardProfile("CIEXYZ.pf"); + ProfileDeferralInfo pInfo = + new ProfileDeferralInfo("CIEXYZ.pf", + ColorSpace.TYPE_XYZ, 3, + CLASS_DISPLAY); + XYZprofile = getDeferredInstance(pInfo); } thisProfile = XYZprofile; } @@ -863,7 +863,11 @@ public class ICC_Profile implements Serializable { case ColorSpace.CS_PYCC: synchronized(ICC_Profile.class) { if (PYCCprofile == null) { - PYCCprofile = getStandardProfile("PYCC.pf"); + ProfileDeferralInfo pInfo = + new ProfileDeferralInfo("PYCC.pf", + ColorSpace.TYPE_3CLR, 3, + CLASS_DISPLAY); + PYCCprofile = getDeferredInstance(pInfo); } thisProfile = PYCCprofile; } @@ -873,7 +877,11 @@ public class ICC_Profile implements Serializable { case ColorSpace.CS_GRAY: synchronized(ICC_Profile.class) { if (GRAYprofile == null) { - GRAYprofile = getStandardProfile("GRAY.pf"); + ProfileDeferralInfo pInfo = + new ProfileDeferralInfo("GRAY.pf", + ColorSpace.TYPE_GRAY, 1, + CLASS_DISPLAY); + GRAYprofile = getDeferredInstance(pInfo); } thisProfile = GRAYprofile; } @@ -883,7 +891,11 @@ public class ICC_Profile implements Serializable { case ColorSpace.CS_LINEAR_RGB: synchronized(ICC_Profile.class) { if (LINEAR_RGBprofile == null) { - LINEAR_RGBprofile = getStandardProfile("LINEAR_RGB.pf"); + ProfileDeferralInfo pInfo = + new ProfileDeferralInfo("LINEAR_RGB.pf", + ColorSpace.TYPE_RGB, 3, + CLASS_DISPLAY); + LINEAR_RGBprofile = getDeferredInstance(pInfo); } thisProfile = LINEAR_RGBprofile; } @@ -1047,9 +1059,7 @@ public class ICC_Profile implements Serializable { * code will take care of access privileges. * @see activateDeferredProfile() */ - static ICC_Profile getDeferredInstance(ProfileDeferralInfo pdi) - throws IOException { - + static ICC_Profile getDeferredInstance(ProfileDeferralInfo pdi) { if (!ProfileDeferralMgr.deferring) { return getStandardProfile(pdi.filename); } @@ -1063,33 +1073,37 @@ public class ICC_Profile implements Serializable { } - void activateDeferredProfile() { - byte profileData[]; - FileInputStream fis; - String fileName = deferralInfo.filename; + void activateDeferredProfile() throws ProfileDataException { + byte profileData[]; + FileInputStream fis; + String fileName = deferralInfo.filename; profileActivator = null; deferralInfo = null; if ((fis = openProfile(fileName)) == null) { - throw new IllegalArgumentException("Cannot open file " + fileName); + throw new ProfileDataException("Cannot open file " + fileName); } try { profileData = getProfileDataFromStream(fis); fis.close(); /* close the file */ } catch (IOException e) { - throw new IllegalArgumentException("Invalid ICC Profile Data" + - fileName); + ProfileDataException pde = new + ProfileDataException("Invalid ICC Profile Data" + fileName); + pde.initCause(e); + throw pde; } if (profileData == null) { - throw new IllegalArgumentException("Invalid ICC Profile Data" + + throw new ProfileDataException("Invalid ICC Profile Data" + fileName); } try { ID = CMSManager.getModule().loadProfile(profileData); } catch (CMMException c) { - throw new IllegalArgumentException("Invalid ICC Profile Data" + - fileName); + ProfileDataException pde = new + ProfileDataException("Invalid ICC Profile Data" + fileName); + pde.initCause(c); + throw pde; } } diff --git a/jdk/src/share/classes/sun/java2d/cmm/ProfileActivator.java b/jdk/src/share/classes/sun/java2d/cmm/ProfileActivator.java index 32c4e477fb9..f5a28f84232 100644 --- a/jdk/src/share/classes/sun/java2d/cmm/ProfileActivator.java +++ b/jdk/src/share/classes/sun/java2d/cmm/ProfileActivator.java @@ -25,6 +25,7 @@ package sun.java2d.cmm; +import java.awt.color.ProfileDataException; /** * An interface to allow the ProfileDeferralMgr to activate a @@ -35,6 +36,6 @@ public interface ProfileActivator { /** * Activate a previously deferred ICC_Profile object. */ - public void activate(); + public void activate() throws ProfileDataException; } diff --git a/jdk/src/share/classes/sun/java2d/cmm/ProfileDeferralMgr.java b/jdk/src/share/classes/sun/java2d/cmm/ProfileDeferralMgr.java index 41804c3fd9b..116f339da0a 100644 --- a/jdk/src/share/classes/sun/java2d/cmm/ProfileDeferralMgr.java +++ b/jdk/src/share/classes/sun/java2d/cmm/ProfileDeferralMgr.java @@ -25,6 +25,7 @@ package sun.java2d.cmm; +import java.awt.color.ProfileDataException; import java.util.Vector; @@ -39,7 +40,7 @@ import java.util.Vector; public class ProfileDeferralMgr { public static boolean deferring = true; - private static Vector aVector; + private static Vector aVector; /** * Records a ProfileActivator object whose activate method will @@ -51,7 +52,7 @@ public class ProfileDeferralMgr { return; } if (aVector == null) { - aVector = new Vector(3, 3); + aVector = new Vector(3, 3); } aVector.addElement(pa); return; @@ -89,8 +90,26 @@ public class ProfileDeferralMgr { return; } n = aVector.size(); - for (i = 0; i < n; i++) { - ((ProfileActivator) aVector.get(i)).activate(); + for (ProfileActivator pa : aVector) { + try { + pa.activate(); + } catch (ProfileDataException e) { + /* + * Ignore profile activation error for now: + * such exception is pssible due to absence + * or corruption of standard color profile. + * As for now we expect all profiles should + * be shiped with jre and presence of this + * exception is indication of some configuration + * problem in jre installation. + * + * NB: we still are greedy loading deferred profiles + * and load them all if any of them is needed. + * Therefore broken profile (if any) might be never used. + * If there will be attempt to use broken profile then + * it will result in CMMException. + */ + } } aVector.removeAllElements(); aVector = null; From 55076b2558a836ff91b27c6cee714f39cae75878 Mon Sep 17 00:00:00 2001 From: Red Hat Date: Wed, 28 Jan 2009 09:38:55 -0800 Subject: [PATCH 024/292] 6793344: BasicStroke's first element dash pattern is not a dash Reviewed-by: igor, flar --- .../classes/sun/java2d/pisces/Dasher.java | 2 +- jdk/test/sun/pisces/DashStrokeTest.java | 86 +++++++++++++++++++ 2 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 jdk/test/sun/pisces/DashStrokeTest.java diff --git a/jdk/src/share/classes/sun/java2d/pisces/Dasher.java b/jdk/src/share/classes/sun/java2d/pisces/Dasher.java index 81c92f44a60..99215e01b8e 100644 --- a/jdk/src/share/classes/sun/java2d/pisces/Dasher.java +++ b/jdk/src/share/classes/sun/java2d/pisces/Dasher.java @@ -120,7 +120,7 @@ public class Dasher extends LineSink { // Normalize so 0 <= phase < dash[0] int idx = 0; - dashOn = false; + dashOn = true; int d; while (phase >= (d = dash[idx])) { phase -= d; diff --git a/jdk/test/sun/pisces/DashStrokeTest.java b/jdk/test/sun/pisces/DashStrokeTest.java new file mode 100644 index 00000000000..f77acbeacfe --- /dev/null +++ b/jdk/test/sun/pisces/DashStrokeTest.java @@ -0,0 +1,86 @@ +/* + * Copyright 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 + * @summary verify that first element is a dash + * @bug 6793344 + */ + +import java.awt.*; +import java.awt.image.*; + +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.SwingUtilities; +import javax.swing.WindowConstants; + +public class DashStrokeTest extends Component { + + static BufferedImage bi; + static boolean printed = false; + + public Dimension getPreferredSize() { + return new Dimension(200,200); + } + + public static void drawGui() { + bi = new BufferedImage(200, 20, BufferedImage.TYPE_INT_RGB); + Graphics2D g2d = bi.createGraphics(); + BasicStroke dashStroke = new BasicStroke(1.0f, BasicStroke.CAP_ROUND, + BasicStroke.JOIN_ROUND, 1.0f, new float[] { 0.0f, 200 }, + 1.0f); + + g2d.setStroke(dashStroke); + g2d.setColor(Color.RED); + g2d.drawLine(5,10, 100,10); + printed =true; + } + + public static void main(String[] args) { + try { + SwingUtilities.invokeAndWait(new Runnable() { + + @Override + public void run() { + drawGui(); + } + + }); + } catch (Exception e) { + } + + if (printed) { + checkBI(bi, Color.RED); + } + } + + static void checkBI(BufferedImage bi, Color badColor) { + int badrgb = badColor.getRGB(); + + int col = bi.getRGB(6, 9); + if (col == badrgb) { + throw new RuntimeException("A pixel was turned on. "); + } + } +} + From 2a2bbe287903c73e0de793d2f1c6a2bb88125151 Mon Sep 17 00:00:00 2001 From: Andrew Brygin Date: Thu, 29 Jan 2009 13:19:34 +0300 Subject: [PATCH 025/292] 6631559: Registration of ImageIO plugins should not cause loading of jpeg.dlli and cmm.dll Reviewed-by: igor, prr --- .../plugins/jpeg/JFIFMarkerSegment.java | 2 +- .../com/sun/imageio/plugins/jpeg/JPEG.java | 25 +- .../imageio/plugins/jpeg/JPEGImageReader.java | 26 +- .../plugins/jpeg/JPEGImageReaderSpi.java | 22 -- .../imageio/plugins/jpeg/JPEGImageWriter.java | 10 +- .../plugins/jpeg/JPEGImageWriterSpi.java | 19 -- .../imageio/plugins/jpeg/JPEGMetadata.java | 2 +- .../javax/imageio/ImageTypeSpecifier.java | 247 +++++++++--------- 8 files changed, 167 insertions(+), 186 deletions(-) diff --git a/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JFIFMarkerSegment.java b/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JFIFMarkerSegment.java index 883bd1a7447..d59a8885c9b 100644 --- a/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JFIFMarkerSegment.java +++ b/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JFIFMarkerSegment.java @@ -1003,7 +1003,7 @@ class JFIFMarkerSegment extends MarkerSegment { 3, new int [] {0, 1, 2}, null); - ColorModel cm = new ComponentColorModel(JPEG.sRGB, + ColorModel cm = new ComponentColorModel(JPEG.JCS.sRGB, false, false, ColorModel.OPAQUE, diff --git a/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEG.java b/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEG.java index b16669bc089..3ed5c5083c3 100644 --- a/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEG.java +++ b/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEG.java @@ -208,15 +208,24 @@ public class JPEG { public static final int [] bOffsRGB = { 2, 1, 0 }; - protected static final ColorSpace sRGB = - ColorSpace.getInstance(ColorSpace.CS_sRGB); - protected static ColorSpace YCC = null; // Can't be final + /* These are kept in the inner class to avoid static initialization + * of the CMM class until someone actually needs it. + * (e.g. do not init CMM on the request for jpeg mime types) + */ + public static class JCS { + public static final ColorSpace sRGB = + ColorSpace.getInstance(ColorSpace.CS_sRGB); + public static final ColorSpace YCC; - static { - try { - YCC = ColorSpace.getInstance(ColorSpace.CS_PYCC); - } catch (IllegalArgumentException e) { - // PYCC.pf may not always be installed + static { + ColorSpace cs = null; + try { + cs = ColorSpace.getInstance(ColorSpace.CS_PYCC); + } catch (IllegalArgumentException e) { + // PYCC.pf may not always be installed + } finally { + YCC = cs; + } } } diff --git a/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReader.java b/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReader.java index 48afd2f354c..faf8261544c 100644 --- a/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReader.java +++ b/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReader.java @@ -228,31 +228,31 @@ public class JPEGImageReader extends ImageReader { (BufferedImage.TYPE_BYTE_GRAY); defaultTypes[JPEG.JCS_RGB] = ImageTypeSpecifier.createInterleaved - (JPEG.sRGB, + (JPEG.JCS.sRGB, JPEG.bOffsRGB, DataBuffer.TYPE_BYTE, false, false); defaultTypes[JPEG.JCS_RGBA] = ImageTypeSpecifier.createPacked - (JPEG.sRGB, + (JPEG.JCS.sRGB, 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff, DataBuffer.TYPE_INT, false); - if (JPEG.YCC != null) { + if (JPEG.JCS.YCC != null) { defaultTypes[JPEG.JCS_YCC] = ImageTypeSpecifier.createInterleaved - (JPEG.YCC, + (JPEG.JCS.YCC, JPEG.bandOffsets[2], DataBuffer.TYPE_BYTE, false, false); defaultTypes[JPEG.JCS_YCCA] = ImageTypeSpecifier.createInterleaved - (JPEG.YCC, + (JPEG.JCS.YCC, JPEG.bandOffsets[3], DataBuffer.TYPE_BYTE, true, @@ -774,7 +774,7 @@ public class JPEGImageReader extends ImageReader { case JPEG.JCS_RGB: list.add(raw); list.add(getImageType(JPEG.JCS_GRAYSCALE)); - if (JPEG.YCC != null) { + if (JPEG.JCS.YCC != null) { list.add(getImageType(JPEG.JCS_YCC)); } break; @@ -811,7 +811,7 @@ public class JPEGImageReader extends ImageReader { } list.add(getImageType(JPEG.JCS_GRAYSCALE)); - if (JPEG.YCC != null) { // Might be null if PYCC.pf not installed + if (JPEG.JCS.YCC != null) { // Might be null if PYCC.pf not installed list.add(getImageType(JPEG.JCS_YCC)); } break; @@ -893,7 +893,7 @@ public class JPEGImageReader extends ImageReader { (!cs.isCS_sRGB()) && (cm.getNumComponents() == numComponents)) { // Target isn't sRGB, so convert from sRGB to the target - convert = new ColorConvertOp(JPEG.sRGB, cs, null); + convert = new ColorConvertOp(JPEG.JCS.sRGB, cs, null); } else if (csType != ColorSpace.TYPE_RGB) { throw new IIOException("Incompatible color conversion"); } @@ -906,18 +906,18 @@ public class JPEGImageReader extends ImageReader { } break; case JPEG.JCS_YCC: - if (JPEG.YCC == null) { // We can't do YCC at all + if (JPEG.JCS.YCC == null) { // We can't do YCC at all throw new IIOException("Incompatible color conversion"); } - if ((cs != JPEG.YCC) && + if ((cs != JPEG.JCS.YCC) && (cm.getNumComponents() == numComponents)) { - convert = new ColorConvertOp(JPEG.YCC, cs, null); + convert = new ColorConvertOp(JPEG.JCS.YCC, cs, null); } break; case JPEG.JCS_YCCA: // No conversions available; image must be YCCA - if ((JPEG.YCC == null) || // We can't do YCC at all - (cs != JPEG.YCC) || + if ((JPEG.JCS.YCC == null) || // We can't do YCC at all + (cs != JPEG.JCS.YCC) || (cm.getNumComponents() != numComponents)) { throw new IIOException("Incompatible color conversion"); } diff --git a/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReaderSpi.java b/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReaderSpi.java index 5bed06158af..13327e3ea9c 100644 --- a/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReaderSpi.java +++ b/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReaderSpi.java @@ -39,8 +39,6 @@ public class JPEGImageReaderSpi extends ImageReaderSpi { private static String [] writerSpiNames = {"com.sun.imageio.plugins.jpeg.JPEGImageWriterSpi"}; - private boolean registered = false; - public JPEGImageReaderSpi() { super(JPEG.vendor, JPEG.version, @@ -61,26 +59,6 @@ public class JPEGImageReaderSpi extends ImageReaderSpi { ); } - public void onRegistration(ServiceRegistry registry, - Class category) { - if (registered) { - return; - } - try { - java.security.AccessController.doPrivileged( - new sun.security.action.LoadLibraryAction("jpeg")); - // Stuff it all into one lib for first pass - //java.security.AccessController.doPrivileged( - //new sun.security.action.LoadLibraryAction("imageioIJG")); - } catch (Throwable e) { // Fail on any Throwable - // if it can't be loaded, deregister and return - registry.deregisterServiceProvider(this); - return; - } - - registered = true; - } - public String getDescription(Locale locale) { return "Standard JPEG Image Reader"; } diff --git a/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageWriter.java b/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageWriter.java index 0fbe8f33945..9c585047faa 100644 --- a/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageWriter.java +++ b/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageWriter.java @@ -812,13 +812,13 @@ public class JPEGImageWriter extends ImageWriter { } break; case ColorSpace.TYPE_3CLR: - if (cs == JPEG.YCC) { + if (cs == JPEG.JCS.YCC) { if (!alpha) { if (jfif != null) { convertTosRGB = true; convertOp = new ColorConvertOp(cs, - JPEG.sRGB, + JPEG.JCS.sRGB, null); outCsType = JPEG.JCS_YCbCr; } else if (adobe != null) { @@ -1494,7 +1494,7 @@ public class JPEGImageWriter extends ImageWriter { } break; case ColorSpace.TYPE_3CLR: - if (cs == JPEG.YCC) { + if (cs == JPEG.JCS.YCC) { if (alpha) { retval = JPEG.JCS_YCCA; } else { @@ -1533,7 +1533,7 @@ public class JPEGImageWriter extends ImageWriter { } break; case ColorSpace.TYPE_3CLR: - if (cs == JPEG.YCC) { + if (cs == JPEG.JCS.YCC) { if (alpha) { retval = JPEG.JCS_YCCA; } else { @@ -1579,7 +1579,7 @@ public class JPEGImageWriter extends ImageWriter { } break; case ColorSpace.TYPE_3CLR: - if (cs == JPEG.YCC) { + if (cs == JPEG.JCS.YCC) { if (alpha) { retval = JPEG.JCS_YCCA; } else { diff --git a/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageWriterSpi.java b/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageWriterSpi.java index 936c65c544f..717b4360794 100644 --- a/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageWriterSpi.java +++ b/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageWriterSpi.java @@ -42,8 +42,6 @@ public class JPEGImageWriterSpi extends ImageWriterSpi { private static String [] readerSpiNames = {"com.sun.imageio.plugins.jpeg.JPEGImageReaderSpi"}; - private boolean registered = false; - public JPEGImageWriterSpi() { super(JPEG.vendor, JPEG.version, @@ -68,23 +66,6 @@ public class JPEGImageWriterSpi extends ImageWriterSpi { return "Standard JPEG Image Writer"; } - public void onRegistration(ServiceRegistry registry, - Class category) { - if (registered) { - return; - } - try { - java.security.AccessController.doPrivileged( - new sun.security.action.LoadLibraryAction("jpeg")); - } catch (Throwable e) { // Fail on any Throwable - // if it can't be loaded, deregister and return - registry.deregisterServiceProvider(this); - return; - } - - registered = true; - } - public boolean isFormatLossless() { return false; } diff --git a/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGMetadata.java b/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGMetadata.java index c84003c9f22..044f7d632f6 100644 --- a/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGMetadata.java +++ b/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGMetadata.java @@ -490,7 +490,7 @@ public class JPEGMetadata extends IIOMetadata implements Cloneable { } break; case ColorSpace.TYPE_3CLR: - if (cs == JPEG.YCC) { + if (cs == JPEG.JCS.YCC) { wantJFIF = false; componentIDs[0] = (byte) 'Y'; componentIDs[1] = (byte) 'C'; diff --git a/jdk/src/share/classes/javax/imageio/ImageTypeSpecifier.java b/jdk/src/share/classes/javax/imageio/ImageTypeSpecifier.java index 4ba0c1062d4..184bf8870cc 100644 --- a/jdk/src/share/classes/javax/imageio/ImageTypeSpecifier.java +++ b/jdk/src/share/classes/javax/imageio/ImageTypeSpecifier.java @@ -67,126 +67,13 @@ public class ImageTypeSpecifier { * BufferedImage types. */ private static ImageTypeSpecifier[] BISpecifier; - + private static ColorSpace sRGB; // Initialize the standard specifiers static { - ColorSpace sRGB = ColorSpace.getInstance(ColorSpace.CS_sRGB); + sRGB = ColorSpace.getInstance(ColorSpace.CS_sRGB); BISpecifier = new ImageTypeSpecifier[BufferedImage.TYPE_BYTE_INDEXED + 1]; - - BISpecifier[BufferedImage.TYPE_CUSTOM] = null; - - BISpecifier[BufferedImage.TYPE_INT_RGB] = - createPacked(sRGB, - 0x00ff0000, - 0x0000ff00, - 0x000000ff, - 0x0, - DataBuffer.TYPE_INT, - false); - - BISpecifier[BufferedImage.TYPE_INT_ARGB] = - createPacked(sRGB, - 0x00ff0000, - 0x0000ff00, - 0x000000ff, - 0xff000000, - DataBuffer.TYPE_INT, - false); - - BISpecifier[BufferedImage.TYPE_INT_ARGB_PRE] = - createPacked(sRGB, - 0x00ff0000, - 0x0000ff00, - 0x000000ff, - 0xff000000, - DataBuffer.TYPE_INT, - true); - - BISpecifier[BufferedImage.TYPE_INT_BGR] = - createPacked(sRGB, - 0x000000ff, - 0x0000ff00, - 0x00ff0000, - 0x0, - DataBuffer.TYPE_INT, - false); - - int[] bOffsRGB = { 2, 1, 0 }; - BISpecifier[BufferedImage.TYPE_3BYTE_BGR] = - createInterleaved(sRGB, - bOffsRGB, - DataBuffer.TYPE_BYTE, - false, - false); - - int[] bOffsABGR = { 3, 2, 1, 0 }; - BISpecifier[BufferedImage.TYPE_4BYTE_ABGR] = - createInterleaved(sRGB, - bOffsABGR, - DataBuffer.TYPE_BYTE, - true, - false); - - BISpecifier[BufferedImage.TYPE_4BYTE_ABGR_PRE] = - createInterleaved(sRGB, - bOffsABGR, - DataBuffer.TYPE_BYTE, - true, - true); - - BISpecifier[BufferedImage.TYPE_USHORT_565_RGB] = - createPacked(sRGB, - 0xF800, - 0x07E0, - 0x001F, - 0x0, - DataBuffer.TYPE_USHORT, - false); - - BISpecifier[BufferedImage.TYPE_USHORT_555_RGB] = - createPacked(sRGB, - 0x7C00, - 0x03E0, - 0x001F, - 0x0, - DataBuffer.TYPE_USHORT, - false); - - BISpecifier[BufferedImage.TYPE_BYTE_GRAY] = - createGrayscale(8, - DataBuffer.TYPE_BYTE, - false); - - BISpecifier[BufferedImage.TYPE_USHORT_GRAY] = - createGrayscale(16, - DataBuffer.TYPE_USHORT, - false); - - BISpecifier[BufferedImage.TYPE_BYTE_BINARY] = - createGrayscale(1, - DataBuffer.TYPE_BYTE, - false); - - BufferedImage bi = - new BufferedImage(1, 1, BufferedImage.TYPE_BYTE_INDEXED); - IndexColorModel icm = (IndexColorModel)bi.getColorModel(); - int mapSize = icm.getMapSize(); - byte[] redLUT = new byte[mapSize]; - byte[] greenLUT = new byte[mapSize]; - byte[] blueLUT = new byte[mapSize]; - byte[] alphaLUT = new byte[mapSize]; - - icm.getReds(redLUT); - icm.getGreens(greenLUT); - icm.getBlues(blueLUT); - icm.getAlphas(alphaLUT); - - BISpecifier[BufferedImage.TYPE_BYTE_INDEXED] = - createIndexed(redLUT, greenLUT, blueLUT, alphaLUT, - 8, - DataBuffer.TYPE_BYTE); } /** @@ -1011,7 +898,7 @@ public class ImageTypeSpecifier { ImageTypeSpecifier createFromBufferedImageType(int bufferedImageType) { if (bufferedImageType >= BufferedImage.TYPE_INT_RGB && bufferedImageType <= BufferedImage.TYPE_BYTE_INDEXED) { - return BISpecifier[bufferedImageType]; + return getSpecifier(bufferedImageType); } else if (bufferedImageType == BufferedImage.TYPE_CUSTOM) { throw new IllegalArgumentException("Cannot create from TYPE_CUSTOM!"); } else { @@ -1041,7 +928,7 @@ public class ImageTypeSpecifier { if (image instanceof BufferedImage) { int bufferedImageType = ((BufferedImage)image).getType(); if (bufferedImageType != BufferedImage.TYPE_CUSTOM) { - return BISpecifier[bufferedImageType]; + return getSpecifier(bufferedImageType); } } @@ -1225,4 +1112,130 @@ public class ImageTypeSpecifier { public int hashCode() { return (9 * colorModel.hashCode()) + (14 * sampleModel.hashCode()); } + + private static ImageTypeSpecifier getSpecifier(int type) { + if (BISpecifier[type] == null) { + BISpecifier[type] = createSpecifier(type); + } + return BISpecifier[type]; + } + + private static ImageTypeSpecifier createSpecifier(int type) { + switch(type) { + case BufferedImage.TYPE_INT_RGB: + return createPacked(sRGB, + 0x00ff0000, + 0x0000ff00, + 0x000000ff, + 0x0, + DataBuffer.TYPE_INT, + false); + + case BufferedImage.TYPE_INT_ARGB: + return createPacked(sRGB, + 0x00ff0000, + 0x0000ff00, + 0x000000ff, + 0xff000000, + DataBuffer.TYPE_INT, + false); + + case BufferedImage.TYPE_INT_ARGB_PRE: + return createPacked(sRGB, + 0x00ff0000, + 0x0000ff00, + 0x000000ff, + 0xff000000, + DataBuffer.TYPE_INT, + true); + + case BufferedImage.TYPE_INT_BGR: + return createPacked(sRGB, + 0x000000ff, + 0x0000ff00, + 0x00ff0000, + 0x0, + DataBuffer.TYPE_INT, + false); + + case BufferedImage.TYPE_3BYTE_BGR: + return createInterleaved(sRGB, + new int[] { 2, 1, 0 }, + DataBuffer.TYPE_BYTE, + false, + false); + + case BufferedImage.TYPE_4BYTE_ABGR: + return createInterleaved(sRGB, + new int[] { 3, 2, 1, 0 }, + DataBuffer.TYPE_BYTE, + true, + false); + + case BufferedImage.TYPE_4BYTE_ABGR_PRE: + return createInterleaved(sRGB, + new int[] { 3, 2, 1, 0 }, + DataBuffer.TYPE_BYTE, + true, + true); + + case BufferedImage.TYPE_USHORT_565_RGB: + return createPacked(sRGB, + 0xF800, + 0x07E0, + 0x001F, + 0x0, + DataBuffer.TYPE_USHORT, + false); + + case BufferedImage.TYPE_USHORT_555_RGB: + return createPacked(sRGB, + 0x7C00, + 0x03E0, + 0x001F, + 0x0, + DataBuffer.TYPE_USHORT, + false); + + case BufferedImage.TYPE_BYTE_GRAY: + return createGrayscale(8, + DataBuffer.TYPE_BYTE, + false); + + case BufferedImage.TYPE_USHORT_GRAY: + return createGrayscale(16, + DataBuffer.TYPE_USHORT, + false); + + case BufferedImage.TYPE_BYTE_BINARY: + return createGrayscale(1, + DataBuffer.TYPE_BYTE, + false); + + case BufferedImage.TYPE_BYTE_INDEXED: + { + + BufferedImage bi = + new BufferedImage(1, 1, BufferedImage.TYPE_BYTE_INDEXED); + IndexColorModel icm = (IndexColorModel)bi.getColorModel(); + int mapSize = icm.getMapSize(); + byte[] redLUT = new byte[mapSize]; + byte[] greenLUT = new byte[mapSize]; + byte[] blueLUT = new byte[mapSize]; + byte[] alphaLUT = new byte[mapSize]; + + icm.getReds(redLUT); + icm.getGreens(greenLUT); + icm.getBlues(blueLUT); + icm.getAlphas(alphaLUT); + + return createIndexed(redLUT, greenLUT, blueLUT, alphaLUT, + 8, + DataBuffer.TYPE_BYTE); + } + default: + throw new IllegalArgumentException("Invalid BufferedImage type!"); + } + } + } From 454a7c0732e7b5c5bfd1e45a4ff6ef5e9c394438 Mon Sep 17 00:00:00 2001 From: Andrew Brygin Date: Fri, 30 Jan 2009 22:30:32 +0300 Subject: [PATCH 026/292] 6791502: IIOException "Invalid icc profile" on jpeg after update from JDK5 to JDK6 Reviewed-by: igor, prr --- .../native/sun/awt/image/jpeg/imageioJPEG.c | 112 +++++++++++------- 1 file changed, 70 insertions(+), 42 deletions(-) diff --git a/jdk/src/share/native/sun/awt/image/jpeg/imageioJPEG.c b/jdk/src/share/native/sun/awt/image/jpeg/imageioJPEG.c index 8c30b5ce69e..0a99c3fdb93 100644 --- a/jdk/src/share/native/sun/awt/image/jpeg/imageioJPEG.c +++ b/jdk/src/share/native/sun/awt/image/jpeg/imageioJPEG.c @@ -396,7 +396,7 @@ static imageIODataPtr initImageioData (JNIEnv *env, data->jpegObj = cinfo; cinfo->client_data = data; -#ifdef DEBUG +#ifdef DEBUG_IIO_JPEG printf("new structures: data is %p, cinfo is %p\n", data, cinfo); #endif @@ -673,7 +673,7 @@ static int setQTables(JNIEnv *env, j_decompress_ptr decomp; qlen = (*env)->GetArrayLength(env, qtables); -#ifdef DEBUG +#ifdef DEBUG_IIO_JPEG printf("in setQTables, qlen = %d, write is %d\n", qlen, write); #endif for (i = 0; i < qlen; i++) { @@ -876,7 +876,7 @@ imageio_fill_input_buffer(j_decompress_ptr cinfo) return FALSE; } -#ifdef DEBUG +#ifdef DEBUG_IIO_JPEG printf("Filling input buffer, remaining skip is %ld, ", sb->remaining_skip); printf("Buffer length is %d\n", sb->bufferLength); @@ -906,7 +906,7 @@ imageio_fill_input_buffer(j_decompress_ptr cinfo) cinfo->err->error_exit((j_common_ptr) cinfo); } -#ifdef DEBUG +#ifdef DEBUG_IIO_JPEG printf("Buffer filled. ret = %d\n", ret); #endif /* @@ -917,7 +917,7 @@ imageio_fill_input_buffer(j_decompress_ptr cinfo) */ if (ret <= 0) { jobject reader = data->imageIOobj; -#ifdef DEBUG +#ifdef DEBUG_IIO_JPEG printf("YO! Early EOI! ret = %d\n", ret); #endif RELEASE_ARRAYS(env, data, src->next_input_byte); @@ -1216,21 +1216,24 @@ read_icc_profile (JNIEnv *env, j_decompress_ptr cinfo) { jpeg_saved_marker_ptr marker; int num_markers = 0; + int num_found_markers = 0; int seq_no; JOCTET *icc_data; + JOCTET *dst_ptr; unsigned int total_length; #define MAX_SEQ_NO 255 // sufficient since marker numbers are bytes - char marker_present[MAX_SEQ_NO+1]; // 1 if marker found - unsigned int data_length[MAX_SEQ_NO+1]; // size of profile data in marker - unsigned int data_offset[MAX_SEQ_NO+1]; // offset for data in marker + jpeg_saved_marker_ptr icc_markers[MAX_SEQ_NO + 1]; + int first; // index of the first marker in the icc_markers array + int last; // index of the last marker in the icc_markers array jbyteArray data = NULL; /* This first pass over the saved markers discovers whether there are * any ICC markers and verifies the consistency of the marker numbering. */ - for (seq_no = 1; seq_no <= MAX_SEQ_NO; seq_no++) - marker_present[seq_no] = 0; + for (seq_no = 0; seq_no <= MAX_SEQ_NO; seq_no++) + icc_markers[seq_no] = NULL; + for (marker = cinfo->marker_list; marker != NULL; marker = marker->next) { if (marker_is_icc(marker)) { @@ -1242,37 +1245,58 @@ read_icc_profile (JNIEnv *env, j_decompress_ptr cinfo) return NULL; } seq_no = GETJOCTET(marker->data[12]); - if (seq_no <= 0 || seq_no > num_markers) { + + /* Some third-party tools produce images with profile chunk + * numeration started from zero. It is inconsistent with ICC + * spec, but seems to be recognized by majority of image + * processing tools, so we should be more tolerant to this + * departure from the spec. + */ + if (seq_no < 0 || seq_no > num_markers) { JNU_ThrowByName(env, "javax/imageio/IIOException", "Invalid icc profile: bad sequence number"); return NULL; } - if (marker_present[seq_no]) { + if (icc_markers[seq_no] != NULL) { JNU_ThrowByName(env, "javax/imageio/IIOException", "Invalid icc profile: duplicate sequence numbers"); return NULL; } - marker_present[seq_no] = 1; - data_length[seq_no] = marker->data_length - ICC_OVERHEAD_LEN; + icc_markers[seq_no] = marker; + num_found_markers ++; } } if (num_markers == 0) return NULL; // There is no profile - /* Check for missing markers, count total space needed, - * compute offset of each marker's part of the data. - */ + if (num_markers != num_found_markers) { + JNU_ThrowByName(env, "javax/imageio/IIOException", + "Invalid icc profile: invalid number of icc markers"); + return NULL; + } + first = icc_markers[0] ? 0 : 1; + last = num_found_markers + first; + + /* Check for missing markers, count total space needed. + */ total_length = 0; - for (seq_no = 1; seq_no <= num_markers; seq_no++) { - if (marker_present[seq_no] == 0) { + for (seq_no = first; seq_no < last; seq_no++) { + unsigned int length; + if (icc_markers[seq_no] == NULL) { JNU_ThrowByName(env, "javax/imageio/IIOException", "Invalid icc profile: missing sequence number"); return NULL; } - data_offset[seq_no] = total_length; - total_length += data_length[seq_no]; + /* check the data length correctness */ + length = icc_markers[seq_no]->data_length; + if (ICC_OVERHEAD_LEN > length || length > MAX_BYTES_IN_MARKER) { + JNU_ThrowByName(env, "javax/imageio/IIOException", + "Invalid icc profile: invalid data length"); + return NULL; + } + total_length += (length - ICC_OVERHEAD_LEN); } if (total_length <= 0) { @@ -1301,19 +1325,14 @@ read_icc_profile (JNIEnv *env, j_decompress_ptr cinfo) } /* and fill it in */ - for (marker = cinfo->marker_list; marker != NULL; marker = marker->next) { - if (marker_is_icc(marker)) { - JOCTET FAR *src_ptr; - JOCTET *dst_ptr; - unsigned int length; - seq_no = GETJOCTET(marker->data[12]); - dst_ptr = icc_data + data_offset[seq_no]; - src_ptr = marker->data + ICC_OVERHEAD_LEN; - length = data_length[seq_no]; - while (length--) { - *dst_ptr++ = *src_ptr++; - } - } + dst_ptr = icc_data; + for (seq_no = first; seq_no < last; seq_no++) { + JOCTET FAR *src_ptr = icc_markers[seq_no]->data + ICC_OVERHEAD_LEN; + unsigned int length = + icc_markers[seq_no]->data_length - ICC_OVERHEAD_LEN; + + memcpy(dst_ptr, src_ptr, length); + dst_ptr += length; } /* finally, unpin the array */ @@ -1530,6 +1549,7 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageReader_readImageHeader j_decompress_ptr cinfo; struct jpeg_source_mgr *src; sun_jpeg_error_ptr jerr; + jbyteArray profileData = NULL; if (data == NULL) { JNU_ThrowByName(env, @@ -1557,7 +1577,7 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageReader_readImageHeader return retval; } -#ifdef DEBUG +#ifdef DEBUG_IIO_JPEG printf("In readImageHeader, data is %p cinfo is %p\n", data, cinfo); printf("clearFirst is %d\n", clearFirst); #endif @@ -1584,7 +1604,7 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageReader_readImageHeader if (ret == JPEG_HEADER_TABLES_ONLY) { retval = JNI_TRUE; imageio_term_source(cinfo); // Pushback remaining buffer contents -#ifdef DEBUG +#ifdef DEBUG_IIO_JPEG printf("just read tables-only image; q table 0 at %p\n", cinfo->quant_tbl_ptrs[0]); #endif @@ -1691,6 +1711,14 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageReader_readImageHeader } } RELEASE_ARRAYS(env, data, src->next_input_byte); + + /* read icc profile data */ + profileData = read_icc_profile(env, cinfo); + + if ((*env)->ExceptionCheck(env)) { + return retval; + } + (*env)->CallVoidMethod(env, this, JPEGImageReader_setImageDataID, cinfo->image_width, @@ -1698,7 +1726,7 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageReader_readImageHeader cinfo->jpeg_color_space, cinfo->out_color_space, cinfo->num_components, - read_icc_profile(env, cinfo)); + profileData); if (reset) { jpeg_abort_decompress(cinfo); } @@ -1827,7 +1855,7 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageReader_readImage (*env)->ReleaseIntArrayElements(env, srcBands, body, JNI_ABORT); -#ifdef DEBUG +#ifdef DEBUG_IIO_JPEG printf("---- in reader.read ----\n"); printf("numBands is %d\n", numBands); printf("bands array: "); @@ -2487,7 +2515,7 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_writeTables data->streamBuf.suspendable = FALSE; if (qtables != NULL) { -#ifdef DEBUG +#ifdef DEBUG_IIO_JPEG printf("in writeTables: qtables not NULL\n"); #endif setQTables(env, (j_common_ptr) cinfo, qtables, TRUE); @@ -2763,7 +2791,7 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_writeImage cinfo->restart_interval = restartInterval; -#ifdef DEBUG +#ifdef DEBUG_IIO_JPEG printf("writer setup complete, starting compressor\n"); #endif @@ -2812,13 +2840,13 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_writeImage for (i = 0; i < numBands; i++) { if (scale !=NULL && scale[i] != NULL) { *out++ = scale[i][*(in+i)]; -#ifdef DEBUG +#ifdef DEBUG_IIO_JPEG if (in == data->pixelBuf.buf.bp){ // Just the first pixel printf("in %d -> out %d, ", *(in+i), *(out-i-1)); } #endif -#ifdef DEBUG +#ifdef DEBUG_IIO_JPEG if (in == data->pixelBuf.buf.bp){ // Just the first pixel printf("\n"); } From 614df1958ca812c31f6097489ef348de9f90a5a8 Mon Sep 17 00:00:00 2001 From: Kelly O'Hair Date: Sat, 31 Jan 2009 15:26:34 -0800 Subject: [PATCH 027/292] 6791649: add "SKIP_MSIVAL2=true" to the Windows section of make/jprt.config Reviewed-by: tbell --- make/jdk-rules.gmk | 2 +- make/jprt.config | 7 +++++++ make/jprt.gmk | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/make/jdk-rules.gmk b/make/jdk-rules.gmk index 821f5d739c6..d0ca905ff02 100644 --- a/make/jdk-rules.gmk +++ b/make/jdk-rules.gmk @@ -106,7 +106,7 @@ jdk-clobber:: $(MAKE) $(JDK_CLOBBER_TARGETS) $(JDK_BUILD_ARGUMENTS) ; ) jdk-sanity:: - @( $(CD) $(JDK_TOPDIR)/make && \ + ( $(CD) $(JDK_TOPDIR)/make && \ $(MAKE) sanity HOTSPOT_IMPORT_CHECK=false $(JDK_BUILD_ARGUMENTS) ; ) compare-images: compare-image diff --git a/make/jprt.config b/make/jprt.config index f3ff50615ef..895d9432e01 100644 --- a/make/jprt.config +++ b/make/jprt.config @@ -358,6 +358,13 @@ else ALT_SPONSOR2DIR=C:/sponsor_binaries export ALT_SPONSOR2DIR + # JPRT systems can never run msival2.exe, set this to avoid them + SKIP_MSIVAL2=true + export SKIP_MSIVAL2 + # Not easy to do + SKIP_COMPARE_IMAGES=true + export SKIP_COMPARE_IMAGES + fi # Export PATH setting diff --git a/make/jprt.gmk b/make/jprt.gmk index fcf67f80b36..32803e06256 100644 --- a/make/jprt.gmk +++ b/make/jprt.gmk @@ -36,7 +36,7 @@ DEFAULT_BUILD_FLAVOR=product JPRT_ARCHIVE_BUNDLE=$(ABS_OUTPUTDIR)/$(DEFAULT_BUILD_FLAVOR)-bundle.zip JPRT_ARCHIVE_INSTALL_BUNDLE=$(ABS_OUTPUTDIR)/$(DEFAULT_BUILD_FLAVOR)-install-bundle.zip -jprt_build_product: all_product_build +jprt_build_product: sanity all_product_build ( $(CD) $(OUTPUTDIR)/j2sdk-image && \ $(ZIPEXE) -q -r $(JPRT_ARCHIVE_BUNDLE) . ) ifdef HAVE_JPRT_SAVE_BUNDLES From 09010fe0a7622ad2bf5f4b32b43ff4ca9eb846e5 Mon Sep 17 00:00:00 2001 From: Kelly O'Hair Date: Sat, 31 Jan 2009 17:19:42 -0800 Subject: [PATCH 028/292] 6799141: Build with --hash-style=both so that binaries can work on SuSE 10 Reviewed-by: tbell --- hotspot/make/linux/makefiles/gcc.make | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/hotspot/make/linux/makefiles/gcc.make b/hotspot/make/linux/makefiles/gcc.make index 4a01c29c50e..1a1f1465c81 100644 --- a/hotspot/make/linux/makefiles/gcc.make +++ b/hotspot/make/linux/makefiles/gcc.make @@ -131,6 +131,14 @@ endif # Enable linker optimization LFLAGS += -Xlinker -O1 +# If this is a --hash-style=gnu system, use --hash-style=both +# The gnu .hash section won't work on some Linux systems like SuSE 10. +_HAS_HASH_STYLE_GNU:=$(shell $(CC) -dumpspecs | grep -- '--hash-style=gnu') +ifneq ($(_HAS_HASH_STYLE_GNU),) + LDFLAGS_HASH_STYLE = -Wl,--hash-style=both +endif +LFLAGS += $(LDFLAGS_HASH_STYLE) + # Use $(MAPFLAG:FILENAME=real_file_name) to specify a map file. MAPFLAG = -Xlinker --version-script=FILENAME From b56f07314820fea8178028ee1b80ea6a924bd2e1 Mon Sep 17 00:00:00 2001 From: Andrew Brygin Date: Wed, 4 Feb 2009 14:06:18 +0300 Subject: [PATCH 029/292] 6799583: LogManager shutdown hook may cause a memory leak Reviewed-by: igor, swamyv --- .../classes/java/util/logging/LogManager.java | 8 + .../util/logging/ClassLoaderLeakTest.java | 190 ++++++++++++++++++ 2 files changed, 198 insertions(+) create mode 100644 jdk/test/java/util/logging/ClassLoaderLeakTest.java diff --git a/jdk/src/share/classes/java/util/logging/LogManager.java b/jdk/src/share/classes/java/util/logging/LogManager.java index 412f749404d..fc8f080eb71 100644 --- a/jdk/src/share/classes/java/util/logging/LogManager.java +++ b/jdk/src/share/classes/java/util/logging/LogManager.java @@ -215,6 +215,14 @@ public class LogManager { // This private class is used as a shutdown hook. // It does a "reset" to close all open handlers. private class Cleaner extends Thread { + + private Cleaner() { + /* Set context class loader to null in order to avoid + * keeping a strong reference to an application classloader. + */ + this.setContextClassLoader(null); + } + public void run() { // This is to ensure the LogManager. is completed // before synchronized block. Otherwise deadlocks are possible. diff --git a/jdk/test/java/util/logging/ClassLoaderLeakTest.java b/jdk/test/java/util/logging/ClassLoaderLeakTest.java new file mode 100644 index 00000000000..988041472fc --- /dev/null +++ b/jdk/test/java/util/logging/ClassLoaderLeakTest.java @@ -0,0 +1,190 @@ +/* + * Copyright 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 6799583 + * + * @summary Test verifes that LogManager shutdown hook does not cause + * an application classloader leaks. + * + * @run main/othervm ClassLoaderLeakTest + */ + +import java.io.File; +import java.lang.ref.WeakReference; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.concurrent.CountDownLatch; +import java.util.logging.Logger; +import java.util.logging.Logger; + +public class ClassLoaderLeakTest { + + private static CountDownLatch doneSignal; + private static CountDownLatch launchSignal; + private static ThreadGroup appsThreadGroup; + private static Throwable launchFailure = null; + + public static void main(String[] args) { + appsThreadGroup = new ThreadGroup("MyAppsThreadGroup"); + doneSignal = new CountDownLatch(1); + launchSignal = new CountDownLatch(1); + + Runnable launcher = new Runnable() { + public void run() { + try { + ClassLoader cl = + Thread.currentThread().getContextClassLoader(); + Class appMain = cl.loadClass("AppTest"); + Method launch = + appMain.getDeclaredMethod("launch", doneSignal.getClass()); + + Constructor c = appMain.getConstructor(); + + Object o = c.newInstance(); + + launch.invoke(o, doneSignal); + + } catch (Throwable e) { + launchFailure = e; + } finally { + launchSignal.countDown(); + } + } + }; + + /* prepare test class loader */ + URL pwd = null; + try { + + pwd = new File(System.getProperty("test.classes",".")).toURL(); + } catch (MalformedURLException e) { + throw new RuntimeException("Test failed.", e); + } + URL[] urls = new URL[] { pwd }; + + MyClassLoader appClassLoader = new MyClassLoader(urls, "test0"); + WeakReference ref = + new WeakReference(appClassLoader); + + + Thread appThread = new Thread(appsThreadGroup, launcher, "AppThread-0"); + appThread.setContextClassLoader(appClassLoader); + + appThread.start(); + appClassLoader = null; + launcher = null; + appThread = null; + + /* wait for laucnh completion */ + try { + launchSignal.await(); + } catch (InterruptedException e) { + } + + /* check if launch failed */ + if (launchFailure != null) { + throw new RuntimeException("Test failed.", launchFailure); + } + + /* wait for test app excution completion */ + try { + doneSignal.await(); + } catch (InterruptedException e) { + } + + /* give a chence to GC */ + waitAndGC(5); + + if (ref.get() != null) { + throw new RuntimeException("Test failed: classloader is still alive"); + } + + System.out.println("Test passed."); + } + + private static class MyClassLoader extends URLClassLoader { + + private static boolean verbose = + Boolean.getBoolean("verboseClassLoading"); + private String uniqClassName; + + public MyClassLoader(URL[] urls, String uniq) { + super(urls); + + uniqClassName = uniq; + } + + public Class loadClass(String name) throws ClassNotFoundException { + if (verbose) { + System.out.printf("%s: load class %s\n", uniqClassName, name); + } + if (uniqClassName.equals(name)) { + return Object.class; + } + return super.loadClass(name); + } + + public String toString() { + return "MyClassLoader(" + uniqClassName + ")"; + } + } + + private static void waitAndGC(int sec) { + int cnt = sec; + System.out.print("Wait "); + while (cnt-- > 0) { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + // do GC every 3 seconds + if (cnt % 3 == 2) { + System.gc(); + System.out.print("+"); + } else { + System.out.print("."); + } + //checkErrors(); + } + System.out.println(""); + } +} + + +class AppTest { + public AppTest() { + + } + + public void launch(CountDownLatch done) { + Logger log = Logger.getLogger("app_test_logger"); + log.fine("Test app is launched"); + + done.countDown(); + } +} From 06d5f1e07f8ba64f7fb29daf7b717e533c93dce1 Mon Sep 17 00:00:00 2001 From: Peter Zhelezniakov Date: Wed, 4 Feb 2009 18:48:24 +0300 Subject: [PATCH 030/292] 6588003: LayoutQueue shares mutable implementation across AppContexts DefaultQueue property is made per-AppContext Reviewed-by: alexp --- .../classes/javax/swing/text/LayoutQueue.java | 31 +++++++--- .../swing/text/LayoutQueue/Test6588003.java | 59 +++++++++++++++++++ 2 files changed, 81 insertions(+), 9 deletions(-) create mode 100644 jdk/test/javax/swing/text/LayoutQueue/Test6588003.java diff --git a/jdk/src/share/classes/javax/swing/text/LayoutQueue.java b/jdk/src/share/classes/javax/swing/text/LayoutQueue.java index e02f9b0f9b6..dbb5d00ccce 100644 --- a/jdk/src/share/classes/javax/swing/text/LayoutQueue.java +++ b/jdk/src/share/classes/javax/swing/text/LayoutQueue.java @@ -25,6 +25,7 @@ package javax.swing.text; import java.util.Vector; +import sun.awt.AppContext; /** * A queue of text layout tasks. @@ -35,10 +36,10 @@ import java.util.Vector; */ public class LayoutQueue { - Vector tasks; - Thread worker; + private static final Object DEFAULT_QUEUE = new Object(); - static LayoutQueue defaultQueue; + private Vector tasks; + private Thread worker; /** * Construct a layout queue. @@ -51,19 +52,31 @@ public class LayoutQueue { * Fetch the default layout queue. */ public static LayoutQueue getDefaultQueue() { - if (defaultQueue == null) { - defaultQueue = new LayoutQueue(); + AppContext ac = AppContext.getAppContext(); + synchronized (DEFAULT_QUEUE) { + LayoutQueue defaultQueue = (LayoutQueue) ac.get(DEFAULT_QUEUE); + if (defaultQueue == null) { + defaultQueue = new LayoutQueue(); + ac.put(DEFAULT_QUEUE, defaultQueue); + } + return defaultQueue; } - return defaultQueue; } /** * Set the default layout queue. * - * @param q the new queue. + * @param defaultQueue the new queue. */ - public static void setDefaultQueue(LayoutQueue q) { - defaultQueue = q; + public static void setDefaultQueue(LayoutQueue defaultQueue) { + synchronized (DEFAULT_QUEUE) { + AppContext ac = AppContext.getAppContext(); + if (defaultQueue == null) { + ac.remove(DEFAULT_QUEUE); + } else { + ac.put(DEFAULT_QUEUE, defaultQueue); + } + } } /** diff --git a/jdk/test/javax/swing/text/LayoutQueue/Test6588003.java b/jdk/test/javax/swing/text/LayoutQueue/Test6588003.java new file mode 100644 index 00000000000..d14d6a56a95 --- /dev/null +++ b/jdk/test/javax/swing/text/LayoutQueue/Test6588003.java @@ -0,0 +1,59 @@ +/* + * Copyright 2007 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 6588003 + @summary LayoutQueue should not share its DefaultQueue across AppContexts + @author Peter Zhelezniakov + @run main Test6588003 +*/ + +import javax.swing.text.LayoutQueue; +import sun.awt.SunToolkit; + +public class Test6588003 implements Runnable { + private static final LayoutQueue DEFAULT = new LayoutQueue(); + + public static void main(String[] args) throws InterruptedException { + LayoutQueue.setDefaultQueue(DEFAULT); + + ThreadGroup group = new ThreadGroup("Test6588003"); + Thread thread = new Thread(group, new Test6588003()); + thread.start(); + thread.join(); + + if (LayoutQueue.getDefaultQueue() != DEFAULT) { + throw new RuntimeException("Sharing detected"); + } + } + + public void run() { + SunToolkit.createNewAppContext(); + + if (LayoutQueue.getDefaultQueue() == DEFAULT) { + throw new RuntimeException("Sharing detected"); + } + + LayoutQueue.setDefaultQueue(new LayoutQueue()); + } +} From 837ece487dd4c28c9d20b914695e5eae5277bb24 Mon Sep 17 00:00:00 2001 From: Sergey Malenkov Date: Thu, 5 Feb 2009 14:48:10 +0300 Subject: [PATCH 031/292] 4769844: classes in java.beans that are serializable but don't define serialVersionUID Reviewed-by: peterz, rupashka --- .../share/classes/java/beans/IndexedPropertyChangeEvent.java | 3 ++- jdk/src/share/classes/java/beans/IntrospectionException.java | 3 ++- jdk/src/share/classes/java/beans/PropertyChangeEvent.java | 3 ++- jdk/src/share/classes/java/beans/PropertyVetoException.java | 4 ++-- .../classes/java/beans/beancontext/BeanContextEvent.java | 3 ++- .../java/beans/beancontext/BeanContextMembershipEvent.java | 3 ++- .../beans/beancontext/BeanContextServiceAvailableEvent.java | 3 ++- .../beans/beancontext/BeanContextServiceRevokedEvent.java | 3 ++- .../java/beans/beancontext/BeanContextServicesSupport.java | 4 +++- jdk/src/share/classes/sun/beans/editors/ColorEditor.java | 4 +++- jdk/src/share/classes/sun/beans/editors/FontEditor.java | 3 ++- 11 files changed, 24 insertions(+), 12 deletions(-) diff --git a/jdk/src/share/classes/java/beans/IndexedPropertyChangeEvent.java b/jdk/src/share/classes/java/beans/IndexedPropertyChangeEvent.java index ea78643e435..951cd871fe5 100644 --- a/jdk/src/share/classes/java/beans/IndexedPropertyChangeEvent.java +++ b/jdk/src/share/classes/java/beans/IndexedPropertyChangeEvent.java @@ -1,5 +1,5 @@ /* - * Copyright 2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-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 @@ -41,6 +41,7 @@ package java.beans; * @author Mark Davidson */ public class IndexedPropertyChangeEvent extends PropertyChangeEvent { + private static final long serialVersionUID = -320227448495806870L; private int index; diff --git a/jdk/src/share/classes/java/beans/IntrospectionException.java b/jdk/src/share/classes/java/beans/IntrospectionException.java index cac0b20fc01..2f5a65eda73 100644 --- a/jdk/src/share/classes/java/beans/IntrospectionException.java +++ b/jdk/src/share/classes/java/beans/IntrospectionException.java @@ -1,5 +1,5 @@ /* - * Copyright 1996-1998 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -36,6 +36,7 @@ package java.beans; public class IntrospectionException extends Exception { + private static final long serialVersionUID = -3728150539969542619L; /** * Constructs an IntrospectionException with a diff --git a/jdk/src/share/classes/java/beans/PropertyChangeEvent.java b/jdk/src/share/classes/java/beans/PropertyChangeEvent.java index 69f523d92e3..3e0c9cef6f9 100644 --- a/jdk/src/share/classes/java/beans/PropertyChangeEvent.java +++ b/jdk/src/share/classes/java/beans/PropertyChangeEvent.java @@ -1,5 +1,5 @@ /* - * Copyright 1996-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -44,6 +44,7 @@ package java.beans; */ public class PropertyChangeEvent extends java.util.EventObject { + private static final long serialVersionUID = 7042693688939648123L; /** * Constructs a new PropertyChangeEvent. diff --git a/jdk/src/share/classes/java/beans/PropertyVetoException.java b/jdk/src/share/classes/java/beans/PropertyVetoException.java index f736b3bade5..73376496b53 100644 --- a/jdk/src/share/classes/java/beans/PropertyVetoException.java +++ b/jdk/src/share/classes/java/beans/PropertyVetoException.java @@ -1,5 +1,5 @@ /* - * Copyright 1996-1998 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -33,7 +33,7 @@ package java.beans; public class PropertyVetoException extends Exception { - + private static final long serialVersionUID = 129596057694162164L; /** * Constructs a PropertyVetoException with a diff --git a/jdk/src/share/classes/java/beans/beancontext/BeanContextEvent.java b/jdk/src/share/classes/java/beans/beancontext/BeanContextEvent.java index 4574605a154..2530869534b 100644 --- a/jdk/src/share/classes/java/beans/beancontext/BeanContextEvent.java +++ b/jdk/src/share/classes/java/beans/beancontext/BeanContextEvent.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -48,6 +48,7 @@ import java.beans.beancontext.BeanContext; */ public abstract class BeanContextEvent extends EventObject { + private static final long serialVersionUID = 7267998073569045052L; /** * Contruct a BeanContextEvent diff --git a/jdk/src/share/classes/java/beans/beancontext/BeanContextMembershipEvent.java b/jdk/src/share/classes/java/beans/beancontext/BeanContextMembershipEvent.java index 7e6c1ae0a69..3752e390341 100644 --- a/jdk/src/share/classes/java/beans/beancontext/BeanContextMembershipEvent.java +++ b/jdk/src/share/classes/java/beans/beancontext/BeanContextMembershipEvent.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -55,6 +55,7 @@ import java.util.Iterator; * @see java.beans.beancontext.BeanContextMembershipListener */ public class BeanContextMembershipEvent extends BeanContextEvent { + private static final long serialVersionUID = 3499346510334590959L; /** * Contruct a BeanContextMembershipEvent diff --git a/jdk/src/share/classes/java/beans/beancontext/BeanContextServiceAvailableEvent.java b/jdk/src/share/classes/java/beans/beancontext/BeanContextServiceAvailableEvent.java index 558c7f9f363..7bb47a66033 100644 --- a/jdk/src/share/classes/java/beans/beancontext/BeanContextServiceAvailableEvent.java +++ b/jdk/src/share/classes/java/beans/beancontext/BeanContextServiceAvailableEvent.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-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 @@ -40,6 +40,7 @@ import java.util.Iterator; */ public class BeanContextServiceAvailableEvent extends BeanContextEvent { + private static final long serialVersionUID = -5333985775656400778L; /** * Construct a BeanContextAvailableServiceEvent. diff --git a/jdk/src/share/classes/java/beans/beancontext/BeanContextServiceRevokedEvent.java b/jdk/src/share/classes/java/beans/beancontext/BeanContextServiceRevokedEvent.java index a508f4ca157..50d888cdf7e 100644 --- a/jdk/src/share/classes/java/beans/beancontext/BeanContextServiceRevokedEvent.java +++ b/jdk/src/share/classes/java/beans/beancontext/BeanContextServiceRevokedEvent.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-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 @@ -37,6 +37,7 @@ import java.beans.beancontext.BeanContextServices; *

*/ public class BeanContextServiceRevokedEvent extends BeanContextEvent { + private static final long serialVersionUID = -1295543154724961754L; /** * Construct a BeanContextServiceEvent. diff --git a/jdk/src/share/classes/java/beans/beancontext/BeanContextServicesSupport.java b/jdk/src/share/classes/java/beans/beancontext/BeanContextServicesSupport.java index d9552c8a34e..54dfdd7d227 100644 --- a/jdk/src/share/classes/java/beans/beancontext/BeanContextServicesSupport.java +++ b/jdk/src/share/classes/java/beans/beancontext/BeanContextServicesSupport.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-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 @@ -60,6 +60,7 @@ import java.util.Locale; public class BeanContextServicesSupport extends BeanContextSupport implements BeanContextServices { + private static final long serialVersionUID = -8494482757288719206L; /** *

@@ -594,6 +595,7 @@ public class BeanContextServicesSupport extends BeanContextSupport */ protected static class BCSSServiceProvider implements Serializable { + private static final long serialVersionUID = 861278251667444782L; BCSSServiceProvider(Class sc, BeanContextServiceProvider bcsp) { super(); diff --git a/jdk/src/share/classes/sun/beans/editors/ColorEditor.java b/jdk/src/share/classes/sun/beans/editors/ColorEditor.java index a3610e0ee2e..55dd9137be1 100644 --- a/jdk/src/share/classes/sun/beans/editors/ColorEditor.java +++ b/jdk/src/share/classes/sun/beans/editors/ColorEditor.java @@ -1,5 +1,5 @@ /* - * Copyright 1996-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -29,6 +29,8 @@ import java.awt.*; import java.beans.*; public class ColorEditor extends Panel implements PropertyEditor { + private static final long serialVersionUID = 1781257185164716054L; + public ColorEditor() { setLayout(null); diff --git a/jdk/src/share/classes/sun/beans/editors/FontEditor.java b/jdk/src/share/classes/sun/beans/editors/FontEditor.java index 88de9aea48f..04d4c187e22 100644 --- a/jdk/src/share/classes/sun/beans/editors/FontEditor.java +++ b/jdk/src/share/classes/sun/beans/editors/FontEditor.java @@ -1,5 +1,5 @@ /* - * Copyright 1996-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -29,6 +29,7 @@ import java.awt.*; import java.beans.*; public class FontEditor extends Panel implements java.beans.PropertyEditor { + private static final long serialVersionUID = 6732704486002715933L; public FontEditor() { setLayout(null); From 8f96eb9cea9b9b3886bb21a76da4aa9bcc5dc0a6 Mon Sep 17 00:00:00 2001 From: Sergey Malenkov Date: Thu, 5 Feb 2009 17:00:57 +0300 Subject: [PATCH 032/292] 6669869: Beans.isDesignTime() and other queries should be per-AppContext Reviewed-by: peterz, rupashka --- jdk/src/share/classes/java/beans/Beans.java | 96 ++++++++++--------- .../beans/Beans/6669869/TestDesignTime.java | 52 ++++++++++ .../beans/Beans/6669869/TestGuiAvailable.java | 53 ++++++++++ 3 files changed, 158 insertions(+), 43 deletions(-) create mode 100644 jdk/test/java/beans/Beans/6669869/TestDesignTime.java create mode 100644 jdk/test/java/beans/Beans/6669869/TestGuiAvailable.java diff --git a/jdk/src/share/classes/java/beans/Beans.java b/jdk/src/share/classes/java/beans/Beans.java index f19b21aead2..8a750a8b15c 100644 --- a/jdk/src/share/classes/java/beans/Beans.java +++ b/jdk/src/share/classes/java/beans/Beans.java @@ -1,5 +1,5 @@ /* - * Copyright 1996-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -27,26 +27,41 @@ package java.beans; import com.sun.beans.finder.ClassFinder; -import java.applet.*; +import java.applet.Applet; +import java.applet.AppletContext; +import java.applet.AppletStub; +import java.applet.AudioClip; -import java.awt.*; - -import java.beans.AppletInitializer; +import java.awt.GraphicsEnvironment; +import java.awt.Image; import java.beans.beancontext.BeanContext; -import java.io.*; - -import java.lang.reflect.Constructor; +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.ObjectStreamClass; +import java.io.StreamCorruptedException; import java.net.URL; -import java.lang.reflect.Array; + +import java.security.AccessController; +import java.security.PrivilegedAction; + +import java.util.Enumeration; +import java.util.Hashtable; +import java.util.Iterator; +import java.util.Vector; + +import sun.awt.AppContext; /** * This class provides some general purpose beans control methods. */ public class Beans { + private static final Object DESIGN_TIME = new Object(); + private static final Object GUI_AVAILABLE = new Object(); /** *

@@ -59,12 +74,12 @@ public class Beans { * @param beanName the name of the bean within the class-loader. * For example "sun.beanbox.foobah" * - * @exception java.lang.ClassNotFoundException if the class of a serialized + * @exception ClassNotFoundException if the class of a serialized * object could not be found. - * @exception java.io.IOException if an I/O error occurs. + * @exception IOException if an I/O error occurs. */ - public static Object instantiate(ClassLoader cls, String beanName) throws java.io.IOException, ClassNotFoundException { + public static Object instantiate(ClassLoader cls, String beanName) throws IOException, ClassNotFoundException { return Beans.instantiate(cls, beanName, null, null); } @@ -80,12 +95,12 @@ public class Beans { * For example "sun.beanbox.foobah" * @param beanContext The BeanContext in which to nest the new bean * - * @exception java.lang.ClassNotFoundException if the class of a serialized + * @exception ClassNotFoundException if the class of a serialized * object could not be found. - * @exception java.io.IOException if an I/O error occurs. + * @exception IOException if an I/O error occurs. */ - public static Object instantiate(ClassLoader cls, String beanName, BeanContext beanContext) throws java.io.IOException, ClassNotFoundException { + public static Object instantiate(ClassLoader cls, String beanName, BeanContext beanContext) throws IOException, ClassNotFoundException { return Beans.instantiate(cls, beanName, beanContext, null); } @@ -135,19 +150,19 @@ public class Beans { * @param beanContext The BeanContext in which to nest the new bean * @param initializer The AppletInitializer for the new bean * - * @exception java.lang.ClassNotFoundException if the class of a serialized + * @exception ClassNotFoundException if the class of a serialized * object could not be found. - * @exception java.io.IOException if an I/O error occurs. + * @exception IOException if an I/O error occurs. */ public static Object instantiate(ClassLoader cls, String beanName, BeanContext beanContext, AppletInitializer initializer) - throws java.io.IOException, ClassNotFoundException { + throws IOException, ClassNotFoundException { - java.io.InputStream ins; - java.io.ObjectInputStream oins = null; + InputStream ins; + ObjectInputStream oins = null; Object result = null; boolean serialized = false; - java.io.IOException serex = null; + IOException serex = null; // If the given classloader is null, we check if an // system classloader is available and (if so) @@ -166,8 +181,8 @@ public class Beans { // Try to find a serialized object with this name final String serName = beanName.replace('.','/').concat(".ser"); final ClassLoader loader = cls; - ins = (InputStream)java.security.AccessController.doPrivileged - (new java.security.PrivilegedAction() { + ins = (InputStream)AccessController.doPrivileged + (new PrivilegedAction() { public Object run() { if (loader == null) return ClassLoader.getSystemResourceAsStream(serName); @@ -185,7 +200,7 @@ public class Beans { result = oins.readObject(); serialized = true; oins.close(); - } catch (java.io.IOException ex) { + } catch (IOException ex) { ins.close(); // Drop through and try opening the class. But remember // the exception in case we can't find the class either. @@ -264,8 +279,8 @@ public class Beans { final ClassLoader cloader = cls; objectUrl = (URL) - java.security.AccessController.doPrivileged - (new java.security.PrivilegedAction() { + AccessController.doPrivileged + (new PrivilegedAction() { public Object run() { if (cloader == null) return ClassLoader.getSystemResource @@ -377,10 +392,11 @@ public class Beans { * @return True if we are running in an application construction * environment. * - * @see java.beans.DesignMode + * @see DesignMode */ public static boolean isDesignTime() { - return designTime; + Object value = AppContext.getAppContext().get(DESIGN_TIME); + return (value instanceof Boolean) && (Boolean) value; } /** @@ -393,11 +409,12 @@ public class Beans { * false in a server environment or if an application is * running as part of a batch job. * - * @see java.beans.Visibility + * @see Visibility * */ public static boolean isGuiAvailable() { - return guiAvailable; + Object value = AppContext.getAppContext().get(GUI_AVAILABLE); + return (value instanceof Boolean) ? (Boolean) value : !GraphicsEnvironment.isHeadless(); } /** @@ -423,7 +440,7 @@ public class Beans { if (sm != null) { sm.checkPropertiesAccess(); } - designTime = isDesignTime; + AppContext.getAppContext().put(DESIGN_TIME, Boolean.valueOf(isDesignTime)); } /** @@ -449,14 +466,7 @@ public class Beans { if (sm != null) { sm.checkPropertiesAccess(); } - guiAvailable = isGuiAvailable; - } - - - private static boolean designTime; - private static boolean guiAvailable; - static { - guiAvailable = !GraphicsEnvironment.isHeadless(); + AppContext.getAppContext().put(GUI_AVAILABLE, Boolean.valueOf(isGuiAvailable)); } } @@ -501,7 +511,7 @@ class ObjectInputStreamWithLoader extends ObjectInputStream class BeansAppletContext implements AppletContext { Applet target; - java.util.Hashtable imageCache = new java.util.Hashtable(); + Hashtable imageCache = new Hashtable(); BeansAppletContext(Applet target) { this.target = target; @@ -546,8 +556,8 @@ class BeansAppletContext implements AppletContext { return null; } - public java.util.Enumeration getApplets() { - java.util.Vector applets = new java.util.Vector(); + public Enumeration getApplets() { + Vector applets = new Vector(); applets.addElement(target); return applets.elements(); } @@ -573,7 +583,7 @@ class BeansAppletContext implements AppletContext { return null; } - public java.util.Iterator getStreamKeys(){ + public Iterator getStreamKeys(){ // We do nothing. return null; } diff --git a/jdk/test/java/beans/Beans/6669869/TestDesignTime.java b/jdk/test/java/beans/Beans/6669869/TestDesignTime.java new file mode 100644 index 00000000000..e78142a2b90 --- /dev/null +++ b/jdk/test/java/beans/Beans/6669869/TestDesignTime.java @@ -0,0 +1,52 @@ +/* + * Copyright 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 6669869 + * @summary Tests DesignTime property in different application contexts + * @author Sergey Malenkov + */ + +import java.beans.Beans; +import sun.awt.SunToolkit; + +public class TestDesignTime implements Runnable { + public static void main(String[] args) throws InterruptedException { + if (Beans.isDesignTime()) { + throw new Error("unexpected DesignTime property"); + } + Beans.setDesignTime(!Beans.isDesignTime()); + ThreadGroup group = new ThreadGroup("$$$"); + Thread thread = new Thread(group, new TestDesignTime()); + thread.start(); + thread.join(); + } + + public void run() { + SunToolkit.createNewAppContext(); + if (Beans.isDesignTime()) { + throw new Error("shared DesignTime property"); + } + } +} diff --git a/jdk/test/java/beans/Beans/6669869/TestGuiAvailable.java b/jdk/test/java/beans/Beans/6669869/TestGuiAvailable.java new file mode 100644 index 00000000000..7144b6fad3b --- /dev/null +++ b/jdk/test/java/beans/Beans/6669869/TestGuiAvailable.java @@ -0,0 +1,53 @@ +/* + * Copyright 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 6669869 + * @summary Tests GuiAvailable property in different application contexts + * @author Sergey Malenkov + */ + +import java.awt.GraphicsEnvironment; +import java.beans.Beans; +import sun.awt.SunToolkit; + +public class TestGuiAvailable implements Runnable { + public static void main(String[] args) throws InterruptedException { + if (Beans.isGuiAvailable() == GraphicsEnvironment.isHeadless()) { + throw new Error("unexpected GuiAvailable property"); + } + Beans.setGuiAvailable(!Beans.isGuiAvailable()); + ThreadGroup group = new ThreadGroup("$$$"); + Thread thread = new Thread(group, new TestGuiAvailable()); + thread.start(); + thread.join(); + } + + public void run() { + SunToolkit.createNewAppContext(); + if (Beans.isGuiAvailable() == GraphicsEnvironment.isHeadless()) { + throw new Error("shared GuiAvailable property"); + } + } +} From a21476939e4a000ab5ee85f0939c99b4afb80312 Mon Sep 17 00:00:00 2001 From: Peter Zhelezniakov Date: Thu, 5 Feb 2009 19:16:13 +0300 Subject: [PATCH 033/292] 6801769: 6588003 should be backed out from jdk7 Reviewed-by: alexp --- .../classes/javax/swing/text/LayoutQueue.java | 31 ++++++------------- 1 file changed, 9 insertions(+), 22 deletions(-) diff --git a/jdk/src/share/classes/javax/swing/text/LayoutQueue.java b/jdk/src/share/classes/javax/swing/text/LayoutQueue.java index dbb5d00ccce..e02f9b0f9b6 100644 --- a/jdk/src/share/classes/javax/swing/text/LayoutQueue.java +++ b/jdk/src/share/classes/javax/swing/text/LayoutQueue.java @@ -25,7 +25,6 @@ package javax.swing.text; import java.util.Vector; -import sun.awt.AppContext; /** * A queue of text layout tasks. @@ -36,10 +35,10 @@ import sun.awt.AppContext; */ public class LayoutQueue { - private static final Object DEFAULT_QUEUE = new Object(); + Vector tasks; + Thread worker; - private Vector tasks; - private Thread worker; + static LayoutQueue defaultQueue; /** * Construct a layout queue. @@ -52,31 +51,19 @@ public class LayoutQueue { * Fetch the default layout queue. */ public static LayoutQueue getDefaultQueue() { - AppContext ac = AppContext.getAppContext(); - synchronized (DEFAULT_QUEUE) { - LayoutQueue defaultQueue = (LayoutQueue) ac.get(DEFAULT_QUEUE); - if (defaultQueue == null) { - defaultQueue = new LayoutQueue(); - ac.put(DEFAULT_QUEUE, defaultQueue); - } - return defaultQueue; + if (defaultQueue == null) { + defaultQueue = new LayoutQueue(); } + return defaultQueue; } /** * Set the default layout queue. * - * @param defaultQueue the new queue. + * @param q the new queue. */ - public static void setDefaultQueue(LayoutQueue defaultQueue) { - synchronized (DEFAULT_QUEUE) { - AppContext ac = AppContext.getAppContext(); - if (defaultQueue == null) { - ac.remove(DEFAULT_QUEUE); - } else { - ac.put(DEFAULT_QUEUE, defaultQueue); - } - } + public static void setDefaultQueue(LayoutQueue q) { + defaultQueue = q; } /** From d83e26cba476db741b0638154ae0d2d922fe91f9 Mon Sep 17 00:00:00 2001 From: Andrew Brygin Date: Fri, 6 Feb 2009 20:49:53 +0300 Subject: [PATCH 034/292] 6800846: REGRESSION: Printing quality degraded with Java 6 compared to 5.0 Reviewed-by: igor, prr --- jdk/src/share/native/sun/awt/image/dither.c | 11 +-- jdk/test/sun/awt/image/DrawByteBinary.java | 75 +++++++++++++++++++++ 2 files changed, 81 insertions(+), 5 deletions(-) create mode 100644 jdk/test/sun/awt/image/DrawByteBinary.java diff --git a/jdk/src/share/native/sun/awt/image/dither.c b/jdk/src/share/native/sun/awt/image/dither.c index a935d6766f6..cb2303e76d7 100644 --- a/jdk/src/share/native/sun/awt/image/dither.c +++ b/jdk/src/share/native/sun/awt/image/dither.c @@ -169,6 +169,7 @@ initCubemap(int* cmap, int cubesize = cube_dim * cube_dim * cube_dim; unsigned char *useFlags; unsigned char *newILut = (unsigned char*)malloc(cubesize); + int cmap_mid = (cmap_len >> 1) + (cmap_len & 0x1); if (newILut) { useFlags = (unsigned char *)calloc(cubesize, 1); @@ -188,7 +189,7 @@ initCubemap(int* cmap, currentState.iLUT = newILut; currentState.rgb = (unsigned short *) - malloc(256 * sizeof(unsigned short)); + malloc(cmap_len * sizeof(unsigned short)); if (currentState.rgb == NULL) { free(newILut); free(useFlags); @@ -199,7 +200,7 @@ initCubemap(int* cmap, } currentState.indices = (unsigned char *) - malloc(256 * sizeof(unsigned char)); + malloc(cmap_len * sizeof(unsigned char)); if (currentState.indices == NULL) { free(currentState.rgb); free(newILut); @@ -210,18 +211,18 @@ initCubemap(int* cmap, return NULL; } - for (i = 0; i < 128; i++) { + for (i = 0; i < cmap_mid; i++) { unsigned short rgb; int pixel = cmap[i]; rgb = (pixel & 0x00f80000) >> 9; rgb |= (pixel & 0x0000f800) >> 6; rgb |= (pixel & 0xf8) >> 3; INSERTNEW(currentState, rgb, i); - pixel = cmap[255-i]; + pixel = cmap[cmap_len - i - 1]; rgb = (pixel & 0x00f80000) >> 9; rgb |= (pixel & 0x0000f800) >> 6; rgb |= (pixel & 0xf8) >> 3; - INSERTNEW(currentState, rgb, 255-i); + INSERTNEW(currentState, rgb, cmap_len - i - 1); } if (!recurseLevel(¤tState)) { diff --git a/jdk/test/sun/awt/image/DrawByteBinary.java b/jdk/test/sun/awt/image/DrawByteBinary.java new file mode 100644 index 00000000000..e9db5c63f23 --- /dev/null +++ b/jdk/test/sun/awt/image/DrawByteBinary.java @@ -0,0 +1,75 @@ +/* + * Copyright 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 6800846 + * + * @summary Test verifes that images with short palette are rendered + * withourt artifacts. + * + * @run main DrawByteBinary + */ + + +import java.awt.*; +import java.awt.color.*; +import java.awt.image.*; +import static java.awt.image.BufferedImage.*; + + +public class DrawByteBinary { + + public static void main(String args[]) { + int w = 100, h = 30; + int x = 10; + byte[] arr = {(byte)0xff, (byte)0x0, (byte)0x00}; + + IndexColorModel newCM = new IndexColorModel(1, 2, arr, arr, arr); + BufferedImage orig = new BufferedImage(w, h, TYPE_BYTE_BINARY, newCM); + Graphics2D g2d = orig.createGraphics(); + g2d.setColor(Color.white); + g2d.fillRect(0, 0, w, h); + g2d.setColor(Color.black); + g2d.drawLine(x, 0, x, h); + g2d.dispose(); + + IndexColorModel origCM = (IndexColorModel)orig.getColorModel(); + BufferedImage test = new BufferedImage(w, h, TYPE_BYTE_BINARY,origCM); + g2d = test.createGraphics(); + g2d.drawImage(orig, 0, 0, null); + g2d.dispose(); + + int y = h / 2; + + // we expect white color outside the line + if (test.getRGB(x - 1, y) != 0xffffffff) { + throw new RuntimeException("Invalid color outside the line."); + } + + // we expect black color on the line + if (test.getRGB(x, y) != 0xff000000) { + throw new RuntimeException("Invalid color on the line."); + } + } +} From e67e7cb5a7efd43e06e98039a581d0adcb593b23 Mon Sep 17 00:00:00 2001 From: Artem Ananiev Date: Wed, 11 Feb 2009 17:07:06 +0300 Subject: [PATCH 035/292] 6633275: Need to support shaped/translucent windows Forward-port from 6u14, no public API is introduced Reviewed-by: anthony, dcherepanov --- jdk/make/sun/awt/FILES_c_windows.gmk | 5 +- jdk/make/sun/awt/Makefile | 3 +- jdk/make/sun/awt/make.depend | 22 +- jdk/make/sun/awt/mapfile-mawt-vers | 1 + jdk/make/sun/awt/mapfile-vers-linux | 1 + jdk/make/sun/xawt/mapfile-vers | 1 + .../classes/com/sun/awt/AWTUtilities.java | 362 ++++++++++++- jdk/src/share/classes/java/awt/Component.java | 69 ++- jdk/src/share/classes/java/awt/Container.java | 5 +- .../java/awt/DefaultKeyboardFocusManager.java | 2 +- .../java/awt/GraphicsConfiguration.java | 18 +- .../classes/java/awt/GraphicsDevice.java | 135 ++++- .../java/awt/KeyboardFocusManager.java | 12 +- jdk/src/share/classes/java/awt/Window.java | 288 +++++++++- .../classes/java/awt/peer/WindowPeer.java | 26 +- .../classes/javax/swing/RepaintManager.java | 45 +- .../share/classes/sun/awt/AWTAccessor.java | 139 ++++- .../share/classes/sun/awt/EmbeddedFrame.java | 11 +- jdk/src/share/classes/sun/awt/SunToolkit.java | 117 +++- jdk/src/share/native/sun/awt/utility/rect.c | 102 ++++ .../classes/sun/awt/X11/XNETProtocol.java | 10 +- .../solaris/classes/sun/awt/X11/XToolkit.java | 34 +- .../classes/sun/awt/X11/XWindowPeer.java | 67 ++- .../awt/X11/generator/WrapperGenerator.java | 6 +- .../sun/awt/X11/generator/xlibtypes.txt | 1 + .../classes/sun/awt/X11GraphicsConfig.java | 11 +- .../solaris/native/sun/awt/awt_GraphicsEnv.c | 102 +++- jdk/src/solaris/native/sun/awt/awt_p.h | 3 +- .../classes/sun/awt/Win32GraphicsConfig.java | 10 +- .../sun/awt/Win32GraphicsEnvironment.java | 9 +- .../awt/windows/TranslucentWindowPainter.java | 398 ++++++++++++++ .../classes/sun/awt/windows/WCanvasPeer.java | 27 +- .../sun/awt/windows/WComponentPeer.java | 68 +-- .../sun/awt/windows/WFileDialogPeer.java | 8 +- .../sun/awt/windows/WPrintDialogPeer.java | 8 +- .../classes/sun/awt/windows/WToolkit.java | 32 +- .../classes/sun/awt/windows/WWindowPeer.java | 181 ++++++- .../sun/java2d/opengl/WGLSurfaceData.java | 12 +- jdk/src/windows/native/sun/awt/utility/rect.h | 12 +- .../native/sun/java2d/d3d/D3DSurfaceData.cpp | 14 +- .../native/sun/java2d/opengl/WGLSurfaceData.c | 10 +- .../native/sun/windows/awt_BitmapUtil.cpp | 226 +++++++- .../native/sun/windows/awt_BitmapUtil.h | 28 +- .../native/sun/windows/awt_Component.cpp | 33 +- .../native/sun/windows/awt_Component.h | 11 +- .../windows/native/sun/windows/awt_Window.cpp | 406 +++++++++++++- .../windows/native/sun/windows/awt_Window.h | 38 +- .../TranslucentJAppletTest.java | 103 ++++ .../TranslucentShapedFrameTest/TSFrame.java | 306 +++++++++++ .../TranslucentShapedFrameTest.form | 230 ++++++++ .../TranslucentShapedFrameTest.java | 359 ++++++++++++ .../sun/awt/Translucency/WindowOpacity.java | 461 ++++++++++++++++ jdk/test/sun/java2d/pipe/RegionOps.java | 510 ++++++++++++++++++ 53 files changed, 4878 insertions(+), 220 deletions(-) create mode 100644 jdk/src/share/native/sun/awt/utility/rect.c create mode 100644 jdk/src/windows/classes/sun/awt/windows/TranslucentWindowPainter.java create mode 100644 jdk/test/com/sun/awt/Translucency/TranslucentJAppletTest/TranslucentJAppletTest.java create mode 100644 jdk/test/com/sun/awt/Translucency/TranslucentShapedFrameTest/TSFrame.java create mode 100644 jdk/test/com/sun/awt/Translucency/TranslucentShapedFrameTest/TranslucentShapedFrameTest.form create mode 100644 jdk/test/com/sun/awt/Translucency/TranslucentShapedFrameTest/TranslucentShapedFrameTest.java create mode 100644 jdk/test/com/sun/awt/Translucency/WindowOpacity.java create mode 100644 jdk/test/sun/java2d/pipe/RegionOps.java diff --git a/jdk/make/sun/awt/FILES_c_windows.gmk b/jdk/make/sun/awt/FILES_c_windows.gmk index 1a9b3b6ad3c..835da687938 100644 --- a/jdk/make/sun/awt/FILES_c_windows.gmk +++ b/jdk/make/sun/awt/FILES_c_windows.gmk @@ -1,5 +1,5 @@ # -# Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1997-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 @@ -104,7 +104,8 @@ FILES_c = \ OGLVertexCache.c \ WGLGraphicsConfig.c \ WGLSurfaceData.c \ - AccelGlyphCache.c + AccelGlyphCache.c \ + rect.c FILES_cpp = \ CmdIDList.cpp \ diff --git a/jdk/make/sun/awt/Makefile b/jdk/make/sun/awt/Makefile index 82a0a681de0..cd89650a597 100644 --- a/jdk/make/sun/awt/Makefile +++ b/jdk/make/sun/awt/Makefile @@ -1,5 +1,5 @@ # -# Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1995-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 @@ -219,6 +219,7 @@ vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/image/cvutils vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/shell vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/medialib vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/debug +vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/utility vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/../java2d vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/../java2d/loops vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/../java2d/pipe diff --git a/jdk/make/sun/awt/make.depend b/jdk/make/sun/awt/make.depend index 650e4c7fde8..df9d4c0f7c2 100644 --- a/jdk/make/sun/awt/make.depend +++ b/jdk/make/sun/awt/make.depend @@ -16,7 +16,7 @@ $(OBJDIR)/AnyShort.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/s $(OBJDIR)/awt_AWTEvent.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_BitmapUtil.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_BitmapUtil.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_BitmapUtil.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_BitmapUtil.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/awt/utility/rect.h $(OBJDIR)/awt_Brush.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h @@ -32,7 +32,7 @@ $(OBJDIR)/awt_Clipboard.obj:: $(CLASSHDRDIR)/sun_awt_windows_WClipboard.h $(CLAS $(OBJDIR)/awt_Color.obj:: $(CLASSHDRDIR)/sun_awt_windows_WColor.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Color.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Component.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Color.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_InputMethodEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_MouseWheelEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Insets.h $(CLASSHDRDIR)/java_awt_KeyboardFocusManager.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Toolkit.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WInputMethod.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPanelPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jawt.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Cursor.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dimension.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_InputEvent.h ../../../src/windows/native/sun/windows/awt_InputTextInfor.h ../../../src/windows/native/sun/windows/awt_Insets.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_KeyEvent.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_MouseEvent.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Component.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Color.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_InputMethodEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_MouseWheelEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Insets.h $(CLASSHDRDIR)/java_awt_KeyboardFocusManager.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Toolkit.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WInputMethod.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPanelPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jawt.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Cursor.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dimension.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_InputEvent.h ../../../src/windows/native/sun/windows/awt_InputTextInfor.h ../../../src/windows/native/sun/windows/awt_Insets.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_KeyEvent.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_MouseEvent.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/awt/utility/rect.h $(OBJDIR)/awt_Container.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/stdhdrs.h @@ -144,9 +144,9 @@ $(OBJDIR)/awt_Win32GraphicsEnv.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSH $(OBJDIR)/awt_Window.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Container.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_ComponentEvent.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Insets.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_BitmapUtil.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_IconCursor.h ../../../src/windows/native/sun/windows/awt_Insets.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Panel.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/Blit.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_Blit.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/Blit.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_Blit.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/awt/utility/rect.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/BlitBg.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_BlitBg.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/BlitBg.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_BlitBg.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/awt/utility/rect.h ../../../src/windows/native/sun/java2d/j2d_md.h $(OBJDIR)/BufferedMaskBlit.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedMaskBlit.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedOpCodes.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntBgr.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h @@ -240,11 +240,11 @@ $(OBJDIR)/GDIHashtable.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/j $(OBJDIR)/GDIRenderer.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_geom_PathIterator.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_windows_GDIRenderer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/GDIWindowSurfaceData.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_windows_GDIWindowSurfaceData.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/Disposer.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/GDIWindowSurfaceData.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_windows_GDIWindowSurfaceData.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/Disposer.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/awt/utility/rect.h ../../../src/windows/native/sun/windows/stdhdrs.h $(OBJDIR)/gifdecoder.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/jlong_md.h -$(OBJDIR)/GraphicsPrimitiveMgr.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_GraphicsPrimitiveMgr.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/GraphicsPrimitiveMgr.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_GraphicsPrimitiveMgr.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/awt/utility/rect.h ../../../src/windows/native/sun/java2d/j2d_md.h $(OBJDIR)/Hashtable.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h @@ -272,7 +272,7 @@ $(OBJDIR)/IntRgb.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/sha $(OBJDIR)/IntRgbx.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyInt.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/IntRgbx.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/MaskBlit.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_MaskBlit.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/MaskBlit.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_MaskBlit.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/awt/utility/rect.h $(OBJDIR)/MaskFill.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_MaskFill.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h @@ -284,7 +284,7 @@ $(OBJDIR)/OGLBlitLoops.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDR $(OBJDIR)/OGLBufImgOps.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLBufImgOps.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h -$(OBJDIR)/OGLContext.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h +$(OBJDIR)/OGLContext.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h ../../../src/windows/native/sun/awt/utility/rect.h $(OBJDIR)/OGLFuncs.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h @@ -306,11 +306,11 @@ $(OBJDIR)/OGLVertexCache.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(OBJDIR)/ProcessPath.obj:: $(CLASSHDRDIR)/java_awt_geom_PathIterator.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/loops/ProcessPath.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/Region.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/jlong_md.h +$(OBJDIR)/Region.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/awt/utility/rect.h $(OBJDIR)/RenderBuffer.obj:: $(CLASSHDRDIR)/sun_java2d_pipe_RenderBuffer.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/jlong_md.h -$(OBJDIR)/ScaledBlit.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_ScaledBlit.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/ScaledBlit.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_ScaledBlit.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/awt/utility/rect.h $(OBJDIR)/ShapeSpanIterator.obj:: $(CLASSHDRDIR)/java_awt_geom_PathIterator.h $(CLASSHDRDIR)/sun_java2d_pipe_ShapeSpanIterator.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/pipe/PathConsumer2D.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h @@ -326,7 +326,7 @@ $(OBJDIR)/ThreeByteBgr.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../s $(OBJDIR)/Trace.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h -$(OBJDIR)/TransformHelper.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_loops_TransformHelper.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/TransformHelper.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_loops_TransformHelper.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/awt/utility/rect.h $(OBJDIR)/Ushort4444Argb.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyShort.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/Ushort4444Argb.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h diff --git a/jdk/make/sun/awt/mapfile-mawt-vers b/jdk/make/sun/awt/mapfile-mawt-vers index ca3b430c57b..f24b57ec991 100644 --- a/jdk/make/sun/awt/mapfile-mawt-vers +++ b/jdk/make/sun/awt/mapfile-mawt-vers @@ -291,6 +291,7 @@ SUNWprivate_1.1 { Java_sun_awt_X11GraphicsConfig_createBackBuffer; Java_sun_awt_X11GraphicsConfig_destroyBackBuffer; Java_sun_awt_X11GraphicsConfig_swapBuffers; + Java_sun_awt_X11GraphicsConfig_isTranslucencyCapable; Java_sun_awt_X11GraphicsDevice_isDBESupported; Java_sun_awt_X11GraphicsDevice_getDisplay; Java_sun_awt_X11GraphicsDevice_getDoubleBufferVisuals; diff --git a/jdk/make/sun/awt/mapfile-vers-linux b/jdk/make/sun/awt/mapfile-vers-linux index 83afeebc7f2..a1e88de623c 100644 --- a/jdk/make/sun/awt/mapfile-vers-linux +++ b/jdk/make/sun/awt/mapfile-vers-linux @@ -407,6 +407,7 @@ SUNWprivate_1.1 { Java_sun_awt_X11GraphicsConfig_getNumColors; Java_sun_awt_X11GraphicsConfig_getXResolution; Java_sun_awt_X11GraphicsConfig_getYResolution; + Java_sun_awt_X11GraphicsConfig_isTranslucencyCapable; Java_sun_awt_X11GraphicsDevice_isDBESupported; Java_sun_awt_X11GraphicsDevice_getDisplay; Java_sun_awt_X11GraphicsDevice_getDoubleBufferVisuals; diff --git a/jdk/make/sun/xawt/mapfile-vers b/jdk/make/sun/xawt/mapfile-vers index 3f6bcdeb821..7bffbfd52bd 100644 --- a/jdk/make/sun/xawt/mapfile-vers +++ b/jdk/make/sun/xawt/mapfile-vers @@ -217,6 +217,7 @@ SUNWprivate_1.1 { Java_sun_awt_X11GraphicsConfig_createBackBuffer; Java_sun_awt_X11GraphicsConfig_destroyBackBuffer; Java_sun_awt_X11GraphicsConfig_swapBuffers; + Java_sun_awt_X11GraphicsConfig_isTranslucencyCapable; Java_java_awt_Insets_initIDs; Java_java_awt_KeyboardFocusManager_initIDs; Java_java_awt_Font_initIDs; diff --git a/jdk/src/share/classes/com/sun/awt/AWTUtilities.java b/jdk/src/share/classes/com/sun/awt/AWTUtilities.java index 818ac6f53e0..bf0628b4712 100644 --- a/jdk/src/share/classes/com/sun/awt/AWTUtilities.java +++ b/jdk/src/share/classes/com/sun/awt/AWTUtilities.java @@ -1,5 +1,5 @@ /* - * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2008-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 @@ -26,17 +26,37 @@ package com.sun.awt; import java.awt.*; -import sun.awt.AWTAccessor; +import sun.awt.AWTAccessor; +import sun.awt.SunToolkit; /** * A collection of utility methods for AWT. * * The functionality provided by the static methods of the class includes: *

    + *
  • Setting shapes on top-level windows + *
  • Setting a constant alpha value for each pixel of a top-level window + *
  • Making a window non-opaque, after that it paints only explicitly + * painted pixels on the screen, with arbitrary alpha values for every pixel. *
  • Setting a 'mixing-cutout' shape for a component. *
*

+ * A "top-level window" is an instance of the {@code Window} class (or its + * descendant, such as {@code JFrame}). + *

+ * Some of the mentioned features may not be supported by the native platform. + * To determine whether a particular feature is supported, the user must use + * the {@code isTranslucencySupported()} method of the class passing a desired + * translucency kind (a member of the {@code Translucency} enum) as an + * argument. + *

+ * The per-pixel alpha feature also requires the user to create her/his + * windows using a translucency-capable graphics configuration. + * The {@code isTranslucencyCapable()} method must + * be used to verify whether any given GraphicsConfiguration supports + * the trasnlcency effects. + *

* WARNING: This class is an implementation detail and only meant * for limited use outside of the core platform. This API may change * drastically between update release, and it may even be @@ -50,6 +70,344 @@ public final class AWTUtilities { private AWTUtilities() { } + /** Kinds of translucency supported by the underlying system. + * @see #isTranslucencySupported + */ + public static enum Translucency { + /** + * Represents support in the underlying system for windows each pixel + * of which is guaranteed to be either completely opaque, with + * an alpha value of 1.0, or completely transparent, with an alpha + * value of 0.0. + */ + PERPIXEL_TRANSPARENT, + + /** + * Represents support in the underlying system for windows all of + * the pixels of which have the same alpha value between or including + * 0.0 and 1.0. + */ + TRANSLUCENT, + + /** + * Represents support in the underlying system for windows that + * contain or might contain pixels with arbitrary alpha values + * between and including 0.0 and 1.0. + */ + PERPIXEL_TRANSLUCENT; + } + + + /** + * Returns whether the given level of translucency is supported by + * the underlying system. + * + * Note that this method may sometimes return the value + * indicating that the particular level is supported, but + * the native windowing system may still not support the + * given level of translucency (due to the bugs in + * the windowing system). + * + * @param translucencyKind a kind of translucency support + * (either PERPIXEL_TRANSPARENT, + * TRANSLUCENT, or PERPIXEL_TRANSLUCENT) + * @return whether the given translucency kind is supported + */ + public static boolean isTranslucencySupported(Translucency translucencyKind) { + switch (translucencyKind) { + case PERPIXEL_TRANSPARENT: + return isWindowShapingSupported(); + case TRANSLUCENT: + return isWindowOpacitySupported(); + case PERPIXEL_TRANSLUCENT: + return isWindowTranslucencySupported(); + } + return false; + } + + + /** + * Returns whether the windowing system supports changing the opacity + * value of top-level windows. + * Note that this method may sometimes return true, but the native + * windowing system may still not support the concept of + * translucency (due to the bugs in the windowing system). + */ + private static boolean isWindowOpacitySupported() { + Toolkit curToolkit = Toolkit.getDefaultToolkit(); + if (!(curToolkit instanceof SunToolkit)) { + return false; + } + return ((SunToolkit)curToolkit).isWindowOpacitySupported(); + } + + /** + * Set the opacity of the window. The opacity is at the range [0..1]. + * Note that setting the opacity level of 0 may or may not disable + * the mouse event handling on this window. This is + * a platform-dependent behavior. + * + * In order for this method to enable the translucency effect, + * the isTranslucencySupported() method should indicate that the + * TRANSLUCENT level of translucency is supported. + * + *

Also note that the window must not be in the full-screen mode + * when setting the opacity value < 1.0f. Otherwise + * the IllegalArgumentException is thrown. + * + * @param window the window to set the opacity level to + * @param opacity the opacity level to set to the window + * @throws NullPointerException if the window argument is null + * @throws IllegalArgumentException if the opacity is out of + * the range [0..1] + * @throws IllegalArgumentException if the window is in full screen mode, + * and the opacity is less than 1.0f + * @throws UnsupportedOperationException if the TRANSLUCENT translucency + * kind is not supported + */ + public static void setWindowOpacity(Window window, float opacity) { + if (window == null) { + throw new NullPointerException( + "The window argument should not be null."); + } + + AWTAccessor.getWindowAccessor().setOpacity(window, opacity); + } + + /** + * Get the opacity of the window. If the opacity has not + * yet being set, this method returns 1.0. + * + * @param window the window to get the opacity level from + * @throws NullPointerException if the window argument is null + */ + public static float getWindowOpacity(Window window) { + if (window == null) { + throw new NullPointerException( + "The window argument should not be null."); + } + + return AWTAccessor.getWindowAccessor().getOpacity(window); + } + + /** + * Returns whether the windowing system supports changing the shape + * of top-level windows. + * Note that this method may sometimes return true, but the native + * windowing system may still not support the concept of + * shaping (due to the bugs in the windowing system). + */ + public static boolean isWindowShapingSupported() { + Toolkit curToolkit = Toolkit.getDefaultToolkit(); + if (!(curToolkit instanceof SunToolkit)) { + return false; + } + return ((SunToolkit)curToolkit).isWindowShapingSupported(); + } + + /** + * Returns an object that implements the Shape interface and represents + * the shape previously set with the call to the setWindowShape() method. + * If no shape has been set yet, or the shape has been reset to null, + * this method returns null. + * + * @param window the window to get the shape from + * @return the current shape of the window + * @throws NullPointerException if the window argument is null + */ + public static Shape getWindowShape(Window window) { + if (window == null) { + throw new NullPointerException( + "The window argument should not be null."); + } + return AWTAccessor.getWindowAccessor().getShape(window); + } + + /** + * Sets a shape for the given window. + * If the shape argument is null, this methods restores + * the default shape making the window rectangular. + *

Note that in order to set a shape, the window must be undecorated. + * If the window is decorated, this method ignores the {@code shape} + * argument and resets the shape to null. + *

Also note that the window must not be in the full-screen mode + * when setting a non-null shape. Otherwise the IllegalArgumentException + * is thrown. + *

Depending on the platform, the method may return without + * effecting the shape of the window if the window has a non-null warning + * string ({@link Window#getWarningString()}). In this case the passed + * shape object is ignored. + * + * @param window the window to set the shape to + * @param shape the shape to set to the window + * @throws NullPointerException if the window argument is null + * @throws IllegalArgumentException if the window is in full screen mode, + * and the shape is not null + * @throws UnsupportedOperationException if the PERPIXEL_TRANSPARENT + * translucency kind is not supported + */ + public static void setWindowShape(Window window, Shape shape) { + if (window == null) { + throw new NullPointerException( + "The window argument should not be null."); + } + AWTAccessor.getWindowAccessor().setShape(window, shape); + } + + private static boolean isWindowTranslucencySupported() { + /* + * Per-pixel alpha is supported if all the conditions are TRUE: + * 1. The toolkit is a sort of SunToolkit + * 2. The toolkit supports translucency in general + * (isWindowTranslucencySupported()) + * 3. There's at least one translucency-capable + * GraphicsConfiguration + */ + + Toolkit curToolkit = Toolkit.getDefaultToolkit(); + if (!(curToolkit instanceof SunToolkit)) { + return false; + } + + if (!((SunToolkit)curToolkit).isWindowTranslucencySupported()) { + return false; + } + + GraphicsEnvironment env = + GraphicsEnvironment.getLocalGraphicsEnvironment(); + + // If the default GC supports translucency return true. + // It is important to optimize the verification this way, + // see CR 6661196 for more details. + if (isTranslucencyCapable(env.getDefaultScreenDevice() + .getDefaultConfiguration())) + { + return true; + } + + // ... otherwise iterate through all the GCs. + GraphicsDevice[] devices = env.getScreenDevices(); + + for (int i = 0; i < devices.length; i++) { + GraphicsConfiguration[] configs = devices[i].getConfigurations(); + for (int j = 0; j < configs.length; j++) { + if (isTranslucencyCapable(configs[j])) { + return true; + } + } + } + + return false; + } + + /** + * Enables the per-pixel alpha support for the given window. + * Once the window becomes non-opaque (the isOpaque is set to false), + * the drawing sub-system is starting to respect the alpha value of each + * separate pixel. If a pixel gets painted with alpha color component + * equal to zero, it becomes visually transparent, if the alpha of the + * pixel is equal to 255, the pixel is fully opaque. Interim values + * of the alpha color component make the pixel semi-transparent (i.e. + * translucent). + *

Note that in order for the window to support the per-pixel alpha + * mode, the window must be created using the GraphicsConfiguration + * for which the {@link #isTranslucencyCapable} + * method returns true. + *

Also note that some native systems enable the per-pixel translucency + * mode for any window created using the translucency-compatible + * graphics configuration. However, it is highly recommended to always + * invoke the setWindowOpaque() method for these windows, at least for + * the sake of cross-platform compatibility reasons. + *

Also note that the window must not be in the full-screen mode + * when making it non-opaque. Otherwise the IllegalArgumentException + * is thrown. + *

If the window is a {@code Frame} or a {@code Dialog}, the window must + * be undecorated prior to enabling the per-pixel translucency effect (see + * {@link Frame#setUndecorated()} and/or {@link Dialog#setUndecorated()}). + * If the window becomes decorated through a subsequent call to the + * corresponding {@code setUndecorated()} method, the per-pixel + * translucency effect will be disabled and the opaque property reset to + * {@code true}. + *

Depending on the platform, the method may return without + * effecting the opaque property of the window if the window has a non-null + * warning string ({@link Window#getWarningString()}). In this case + * the passed 'isOpaque' value is ignored. + * + * @param window the window to set the shape to + * @param isOpaque whether the window must be opaque (true), + * or translucent (false) + * @throws NullPointerException if the window argument is null + * @throws IllegalArgumentException if the window uses + * a GraphicsConfiguration for which the + * {@code isTranslucencyCapable()} + * method returns false + * @throws IllegalArgumentException if the window is in full screen mode, + * and the isOpaque is false + * @throws IllegalArgumentException if the window is decorated and the + * isOpaque argument is {@code false}. + * @throws UnsupportedOperationException if the PERPIXEL_TRANSLUCENT + * translucency kind is not supported + */ + public static void setWindowOpaque(Window window, boolean isOpaque) { + if (window == null) { + throw new NullPointerException( + "The window argument should not be null."); + } + if (!isOpaque && !isTranslucencySupported(Translucency.PERPIXEL_TRANSLUCENT)) { + throw new UnsupportedOperationException( + "The PERPIXEL_TRANSLUCENT translucency kind is not supported"); + } + AWTAccessor.getWindowAccessor().setOpaque(window, isOpaque); + } + + /** + * Returns whether the window is opaque or translucent. + * + * @param window the window to set the shape to + * @return whether the window is currently opaque (true) + * or translucent (false) + * @throws NullPointerException if the window argument is null + */ + public static boolean isWindowOpaque(Window window) { + if (window == null) { + throw new NullPointerException( + "The window argument should not be null."); + } + + return AWTAccessor.getWindowAccessor().isOpaque(window); + } + + /** + * Verifies whether a given GraphicsConfiguration supports + * the PERPIXEL_TRANSLUCENT kind of translucency. + * All windows that are intended to be used with the {@link #setWindowOpaque} + * method must be created using a GraphicsConfiguration for which this method + * returns true. + *

Note that some native systems enable the per-pixel translucency + * mode for any window created using a translucency-capable + * graphics configuration. However, it is highly recommended to always + * invoke the setWindowOpaque() method for these windows, at least + * for the sake of cross-platform compatibility reasons. + * + * @param gc GraphicsConfiguration + * @throws NullPointerException if the gc argument is null + * @return whether the given GraphicsConfiguration supports + * the translucency effects. + */ + public static boolean isTranslucencyCapable(GraphicsConfiguration gc) { + if (gc == null) { + throw new NullPointerException("The gc argument should not be null"); + } + /* + return gc.isTranslucencyCapable(); + */ + Toolkit curToolkit = Toolkit.getDefaultToolkit(); + if (!(curToolkit instanceof SunToolkit)) { + return false; + } + return ((SunToolkit)curToolkit).isTranslucencyCapable(gc); + } + /** * Sets a 'mixing-cutout' shape for the given component. * diff --git a/jdk/src/share/classes/java/awt/Component.java b/jdk/src/share/classes/java/awt/Component.java index afe091dccef..9828ddb5661 100644 --- a/jdk/src/share/classes/java/awt/Component.java +++ b/jdk/src/share/classes/java/awt/Component.java @@ -1,5 +1,5 @@ /* - * Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1995-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 @@ -799,8 +799,24 @@ public abstract class Component implements ImageObserver, MenuContainer, } } + // Whether this Component has had the background erase flag + // specified via SunToolkit.disableBackgroundErase(). This is + // needed in order to make this function work on X11 platforms, + // where currently there is no chance to interpose on the creation + // of the peer and therefore the call to XSetBackground. + transient boolean backgroundEraseDisabled; + static { AWTAccessor.setComponentAccessor(new AWTAccessor.ComponentAccessor() { + public void setBackgroundEraseDisabled(Component comp, boolean disabled) { + comp.backgroundEraseDisabled = disabled; + } + public boolean getBackgroundEraseDisabled(Component comp) { + return comp.backgroundEraseDisabled; + } + public Rectangle getBounds(Component comp) { + return new Rectangle(comp.x, comp.y, comp.width, comp.height); + } public void setMixingCutoutShape(Component comp, Shape shape) { Region region = shape == null ? null : Region.getInstance(shape, null); @@ -7456,7 +7472,7 @@ public abstract class Component implements ImageObserver, MenuContainer, // sometimes most recent focus owner may be null, but focus owner is not // e.g. we reset most recent focus owner if user removes focus owner focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner(); - if (focusOwner != null && getContainingWindow(focusOwner) != window) { + if (focusOwner != null && focusOwner.getContainingWindow() != window) { focusOwner = null; } } @@ -8689,30 +8705,8 @@ public abstract class Component implements ImageObserver, MenuContainer, * null, if component is not a part of window hierarchy */ Window getContainingWindow() { - return getContainingWindow(this); + return SunToolkit.getContainingWindow(this); } - /** - * Returns the Window ancestor of the component comp. - * @return Window ancestor of the component or component by itself if it is Window; - * null, if component is not a part of window hierarchy - */ - static Window getContainingWindow(Component comp) { - while (comp != null && !(comp instanceof Window)) { - comp = comp.getParent(); - } - - return (Window)comp; - } - - - - - - - - - - /** * Initialize JNI field and method IDs @@ -9827,4 +9821,29 @@ public abstract class Component implements ImageObserver, MenuContainer, } // ****************** END OF MIXING CODE ******************************** + + private static boolean doesClassImplement(Class cls, String interfaceName) { + if (cls == null) return false; + + for (Class c : cls.getInterfaces()) { + if (c.getName().equals(interfaceName)) { + return true; + } + } + return doesClassImplement(cls.getSuperclass(), interfaceName); + } + + /** + * Checks that the given object implements the given interface. + * @param obj Object to be checked + * @param interfaceName The name of the interface. Must be fully-qualified interface name. + * @return true, if this object implements the given interface, + * false, otherwise, or if obj or interfaceName is null + */ + static boolean doesImplement(Object obj, String interfaceName) { + if (obj == null) return false; + if (interfaceName == null) return false; + + return doesClassImplement(obj.getClass(), interfaceName); + } } diff --git a/jdk/src/share/classes/java/awt/Container.java b/jdk/src/share/classes/java/awt/Container.java index 04425d5a45a..64de85477a7 100644 --- a/jdk/src/share/classes/java/awt/Container.java +++ b/jdk/src/share/classes/java/awt/Container.java @@ -1,5 +1,5 @@ /* - * Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1995-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 @@ -167,6 +167,9 @@ public class Container extends Component { transient int listeningBoundsChildren; transient int descendantsCount; + /* Non-opaque window support -- see Window.setLayersOpaque */ + transient Color preserveBackgroundColor = null; + /** * JDK 1.1 serialVersionUID */ diff --git a/jdk/src/share/classes/java/awt/DefaultKeyboardFocusManager.java b/jdk/src/share/classes/java/awt/DefaultKeyboardFocusManager.java index 5dd0d9061ff..71342bdaeed 100644 --- a/jdk/src/share/classes/java/awt/DefaultKeyboardFocusManager.java +++ b/jdk/src/share/classes/java/awt/DefaultKeyboardFocusManager.java @@ -479,7 +479,7 @@ public class DefaultKeyboardFocusManager extends KeyboardFocusManager { // that a Component outside of the focused Window receives a // FOCUS_GAINED event. We synthesize a WINDOW_GAINED_FOCUS // event in that case. - final Window newFocusedWindow = Component.getContainingWindow(newFocusOwner); + final Window newFocusedWindow = SunToolkit.getContainingWindow(newFocusOwner); final Window currentFocusedWindow = getGlobalFocusedWindow(); if (newFocusedWindow != null && newFocusedWindow != currentFocusedWindow) diff --git a/jdk/src/share/classes/java/awt/GraphicsConfiguration.java b/jdk/src/share/classes/java/awt/GraphicsConfiguration.java index 03b147f8a43..c520d310bbe 100644 --- a/jdk/src/share/classes/java/awt/GraphicsConfiguration.java +++ b/jdk/src/share/classes/java/awt/GraphicsConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -434,4 +434,20 @@ public abstract class GraphicsConfiguration { } return defaultImageCaps; } + + /** + * Returns whether this GraphicsConfiguration supports + * the {@link GraphicsDevice.WindowTranslucency#PERPIXEL_TRANSLUCENT + * PERPIXEL_TRANSLUCENT} kind of translucency. + * + * @param gc GraphicsConfiguration + * @throws NullPointerException if the gc argument is null + * @return whether the given GraphicsConfiguration supports + * the translucency effects. + * @see Window#setBackground(Color) + */ + /*public */boolean isTranslucencyCapable() { + // Overridden in subclasses + return false; } +} diff --git a/jdk/src/share/classes/java/awt/GraphicsDevice.java b/jdk/src/share/classes/java/awt/GraphicsDevice.java index 47b578129dd..920687150d9 100644 --- a/jdk/src/share/classes/java/awt/GraphicsDevice.java +++ b/jdk/src/share/classes/java/awt/GraphicsDevice.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -27,7 +27,10 @@ package java.awt; import java.awt.image.ColorModel; + +import sun.awt.AWTAccessor; import sun.awt.AppContext; +import sun.awt.SunToolkit; /** * The GraphicsDevice class describes the graphics devices @@ -109,6 +112,31 @@ public abstract class GraphicsDevice { */ public final static int TYPE_IMAGE_BUFFER = 2; + /** Kinds of translucency supported by the underlying system. + * @see #isTranslucencySupported + */ + /*public */static enum WindowTranslucency { + /** + * Represents support in the underlying system for windows each pixel + * of which is guaranteed to be either completely opaque, with + * an alpha value of 1.0, or completely transparent, with an alpha + * value of 0.0. + */ + PERPIXEL_TRANSPARENT, + /** + * Represents support in the underlying system for windows all of + * the pixels of which have the same alpha value between or including + * 0.0 and 1.0. + */ + TRANSLUCENT, + /** + * Represents support in the underlying system for windows that + * contain or might contain pixels with arbitrary alpha values + * between and including 0.0 and 1.0. + */ + PERPIXEL_TRANSLUCENT; + } + /** * Returns the type of this GraphicsDevice. * @return the type of this GraphicsDevice, which can @@ -235,6 +263,21 @@ public abstract class GraphicsDevice { * @since 1.4 */ public void setFullScreenWindow(Window w) { + if (w != null) { + //XXX: The actions should be documented in some non-update release. + /* + if (w.getShape() != null) { + w.setShape(w, null); + } + if (!w.isOpaque()) { + w.setOpaque(false); + } + if (w.getOpacity() < 1.0f) { + w.setOpacity(1.0f); + } + */ + } + if (fullScreenWindow != null && windowedModeBounds != null) { // if the window went into fs mode before it was realized it may // have (0,0) dimensions @@ -424,4 +467,94 @@ public abstract class GraphicsDevice { public int getAvailableAcceleratedMemory() { return -1; } + + /** + * Returns whether the given level of translucency is supported + * this graphics device. + * + * @param translucencyKind a kind of translucency support + * @return whether the given translucency kind is supported + */ + /*public */boolean isWindowTranslucencySupported(WindowTranslucency translucencyKind) { + switch (translucencyKind) { + case PERPIXEL_TRANSPARENT: + return isWindowShapingSupported(); + case TRANSLUCENT: + return isWindowOpacitySupported(); + case PERPIXEL_TRANSLUCENT: + return isWindowPerpixelTranslucencySupported(); + } + return false; + } + + /** + * Returns whether the windowing system supports changing the shape + * of top-level windows. + * Note that this method may sometimes return true, but the native + * windowing system may still not support the concept of + * shaping (due to the bugs in the windowing system). + */ + static boolean isWindowShapingSupported() { + Toolkit curToolkit = Toolkit.getDefaultToolkit(); + if (!(curToolkit instanceof SunToolkit)) { + return false; + } + return ((SunToolkit)curToolkit).isWindowShapingSupported(); + } + + /** + * Returns whether the windowing system supports changing the opacity + * value of top-level windows. + * Note that this method may sometimes return true, but the native + * windowing system may still not support the concept of + * translucency (due to the bugs in the windowing system). + */ + static boolean isWindowOpacitySupported() { + Toolkit curToolkit = Toolkit.getDefaultToolkit(); + if (!(curToolkit instanceof SunToolkit)) { + return false; + } + return ((SunToolkit)curToolkit).isWindowOpacitySupported(); + } + + boolean isWindowPerpixelTranslucencySupported() { + /* + * Per-pixel alpha is supported if all the conditions are TRUE: + * 1. The toolkit is a sort of SunToolkit + * 2. The toolkit supports translucency in general + * (isWindowTranslucencySupported()) + * 3. There's at least one translucency-capable + * GraphicsConfiguration + */ + Toolkit curToolkit = Toolkit.getDefaultToolkit(); + if (!(curToolkit instanceof SunToolkit)) { + return false; + } + if (!((SunToolkit)curToolkit).isWindowTranslucencySupported()) { + return false; + } + + // TODO: cache translucency capable GC + return getTranslucencyCapableGC() != null; + } + + GraphicsConfiguration getTranslucencyCapableGC() { + // If the default GC supports translucency return true. + // It is important to optimize the verification this way, + // see CR 6661196 for more details. + GraphicsConfiguration defaultGC = getDefaultConfiguration(); + if (defaultGC.isTranslucencyCapable()) { + return defaultGC; + } + + // ... otherwise iterate through all the GCs. + GraphicsConfiguration[] configs = getConfigurations(); + for (int j = 0; j < configs.length; j++) { + if (configs[j].isTranslucencyCapable()) { + return configs[j]; + } + } + + return null; + } } diff --git a/jdk/src/share/classes/java/awt/KeyboardFocusManager.java b/jdk/src/share/classes/java/awt/KeyboardFocusManager.java index b84b93b021e..268eba915be 100644 --- a/jdk/src/share/classes/java/awt/KeyboardFocusManager.java +++ b/jdk/src/share/classes/java/awt/KeyboardFocusManager.java @@ -2208,7 +2208,7 @@ public abstract class KeyboardFocusManager boolean temporary, boolean focusedWindowChangeAllowed, long time) { - Window parentWindow = Component.getContainingWindow(heavyweight); + Window parentWindow = SunToolkit.getContainingWindow(heavyweight); if (parentWindow == null || !parentWindow.syncLWRequests) { return false; } @@ -2542,7 +2542,7 @@ public abstract class KeyboardFocusManager (HeavyweightFocusRequest.CLEAR_GLOBAL_FOCUS_OWNER); Component activeWindow = ((hwFocusRequest != null) - ? Component.getContainingWindow(hwFocusRequest.heavyweight) + ? SunToolkit.getContainingWindow(hwFocusRequest.heavyweight) : nativeFocusedWindow); while (activeWindow != null && !((activeWindow instanceof Frame) || @@ -3013,8 +3013,8 @@ public abstract class KeyboardFocusManager } private static boolean focusedWindowChanged(Component to, Component from) { - Window wto = Component.getContainingWindow(to); - Window wfrom = Component.getContainingWindow(from); + Window wto = SunToolkit.getContainingWindow(to); + Window wfrom = SunToolkit.getContainingWindow(from); if (wto == null && wfrom == null) { return true; } @@ -3028,8 +3028,8 @@ public abstract class KeyboardFocusManager } private static boolean isTemporary(Component to, Component from) { - Window wto = Component.getContainingWindow(to); - Window wfrom = Component.getContainingWindow(from); + Window wto = SunToolkit.getContainingWindow(to); + Window wfrom = SunToolkit.getContainingWindow(from); if (wto == null && wfrom == null) { return false; } diff --git a/jdk/src/share/classes/java/awt/Window.java b/jdk/src/share/classes/java/awt/Window.java index 2651729f20d..64c611ac3c3 100644 --- a/jdk/src/share/classes/java/awt/Window.java +++ b/jdk/src/share/classes/java/awt/Window.java @@ -1,5 +1,5 @@ /* - * Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1995-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 @@ -27,6 +27,7 @@ package java.awt; import java.awt.event.*; import java.awt.im.InputContext; import java.awt.image.BufferStrategy; +import java.awt.image.BufferedImage; import java.awt.peer.ComponentPeer; import java.awt.peer.WindowPeer; import java.beans.PropertyChangeListener; @@ -49,6 +50,7 @@ import java.util.logging.Level; import java.util.logging.Logger; import java.util.concurrent.atomic.AtomicBoolean; import javax.accessibility.*; +import sun.awt.AWTAccessor; import sun.awt.AppContext; import sun.awt.CausedFocusEvent; import sun.awt.SunToolkit; @@ -291,6 +293,25 @@ public class Window extends Container implements Accessible { */ transient boolean isInShow = false; + /* + * Opacity level of the window + * + * @see #setOpacity(float) + * @see #getOpacity() + * @since 1.7 + */ + private float opacity = 1.0f; + + /* + * The shape assigned to this window. This field is set to null if + * no shape is set (rectangular window). + * + * @see #getShape() + * @see #setShape(Shape) + * @since 1.7 + */ + private Shape shape = null; + private static final String base = "win"; private static int nameCounter = 0; @@ -666,9 +687,9 @@ public class Window extends Container implements Accessible { } if (peer == null) { peer = getToolkit().createWindow(this); - } - synchronized (allWindows) { - allWindows.add(this); + synchronized (allWindows) { + allWindows.add(this); + } } super.addNotify(); } @@ -2849,6 +2870,8 @@ public class Window extends Container implements Accessible { if(aot) { setAlwaysOnTop(aot); // since 1.5; subject to permission check } + shape = (Shape)f.get("shape", null); + opacity = (Float)f.get("opacity", 1.0f); deserializeResources(s); } @@ -3016,7 +3039,7 @@ public class Window extends Container implements Accessible { Dimension windowSize = getSize(); // search a top-level of c - Window componentWindow = Component.getContainingWindow(c); + Window componentWindow = SunToolkit.getContainingWindow(c); if ((c == null) || (componentWindow == null)) { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); gc = ge.getDefaultScreenDevice().getDefaultConfiguration(); @@ -3304,6 +3327,225 @@ public class Window extends Container implements Accessible { } + // ******************** SHAPES & TRANSPARENCY CODE ******************** + + /** + * JavaDoc + */ + /*public */float getOpacity() { + synchronized (getTreeLock()) { + return opacity; + } + } + + /** + * JavaDoc + */ + /*public */void setOpacity(float opacity) { + synchronized (getTreeLock()) { + if (opacity < 0.0f || opacity > 1.0f) { + throw new IllegalArgumentException( + "The value of opacity should be in the range [0.0f .. 1.0f]."); + } + GraphicsConfiguration gc = getGraphicsConfiguration(); + GraphicsDevice gd = gc.getDevice(); + if (!gd.isWindowTranslucencySupported(GraphicsDevice.WindowTranslucency.TRANSLUCENT)) { + throw new UnsupportedOperationException( + "TRANSLUCENT translucency is not supported."); + } + if ((gc.getDevice().getFullScreenWindow() == this) && (opacity < 1.0f)) { + throw new IllegalArgumentException( + "Setting opacity for full-screen window is not supported."); + } + this.opacity = opacity; + WindowPeer peer = (WindowPeer)getPeer(); + if (peer != null) { + peer.setOpacity(opacity); + } + } + } + + /** + * JavaDoc + */ + /*public */Shape getShape() { + synchronized (getTreeLock()) { + return shape; + } + } + + /** + * JavaDoc + * + * @param window the window to set the shape to + * @param shape the shape to set to the window + * @throws IllegalArgumentException if the window is in full screen mode, + * and the shape is not null + */ + /*public */void setShape(Shape shape) { + synchronized (getTreeLock()) { + GraphicsConfiguration gc = getGraphicsConfiguration(); + GraphicsDevice gd = gc.getDevice(); + if (!gd.isWindowTranslucencySupported( + GraphicsDevice.WindowTranslucency.PERPIXEL_TRANSPARENT)) + { + throw new UnsupportedOperationException( + "PERPIXEL_TRANSPARENT translucency is not supported."); + } + if ((gc.getDevice().getFullScreenWindow() == this) && (shape != null)) { + throw new IllegalArgumentException( + "Setting shape for full-screen window is not supported."); + } + this.shape = shape; + WindowPeer peer = (WindowPeer)getPeer(); + if (peer != null) { + peer.applyShape(shape == null ? null : Region.getInstance(shape, null)); + } + } + } + + /** + * JavaDoc + */ +/* + @Override + public void setBackground(Color bgColor) { + int alpha = bgColor.getAlpha(); + if (alpha < 255) { // non-opaque window + GraphicsConfiguration gc = getGraphicsConfiguration(); + GraphicsDevice gd = gc.getDevice(); + if (gc.getDevice().getFullScreenWindow() == this) { + throw new IllegalArgumentException( + "Making full-screen window non opaque is not supported."); + } + if (!gc.isTranslucencyCapable()) { + GraphicsConfiguration capableGC = gd.getTranslucencyCapableGC(); + if (capableGC == null) { + throw new IllegalArgumentException( + "PERPIXEL_TRANSLUCENT translucency is not supported"); + } + // TODO: change GC + } + setLayersOpaque(this, false); + } + + super.setBackground(bgColor); + + WindowPeer peer = (WindowPeer)getPeer(); + if (peer != null) { + peer.setOpaque(alpha == 255); + } + } +*/ + + private transient boolean opaque = true; + + void setOpaque(boolean opaque) { + synchronized (getTreeLock()) { + GraphicsConfiguration gc = getGraphicsConfiguration(); + if (!opaque && !com.sun.awt.AWTUtilities.isTranslucencyCapable(gc)) { + throw new IllegalArgumentException( + "The window must use a translucency-compatible graphics configuration"); + } + if (!com.sun.awt.AWTUtilities.isTranslucencySupported( + com.sun.awt.AWTUtilities.Translucency.PERPIXEL_TRANSLUCENT)) + { + throw new UnsupportedOperationException( + "PERPIXEL_TRANSLUCENT translucency is not supported."); + } + if ((gc.getDevice().getFullScreenWindow() == this) && !opaque) { + throw new IllegalArgumentException( + "Making full-screen window non opaque is not supported."); + } + setLayersOpaque(this, opaque); + this.opaque = opaque; + WindowPeer peer = (WindowPeer)getPeer(); + if (peer != null) { + peer.setOpaque(opaque); + } + } + } + + private void updateWindow(BufferedImage backBuffer) { + synchronized (getTreeLock()) { + WindowPeer peer = (WindowPeer)getPeer(); + if (peer != null) { + peer.updateWindow(backBuffer); + } + } + } + + private static final Color TRANSPARENT_BACKGROUND_COLOR = new Color(0, 0, 0, 0); + + private static void setLayersOpaque(Component component, boolean isOpaque) { + // Shouldn't use instanceof to avoid loading Swing classes + // if it's a pure AWT application. + if (Component.doesImplement(component, "javax.swing.RootPaneContainer")) { + javax.swing.RootPaneContainer rpc = (javax.swing.RootPaneContainer)component; + javax.swing.JRootPane root = rpc.getRootPane(); + javax.swing.JLayeredPane lp = root.getLayeredPane(); + Container c = root.getContentPane(); + javax.swing.JComponent content = + (c instanceof javax.swing.JComponent) ? (javax.swing.JComponent)c : null; + javax.swing.JComponent gp = + (rpc.getGlassPane() instanceof javax.swing.JComponent) ? + (javax.swing.JComponent)rpc.getGlassPane() : null; + if (gp != null) { + gp.setDoubleBuffered(isOpaque); + } + lp.setOpaque(isOpaque); + root.setOpaque(isOpaque); + root.setDoubleBuffered(isOpaque); //XXX: the "white rect" workaround + if (content != null) { + content.setOpaque(isOpaque); + content.setDoubleBuffered(isOpaque); //XXX: the "white rect" workaround + + // Iterate down one level to see whether we have a JApplet + // (which is also a RootPaneContainer) which requires processing + int numChildren = content.getComponentCount(); + if (numChildren > 0) { + Component child = content.getComponent(0); + // It's OK to use instanceof here because we've + // already loaded the RootPaneContainer class by now + if (child instanceof javax.swing.RootPaneContainer) { + setLayersOpaque(child, isOpaque); + } + } + } + } + + Color bg = component.getBackground(); + boolean hasTransparentBg = TRANSPARENT_BACKGROUND_COLOR.equals(bg); + + Container container = null; + if (component instanceof Container) { + container = (Container) component; + } + + if (isOpaque) { + if (hasTransparentBg) { + // Note: we use the SystemColor.window color as the default. + // This color is used in the WindowPeer implementations to + // initialize the background color of the window if it is null. + // (This might not be the right thing to do for other + // RootPaneContainers we might be invoked with) + Color newColor = null; + if (container != null && container.preserveBackgroundColor != null) { + newColor = container.preserveBackgroundColor; + } else { + newColor = SystemColor.window; + } + component.setBackground(newColor); + } + } else { + if (!hasTransparentBg && container != null) { + container.preserveBackgroundColor = bg; + } + component.setBackground(TRANSPARENT_BACKGROUND_COLOR); + } + } + + // ************************** MIXING CODE ******************************* // A window has a parent, but it does NOT have a container @@ -3341,6 +3583,42 @@ public class Window extends Container implements Accessible { // ****************** END OF MIXING CODE ******************************** + static { + AWTAccessor.setWindowAccessor(new AWTAccessor.WindowAccessor() { + public float getOpacity(Window window) { + return window.opacity; + } + public void setOpacity(Window window, float opacity) { + window.setOpacity(opacity); + } + public Shape getShape(Window window) { + return window.getShape(); + } + public void setShape(Window window, Shape shape) { + window.setShape(shape); + } + public boolean isOpaque(Window window) { + /* + return window.getBackground().getAlpha() < 255; + */ + synchronized (window.getTreeLock()) { + return window.opaque; + } + } + public void setOpaque(Window window, boolean opaque) { + /* + Color bg = window.getBackground(); + window.setBackground(new Color(bg.getRed(), bg.getGreen(), bg.getBlue(), + opaque ? 255 : 0)); + */ + window.setOpaque(opaque); + } + public void updateWindow(Window window, BufferedImage backBuffer) { + window.updateWindow(backBuffer); + } + }); // WindowAccessor + } // static + } // class Window diff --git a/jdk/src/share/classes/java/awt/peer/WindowPeer.java b/jdk/src/share/classes/java/awt/peer/WindowPeer.java index 7b5da857f40..8a2589b9c8e 100644 --- a/jdk/src/share/classes/java/awt/peer/WindowPeer.java +++ b/jdk/src/share/classes/java/awt/peer/WindowPeer.java @@ -1,5 +1,5 @@ /* - * Copyright 1995-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1995-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 @@ -27,6 +27,8 @@ package java.awt.peer; import java.awt.*; +import java.awt.image.BufferedImage; + /** * The peer interface for {@link Window}. * @@ -92,4 +94,26 @@ public interface WindowPeer extends ContainerPeer { * @see Window#setIconImages(java.util.List) */ void updateIconImages(); + + /** + * Sets the level of opacity for the window. + * + * @see Window#setOpacity(float) + */ + void setOpacity(float opacity); + + /** + * Enables the per-pixel alpha support for the window. + * + * @see Window#setBackground(Color) + */ + void setOpaque(boolean isOpaque); + + /** + * Updates the native part of non-opaque window using + * the given image with color+alpha values for each pixel. + * + * @see Window#setBackground(Color) + */ + void updateWindow(BufferedImage backBuffer); } diff --git a/jdk/src/share/classes/javax/swing/RepaintManager.java b/jdk/src/share/classes/javax/swing/RepaintManager.java index b0e6c048f62..5fc08a1ccdf 100644 --- a/jdk/src/share/classes/javax/swing/RepaintManager.java +++ b/jdk/src/share/classes/javax/swing/RepaintManager.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -34,6 +34,7 @@ import java.security.AccessController; import java.util.*; import java.applet.*; +import sun.awt.AWTAccessor; import sun.awt.AppContext; import sun.awt.DisplayChangedListener; import sun.awt.SunToolkit; @@ -716,6 +717,44 @@ public class RepaintManager } } + private Map + updateWindows(Map dirtyComponents) + { + Toolkit toolkit = Toolkit.getDefaultToolkit(); + if (!(toolkit instanceof SunToolkit && + ((SunToolkit)toolkit).needUpdateWindow())) + { + return dirtyComponents; + } + + Set windows = new HashSet(); + Set dirtyComps = dirtyComponents.keySet(); + for (Iterator it = dirtyComps.iterator(); it.hasNext();) { + Component dirty = it.next(); + Window window = dirty instanceof Window ? + (Window)dirty : + SwingUtilities.getWindowAncestor(dirty); + + if (window != null && + !AWTAccessor.getWindowAccessor().isOpaque(window)) + { + // if this component's toplevel is perpixel translucent, it will + // be repainted below + it.remove(); + // add to the set of windows to update (so that we don't update + // the window many times for each component to be repainted that + // belongs to this window) + windows.add(window); + } + } + + for (Window window : windows) { + AWTAccessor.getWindowAccessor().updateWindow(window, null); + } + + return dirtyComponents; + } + /** * Paint all of the components that have been marked dirty. * @@ -749,6 +788,10 @@ public class RepaintManager int localBoundsW; Enumeration keys; + // the components belonging to perpixel-translucent windows will be + // removed from the list + tmpDirtyComponents = updateWindows(tmpDirtyComponents); + roots = new ArrayList(count); for (Component dirty : tmpDirtyComponents.keySet()) { diff --git a/jdk/src/share/classes/sun/awt/AWTAccessor.java b/jdk/src/share/classes/sun/awt/AWTAccessor.java index 41b933c4a61..94d0bb25f0b 100644 --- a/jdk/src/share/classes/sun/awt/AWTAccessor.java +++ b/jdk/src/share/classes/sun/awt/AWTAccessor.java @@ -1,5 +1,5 @@ /* - * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2008-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 @@ -26,6 +26,9 @@ package sun.awt; import java.awt.*; +import java.awt.geom.Point2D; +import java.awt.image.BufferedImage; + import sun.misc.Unsafe; /** The AWTAccessor utility class. @@ -35,37 +38,124 @@ import sun.misc.Unsafe; * for another example. */ public final class AWTAccessor { + private static final Unsafe unsafe = Unsafe.getUnsafe(); - /** We don't need any objects of this class. + /* + * We don't need any objects of this class. * It's rather a collection of static methods * and interfaces. */ private AWTAccessor() { } - /** An accessor for the java.awt.Component class. + /* + * An interface of accessor for the java.awt.Component class. */ public interface ComponentAccessor { - // See 6797587 - // Also see: 6776743, 6768307, and 6768332. - /** + /* + * Sets whether the native background erase for a component + * has been disabled via SunToolkit.disableBackgroundErase(). + */ + void setBackgroundEraseDisabled(Component comp, boolean disabled); + /* + * Indicates whether the native background erase for a + * component has been disabled via + * SunToolkit.disableBackgroundErase(). + */ + boolean getBackgroundEraseDisabled(Component comp); + /* + * + * Gets the bounds of this component in the form of a + * Rectangle object. The bounds specify this + * component's width, height, and location relative to + * its parent. + */ + Rectangle getBounds(Component comp); + /* * Sets the shape of a lw component to cut out from hw components. + * + * See 6797587, 6776743, 6768307, and 6768332 for details */ void setMixingCutoutShape(Component comp, Shape shape); } - /* The java.awt.Component class accessor object. + /* + * An interface of accessor for java.awt.Window class. + */ + public interface WindowAccessor { + /* + * Get opacity level of the given window. + */ + float getOpacity(Window window); + /* + * Set opacity level to the given window. + */ + void setOpacity(Window window, float opacity); + /* + * Get a shape assigned to the given window. + */ + Shape getShape(Window window); + /* + * Set a shape to the given window. + */ + void setShape(Window window, Shape shape); + /* + * Identify whether the given window is opaque (true) + * or translucent (false). + */ + boolean isOpaque(Window window); + /* + * Set the opaque preoperty to the given window. + */ + void setOpaque(Window window, boolean isOpaque); + /* + * Update the image of a non-opaque (translucent) window. + */ + void updateWindow(Window window, BufferedImage backBuffer); + } + + /* + * An accessor for the AWTEvent class. + */ + public interface AWTEventAccessor { + /* + * + * Sets the flag on this AWTEvent indicating that it was + * generated by the system. + */ + void setSystemGenerated(AWTEvent ev); + /* + * + * Indicates whether this AWTEvent was generated by the system. + */ + boolean isSystemGenerated(AWTEvent ev); + } + + /* + * The java.awt.Component class accessor object. */ private static ComponentAccessor componentAccessor; - /** Set an accessor object for the java.awt.Component class. + /* + * The java.awt.Window class accessor object. + */ + private static WindowAccessor windowAccessor; + + /* + * The java.awt.AWTEvent class accessor object. + */ + private static AWTEventAccessor awtEventAccessor; + + /* + * Set an accessor object for the java.awt.Component class. */ public static void setComponentAccessor(ComponentAccessor ca) { componentAccessor = ca; } - /** Retrieve the accessor object for the java.awt.Window class. + /* + * Retrieve the accessor object for the java.awt.Window class. */ public static ComponentAccessor getComponentAccessor() { if (componentAccessor == null) { @@ -74,4 +164,35 @@ public final class AWTAccessor { return componentAccessor; } + + /* + * Set an accessor object for the java.awt.Window class. + */ + public static void setWindowAccessor(WindowAccessor wa) { + windowAccessor = wa; + } + + /* + * Retrieve the accessor object for the java.awt.Window class. + */ + public static WindowAccessor getWindowAccessor() { + if (windowAccessor == null) { + unsafe.ensureClassInitialized(Window.class); + } + return windowAccessor; + } + + /* + * Set an accessor object for the java.awt.AWTEvent class. + */ + public static void setAWTEventAccessor(AWTEventAccessor aea) { + awtEventAccessor = aea; + } + + /* + * Retrieve the accessor object for the java.awt.AWTEvent class. + */ + public static AWTEventAccessor getAWTEventAccessor() { + return awtEventAccessor; + } } diff --git a/jdk/src/share/classes/sun/awt/EmbeddedFrame.java b/jdk/src/share/classes/sun/awt/EmbeddedFrame.java index d7450bebe1d..f636da47191 100644 --- a/jdk/src/share/classes/sun/awt/EmbeddedFrame.java +++ b/jdk/src/share/classes/sun/awt/EmbeddedFrame.java @@ -1,5 +1,5 @@ /* - * Copyright 1996-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -585,5 +585,12 @@ public abstract class EmbeddedFrame extends Frame } public void updateMinimumSize() { } - } + + public void setOpacity(float opacity) { + } + public void setOpaque(boolean isOpaque) { + } + public void updateWindow(BufferedImage backBuffer) { + } + } } // class EmbeddedFrame diff --git a/jdk/src/share/classes/sun/awt/SunToolkit.java b/jdk/src/share/classes/sun/awt/SunToolkit.java index 7c6f74856a9..ac375d836fd 100644 --- a/jdk/src/share/classes/sun/awt/SunToolkit.java +++ b/jdk/src/share/classes/sun/awt/SunToolkit.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -32,14 +32,10 @@ import java.awt.dnd.peer.DragSourceContextPeer; import java.awt.peer.*; import java.awt.event.WindowEvent; import java.awt.event.KeyEvent; -import java.awt.im.spi.InputMethodDescriptor; import java.awt.image.*; -import java.awt.geom.AffineTransform; import java.awt.TrayIcon; import java.awt.SystemTray; -import java.io.*; import java.net.URL; -import java.net.JarURLConnection; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Condition; @@ -49,7 +45,6 @@ import java.util.logging.Logger; import sun.misc.SoftCache; import sun.font.FontDesignMetrics; import sun.awt.im.InputContext; -import sun.awt.im.SimpleInputMethodWindow; import sun.awt.image.*; import sun.security.action.GetPropertyAction; import sun.security.action.GetBooleanAction; @@ -824,16 +819,31 @@ public abstract class SunToolkit extends Toolkit } /** - * Disables erasing of background on the canvas before painting - * if this is supported by the current toolkit. - * - * @throws IllegalStateException if the canvas is not displayable - * @see java.awt.Component#isDisplayable + * Disables erasing of background on the canvas before painting if + * this is supported by the current toolkit. It is recommended to + * call this method early, before the Canvas becomes displayable, + * because some Toolkit implementations do not support changing + * this property once the Canvas becomes displayable. */ public void disableBackgroundErase(Canvas canvas) { - if (!canvas.isDisplayable()) { - throw new IllegalStateException("Canvas must have a valid peer"); - } + disableBackgroundEraseImpl(canvas); + } + + /** + * Disables the native erasing of the background on the given + * component before painting if this is supported by the current + * toolkit. This only has an effect for certain components such as + * Canvas, Panel and Window. It is recommended to call this method + * early, before the Component becomes displayable, because some + * Toolkit implementations do not support changing this property + * once the Component becomes displayable. + */ + public void disableBackgroundErase(Component component) { + disableBackgroundEraseImpl(component); + } + + private void disableBackgroundEraseImpl(Component component) { + AWTAccessor.getComponentAccessor().setBackgroundEraseDisabled(component, true); } /** @@ -1972,6 +1982,18 @@ public abstract class SunToolkit extends Toolkit AWTAutoShutdown.getInstance().dumpPeers(aLog); } + /** + * Returns the Window ancestor of the component comp. + * @return Window ancestor of the component or component by itself if it is Window; + * null, if component is not a part of window hierarchy + */ + public static Window getContainingWindow(Component comp) { + while (comp != null && !(comp instanceof Window)) { + comp = comp.getParent(); + } + return (Window)comp; + } + private static Boolean sunAwtDisableMixing = null; /** @@ -1995,6 +2017,73 @@ public abstract class SunToolkit extends Toolkit public boolean isNativeGTKAvailable() { return false; } + + // Cosntant alpha + public boolean isWindowOpacitySupported() { + return false; + } + + // Shaping + public boolean isWindowShapingSupported() { + return false; + } + + // Per-pixel alpha + public boolean isWindowTranslucencySupported() { + return false; + } + + public boolean isTranslucencyCapable(GraphicsConfiguration gc) { + return false; + } + + /** + * Returns whether or not a containing top level window for the passed + * component is + * {@link com.sun.awt.AWTUtilities.Translucency#PERPIXEL_TRANSLUCENT PERPIXEL_TRANSLUCENT}. + * + * @param c a Component which toplevel's to check + * @return {@code true} if the passed component is not null and has a + * containing toplevel window which is opaque (so per-pixel translucency + * is not enabled), {@code false} otherwise + * @see com.sun.awt.AWTUtilities.Translucency#PERPIXEL_TRANSLUCENT + * @see com.sun.awt.AWTUtilities#isWindowOpaque(Window) + */ + public static boolean isContainingTopLevelOpaque(Component c) { + Window w = getContainingWindow(c); + // return w != null && (w).isOpaque(); + return w != null && com.sun.awt.AWTUtilities.isWindowOpaque(w); + } + + /** + * Returns whether or not a containing top level window for the passed + * component is + * {@link com.sun.awt.AWTUtilities.Translucency#TRANSLUCENT TRANSLUCENT}. + * + * @param c a Component which toplevel's to check + * @return {@code true} if the passed component is not null and has a + * containing toplevel window which has opacity less than + * 1.0f (which means that it is translucent), {@code false} otherwise + * @see com.sun.awt.AWTUtilities.Translucency#TRANSLUCENT + * @see com.sun.awt.AWTUtilities#getWindowOpacity(Window) + */ + public static boolean isContainingTopLevelTranslucent(Component c) { + Window w = getContainingWindow(c); + // return w != null && (w).getOpacity() < 1.0f; + return w != null && com.sun.awt.AWTUtilities.getWindowOpacity((Window)w) < 1.0f; + } + + /** + * Returns whether the native system requires using the peer.updateWindow() + * method to update the contents of a non-opaque window, or if usual + * painting procedures are sufficient. The default return value covers + * the X11 systems. On MS Windows this method is overriden in WToolkit + * to return true. + */ + public boolean needUpdateWindow() { + return false; + } + } // class SunToolkit diff --git a/jdk/src/share/native/sun/awt/utility/rect.c b/jdk/src/share/native/sun/awt/utility/rect.c new file mode 100644 index 00000000000..00bbecb6e11 --- /dev/null +++ b/jdk/src/share/native/sun/awt/utility/rect.c @@ -0,0 +1,102 @@ +/* + * Copyright 2008-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. 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. + */ + +#include "utility/rect.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +/** + * bitsPerPixel must be 32 for now. + * outBuf must be large enough to conatin all the rectangles. + */ +int BitmapToYXBandedRectangles(int bitsPerPixel, int width, int height, unsigned char * buf, RECT_T * outBuf) +{ + //XXX: we might want to reuse the code in the splashscreen library, + // though we'd have to deal with the ALPHA_THRESHOLD and different + // image formats in this case. + int widthBytes = width * bitsPerPixel / 8; + int alignedWidth = (((widthBytes - 1) / 4) + 1) * 4; + + RECT_T * out = outBuf; + + RECT_T *pPrevLine = NULL, *pFirst = out, *pThis = pFirst; + int i, j, i0; + int length; + + for (j = 0; j < height; j++) { + /* generate data for a scanline */ + + unsigned char *pSrc = (unsigned char *) buf + j * alignedWidth; + RECT_T *pLine = pThis; + + i = 0; + + do { + // pSrc[0,1,2] == B,G,R; pSrc[3] == Alpha + while (i < width && !pSrc[3]) { + pSrc += 4; + ++i; + } + if (i >= width) + break; + i0 = i; + while (i < width && pSrc[3]) { + pSrc += 4; + ++i; + } + RECT_SET(*pThis, i0, j, i - i0, 1); + ++pThis; + } while (i < width); + + /* check if the previous scanline is exactly the same, merge if so + (this is the only optimization we can use for YXBanded rectangles, + and win32 supports YXBanded only */ + + length = pThis - pLine; + if (pPrevLine && pLine - pPrevLine == length) { + for (i = 0; i < length && RECT_EQ_X(pPrevLine[i], pLine[i]); ++i) { + } + if (i == pLine - pPrevLine) { + // do merge + for (i = 0; i < length; i++) { + RECT_INC_HEIGHT(pPrevLine[i]); + } + pThis = pLine; + continue; + } + } + /* or else use the generated scanline */ + + pPrevLine = pLine; + } + + return pThis - pFirst; +} + +#if defined(__cplusplus) +} +#endif diff --git a/jdk/src/solaris/classes/sun/awt/X11/XNETProtocol.java b/jdk/src/solaris/classes/sun/awt/X11/XNETProtocol.java index 68145a74f79..e145cd98206 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XNETProtocol.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XNETProtocol.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-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 @@ -252,6 +252,8 @@ final class XNETProtocol extends XProtocol implements XStateProtocol, XLayerProt XAtom XA_NET_WM_WINDOW_TYPE = XAtom.get("_NET_WM_WINDOW_TYPE"); XAtom XA_NET_WM_WINDOW_TYPE_DIALOG = XAtom.get("_NET_WM_WINDOW_TYPE_DIALOG"); + XAtom XA_NET_WM_WINDOW_OPACITY = XAtom.get("_NET_WM_WINDOW_OPACITY"); + /* For _NET_WM_STATE ClientMessage requests */ final static int _NET_WM_STATE_REMOVE =0; /* remove/unset property */ final static int _NET_WM_STATE_ADD =1; /* add/set property */ @@ -289,6 +291,12 @@ final class XNETProtocol extends XProtocol implements XStateProtocol, XLayerProt boolean res = active() && checkProtocol(XA_NET_SUPPORTED, XA_NET_WM_STATE_MODAL); return res; } + + boolean doOpacityProtocol() { + boolean res = active() && checkProtocol(XA_NET_SUPPORTED, XA_NET_WM_WINDOW_OPACITY); + return res; + } + boolean isWMName(String name) { if (!active()) { return false; diff --git a/jdk/src/solaris/classes/sun/awt/X11/XToolkit.java b/jdk/src/solaris/classes/sun/awt/X11/XToolkit.java index c3011dfa6a2..65324290213 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XToolkit.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XToolkit.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-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 @@ -2273,4 +2273,36 @@ public final class XToolkit extends UNIXToolkit implements Runnable { public boolean areExtraMouseButtonsEnabled() throws HeadlessException { return areExtraMouseButtonsEnabled; } + + @Override + public boolean isWindowOpacitySupported() { + XNETProtocol net_protocol = XWM.getWM().getNETProtocol(); + + if (net_protocol == null) { + return false; + } + + return net_protocol.doOpacityProtocol(); + } + + @Override + public boolean isWindowShapingSupported() { + return XlibUtil.isShapingSupported(); + } + + @Override + public boolean isWindowTranslucencySupported() { + //NOTE: it may not be supported. The actual check is being performed + // at com.sun.awt.AWTUtilities(). In X11 we need to check + // whether there's any translucency-capable GC available. + return true; + } + + @Override + public boolean isTranslucencyCapable(GraphicsConfiguration gc) { + if (!(gc instanceof X11GraphicsConfig)) { + return false; + } + return ((X11GraphicsConfig)gc).isTranslucencyCapable(); + } } diff --git a/jdk/src/solaris/classes/sun/awt/X11/XWindowPeer.java b/jdk/src/solaris/classes/sun/awt/X11/XWindowPeer.java index 5666cab8cda..619ff8a9c9b 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XWindowPeer.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XWindowPeer.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-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 @@ -30,6 +30,8 @@ import java.awt.event.ComponentEvent; import java.awt.event.FocusEvent; import java.awt.event.WindowEvent; +import java.awt.image.BufferedImage; + import java.awt.peer.ComponentPeer; import java.awt.peer.WindowPeer; @@ -42,6 +44,7 @@ import java.util.Vector; import java.util.logging.Level; import java.util.logging.Logger; +import sun.awt.AWTAccessor; import sun.awt.ComponentAccessor; import sun.awt.WindowAccessor; import sun.awt.DisplayChangedListener; @@ -49,6 +52,8 @@ import sun.awt.SunToolkit; import sun.awt.X11GraphicsDevice; import sun.awt.X11GraphicsEnvironment; +import sun.java2d.pipe.Region; + class XWindowPeer extends XPanelPeer implements WindowPeer, DisplayChangedListener { @@ -260,6 +265,10 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, setSaveUnder(true); updateIconImages(); + + updateShape(); + updateOpacity(); + // no need in updateOpaque() as it is no-op } public void updateIconImages() { @@ -417,6 +426,22 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, return defaultIconInfo; } + private void updateShape() { + // Shape shape = ((Window)target).getShape(); + Shape shape = AWTAccessor.getWindowAccessor().getShape((Window)target); + if (shape != null) { + applyShape(Region.getInstance(shape, null)); + } + } + + private void updateOpacity() { + // float opacity = ((Window)target).getOpacity(); + float opacity = AWTAccessor.getWindowAccessor().getOpacity((Window)target); + if (opacity < 1.0f) { + setOpacity(opacity); + } + } + public void updateMinimumSize() { //This function only saves minimumSize value in XWindowPeer //Setting WMSizeHints is implemented in XDecoratedPeer @@ -2064,4 +2089,44 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, } super.handleButtonPressRelease(xev); } + + public void print(Graphics g) { + // We assume we print the whole frame, + // so we expect no clip was set previously + Shape shape = AWTAccessor.getWindowAccessor().getShape((Window)target); + if (shape != null) { + g.setClip(shape); + } + super.print(g); + } + + @Override + public void setOpacity(float opacity) { + final long maxOpacity = 0xffffffffl; + long iOpacity = (long)(opacity * maxOpacity); + if (iOpacity < 0) { + iOpacity = 0; + } + if (iOpacity > maxOpacity) { + iOpacity = maxOpacity; + } + + XAtom netWmWindowOpacityAtom = XAtom.get("_NET_WM_WINDOW_OPACITY"); + + if (iOpacity == maxOpacity) { + netWmWindowOpacityAtom.DeleteProperty(getWindow()); + } else { + netWmWindowOpacityAtom.setCard32Property(getWindow(), iOpacity); + } + } + + @Override + public void setOpaque(boolean isOpaque) { + // no-op + } + + @Override + public void updateWindow(BufferedImage backBuffer) { + // no-op + } } diff --git a/jdk/src/solaris/classes/sun/awt/X11/generator/WrapperGenerator.java b/jdk/src/solaris/classes/sun/awt/X11/generator/WrapperGenerator.java index 84cfa254e4c..7aa039546fa 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/generator/WrapperGenerator.java +++ b/jdk/src/solaris/classes/sun/awt/X11/generator/WrapperGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-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 @@ -859,14 +859,14 @@ public class WrapperGenerator { pw.println("\n\tlong pData;"); pw.println("\n\tpublic long getPData() { return pData; }"); - pw.println("\n\n\t" + stp.getJavaClassName() + "(long addr) {"); + pw.println("\n\n\tpublic " + stp.getJavaClassName() + "(long addr) {"); if (generateLog) { pw.println("\t\tlog.finest(\"Creating\");"); } pw.println("\t\tpData=addr;"); pw.println("\t\tshould_free_memory = false;"); pw.println("\t}"); - pw.println("\n\n\t" + stp.getJavaClassName() + "() {"); + pw.println("\n\n\tpublic " + stp.getJavaClassName() + "() {"); if (generateLog) { pw.println("\t\tlog.finest(\"Creating\");"); } diff --git a/jdk/src/solaris/classes/sun/awt/X11/generator/xlibtypes.txt b/jdk/src/solaris/classes/sun/awt/X11/generator/xlibtypes.txt index 21bc3ce02a9..7ef8fd44790 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/generator/xlibtypes.txt +++ b/jdk/src/solaris/classes/sun/awt/X11/generator/xlibtypes.txt @@ -750,6 +750,7 @@ AwtGraphicsConfigData pixelStride int color_data pointer ColorData glxInfo pointer + isTranslucencySupported int AwtScreenData numConfigs int diff --git a/jdk/src/solaris/classes/sun/awt/X11GraphicsConfig.java b/jdk/src/solaris/classes/sun/awt/X11GraphicsConfig.java index 8ea5717ac2a..aa4b527208b 100644 --- a/jdk/src/solaris/classes/sun/awt/X11GraphicsConfig.java +++ b/jdk/src/solaris/classes/sun/awt/X11GraphicsConfig.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -450,4 +450,13 @@ public class X11GraphicsConfig extends GraphicsConfiguration return 0x00; // UNDEFINED } } + + /* + @Override + */ + public boolean isTranslucencyCapable() { + return isTranslucencyCapable(getAData()); + } + + private native boolean isTranslucencyCapable(long x11ConfigData); } diff --git a/jdk/src/solaris/native/sun/awt/awt_GraphicsEnv.c b/jdk/src/solaris/native/sun/awt/awt_GraphicsEnv.c index 03f5c23d144..2e80cf7206d 100644 --- a/jdk/src/solaris/native/sun/awt/awt_GraphicsEnv.c +++ b/jdk/src/solaris/native/sun/awt/awt_GraphicsEnv.c @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -354,6 +354,48 @@ makeDefaultConfig(JNIEnv *env, int screen) { return NULL; } +/* Note: until we include the explicitly + * we have to define a couple of things ourselves. + */ +typedef unsigned long PictFormat; +#define PictTypeIndexed 0 +#define PictTypeDirect 1 + +typedef struct { + short red; + short redMask; + short green; + short greenMask; + short blue; + short blueMask; + short alpha; + short alphaMask; +} XRenderDirectFormat; + +typedef struct { + PictFormat id; + int type; + int depth; + XRenderDirectFormat direct; + Colormap colormap; +} XRenderPictFormat; + +#define PictFormatID (1 << 0) +#define PictFormatType (1 << 1) +#define PictFormatDepth (1 << 2) +#define PictFormatRed (1 << 3) +#define PictFormatRedMask (1 << 4) +#define PictFormatGreen (1 << 5) +#define PictFormatGreenMask (1 << 6) +#define PictFormatBlue (1 << 7) +#define PictFormatBlueMask (1 << 8) +#define PictFormatAlpha (1 << 9) +#define PictFormatAlphaMask (1 << 10) +#define PictFormatColormap (1 << 11) + +typedef XRenderPictFormat * +XRenderFindVisualFormatFunc (Display *dpy, _Xconst Visual *visual); + static void getAllConfigs (JNIEnv *env, int screen, AwtScreenDataPtr screenDataPtr) { @@ -367,6 +409,9 @@ getAllConfigs (JNIEnv *env, int screen, AwtScreenDataPtr screenDataPtr) { int ind; char errmsg[128]; int xinawareScreen; + void* xrenderLibHandle = NULL; + XRenderFindVisualFormatFunc *XRenderFindVisualFormat = NULL; + int major_opcode, first_event, first_error; if (usingXinerama) { xinawareScreen = 0; @@ -449,6 +494,26 @@ getAllConfigs (JNIEnv *env, int screen, AwtScreenDataPtr screenDataPtr) { graphicsConfigs[0] = defaultConfig; nConfig = 1; /* reserve index 0 for default config */ + // Only use the RENDER extension if it is available on the X server + if (XQueryExtension(awt_display, "RENDER", + &major_opcode, &first_event, &first_error)) + { + xrenderLibHandle = dlopen("libXrender.so.1", RTLD_LAZY | RTLD_GLOBAL); + +#ifndef __linux__ /* SOLARIS */ + if (xrenderLibHandle == NULL) { + xrenderLibHandle = dlopen("/usr/sfw/lib/libXrender.so.1", + RTLD_LAZY | RTLD_GLOBAL); + } +#endif + + if (xrenderLibHandle != NULL) { + XRenderFindVisualFormat = + (XRenderFindVisualFormatFunc*)dlsym(xrenderLibHandle, + "XRenderFindVisualFormat"); + } + } + for (i = 0; i < nTrue; i++) { if (XVisualIDFromVisual(pVITrue[i].visual) == XVisualIDFromVisual(defaultConfig->awt_visInfo.visual) || @@ -462,6 +527,21 @@ getAllConfigs (JNIEnv *env, int screen, AwtScreenDataPtr screenDataPtr) { graphicsConfigs [ind]->awt_depth = pVITrue [i].depth; memcpy (&graphicsConfigs [ind]->awt_visInfo, &pVITrue [i], sizeof (XVisualInfo)); + if (XRenderFindVisualFormat != NULL) { + XRenderPictFormat *format = XRenderFindVisualFormat (awt_display, + pVITrue [i].visual); + if (format && + format->type == PictTypeDirect && + format->direct.alphaMask) + { + graphicsConfigs [ind]->isTranslucencySupported = 1; + } + } + } + + if (xrenderLibHandle != NULL) { + dlclose(xrenderLibHandle); + xrenderLibHandle = NULL; } for (i = 0; i < n8p; i++) { @@ -1505,6 +1585,26 @@ Java_sun_awt_X11GraphicsConfig_swapBuffers AWT_FLUSH_UNLOCK(); } +/* + * Class: sun_awt_X11GraphicsConfig + * Method: isTranslucencyCapable + * Signature: (J)V + */ +JNIEXPORT jboolean JNICALL +Java_sun_awt_X11GraphicsConfig_isTranslucencyCapable + (JNIEnv *env, jobject this, jlong configData) +{ +#ifdef HEADLESS + return JNI_FALSE; +#else + AwtGraphicsConfigDataPtr aData = (AwtGraphicsConfigDataPtr)jlong_to_ptr(configData); + if (aData == NULL) { + return JNI_FALSE; + } + return (jboolean)aData->isTranslucencySupported; +#endif +} + /* * Class: sun_awt_X11GraphicsDevice * Method: isDBESupported diff --git a/jdk/src/solaris/native/sun/awt/awt_p.h b/jdk/src/solaris/native/sun/awt/awt_p.h index fb4f513f79f..73e5dd0a88e 100644 --- a/jdk/src/solaris/native/sun/awt/awt_p.h +++ b/jdk/src/solaris/native/sun/awt/awt_p.h @@ -1,5 +1,5 @@ /* - * Copyright 1995-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1995-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 @@ -135,6 +135,7 @@ typedef struct _AwtGraphicsConfigData { int pixelStride; /* Used in X11SurfaceData.c */ ColorData *color_data; struct _GLXGraphicsConfigInfo *glxInfo; + int isTranslucencySupported; /* Uses Xrender to find this out. */ } AwtGraphicsConfigData; typedef AwtGraphicsConfigData* AwtGraphicsConfigDataPtr; diff --git a/jdk/src/windows/classes/sun/awt/Win32GraphicsConfig.java b/jdk/src/windows/classes/sun/awt/Win32GraphicsConfig.java index d24ce0eb1bb..2eefb33f1ce 100644 --- a/jdk/src/windows/classes/sun/awt/Win32GraphicsConfig.java +++ b/jdk/src/windows/classes/sun/awt/Win32GraphicsConfig.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -331,4 +331,12 @@ public class Win32GraphicsConfig extends GraphicsConfiguration } // the rest of the flip actions are not supported } + + /* + @Override + */ + public boolean isTranslucencyCapable() { + //XXX: worth checking if 8-bit? Anyway, it doesn't hurt. + return true; + } } diff --git a/jdk/src/windows/classes/sun/awt/Win32GraphicsEnvironment.java b/jdk/src/windows/classes/sun/awt/Win32GraphicsEnvironment.java index 80ee7747004..5c53d79d4d4 100644 --- a/jdk/src/windows/classes/sun/awt/Win32GraphicsEnvironment.java +++ b/jdk/src/windows/classes/sun/awt/Win32GraphicsEnvironment.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -393,4 +393,11 @@ public class Win32GraphicsEnvironment private static void dwmCompositionChanged(boolean enabled) { isDWMCompositionEnabled = enabled; } + + /** + * Used to find out if the OS is Windows Vista or later. + * + * @return {@code true} if the OS is Vista or later, {@code false} otherwise + */ + public static native boolean isVistaOS(); } diff --git a/jdk/src/windows/classes/sun/awt/windows/TranslucentWindowPainter.java b/jdk/src/windows/classes/sun/awt/windows/TranslucentWindowPainter.java new file mode 100644 index 00000000000..9f8193f9920 --- /dev/null +++ b/jdk/src/windows/classes/sun/awt/windows/TranslucentWindowPainter.java @@ -0,0 +1,398 @@ +/* + * Copyright 2008-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. 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. + */ +package sun.awt.windows; + +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.GraphicsConfiguration; +import java.awt.Image; +import java.awt.Window; +import java.awt.image.BufferedImage; +import java.awt.image.DataBufferInt; +import java.awt.image.VolatileImage; +import java.lang.ref.WeakReference; +import java.security.AccessController; +import sun.awt.image.BufImgSurfaceData; +import sun.java2d.DestSurfaceProvider; +import sun.java2d.InvalidPipeException; +import sun.java2d.Surface; +import sun.java2d.pipe.RenderQueue; +import sun.java2d.pipe.hw.AccelGraphicsConfig; +import sun.java2d.pipe.hw.AccelSurface; +import sun.security.action.GetPropertyAction; + +import static java.awt.image.VolatileImage.*; +import static java.awt.Transparency.*; +import static sun.java2d.pipe.hw.AccelSurface.*; +import static sun.java2d.pipe.hw.ContextCapabilities.*; + +/** + * This class handles the updates of the non-opaque windows. + * The window associated with the peer is updated either given an image or + * the window is repainted to an internal buffer which is then used to update + * the window. + * + * Note: this class does not attempt to be thread safe, it is expected to be + * called from a single thread (EDT). + */ +public abstract class TranslucentWindowPainter { + + protected Window window; + protected WWindowPeer peer; + + // REMIND: we probably would want to remove this later + private static final boolean forceOpt = + Boolean.valueOf(AccessController.doPrivileged( + new GetPropertyAction("sun.java2d.twp.forceopt", "false"))); + private static final boolean forceSW = + Boolean.valueOf(AccessController.doPrivileged( + new GetPropertyAction("sun.java2d.twp.forcesw", "false"))); + + /** + * Creates an instance of the painter for particular peer. + */ + public static TranslucentWindowPainter createInstance(WWindowPeer peer) { + GraphicsConfiguration gc = peer.getGraphicsConfiguration(); + if (!forceSW && gc instanceof AccelGraphicsConfig) { + String gcName = gc.getClass().getSimpleName(); + AccelGraphicsConfig agc = (AccelGraphicsConfig)gc; + // this is a heuristic to check that we have a pcix board + // (those have higher transfer rate from gpu to cpu) + if ((agc.getContextCapabilities().getCaps() & CAPS_PS30) != 0 || + forceOpt) + { + // we check for name to avoid loading classes unnecessarily if + // a pipeline isn't enabled + if (gcName.startsWith("D3D")) { + return new VIOptD3DWindowPainter(peer); + } else if (forceOpt && gcName.startsWith("WGL")) { + // on some boards (namely, ATI, even on pcix bus) ogl is + // very slow reading pixels back so for now it is disabled + // unless forced + return new VIOptWGLWindowPainter(peer); + } + } + } + return new BIWindowPainter(peer); + } + + protected TranslucentWindowPainter(WWindowPeer peer) { + this.peer = peer; + this.window = (Window)peer.getTarget(); + } + + /** + * Creates (if needed), clears and returns the buffer for this painter. + */ + protected abstract Image getBackBuffer(); + + /** + * Updates the the window associated with this painter with the contents + * of the passed image. + * The image can not be null, and NPE will be thrown if it is. + */ + protected abstract boolean update(Image bb); + + /** + * Flushes the resources associated with the painter. They will be + * recreated as needed. + */ + public abstract void flush(); + + /** + * Updates the window associated with the painter given the passed image. + * If the passed image is null the painter will use its own buffer for + * rendering the contents of the window into it and updating the window. + * + * If the passed buffer has dimensions different from the window, it is + * copied into the internal buffer first and the latter is used to update + * the window. + * + * @param bb the image to update the non opaque window with, or null. + * If not null, the image must be of ARGB_PRE type. + */ + public void updateWindow(Image bb) { + boolean done = false; + if (bb != null && (window.getWidth() != bb.getWidth(null) || + window.getHeight() != bb.getHeight(null))) + { + Image ourBB = getBackBuffer(); + Graphics2D g = (Graphics2D)ourBB.getGraphics(); + g.drawImage(bb, 0, 0, null); + g.dispose(); + bb = ourBB; + } + do { + if (bb == null) { + bb = getBackBuffer(); + Graphics2D g = (Graphics2D)bb.getGraphics(); + try { + window.paintAll(g); + } finally { + g.dispose(); + } + } + + peer.paintAppletWarning((Graphics2D)bb.getGraphics(), + bb.getWidth(null), bb.getHeight(null)); + + done = update(bb); + // in case they passed us a lost VI, next time around we'll use our + // own bb because we can not validate and restore the contents of + // their VI + if (!done) { + bb = null; + } + } while (!done); + } + + private static final Image clearImage(Image bb) { + Graphics2D g = (Graphics2D)bb.getGraphics(); + int w = bb.getWidth(null); + int h = bb.getHeight(null); + + g.setComposite(AlphaComposite.Src); + g.setColor(new Color(0, 0, 0, 0)); + g.fillRect(0, 0, w, h); + + return bb; + } + + /** + * A painter which uses BufferedImage as the internal buffer. The window + * is painted into this buffer, and the contents then are uploaded + * into the layered window. + * + * This painter handles all types of images passed to its paint(Image) + * method (VI, BI, regular Images). + */ + private static class BIWindowPainter extends TranslucentWindowPainter { + private WeakReference biRef; + + protected BIWindowPainter(WWindowPeer peer) { + super(peer); + } + + private BufferedImage getBIBackBuffer() { + int w = window.getWidth(); + int h = window.getHeight(); + BufferedImage bb = biRef == null ? null : biRef.get(); + if (bb == null || bb.getWidth() != w || bb.getHeight() != h) { + if (bb != null) { + bb.flush(); + bb = null; + } + bb = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB_PRE); + biRef = new WeakReference(bb); + } + return (BufferedImage)clearImage(bb); + } + + @Override + protected Image getBackBuffer() { + return getBIBackBuffer(); + } + + @Override + protected boolean update(Image bb) { + VolatileImage viBB = null; + + if (bb instanceof BufferedImage) { + BufferedImage bi = (BufferedImage)bb; + int data[] = + ((DataBufferInt)bi.getRaster().getDataBuffer()).getData(); + peer.updateWindowImpl(data, bi.getWidth(), bi.getHeight()); + return true; + } else if (bb instanceof VolatileImage) { + viBB = (VolatileImage)bb; + if (bb instanceof DestSurfaceProvider) { + Surface s = ((DestSurfaceProvider)bb).getDestSurface(); + if (s instanceof BufImgSurfaceData) { + // the image is probably lost, upload the data from the + // backup surface to avoid creating another heap-based + // image (the parent's buffer) + int w = viBB.getWidth(); + int h = viBB.getHeight(); + BufImgSurfaceData bisd = (BufImgSurfaceData)s; + int data[] = ((DataBufferInt)bisd.getRaster(0,0,w,h). + getDataBuffer()).getData(); + peer.updateWindowImpl(data, w, h); + return true; + } + } + } + + // copy the passed image into our own buffer, then upload + BufferedImage bi = getBIBackBuffer(); + Graphics2D g = (Graphics2D)bi.getGraphics(); + g.setComposite(AlphaComposite.Src); + g.drawImage(bb, 0, 0, null); + + int data[] = + ((DataBufferInt)bi.getRaster().getDataBuffer()).getData(); + peer.updateWindowImpl(data, bi.getWidth(), bi.getHeight()); + + return (viBB != null ? !viBB.contentsLost() : true); + } + + public void flush() { + if (biRef != null) { + biRef.clear(); + } + } + } + + /** + * A version of the painter which uses VolatileImage as the internal buffer. + * The window is painted into this VI and then copied into the parent's + * Java heap-based buffer (which is then uploaded to the layered window) + */ + private static class VIWindowPainter extends BIWindowPainter { + private WeakReference viRef; + + protected VIWindowPainter(WWindowPeer peer) { + super(peer); + } + + @Override + protected Image getBackBuffer() { + int w = window.getWidth(); + int h = window.getHeight(); + GraphicsConfiguration gc = peer.getGraphicsConfiguration(); + + VolatileImage viBB = viRef == null ? null : viRef.get(); + + if (viBB == null || viBB.getWidth() != w || viBB.getHeight() != h || + viBB.validate(gc) == IMAGE_INCOMPATIBLE) + { + if (viBB != null) { + viBB.flush(); + viBB = null; + } + + if (gc instanceof AccelGraphicsConfig) { + AccelGraphicsConfig agc = ((AccelGraphicsConfig)gc); + viBB = agc.createCompatibleVolatileImage(w, h, + TRANSLUCENT, + RT_PLAIN); + } + if (viBB == null) { + viBB = gc.createCompatibleVolatileImage(w, h, TRANSLUCENT); + } + viBB.validate(gc); + viRef = new WeakReference(viBB); + } + + return clearImage(viBB); + } + + @Override + public void flush() { + if (viRef != null) { + VolatileImage viBB = viRef.get(); + if (viBB != null) { + viBB.flush(); + viBB = null; + } + viRef.clear(); + } + } + } + + /** + * Optimized version of hw painter. Uses VolatileImages for the + * buffer, and uses an optimized path to pull the data from those into + * the layered window, bypassing Java heap-based image. + */ + private abstract static class VIOptWindowPainter extends VIWindowPainter { + + protected VIOptWindowPainter(WWindowPeer peer) { + super(peer); + } + + protected abstract boolean updateWindowAccel(long psdops, int w, int h); + + @Override + protected boolean update(Image bb) { + if (bb instanceof DestSurfaceProvider) { + Surface s = ((DestSurfaceProvider)bb).getDestSurface(); + if (s instanceof AccelSurface) { + final int w = bb.getWidth(null); + final int h = bb.getHeight(null); + final boolean arr[] = { false }; + final AccelSurface as = (AccelSurface)s; + RenderQueue rq = as.getContext().getRenderQueue(); + rq.lock(); + try { + as.getContext().validateContext(as); + rq.flushAndInvokeNow(new Runnable() { + public void run() { + long psdops = as.getNativeOps(); + arr[0] = updateWindowAccel(psdops, w, h); + } + }); + } catch (InvalidPipeException e) { + // ignore, false will be returned + } finally { + rq.unlock(); + } + return arr[0]; + } + } + return super.update(bb); + } + } + + private static class VIOptD3DWindowPainter extends VIOptWindowPainter { + + protected VIOptD3DWindowPainter(WWindowPeer peer) { + super(peer); + } + + @Override + protected boolean updateWindowAccel(long psdops, int w, int h) { + // note: this method is executed on the toolkit thread, no sync is + // necessary at the native level, and a pointer to peer can be used + return sun.java2d.d3d.D3DSurfaceData. + updateWindowAccelImpl(psdops, peer.getData(), w, h); + } + } + + private static class VIOptWGLWindowPainter extends VIOptWindowPainter { + + protected VIOptWGLWindowPainter(WWindowPeer peer) { + super(peer); + } + + @Override + protected boolean updateWindowAccel(long psdops, int w, int h) { + // note: part of this method which deals with GDI will be on the + // toolkit thread + return sun.java2d.opengl.WGLSurfaceData. + updateWindowAccelImpl(psdops, peer, w, h); + } + } +} diff --git a/jdk/src/windows/classes/sun/awt/windows/WCanvasPeer.java b/jdk/src/windows/classes/sun/awt/windows/WCanvasPeer.java index 5d88a0c3703..e1657102900 100644 --- a/jdk/src/windows/classes/sun/awt/windows/WCanvasPeer.java +++ b/jdk/src/windows/classes/sun/awt/windows/WCanvasPeer.java @@ -1,5 +1,5 @@ /* - * Copyright 1996-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -28,6 +28,7 @@ import java.awt.*; import java.awt.peer.*; import java.lang.ref.WeakReference; import java.lang.reflect.Method; +import sun.awt.AWTAccessor; import sun.awt.ComponentAccessor; import sun.awt.SunToolkit; import sun.awt.Win32GraphicsDevice; @@ -110,16 +111,20 @@ class WCanvasPeer extends WComponentPeer implements CanvasPeer { } public void print(Graphics g) { - Dimension d = ((Component)target).getSize(); - if (g instanceof Graphics2D || - g instanceof sun.awt.Graphics2Delegate) { - // background color is setup correctly, so just use clearRect - g.clearRect(0, 0, d.width, d.height); - } else { - // emulate clearRect - g.setColor(((Component)target).getBackground()); - g.fillRect(0, 0, d.width, d.height); - g.setColor(((Component)target).getForeground()); + if (!(target instanceof Window) || + AWTAccessor.getWindowAccessor().isOpaque((Window)target)) + { + Dimension d = ((Component)target).getSize(); + if (g instanceof Graphics2D || + g instanceof sun.awt.Graphics2Delegate) { + // background color is setup correctly, so just use clearRect + g.clearRect(0, 0, d.width, d.height); + } else { + // emulate clearRect + g.setColor(((Component)target).getBackground()); + g.fillRect(0, 0, d.width, d.height); + g.setColor(((Component)target).getForeground()); + } } super.print(g); } diff --git a/jdk/src/windows/classes/sun/awt/windows/WComponentPeer.java b/jdk/src/windows/classes/sun/awt/windows/WComponentPeer.java index afbd170cc7f..3a414d1c328 100644 --- a/jdk/src/windows/classes/sun/awt/windows/WComponentPeer.java +++ b/jdk/src/windows/classes/sun/awt/windows/WComponentPeer.java @@ -1,5 +1,5 @@ /* - * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -39,21 +39,22 @@ import java.awt.event.PaintEvent; import java.awt.event.InvocationEvent; import java.awt.event.KeyEvent; import sun.awt.Win32GraphicsConfig; +import sun.awt.Win32GraphicsEnvironment; import sun.java2d.InvalidPipeException; import sun.java2d.SurfaceData; -import sun.java2d.d3d.D3DScreenUpdateManager; -import static sun.java2d.d3d.D3DSurfaceData.*; import sun.java2d.ScreenUpdateManager; +import sun.java2d.d3d.D3DSurfaceData; import sun.java2d.opengl.OGLSurfaceData; +import sun.java2d.pipe.Region; import sun.awt.DisplayChangedListener; import sun.awt.PaintEventDispatcher; +import sun.awt.SunToolkit; import sun.awt.event.IgnorePaintEvent; import java.awt.dnd.DropTarget; import java.awt.dnd.peer.DropTargetPeer; import sun.awt.ComponentAccessor; - import java.util.logging.*; @@ -186,7 +187,7 @@ public abstract class WComponentPeer extends WObjectPeer cont.invalidate(); cont.validate(); - if (surfaceData instanceof D3DWindowSurfaceData || + if (surfaceData instanceof D3DSurfaceData.D3DWindowSurfaceData || surfaceData instanceof OGLSurfaceData) { // When OGL or D3D is enabled, it is necessary to @@ -258,7 +259,7 @@ public abstract class WComponentPeer extends WObjectPeer int[] pix = createPrintedPixels(0, startY, totalW, h); if (pix != null) { BufferedImage bim = new BufferedImage(totalW, h, - BufferedImage.TYPE_INT_RGB); + BufferedImage.TYPE_INT_ARGB); bim.setRGB(0, 0, totalW, h, pix, 0, totalW); g.drawImage(bim, 0, startY, null); bim.flush(); @@ -895,9 +896,29 @@ public abstract class WComponentPeer extends WObjectPeer public void setBoundsOperation(int operation) { } + /** + * Returns whether this component is capable of being hw accelerated. + * More specifically, whether rendering to this component or a + * BufferStrategy's back-buffer for this component can be hw accelerated. + * + * Conditions which could prevent hw acceleration include the toplevel + * window containing this component being + * {@link com.sun.awt.AWTUtilities.Translucency#TRANSLUCENT TRANSLUCENT}. + * + * @return {@code true} if this component is capable of being hw + * accelerated, {@code false} otherwise + * @see com.sun.awt.AWTUtilities.Translucency#TRANSLUCENT + */ + public boolean isAccelCapable() { + boolean isTranslucent = + SunToolkit.isContainingTopLevelTranslucent((Component)target); + // D3D/OGL and translucent windows interacted poorly in Windows XP; + // these problems are no longer present in Vista + return !isTranslucent || Win32GraphicsEnvironment.isVistaOS(); + } native void setRectangularShape(int lox, int loy, int hix, int hiy, - sun.java2d.pipe.Region region); + Region region); // REMIND: Temp workaround for issues with using HW acceleration @@ -914,42 +935,11 @@ public abstract class WComponentPeer extends WObjectPeer return ((WEmbeddedFramePeer)c.getPeer()).isAccelCapable(); } - /** - * Returns whether this component is capable of being hw accelerated. - * More specifically, whether rendering to this component or a - * BufferStrategy's back-buffer for this component can be hw accelerated. - * - * Conditions which could prevent hw acceleration include the toplevel - * window containing this component being - * {@link com.sun.awt.AWTUtilities.Translucency#TRANSLUCENT TRANSLUCENT}. - * - * @return {@code true} if this component is capable of being hw - * accelerated, {@code false} otherwise - * @see com.sun.awt.AWTUtilities.Translucency#TRANSLUCENT - */ - public boolean isAccelCapable() { - // REMIND: Temp workaround for issues with using HW acceleration - // in the browser on Vista when DWM is enabled - if (!isContainingTopLevelAccelCapable((Component)target)) { - return false; - } - - // REMIND: translucent windows support-related -/* - boolean isTranslucent = - SunToolkit.isContainingTopLevelTranslucent((Component)target); - // D3D/OGL and translucent windows interacted poorly in Windows XP; - // these problems are no longer present in Vista - return !isTranslucent || Win32GraphicsEnvironment.isVistaOS(); -*/ - return true; - } - /** * Applies the shape to the native component window. * @since 1.7 */ - public void applyShape(sun.java2d.pipe.Region shape) { + public void applyShape(Region shape) { if (shapeLog.isLoggable(Level.FINER)) { shapeLog.finer( "*** INFO: Setting shape: PEER: " + this diff --git a/jdk/src/windows/classes/sun/awt/windows/WFileDialogPeer.java b/jdk/src/windows/classes/sun/awt/windows/WFileDialogPeer.java index 548dc3d41ee..2d4dfccf7a1 100644 --- a/jdk/src/windows/classes/sun/awt/windows/WFileDialogPeer.java +++ b/jdk/src/windows/classes/sun/awt/windows/WFileDialogPeer.java @@ -1,5 +1,5 @@ /* - * Copyright 1996-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -244,4 +244,10 @@ public class WFileDialogPeer extends WWindowPeer implements FileDialogPeer { public boolean isRestackSupported() { return false; } + + // The effects are not supported for system dialogs. + public void applyShape(sun.java2d.pipe.Region shape) {} + public void setOpacity(float opacity) {} + public void setOpaque(boolean isOpaque) {} + public void updateWindow(java.awt.image.BufferedImage backBuffer) {} } diff --git a/jdk/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java b/jdk/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java index c1e06f53cb5..939d54520b6 100644 --- a/jdk/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java +++ b/jdk/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-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 @@ -156,4 +156,10 @@ public class WPrintDialogPeer extends WWindowPeer implements DialogPeer { public boolean isRestackSupported() { return false; } + + // The effects are not supported for system dialogs. + public void applyShape(sun.java2d.pipe.Region shape) {} + public void setOpacity(float opacity) {} + public void setOpaque(boolean isOpaque) {} + public void updateWindow(java.awt.image.BufferedImage backBuffer) {} } diff --git a/jdk/src/windows/classes/sun/awt/windows/WToolkit.java b/jdk/src/windows/classes/sun/awt/windows/WToolkit.java index 55c1dde092d..5376e8ff720 100644 --- a/jdk/src/windows/classes/sun/awt/windows/WToolkit.java +++ b/jdk/src/windows/classes/sun/awt/windows/WToolkit.java @@ -1,5 +1,5 @@ /* - * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -975,4 +975,34 @@ public class WToolkit extends SunToolkit implements Runnable { public boolean areExtraMouseButtonsEnabled() throws HeadlessException { return areExtraMouseButtonsEnabled; } + + @Override + public boolean isWindowOpacitySupported() { + // supported in Win2K and later + return true; + } + + @Override + public boolean isWindowShapingSupported() { + return true; + } + + @Override + public boolean isWindowTranslucencySupported() { + // supported in Win2K and later + return true; + } + + @Override + public boolean isTranslucencyCapable(GraphicsConfiguration gc) { + //XXX: worth checking if 8-bit? Anyway, it doesn't hurt. + return true; + } + + // On MS Windows one must use the peer.updateWindow() to implement + // non-opaque windows. + @Override + public boolean needUpdateWindow() { + return true; + } } diff --git a/jdk/src/windows/classes/sun/awt/windows/WWindowPeer.java b/jdk/src/windows/classes/sun/awt/windows/WWindowPeer.java index 6afdb2be6b9..79818431063 100644 --- a/jdk/src/windows/classes/sun/awt/windows/WWindowPeer.java +++ b/jdk/src/windows/classes/sun/awt/windows/WWindowPeer.java @@ -1,5 +1,5 @@ /* - * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -31,17 +31,15 @@ import java.awt.peer.*; import java.beans.*; -import java.lang.ref.*; import java.lang.reflect.*; -import java.security.*; - import java.util.*; import java.util.List; import java.util.logging.*; import sun.awt.*; -import sun.awt.image.*; + +import sun.java2d.pipe.Region; public class WWindowPeer extends WPanelPeer implements WindowPeer { @@ -52,6 +50,10 @@ public class WWindowPeer extends WPanelPeer implements WindowPeer { // extends WWindowPeer, not WDialogPeer private WWindowPeer modalBlocker = null; + private boolean isOpaque; + + private volatile TranslucentWindowPainter painter; + /* * A key used for storing a list of active windows in AppContext. The value * is a list of windows, sorted by the time of activation: later a window is @@ -91,9 +93,18 @@ public class WWindowPeer extends WPanelPeer implements WindowPeer { l.remove(this); } } + // Remove ourself from the Map of DisplayChangeListeners GraphicsConfiguration gc = getGraphicsConfiguration(); ((Win32GraphicsDevice)gc.getDevice()).removeDisplayChangedListener(this); + + TranslucentWindowPainter currentPainter = painter; + if (currentPainter != null) { + currentPainter.flush(); + // don't set the current one to null here; reduces the chances of + // MT issues (like NPEs) + } + super.disposeImpl(); } @@ -158,6 +169,10 @@ public class WWindowPeer extends WPanelPeer implements WindowPeer { initActiveWindowsTracking((Window)target); updateIconImages(); + + updateShape(); + updateOpacity(); + updateOpaque(); } native void createAwtWindow(WComponentPeer parent); @@ -191,6 +206,8 @@ public class WWindowPeer extends WPanelPeer implements WindowPeer { if (((Window)target).isAlwaysOnTopSupported() && alwaysOnTop) { setAlwaysOnTop(alwaysOnTop); } + + updateWindow(null); } // Synchronize the insets members (here & in helper) with actual window @@ -273,6 +290,31 @@ public class WWindowPeer extends WPanelPeer implements WindowPeer { } } + private void updateShape() { + // Shape shape = ((Window)target).getShape(); + Shape shape = AWTAccessor.getWindowAccessor().getShape((Window)target); + if (shape != null) { + applyShape(Region.getInstance(shape, null)); + } + } + + private void updateOpacity() { + // float opacity = ((Window)target).getOpacity(); + float opacity = AWTAccessor.getWindowAccessor().getOpacity((Window)target); + if (opacity < 1.0f) { + setOpacity(opacity); + } + } + + private void updateOpaque() { + this.isOpaque = true; + // boolean opaque = ((Window)target).isOpaque(); + boolean opaque = AWTAccessor.getWindowAccessor().isOpaque((Window)target); + if (!opaque) { + setOpaque(opaque); + } + } + native void setMinSize(int width, int height); /* @@ -525,6 +567,135 @@ public class WWindowPeer extends WPanelPeer implements WindowPeer { super.setBounds(newBounds.x, newBounds.y, newBounds.width, newBounds.height, op); } + @Override + public void print(Graphics g) { + // We assume we print the whole frame, + // so we expect no clip was set previously + Shape shape = AWTAccessor.getWindowAccessor().getShape((Window)target); + if (shape != null) { + g.setClip(shape); + } + super.print(g); + } + + private void replaceSurfaceDataRecursively(Component c) { + if (c instanceof Container) { + for (Component child : ((Container)c).getComponents()) { + replaceSurfaceDataRecursively(child); + } + } + ComponentPeer cp = c.getPeer(); + if (cp instanceof WComponentPeer) { + ((WComponentPeer)cp).replaceSurfaceDataLater(); + } + } + + private native void setOpacity(int iOpacity); + + public void setOpacity(float opacity) { + if (!((SunToolkit)((Window)target).getToolkit()). + isWindowOpacitySupported()) + { + return; + } + + replaceSurfaceDataRecursively((Component)getTarget()); + + final int maxOpacity = 0xff; + int iOpacity = (int)(opacity * maxOpacity); + if (iOpacity < 0) { + iOpacity = 0; + } + if (iOpacity > maxOpacity) { + iOpacity = maxOpacity; + } + + setOpacity(iOpacity); + updateWindow(null); + } + + private native void setOpaqueImpl(boolean isOpaque); + + public void setOpaque(boolean isOpaque) { + Window target = (Window)getTarget(); + + SunToolkit sunToolkit = (SunToolkit)target.getToolkit(); + if (!sunToolkit.isWindowTranslucencySupported() || + !sunToolkit.isTranslucencyCapable(target.getGraphicsConfiguration())) + { + return; + } + + boolean opaqueChanged = this.isOpaque != isOpaque; + boolean isVistaOS = Win32GraphicsEnvironment.isVistaOS(); + + if (opaqueChanged && !isVistaOS){ + // non-Vista OS: only replace the surface data if the opacity + // status changed (see WComponentPeer.isAccelCapable() for more) + replaceSurfaceDataRecursively(target); + } + + this.isOpaque = isOpaque; + + setOpaqueImpl(isOpaque); + + if (opaqueChanged) { + if (isOpaque) { + TranslucentWindowPainter currentPainter = painter; + if (currentPainter != null) { + currentPainter.flush(); + painter = null; + } + } else { + painter = TranslucentWindowPainter.createInstance(this); + } + } + + if (opaqueChanged && isVistaOS) { + // On Vista: setting the window non-opaque makes the window look + // rectangular, though still catching the mouse clicks within + // its shape only. To restore the correct visual appearance + // of the window (i.e. w/ the correct shape) we have to reset + // the shape. + Shape shape = AWTAccessor.getWindowAccessor().getShape(target); + if (shape != null) { + AWTAccessor.getWindowAccessor().setShape(target, shape); + } + } + + updateWindow(null); + } + + public native void updateWindowImpl(int[] data, int width, int height); + + public void updateWindow(BufferedImage backBuffer) { + if (isOpaque) { + return; + } + + TranslucentWindowPainter currentPainter = painter; + if (currentPainter != null) { + currentPainter.updateWindow(backBuffer); + } else if (log.isLoggable(Level.FINER)) { + log.log(Level.FINER, + "Translucent window painter is null in updateWindow"); + } + } + + /** + * Paints the Applet Warning into the passed Graphics2D. This method is + * called by the TranslucentWindowPainter before updating the layered + * window. + * + * @param g Graphics context to paint the warning to + * @param w the width of the area + * @param h the height of the area + * @see TranslucentWindowPainter + */ + public void paintAppletWarning(Graphics2D g, int w, int h) { + // REMIND: the applet warning needs to be painted here + } + /* * The method maps the list of the active windows to the window's AppContext, * then the method registers ActiveWindowListener, GuiDisposedListener listeners; diff --git a/jdk/src/windows/classes/sun/java2d/opengl/WGLSurfaceData.java b/jdk/src/windows/classes/sun/java2d/opengl/WGLSurfaceData.java index 27997aa8c59..4164264a164 100644 --- a/jdk/src/windows/classes/sun/java2d/opengl/WGLSurfaceData.java +++ b/jdk/src/windows/classes/sun/java2d/opengl/WGLSurfaceData.java @@ -1,5 +1,5 @@ /* - * Copyright 2004-2008 Sun Microsystems, Inc. All Rights Reserved. + * 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 @@ -72,9 +72,8 @@ public abstract class WGLSurfaceData extends OGLSurfaceData { // the OGL pipeline can render directly to the screen and interfere // with layered windows, which is why we don't allow accelerated // surfaces in this case - if (!peer.isAccelCapable()) - // REMIND: commented until toplevel translucency is implemented -// || !SunToolkit.isContainingTopLevelOpaque((Component)peer.getTarget())) + if (!peer.isAccelCapable() || + !SunToolkit.isContainingTopLevelOpaque((Component)peer.getTarget())) { return null; } @@ -93,9 +92,8 @@ public abstract class WGLSurfaceData extends OGLSurfaceData { // the OGL pipeline can render directly to the screen and interfere // with layered windows, which is why we don't allow accelerated // surfaces in this case - if (!peer.isAccelCapable()) - // REMIND: commented until toplevel translucency is implemented -// || !SunToolkit.isContainingTopLevelOpaque((Component)peer.getTarget())) + if (!peer.isAccelCapable() || + !SunToolkit.isContainingTopLevelOpaque((Component)peer.getTarget())) { return null; } diff --git a/jdk/src/windows/native/sun/awt/utility/rect.h b/jdk/src/windows/native/sun/awt/utility/rect.h index bc250e2ac1b..a8e9fc28bea 100644 --- a/jdk/src/windows/native/sun/awt/utility/rect.h +++ b/jdk/src/windows/native/sun/awt/utility/rect.h @@ -1,5 +1,5 @@ /* - * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2007-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 @@ -43,5 +43,15 @@ typedef RECT RECT_T; #define RECT_INC_HEIGHT(r) (r).bottom++ +#if defined(__cplusplus) +extern "C" { +#endif + +int BitmapToYXBandedRectangles(int bitsPerPixel, int width, int height, + unsigned char * buf, RECT_T * outBuf); + +#if defined(__cplusplus) +} +#endif #endif // _AWT_RECT_H diff --git a/jdk/src/windows/native/sun/java2d/d3d/D3DSurfaceData.cpp b/jdk/src/windows/native/sun/java2d/d3d/D3DSurfaceData.cpp index 9c865dc971b..c6d4bb1b3eb 100644 --- a/jdk/src/windows/native/sun/java2d/d3d/D3DSurfaceData.cpp +++ b/jdk/src/windows/native/sun/java2d/d3d/D3DSurfaceData.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2007-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 @@ -613,17 +613,15 @@ JNICALL Java_sun_java2d_d3d_D3DSurfaceData_updateWindowAccelImpl res = pTmpSurface->LockRect(&lockedRect, NULL, D3DLOCK_NOSYSLOCK); if (SUCCEEDED(res)) { - // REMIND: commented until translucent window support is integrated -// hBitmap = -// BitmapUtil::CreateBitmapFromARGBPre(w, h, -// lockedRect.Pitch, -// (int*)lockedRect.pBits); + hBitmap = + BitmapUtil::CreateBitmapFromARGBPre(w, h, + lockedRect.Pitch, + (int*)lockedRect.pBits); pTmpSurface->UnlockRect(); } RETURN_STATUS_IF_NULL(hBitmap, JNI_FALSE); - // REMIND: commented until translucent window support is integrated -// window->UpdateWindow(env, NULL, w, h, hBitmap); + window->UpdateWindow(env, NULL, w, h, hBitmap); // hBitmap is released in UpdateWindow diff --git a/jdk/src/windows/native/sun/java2d/opengl/WGLSurfaceData.c b/jdk/src/windows/native/sun/java2d/opengl/WGLSurfaceData.c index 71d5e876406..3c3e09cecea 100644 --- a/jdk/src/windows/native/sun/java2d/opengl/WGLSurfaceData.c +++ b/jdk/src/windows/native/sun/java2d/opengl/WGLSurfaceData.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2008 Sun Microsystems, Inc. All Rights Reserved. + * 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 @@ -625,17 +625,15 @@ JNIEXPORT jboolean JNICALL j2d_glPixelStorei(GL_PACK_ALIGNMENT, 4); // the pixels read from the surface are already premultiplied - // REMIND: commented until translucent window support is integrated -// hBitmap = BitmapUtil_CreateBitmapFromARGBPre(w, h, scanStride, -// (int*)pDst); + hBitmap = BitmapUtil_CreateBitmapFromARGBPre(w, h, scanStride, + (int*)pDst); free(pDst); if (hBitmap == NULL) { return JNI_FALSE; } - // REMIND: commented until translucent window support is integrated - // AwtWindow_UpdateWindow(env, peer, w, h, hBitmap); + AwtWindow_UpdateWindow(env, peer, w, h, hBitmap); // hBitmap is released in UpdateWindow diff --git a/jdk/src/windows/native/sun/windows/awt_BitmapUtil.cpp b/jdk/src/windows/native/sun/windows/awt_BitmapUtil.cpp index 64c52e2f8f8..10e71b3e61e 100644 --- a/jdk/src/windows/native/sun/windows/awt_BitmapUtil.cpp +++ b/jdk/src/windows/native/sun/windows/awt_BitmapUtil.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2006-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 @@ -28,9 +28,14 @@ #include #include +#include "GraphicsPrimitiveMgr.h" + #include "awt.h" #include "awt_BitmapUtil.h" +// Platform-dependent RECT_[EQ | SET | INC_HEIGHT] macros +#include "utility/rect.h" + HBITMAP BitmapUtil::CreateTransparencyMaskFromARGB(int width, int height, int* imageData) { //Scan lines should be aligned to word boundary @@ -148,3 +153,222 @@ HBITMAP BitmapUtil::CreateV4BitmapFromARGB(int width, int height, int* imageData ::GdiFlush(); return hBitmap; } + +/* + * Creates 32-bit premultiplied ARGB bitmap from specified ARGBPre data. + * This function may not work on OS prior to Win95. + * See MSDN articles for CreateDIBitmap, BITMAPINFOHEADER, + * BITMAPV4HEADER, BITMAPV5HEADER for additional info. + */ +HBITMAP BitmapUtil::CreateBitmapFromARGBPre(int width, int height, + int srcStride, + int* imageData) +{ + BITMAPINFOHEADER bmi; + void *bitmapBits = NULL; + + ZeroMemory(&bmi, sizeof(bmi)); + bmi.biSize = sizeof(bmi); + bmi.biWidth = width; + bmi.biHeight = -height; + bmi.biPlanes = 1; + bmi.biBitCount = 32; + bmi.biCompression = BI_RGB; + + HBITMAP hBitmap = + ::CreateDIBSection(NULL, (BITMAPINFO *) & bmi, DIB_RGB_COLORS, + &bitmapBits, NULL, 0); + + if (!bitmapBits) { + return NULL; + } + + int dstStride = width * 4; + + if (srcStride == dstStride) { + memcpy(bitmapBits, (void*)imageData, srcStride * height); + } else if (height > 0) { + void *pSrcPixels = (void*)imageData; + void *pDstPixels = bitmapBits; + do { + memcpy(pDstPixels, pSrcPixels, dstStride); + pSrcPixels = PtrAddBytes(pSrcPixels, srcStride); + pDstPixels = PtrAddBytes(pDstPixels, dstStride); + } while (--height > 0); + } + + return hBitmap; +} + +extern "C" { + +/** + * This method is called from the WGL pipeline when it needs to create a bitmap + * needed to update the layered window. + */ +HBITMAP BitmapUtil_CreateBitmapFromARGBPre(int width, int height, + int srcStride, + int* imageData) +{ + return BitmapUtil::CreateBitmapFromARGBPre(width, height, + srcStride, imageData); + +} + +} /* extern "C" */ + + +/** + * Transforms the given bitmap into an HRGN representing the transparency + * of the bitmap. The bitmap MUST BE 32bpp. Alpha value == 0 is considered + * transparent, alpha > 0 - opaque. + */ +HRGN BitmapUtil::BitmapToRgn(HBITMAP hBitmap) +{ + HDC hdc = ::CreateCompatibleDC(NULL); + ::SelectObject(hdc, hBitmap); + + BITMAPINFOEX bi; + ::ZeroMemory(&bi, sizeof(bi)); + + bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + + BOOL r = ::GetDIBits(hdc, hBitmap, 0, 0, NULL, + reinterpret_cast(&bi), DIB_RGB_COLORS); + + if (!r || bi.bmiHeader.biBitCount != 32) + { + ::DeleteDC(hdc); + return NULL; + } + + UINT width = bi.bmiHeader.biWidth; + UINT height = abs(bi.bmiHeader.biHeight); + + BYTE * buf = (BYTE*)safe_Malloc(bi.bmiHeader.biSizeImage); + bi.bmiHeader.biHeight = -height; + ::GetDIBits(hdc, hBitmap, 0, height, buf, + reinterpret_cast(&bi), DIB_RGB_COLORS); + + /* reserving memory for the worst case */ + RGNDATA * pRgnData = (RGNDATA *) safe_Malloc(sizeof(RGNDATAHEADER) + + sizeof(RECT) * (width / 2 + 1) * height); + RGNDATAHEADER * pRgnHdr = (RGNDATAHEADER *) pRgnData; + pRgnHdr->dwSize = sizeof(RGNDATAHEADER); + pRgnHdr->iType = RDH_RECTANGLES; + pRgnHdr->nRgnSize = 0; + pRgnHdr->rcBound.top = 0; + pRgnHdr->rcBound.left = 0; + pRgnHdr->rcBound.bottom = height; + pRgnHdr->rcBound.right = width; + + pRgnHdr->nCount = BitmapToYXBandedRectangles(32, width, height, buf, + (RECT_T *) (((BYTE *) pRgnData) + sizeof(RGNDATAHEADER))); + + HRGN rgn = ::ExtCreateRegion(NULL, + sizeof(RGNDATAHEADER) + sizeof(RECT_T) * pRgnHdr->nCount, + pRgnData); + + free(pRgnData); + ::DeleteDC(hdc); + free(buf); + + return rgn; +} + +/** + * Makes a copy of the given bitmap. Blends every pixel of the source + * with the given blendColor and alpha. If alpha == 0, the function + * simply makes a plain copy of the source without any blending. + */ +HBITMAP BitmapUtil::BlendCopy(HBITMAP hSrcBitmap, COLORREF blendColor, + BYTE alpha) +{ + HDC hdc = ::CreateCompatibleDC(NULL); + HBITMAP oldBitmap = (HBITMAP)::SelectObject(hdc, hSrcBitmap); + + BITMAPINFOEX bi; + ::ZeroMemory(&bi, sizeof(bi)); + + bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + + BOOL r = ::GetDIBits(hdc, hSrcBitmap, 0, 0, NULL, + reinterpret_cast(&bi), DIB_RGB_COLORS); + + if (!r || bi.bmiHeader.biBitCount != 32) + { + ::DeleteDC(hdc); + return NULL; + } + + UINT width = bi.bmiHeader.biWidth; + UINT height = abs(bi.bmiHeader.biHeight); + + BYTE * buf = (BYTE*)safe_Malloc(bi.bmiHeader.biSizeImage); + bi.bmiHeader.biHeight = -height; + ::GetDIBits(hdc, hSrcBitmap, 0, height, buf, + reinterpret_cast(&bi), DIB_RGB_COLORS); + + UINT widthBytes = width * bi.bmiHeader.biBitCount / 8; + UINT alignedWidth = (((widthBytes - 1) / 4) + 1) * 4; + UINT i, j; + + for (j = 0; j < height; j++) { + BYTE *pSrc = (BYTE *) buf + j * alignedWidth; + for (i = 0; i < width; i++, pSrc += 4) { + // Note: if the current alpha is zero, the other three color + // components may (theoretically) contain some uninitialized + // data. The developer does not expect to display them, + // hence we handle this situation differently. + if (pSrc[3] == 0) { + pSrc[0] = GetBValue(blendColor) * alpha / 255; + pSrc[1] = GetGValue(blendColor) * alpha / 255; + pSrc[2] = GetRValue(blendColor) * alpha / 255; + pSrc[3] = alpha; + } else { + pSrc[0] = (GetBValue(blendColor) * alpha / 255) + + (pSrc[0] * (255 - alpha) / 255); + pSrc[1] = (GetGValue(blendColor) * alpha / 255) + + (pSrc[1] * (255 - alpha) / 255); + pSrc[2] = (GetRValue(blendColor) * alpha / 255) + + (pSrc[2] * (255 - alpha) / 255); + pSrc[3] = (alpha * alpha / 255) + + (pSrc[3] * (255 - alpha) / 255); + } + } + } + + HBITMAP hDstBitmap = ::CreateDIBitmap(hdc, + reinterpret_cast(&bi), + CBM_INIT, + buf, + reinterpret_cast(&bi), + DIB_RGB_COLORS + ); + + ::SelectObject(hdc, oldBitmap); + ::DeleteDC(hdc); + free(buf); + + return hDstBitmap; +} + +/** + * Creates a 32 bit ARGB bitmap. Returns the bitmap handle. The *bitmapBits + * contains the pointer to the bitmap data or NULL if an error occured. + */ +HBITMAP BitmapUtil::CreateARGBBitmap(int width, int height, void ** bitmapBitsPtr) +{ + BITMAPINFOHEADER bmi; + + ::ZeroMemory(&bmi, sizeof(bmi)); + bmi.biSize = sizeof(BITMAPINFOHEADER); + bmi.biWidth = width; + bmi.biHeight = -height; + bmi.biPlanes = 1; + bmi.biBitCount = 32; + bmi.biCompression = BI_RGB; + + return ::CreateDIBSection(NULL, (BITMAPINFO *) & bmi, DIB_RGB_COLORS, + bitmapBitsPtr, NULL, 0); +} diff --git a/jdk/src/windows/native/sun/windows/awt_BitmapUtil.h b/jdk/src/windows/native/sun/windows/awt_BitmapUtil.h index b32f3fe0a41..2c039232fcb 100644 --- a/jdk/src/windows/native/sun/windows/awt_BitmapUtil.h +++ b/jdk/src/windows/native/sun/windows/awt_BitmapUtil.h @@ -1,5 +1,5 @@ /* - * Copyright 2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2006-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 @@ -45,6 +45,32 @@ public: */ static HBITMAP CreateV4BitmapFromARGB(int width, int height, int* imageData); + /** + * Creates 32-bit premultiplied ARGB V4 Bitmap (Win95-compatible) from + * specified ARGB Pre input data. + */ + static HBITMAP CreateBitmapFromARGBPre(int width, int height, + int srcStride, + int* imageData); + + /** + * Transforms the given bitmap into an HRGN representing the transparency + * of the bitmap. + */ + static HRGN BitmapToRgn(HBITMAP hBitmap); + + /** + * Makes a copy of the given bitmap. Blends every pixel of the source + * with the given blendColor and alpha. If alpha == 0, the function + * simply makes a plain copy of the source without any blending. + */ + static HBITMAP BlendCopy(HBITMAP hSrcBitmap, COLORREF blendColor, BYTE alpha); + + /** + * Creates a 32 bit ARGB bitmap. Returns the bitmap handle. + * The pointer to the bitmap data is stored into bitmapBitsPtr. + */ + static HBITMAP CreateARGBBitmap(int width, int height, void ** bitmapBitsPtr); }; #endif diff --git a/jdk/src/windows/native/sun/windows/awt_Component.cpp b/jdk/src/windows/native/sun/windows/awt_Component.cpp index 6f0df2e449f..a49ae839459 100644 --- a/jdk/src/windows/native/sun/windows/awt_Component.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Component.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -199,9 +199,6 @@ BOOL AwtComponent::sm_rtl = PRIMARYLANGID(GetInputLanguage()) == LANG_ARABIC || BOOL AwtComponent::sm_rtlReadingOrder = PRIMARYLANGID(GetInputLanguage()) == LANG_ARABIC; -UINT AwtComponent::sm_95WheelMessage = WM_NULL; -UINT AwtComponent::sm_95WheelSupport = WM_NULL; - HWND AwtComponent::sm_cursorOn; BOOL AwtComponent::m_QueryNewPaletteCalled = FALSE; @@ -4562,6 +4559,25 @@ HDC AwtComponent::GetDCFromComponent() return hdc; } +void AwtComponent::FillBackground(HDC hMemoryDC, SIZE &size) +{ + RECT eraseR = { 0, 0, size.cx, size.cy }; + VERIFY(::FillRect(hMemoryDC, &eraseR, GetBackgroundBrush())); +} + +void AwtComponent::FillAlpha(void *bitmapBits, SIZE &size, BYTE alpha) +{ + if (bitmapBits) { + DWORD* dest = (DWORD*)bitmapBits; + //XXX: might be optimized to use one loop (cy*cx -> 0). + for (int i = 0; i < size.cy; i++ ) { + for (int j = 0; j < size.cx; j++ ) { + ((BYTE*)(dest++))[3] = alpha; + } + } + } +} + jintArray AwtComponent::CreatePrintedPixels(SIZE &loc, SIZE &size) { JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); @@ -6107,15 +6123,12 @@ void AwtComponent::_SetRectangularShape(void *param) AwtComponent *c = NULL; - - PDATA pData; JNI_CHECK_PEER_GOTO(self, ret); - c = (AwtComponent *)pData; - if (::IsWindow(c->GetHWnd())) - { - HRGN hRgn = NULL; + c = (AwtComponent *)pData; + if (::IsWindow(c->GetHWnd())) { + HRGN hRgn = NULL; if (region || x1 || x2 || y1 || y2) { // If all the params are zeros, the shape must be simply reset. // Otherwise, convert it into a region. diff --git a/jdk/src/windows/native/sun/windows/awt_Component.h b/jdk/src/windows/native/sun/windows/awt_Component.h index 0c18961ed49..2c9c0318cad 100644 --- a/jdk/src/windows/native/sun/windows/awt_Component.h +++ b/jdk/src/windows/native/sun/windows/awt_Component.h @@ -1,5 +1,5 @@ /* - * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -434,9 +434,6 @@ public: /* Functions for MouseWheel support on Windows95 * These should only be called if running on 95 */ - static void Wheel95Init(); - INLINE static UINT Wheel95GetMsg() {return sm_95WheelMessage;} - static UINT Wheel95GetScrLines(); /* Determines whether the component is obscured by another window */ // Called on Toolkit thread @@ -715,9 +712,9 @@ protected: virtual void SetDragCapture(UINT flags); virtual void ReleaseDragCapture(UINT flags); - // 95 support for mouse wheel - static UINT sm_95WheelMessage; - static UINT sm_95WheelSupport; + //These functions are overridden in AwtWindow to handle non-opaque windows. + virtual void FillBackground(HDC hMemoryDC, SIZE &size); + virtual void FillAlpha(void *bitmapBits, SIZE &size, BYTE alpha); private: /* A bitmask keeps the button's numbers as MK_LBUTTON, MK_MBUTTON, MK_RBUTTON diff --git a/jdk/src/windows/native/sun/windows/awt_Window.cpp b/jdk/src/windows/native/sun/windows/awt_Window.cpp index 0c9bce1210d..8d635b5d00d 100644 --- a/jdk/src/windows/native/sun/windows/awt_Window.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Window.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -25,6 +25,8 @@ #include "awt.h" +#include + #include "awt_Component.h" #include "awt_Container.h" #include "awt_Frame.h" @@ -88,7 +90,6 @@ struct ReshapeFrameStruct { jint x, y; jint w, h; }; - // struct for _SetIconImagesData struct SetIconImagesDataStruct { jobject window; @@ -97,7 +98,6 @@ struct SetIconImagesDataStruct { jintArray smallIconRaster; jint smw, smh; }; - // struct for _SetMinSize() method // and other methods setting sizes struct SizeStruct { @@ -114,6 +114,24 @@ struct ModalDisableStruct { jobject window; jlong blockerHWnd; }; +// struct for _SetOpacity() method +struct OpacityStruct { + jobject window; + jint iOpacity; +}; +// struct for _SetOpaque() method +struct OpaqueStruct { + jobject window; + jboolean isOpaque; +}; +// struct for _UpdateWindow() method +struct UpdateWindowStruct { + jobject window; + jintArray data; + HBITMAP hBitmap; + jint width, height; +}; + /************************************************************************ * AwtWindow fields */ @@ -162,6 +180,11 @@ AwtWindow::AwtWindow() { ::SetWindowsHookEx(WH_CBT, (HOOKPROC)AwtWindow::CBTFilter, 0, AwtToolkit::MainThread()); } + + m_opaque = TRUE; + m_opacity = 0xff; + + ::InitializeCriticalSection(&contentBitmapCS); } AwtWindow::~AwtWindow() @@ -1839,6 +1862,216 @@ void AwtWindow::DoUpdateIcon() //Does nothing for windows, is overriden for frames and dialogs } +void AwtWindow::RedrawWindow() +{ + if (isOpaque()) { + ::RedrawWindow(GetHWnd(), NULL, NULL, + RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN); + } else { + ::EnterCriticalSection(&contentBitmapCS); + if (hContentBitmap != NULL) { + UpdateWindowImpl(contentWidth, contentHeight, hContentBitmap); + } + ::LeaveCriticalSection(&contentBitmapCS); + } +} + +void AwtWindow::SetTranslucency(BYTE opacity, BOOL opaque) +{ + BYTE old_opacity = getOpacity(); + BOOL old_opaque = isOpaque(); + + if (opacity == old_opacity && opaque == old_opaque) { + return; + } + + setOpacity(opacity); + setOpaque(opaque); + + HWND hwnd = GetHWnd(); + + LONG ex_style = ::GetWindowLong(hwnd, GWL_EXSTYLE); + + if (opaque != old_opaque) { + ::EnterCriticalSection(&contentBitmapCS); + if (hContentBitmap != NULL) { + ::DeleteObject(hContentBitmap); + hContentBitmap = NULL; + } + ::LeaveCriticalSection(&contentBitmapCS); + } + + if (opaque && opacity == 0xff) { + // Turn off all the effects + ::SetWindowLong(hwnd, GWL_EXSTYLE, ex_style & ~WS_EX_LAYERED); + // Ask the window to repaint itself and all the children + RedrawWindow(); + } else { + // We're going to enable some effects + if (!(ex_style & WS_EX_LAYERED)) { + ::SetWindowLong(hwnd, GWL_EXSTYLE, ex_style | WS_EX_LAYERED); + } else { + if ((opaque && opacity < 0xff) ^ (old_opaque && old_opacity < 0xff)) { + // _One_ of the modes uses the SetLayeredWindowAttributes. + // Need to reset the style in this case. + // If both modes are simple (i.e. just changing the opacity level), + // no need to reset the style. + ::SetWindowLong(hwnd, GWL_EXSTYLE, ex_style & ~WS_EX_LAYERED); + ::SetWindowLong(hwnd, GWL_EXSTYLE, ex_style | WS_EX_LAYERED); + } + } + + if (opaque) { + // Simple opacity mode + ::SetLayeredWindowAttributes(hwnd, RGB(0, 0, 0), opacity, LWA_ALPHA); + } + } +} + +static HBITMAP CreateBitmapFromRaster(JNIEnv* env, jintArray raster, jint w, jint h) +{ + HBITMAP image = NULL; + if (raster != NULL) { + int* rasterBuffer = NULL; + try { + rasterBuffer = (int *)env->GetPrimitiveArrayCritical(raster, 0); + JNI_CHECK_NULL_GOTO(rasterBuffer, "raster data", done); + image = BitmapUtil::CreateBitmapFromARGBPre(w, h, w*4, rasterBuffer); + } catch (...) { + if (rasterBuffer != NULL) { + env->ReleasePrimitiveArrayCritical(raster, rasterBuffer, 0); + } + throw; + } + if (rasterBuffer != NULL) { + env->ReleasePrimitiveArrayCritical(raster, rasterBuffer, 0); + } + } +done: + return image; +} + +void AwtWindow::UpdateWindowImpl(int width, int height, HBITMAP hBitmap) +{ + if (isOpaque()) { + return; + } + + HWND hWnd = GetHWnd(); + HDC hdcDst = ::GetDC(NULL); + HDC hdcSrc = ::CreateCompatibleDC(NULL); + HBITMAP hOldBitmap = (HBITMAP)::SelectObject(hdcSrc, hBitmap); + + //XXX: this code doesn't paint the children (say, the java.awt.Button)! + //So, if we ever want to support HWs here, we need to repaint them + //in some other way... + //::SendMessage(hWnd, WM_PRINT, (WPARAM)hdcSrc, /*PRF_CHECKVISIBLE |*/ + // PRF_CHILDREN /*| PRF_CLIENT | PRF_NONCLIENT*/); + + POINT ptSrc; + ptSrc.x = ptSrc.y = 0; + + RECT rect; + POINT ptDst; + SIZE size; + + ::GetWindowRect(hWnd, &rect); + ptDst.x = rect.left; + ptDst.y = rect.top; + size.cx = width; + size.cy = height; + + BLENDFUNCTION bf; + + bf.SourceConstantAlpha = getOpacity(); + bf.AlphaFormat = AC_SRC_ALPHA; + bf.BlendOp = AC_SRC_OVER; + bf.BlendFlags = 0; + + ::UpdateLayeredWindow(hWnd, hdcDst, &ptDst, &size, hdcSrc, &ptSrc, + RGB(0, 0, 0), &bf, ULW_ALPHA); + + ::ReleaseDC(NULL, hdcDst); + ::SelectObject(hdcSrc, hOldBitmap); + ::DeleteDC(hdcSrc); +} + +void AwtWindow::UpdateWindow(JNIEnv* env, jintArray data, int width, int height, + HBITMAP hNewBitmap) +{ + if (isOpaque()) { + return; + } + + HBITMAP hBitmap; + if (hNewBitmap == NULL) { + if (data == NULL) { + return; + } + hBitmap = CreateBitmapFromRaster(env, data, width, height); + if (hBitmap == NULL) { + return; + } + } else { + hBitmap = hNewBitmap; + } + + ::EnterCriticalSection(&contentBitmapCS); + if (hContentBitmap != NULL) { + ::DeleteObject(hContentBitmap); + } + hContentBitmap = hBitmap; + contentWidth = width; + contentHeight = height; + UpdateWindowImpl(width, height, hBitmap); + ::LeaveCriticalSection(&contentBitmapCS); +} + +void AwtWindow::FillBackground(HDC hMemoryDC, SIZE &size) +{ + if (isOpaque()) { + AwtCanvas::FillBackground(hMemoryDC, size); + } +} + +void AwtWindow::FillAlpha(void *bitmapBits, SIZE &size, BYTE alpha) +{ + if (isOpaque()) { + AwtCanvas::FillAlpha(bitmapBits, size, alpha); + } +} + +/* + * Fixed 6353381: it's improved fix for 4792958 + * which was backed-out to avoid 5059656 + */ +BOOL AwtWindow::HasValidRect() +{ + RECT inside; + RECT outside; + + if (::IsIconic(GetHWnd())) { + return FALSE; + } + + ::GetClientRect(GetHWnd(), &inside); + ::GetWindowRect(GetHWnd(), &outside); + + BOOL isZeroClientArea = (inside.right == 0 && inside.bottom == 0); + BOOL isInvalidLocation = ((outside.left == -32000 && outside.top == -32000) || // Win2k && WinXP + (outside.left == 32000 && outside.top == 32000) || // Win95 && Win98 + (outside.left == 3000 && outside.top == 3000)); // Win95 && Win98 + + // the bounds correspond to iconic state + if (isZeroClientArea && isInvalidLocation) + { + return FALSE; + } + + return TRUE; +} + + void AwtWindow::_SetIconImagesData(void * param) { JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); @@ -2009,36 +2242,68 @@ void AwtWindow::_ModalEnable(void *param) env->DeleteGlobalRef(self); } -/* - * Fixed 6353381: it's improved fix for 4792958 - * which was backed-out to avoid 5059656 - */ -BOOL AwtWindow::HasValidRect() +void AwtWindow::_SetOpacity(void* param) { - RECT inside; - RECT outside; + JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - if (::IsIconic(GetHWnd())) { - return FALSE; - } + OpacityStruct *os = (OpacityStruct *)param; + jobject self = os->window; + BYTE iOpacity = (BYTE)os->iOpacity; - ::GetClientRect(GetHWnd(), &inside); - ::GetWindowRect(GetHWnd(), &outside); + PDATA pData; + JNI_CHECK_PEER_GOTO(self, ret); + AwtWindow *window = (AwtWindow *)pData; - BOOL isZeroClientArea = (inside.right == 0 && inside.bottom == 0); - BOOL isInvalidLocation = ((outside.left == -32000 && outside.top == -32000) || // Win2k && WinXP - (outside.left == 32000 && outside.top == 32000) || // Win95 && Win98 - (outside.left == 3000 && outside.top == 3000)); // Win95 && Win98 + window->SetTranslucency(iOpacity, window->isOpaque()); - // the bounds correspond to iconic state - if (isZeroClientArea && isInvalidLocation) - { - return FALSE; - } - - return TRUE; + ret: + env->DeleteGlobalRef(self); + delete os; } +void AwtWindow::_SetOpaque(void* param) +{ + JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); + + OpaqueStruct *os = (OpaqueStruct *)param; + jobject self = os->window; + BOOL isOpaque = (BOOL)os->isOpaque; + + PDATA pData; + JNI_CHECK_PEER_GOTO(self, ret); + AwtWindow *window = (AwtWindow *)pData; + + window->SetTranslucency(window->getOpacity(), isOpaque); + + ret: + env->DeleteGlobalRef(self); + delete os; +} + +void AwtWindow::_UpdateWindow(void* param) +{ + JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); + + UpdateWindowStruct *uws = (UpdateWindowStruct *)param; + jobject self = uws->window; + jintArray data = uws->data; + + PDATA pData; + JNI_CHECK_PEER_GOTO(self, ret); + AwtWindow *window = (AwtWindow *)pData; + + window->UpdateWindow(env, data, (int)uws->width, (int)uws->height, + uws->hBitmap); + + ret: + env->DeleteGlobalRef(self); + if (data != NULL) { + env->DeleteGlobalRef(data); + } + delete uws; +} + + extern "C" { /* @@ -2489,4 +2754,93 @@ Java_sun_awt_windows_WWindowPeer_nativeUngrab(JNIEnv *env, jobject self) CATCH_BAD_ALLOC; } +/* + * Class: sun_awt_windows_WWindowPeer + * Method: setOpacity + * Signature: (I)V + */ +JNIEXPORT void JNICALL +Java_sun_awt_windows_WWindowPeer_setOpacity(JNIEnv *env, jobject self, + jint iOpacity) +{ + TRY; + + OpacityStruct *os = new OpacityStruct; + os->window = env->NewGlobalRef(self); + os->iOpacity = iOpacity; + + AwtToolkit::GetInstance().SyncCall(AwtWindow::_SetOpacity, os); + // global refs and mds are deleted in _SetMinSize + + CATCH_BAD_ALLOC; +} + +/* + * Class: sun_awt_windows_WWindowPeer + * Method: setOpaqueImpl + * Signature: (Z)V + */ +JNIEXPORT void JNICALL +Java_sun_awt_windows_WWindowPeer_setOpaqueImpl(JNIEnv *env, jobject self, + jboolean isOpaque) +{ + TRY; + + OpaqueStruct *os = new OpaqueStruct; + os->window = env->NewGlobalRef(self); + os->isOpaque = isOpaque; + + AwtToolkit::GetInstance().SyncCall(AwtWindow::_SetOpaque, os); + // global refs and mds are deleted in _SetMinSize + + CATCH_BAD_ALLOC; +} + +/* + * Class: sun_awt_windows_WWindowPeer + * Method: updateWindowImpl + * Signature: ([III)V + */ +JNIEXPORT void JNICALL +Java_sun_awt_windows_WWindowPeer_updateWindowImpl(JNIEnv *env, jobject self, + jintArray data, + jint width, jint height) +{ + TRY; + + UpdateWindowStruct *uws = new UpdateWindowStruct; + uws->window = env->NewGlobalRef(self); + uws->data = (jintArray)env->NewGlobalRef(data); + uws->hBitmap = NULL; + uws->width = width; + uws->height = height; + + AwtToolkit::GetInstance().InvokeFunction(AwtWindow::_UpdateWindow, uws); + // global refs and mds are deleted in _UpdateWindow + + CATCH_BAD_ALLOC; +} + +/** + * This method is called from the WGL pipeline when it needs to update + * the layered window WindowPeer's C++ level object. + */ +void AwtWindow_UpdateWindow(JNIEnv *env, jobject peer, + jint width, jint height, HBITMAP hBitmap) +{ + TRY; + + UpdateWindowStruct *uws = new UpdateWindowStruct; + uws->window = env->NewGlobalRef(peer); + uws->data = NULL; + uws->hBitmap = hBitmap; + uws->width = width; + uws->height = height; + + AwtToolkit::GetInstance().InvokeFunction(AwtWindow::_UpdateWindow, uws); + // global refs and mds are deleted in _UpdateWindow + + CATCH_BAD_ALLOC; +} + } /* extern "C" */ diff --git a/jdk/src/windows/native/sun/windows/awt_Window.h b/jdk/src/windows/native/sun/windows/awt_Window.h index 9a252a25ce1..a3d57db7b2d 100644 --- a/jdk/src/windows/native/sun/windows/awt_Window.h +++ b/jdk/src/windows/native/sun/windows/awt_Window.h @@ -1,5 +1,5 @@ /* - * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -182,6 +182,9 @@ public: void moveToDefaultLocation(); /* moves Window to X,Y specified by Window Manger */ + void UpdateWindow(JNIEnv* env, jintArray data, int width, int height, + HBITMAP hNewBitmap = NULL); + INLINE virtual BOOL IsTopLevel() { return TRUE; } static AwtWindow * GetGrabbedWindow() { return m_grabbedWindow; } @@ -204,6 +207,9 @@ public: static void _SetModalExcludedNativeProp(void *param); static void _ModalDisable(void *param); static void _ModalEnable(void *param); + static void _SetOpacity(void* param); + static void _SetOpaque(void* param); + static void _UpdateWindow(void* param); inline static BOOL IsResizing() { return sm_resizing; @@ -228,6 +234,32 @@ private: // from its hierarchy when shown. Currently applied to instances of // javax/swing/Popup$HeavyWeightWindow class. + BYTE m_opacity; // The opacity level. == 0xff by default (when opacity mode is disabled) + BOOL m_opaque; // Whether the window uses the perpixel translucency (false), or not (true). + + inline BYTE getOpacity() { + return m_opacity; + } + inline void setOpacity(BYTE opacity) { + m_opacity = opacity; + } + + inline BOOL isOpaque() { + return m_opaque; + } + inline void setOpaque(BOOL opaque) { + m_opaque = opaque; + } + + CRITICAL_SECTION contentBitmapCS; + HBITMAP hContentBitmap; + UINT contentWidth; + UINT contentHeight; + + void RedrawWindow(); + void SetTranslucency(BYTE opacity, BOOL opaque); + void UpdateWindowImpl(int width, int height, HBITMAP hBitmap); + protected: BOOL m_isResizable; static AwtWindow* m_grabbedWindow; // Current grabbing window @@ -236,6 +268,10 @@ protected: BOOL m_iconInherited; /* TRUE if icon is inherited from the owner */ BOOL m_filterFocusAndActivation; /* Used in the WH_CBT hook */ + //These are used in AwtComponent::CreatePrintedPixels. They are overridden + //here to handle non-opaque windows. + virtual void FillBackground(HDC hMemoryDC, SIZE &size); + virtual void FillAlpha(void *bitmapBits, SIZE &size, BYTE alpha); private: int m_screenNum; diff --git a/jdk/test/com/sun/awt/Translucency/TranslucentJAppletTest/TranslucentJAppletTest.java b/jdk/test/com/sun/awt/Translucency/TranslucentJAppletTest/TranslucentJAppletTest.java new file mode 100644 index 00000000000..08cbe4069a3 --- /dev/null +++ b/jdk/test/com/sun/awt/Translucency/TranslucentJAppletTest/TranslucentJAppletTest.java @@ -0,0 +1,103 @@ +/* + * Copyright 2008-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 %I% %E% + * @bug 6683728 + * @summary Tests that a JApplet in a translucent JFrame works properly + * @author Kenneth.Russell@sun.com: area=Graphics + * @compile -XDignore.symbol.file=true TranslucentJAppletTest.java + * @run main/manual/othervm TranslucentJAppletTest + */ + +import java.awt.*; +import java.awt.image.*; + +import javax.swing.*; + +public class TranslucentJAppletTest { + + private static JFrame frame; + private static volatile boolean paintComponentCalled = false; + + private static void initAndShowGUI() { + frame = new JFrame(); + JApplet applet = new JApplet(); + JPanel panel = new JPanel() { + protected void paintComponent(Graphics g) { + paintComponentCalled = true; + g.setColor(Color.RED); + g.fillOval(0, 0, getWidth(), getHeight()); + } + }; + panel.setDoubleBuffered(false); + panel.setOpaque(false); + applet.add(panel); + frame.add(applet); + frame.setBounds(100, 100, 200, 200); + frame.setUndecorated(true); + com.sun.awt.AWTUtilities.setWindowOpaque(frame, false); + frame.setVisible(true); + } + + public static void main(String[] args) + throws Exception + { + sun.awt.SunToolkit tk = (sun.awt.SunToolkit)Toolkit.getDefaultToolkit(); + + Robot r = new Robot(); + Color color1 = r.getPixelColor(100, 100); // (0, 0) in frame coordinates + + SwingUtilities.invokeAndWait(new Runnable() { + public void run() { + initAndShowGUI(); + } + }); + tk.realSync(); + + if (!paintComponentCalled) { + throw new RuntimeException("Test FAILED: panel's paintComponent() method is not called"); + } + + Color newColor1 = r.getPixelColor(100, 100); + // unfortunately, robot.getPixelColor() doesn't work for some unknown reason + // Color newColor2 = r.getPixelColor(200, 200); + BufferedImage bim = r.createScreenCapture(new Rectangle(200, 200, 1, 1)); + Color newColor2 = new Color(bim.getRGB(0, 0)); + + // Frame must be transparent at (100, 100) in screen coords + if (!color1.equals(newColor1)) { + System.err.println("color1 = " + color1); + System.err.println("newColor1 = " + newColor1); + throw new RuntimeException("Test FAILED: frame pixel at (0, 0) is not transparent"); + } + + // Frame must be RED at (200, 200) in screen coords + if (!newColor2.equals(Color.RED)) { + System.err.println("newColor2 = " + newColor2); + throw new RuntimeException("Test FAILED: frame pixel at (100, 100) is not red (transparent?)"); + } + + System.out.println("Test PASSED"); + } +} diff --git a/jdk/test/com/sun/awt/Translucency/TranslucentShapedFrameTest/TSFrame.java b/jdk/test/com/sun/awt/Translucency/TranslucentShapedFrameTest/TSFrame.java new file mode 100644 index 00000000000..1e9cf74658e --- /dev/null +++ b/jdk/test/com/sun/awt/Translucency/TranslucentShapedFrameTest/TSFrame.java @@ -0,0 +1,306 @@ +/* + * Copyright 2008-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. 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. + */ + +import com.sun.awt.AWTUtilities; +import static com.sun.awt.AWTUtilities.Translucency.*; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.Graphics; +import java.awt.GraphicsConfiguration; +import java.awt.GraphicsEnvironment; +import java.awt.RenderingHints; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.awt.Canvas; +import java.awt.Component; +import java.awt.GradientPaint; +import java.awt.Graphics2D; +import java.awt.Paint; +import java.util.Random; +import java.awt.geom.Ellipse2D; +import javax.swing.JApplet; +import javax.swing.JButton; +import javax.swing.JComponent; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.SwingUtilities; + +public class TSFrame { + + static volatile boolean done = false; + + static final boolean useSwing = System.getProperty("useswing") != null; + static final boolean useShape = System.getProperty("useshape") != null; + static final boolean useTransl = System.getProperty("usetransl") != null; + static final boolean useNonOpaque = System.getProperty("usenonop") != null; + + static final Random rnd = new Random(); + private static void render(Graphics g, int w, int h, boolean useNonOpaque) { + if (useNonOpaque) { + Graphics2D g2d = (Graphics2D)g; + GradientPaint p = + new GradientPaint(0.0f, 0.0f, + new Color(rnd.nextInt(0xffffff)), + w, h, + new Color(rnd.nextInt(0xff), + rnd.nextInt(0xff), + rnd.nextInt(0xff), 0), + true); + g2d.setPaint(p); + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); + g2d.fillOval(0, 0, w, h); + } else { + g.setColor(new Color(rnd.nextInt(0xffffff))); + g.fillRect(0, 0, w, h); + } + } + + private static class MyCanvas extends Canvas { + @Override + public void paint(Graphics g) { + render(g, getWidth(), getHeight(), false); + } + @Override + public Dimension getPreferredSize() { + return new Dimension(200, 100); + } + } + private static class NonOpaqueJFrame extends JFrame { + NonOpaqueJFrame(GraphicsConfiguration gc) { + super("NonOpaque Swing JFrame", gc); + JPanel p = new JPanel() { + public void paintComponent(Graphics g) { + super.paintComponent(g); + render(g, getWidth(), getHeight(), true); + g.setColor(Color.red); + g.drawString("Non-Opaque Swing JFrame", 10, 15); + } + }; + p.setDoubleBuffered(false); + p.setOpaque(false); + add(p); + setUndecorated(true); + } + } + private static class NonOpaqueJAppletFrame extends JFrame { + JPanel p; + NonOpaqueJAppletFrame(GraphicsConfiguration gc) { + super("NonOpaque Swing JAppletFrame", gc); + JApplet ja = new JApplet() { + public void paint(Graphics g) { + super.paint(g); + System.err.println("JAppletFrame paint called"); + } + }; + p = new JPanel() { + public void paintComponent(Graphics g) { + super.paintComponent(g); + render(g, getWidth(), getHeight(), true); + g.setColor(Color.red); + g.drawString("Non-Opaque Swing JFrame", 10, 15); + } + }; + p.setDoubleBuffered(false); + p.setOpaque(false); + ja.add(p); + add(ja); + setUndecorated(true); + } + } + private static class NonOpaqueFrame extends Frame { + NonOpaqueFrame(GraphicsConfiguration gc) { + super("NonOpaque AWT Frame", gc); + // uncomment to test with hw child +// setLayout(null); +// Component c = new Panel() { +// public void paint(Graphics g) { +// g.setColor(new Color(1.0f, 1.0f, 1.0f, 0.5f)); +// g.fillRect(0, 0, getWidth(), getHeight()); +// } +// }; +// c.setSize(100, 100); +// c.setBackground(Color.red); +// c.setForeground(Color.red); +// add(c); +// c.setLocation(130, 130); + } + @Override + public void paint(Graphics g) { + render(g, getWidth(), getHeight(), true); + g.setColor(Color.red); + g.drawString("Non-Opaque AWT Frame", 10, 15); + } + } + + private static class MyJPanel extends JPanel { + @Override + public void paintComponent(Graphics g) { + render(g, getWidth(), getHeight(), false); + } + } + + public static Frame createGui(GraphicsConfiguration gc, + final boolean useSwing, + final boolean useShape, + final boolean useTransl, + final boolean useNonOpaque, + final float factor) + { + Frame frame; + done = false; + + if (gc == null) { + gc = GraphicsEnvironment.getLocalGraphicsEnvironment(). + getDefaultScreenDevice().getDefaultConfiguration(); + } + + if (useNonOpaque) { + if (useSwing) { + frame = new NonOpaqueJFrame(gc); +// frame = new NonOpaqueJAppletFrame(gc); + } else { + frame = new NonOpaqueFrame(gc); + } + animateComponent(frame); + } else if (useSwing) { + frame = new JFrame("Swing Frame", gc); + JComponent p = new JButton("Swing!"); + p.setPreferredSize(new Dimension(200, 100)); + frame.add("North", p); + p = new MyJPanel(); + animateComponent(p); + frame.add("Center", p); + } else { + frame = new Frame("AWT Frame", gc) { + public void paint(Graphics g) { + g.setColor(Color.red); + g.fillRect(0, 0, 100, 100); + } + }; + frame.setLayout(new BorderLayout()); + Canvas c = new MyCanvas(); + frame.add("North", c); + animateComponent(c); + c = new MyCanvas(); + frame.add("Center", c); + animateComponent(c); + c = new MyCanvas(); + frame.add("South", c); + animateComponent(c); + } + final Frame finalFrame = frame; + frame.addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) { + finalFrame.dispose(); + done = true; + } + }); + frame.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + finalFrame.dispose(); + done = true; + } + }); + frame.setPreferredSize(new Dimension(800, 600)); + + if (useShape) { + frame.setUndecorated(true); + } + + frame.setLocation(450, 10); + frame.pack(); + + if (useShape) { + if (AWTUtilities.isTranslucencySupported(PERPIXEL_TRANSPARENT)) { + System.out.println("applying PERPIXEL_TRANSPARENT"); + AWTUtilities.setWindowShape(frame, + new Ellipse2D.Double(0, 0, frame.getWidth(), + frame.getHeight()/3)); + frame.setTitle("PERPIXEL_TRANSPARENT"); + } else { + System.out.println("Passed: PERPIXEL_TRANSPARENT unsupported"); + } + } + if (useTransl) { + if (AWTUtilities.isTranslucencySupported(TRANSLUCENT)) { + System.out.println("applying TRANSLUCENT"); + AWTUtilities.setWindowOpacity(frame, factor); + frame.setTitle("TRANSLUCENT"); + } else { + System.out.println("Passed: TRANSLUCENT unsupported"); + } + } + if (useNonOpaque) { + if (AWTUtilities.isTranslucencySupported(PERPIXEL_TRANSLUCENT) && + AWTUtilities.isTranslucencyCapable(gc)) + { + System.out.println("applying PERPIXEL_TRANSLUCENT"); + AWTUtilities.setWindowOpaque(frame, false); + frame.setTitle("PERPIXEL_TRANSLUCENT"); + } else { + System.out.println("Passed: PERPIXEL_TRANSLUCENT unsupported"); + } + } + frame.setVisible(true); + return frame; + } + + public static void stopThreads() { + done = true; + } + + private static void animateComponent(final Component comp) { + Thread t = new Thread(new Runnable() { + public void run() { + do { + try { + Thread.sleep(50); + } catch (InterruptedException ex) {} + comp.repaint(); + } while (!done); + } + }); + t.start(); + } + + public static void main(String[] args) throws Exception { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + TSFrame.createGui(null, useSwing, + useShape, + useTransl, + useNonOpaque, + 0.7f); + } + }); + } +} diff --git a/jdk/test/com/sun/awt/Translucency/TranslucentShapedFrameTest/TranslucentShapedFrameTest.form b/jdk/test/com/sun/awt/Translucency/TranslucentShapedFrameTest/TranslucentShapedFrameTest.form new file mode 100644 index 00000000000..4291e0eeaac --- /dev/null +++ b/jdk/test/com/sun/awt/Translucency/TranslucentShapedFrameTest/TranslucentShapedFrameTest.form @@ -0,0 +1,230 @@ + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/jdk/test/com/sun/awt/Translucency/TranslucentShapedFrameTest/TranslucentShapedFrameTest.java b/jdk/test/com/sun/awt/Translucency/TranslucentShapedFrameTest/TranslucentShapedFrameTest.java new file mode 100644 index 00000000000..edb58ff67b8 --- /dev/null +++ b/jdk/test/com/sun/awt/Translucency/TranslucentShapedFrameTest/TranslucentShapedFrameTest.java @@ -0,0 +1,359 @@ +/* + * Copyright 2008-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. 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 %I% %E% + * @bug 6655001 6670649 6687141 + * @summary Tests that hw acceleration doesn't affect translucent/shaped windows + * @author Dmitri.Trembovetski@sun.com: area=Graphics + * @compile -XDignore.symbol.file=true TranslucentShapedFrameTest.java + * @compile -XDignore.symbol.file=true TSFrame.java + * @run main/manual/othervm TranslucentShapedFrameTest + * @run main/manual/othervm -Dsun.java2d.noddraw=true TranslucentShapedFrameTest + * @run main/manual/othervm -Dsun.java2d.opengl=True TranslucentShapedFrameTest + */ +import com.sun.awt.AWTUtilities; +import static com.sun.awt.AWTUtilities.Translucency.*; +import java.awt.Frame; +import java.awt.GraphicsConfiguration; +import java.awt.GraphicsDevice; +import java.awt.GraphicsEnvironment; +import java.awt.Shape; +import java.awt.geom.Ellipse2D; +import java.util.concurrent.CountDownLatch; +import javax.swing.JSlider; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +public class TranslucentShapedFrameTest extends javax.swing.JFrame { + Frame testFrame; + static CountDownLatch done; + static volatile boolean failed = false; + GraphicsConfiguration gcToUse = null; + + /** + * Creates new form TranslucentShapedFrameTest + */ + public TranslucentShapedFrameTest() { + // not necessary, but we just look nicer + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (Exception ex) {} + + initComponents(); + checkEffects(); + + SwingUtilities.updateComponentTreeUI(this); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + // //GEN-BEGIN:initComponents + private void initComponents() { + createDisposeGrp = new javax.swing.ButtonGroup(); + jLabel1 = new javax.swing.JLabel(); + transparencySld = new javax.swing.JSlider(); + shapedCb = new javax.swing.JCheckBox(); + nonOpaqueChb = new javax.swing.JCheckBox(); + jScrollPane1 = new javax.swing.JScrollPane(); + jTextArea1 = new javax.swing.JTextArea(); + jLabel2 = new javax.swing.JLabel(); + passedBtn = new javax.swing.JButton(); + failedBtn = new javax.swing.JButton(); + createFrameBtn = new javax.swing.JToggleButton(); + disposeFrameBtn = new javax.swing.JToggleButton(); + useSwingCb = new javax.swing.JCheckBox(); + + setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); + setTitle("TranslucentShapedFrameTest"); + jLabel1.setText("Frame Opacity:"); + + transparencySld.setMajorTickSpacing(10); + transparencySld.setMinorTickSpacing(5); + transparencySld.setPaintLabels(true); + transparencySld.setPaintTicks(true); + transparencySld.setValue(100); + transparencySld.addChangeListener(new javax.swing.event.ChangeListener() { + public void stateChanged(javax.swing.event.ChangeEvent evt) { + transparencySldStateChanged(evt); + } + }); + + shapedCb.setText("Shaped Frame"); + shapedCb.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0)); + shapedCb.setMargin(new java.awt.Insets(0, 0, 0, 0)); + shapedCb.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + shapedCbActionPerformed(evt); + } + }); + + nonOpaqueChb.setText("Non Opaque Frame"); + nonOpaqueChb.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0)); + nonOpaqueChb.setMargin(new java.awt.Insets(0, 0, 0, 0)); + nonOpaqueChb.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + nonOpaqueChbActionPerformed(evt); + } + }); + + jTextArea1.setColumns(20); + jTextArea1.setRows(5); + jTextArea1.setText("Create translucent and/or shaped, or\nnon-opaque frame. Make sure it behaves\ncorrectly (no artifacts left on the screen\nwhen dragging - if dragging is possible).\nClick \"Passed\" if the test behaves correctly,\n\"Falied\" otherwise."); + jScrollPane1.setViewportView(jTextArea1); + + jLabel2.setText("Instructions:"); + + passedBtn.setBackground(new java.awt.Color(129, 255, 100)); + passedBtn.setText("Passed"); + passedBtn.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + passedBtnActionPerformed(evt); + } + }); + + failedBtn.setBackground(java.awt.Color.red); + failedBtn.setText("Failed"); + failedBtn.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + failedBtnActionPerformed(evt); + } + }); + + createDisposeGrp.add(createFrameBtn); + createFrameBtn.setText("Create Frame"); + createFrameBtn.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + createFrameBtnActionPerformed(evt); + } + }); + + createDisposeGrp.add(disposeFrameBtn); + disposeFrameBtn.setSelected(true); + disposeFrameBtn.setText("Dispose Frame"); + disposeFrameBtn.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + disposeFrameBtnActionPerformed(evt); + } + }); + + useSwingCb.setText("Use JFrame"); + useSwingCb.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0)); + useSwingCb.setMargin(new java.awt.Insets(0, 0, 0, 0)); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(transparencySld, javax.swing.GroupLayout.DEFAULT_SIZE, 375, Short.MAX_VALUE) + .addContainerGap()) + .addComponent(jLabel1) + .addGroup(layout.createSequentialGroup() + .addComponent(shapedCb) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(nonOpaqueChb) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(useSwingCb) + .addContainerGap(102, Short.MAX_VALUE)) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(jLabel2) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 314, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(layout.createSequentialGroup() + .addComponent(passedBtn) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(failedBtn) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 241, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 375, Short.MAX_VALUE) + .addGroup(layout.createSequentialGroup() + .addComponent(createFrameBtn, javax.swing.GroupLayout.PREFERRED_SIZE, 187, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(disposeFrameBtn, javax.swing.GroupLayout.PREFERRED_SIZE, 182, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addContainerGap()))) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(jLabel1) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(transparencySld, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(shapedCb) + .addComponent(nonOpaqueChb) + .addComponent(useSwingCb)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(disposeFrameBtn) + .addComponent(createFrameBtn)) + .addGap(17, 17, 17) + .addComponent(jLabel2) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 148, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(passedBtn) + .addComponent(failedBtn)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + pack(); + }// //GEN-END:initComponents + + private void nonOpaqueChbActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_nonOpaqueChbActionPerformed + if (testFrame != null) { + // REMIND: this path in the test doesn't work well (test bug) +// AWTUtilities.setWindowOpaque(testFrame, !nonOpaqueChb.isSelected()); + } + }//GEN-LAST:event_nonOpaqueChbActionPerformed + + private void shapedCbActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_shapedCbActionPerformed + if (testFrame != null) { + Shape s = null; + if (shapedCb.isSelected()) { + s = new Ellipse2D.Double(0, 0, + testFrame.getWidth(), + testFrame.getHeight()); + } + AWTUtilities.setWindowShape(testFrame, s); + } + }//GEN-LAST:event_shapedCbActionPerformed + + private void transparencySldStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_transparencySldStateChanged + JSlider source = (JSlider)evt.getSource(); + int transl = transparencySld.getValue(); + if (testFrame != null) { + AWTUtilities.setWindowOpacity(testFrame, (float)transl/100f); + } + }//GEN-LAST:event_transparencySldStateChanged + + private void failedBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_failedBtnActionPerformed + disposeFrameBtnActionPerformed(evt); + dispose(); + failed = true; + done.countDown(); + }//GEN-LAST:event_failedBtnActionPerformed + + private void disposeFrameBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_disposeFrameBtnActionPerformed + TSFrame.stopThreads(); + if (testFrame != null) { + testFrame.dispose(); + testFrame = null; + } + }//GEN-LAST:event_disposeFrameBtnActionPerformed + + private void createFrameBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_createFrameBtnActionPerformed + disposeFrameBtnActionPerformed(evt); + int transl = transparencySld.getValue(); + testFrame = TSFrame.createGui(gcToUse, + useSwingCb.isSelected(), shapedCb.isSelected(), + (transl < 100), nonOpaqueChb.isSelected(), + (float)transl/100f); + }//GEN-LAST:event_createFrameBtnActionPerformed + + private void passedBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_passedBtnActionPerformed + disposeFrameBtnActionPerformed(evt); + dispose(); + done.countDown(); + }//GEN-LAST:event_passedBtnActionPerformed + + /** + * @param args the command line arguments + */ + public static void main(String args[]) { + done = new CountDownLatch(1); + java.awt.EventQueue.invokeLater(new Runnable() { + public void run() { + new TranslucentShapedFrameTest().setVisible(true); + } + }); + try { + done.await(); + } catch (InterruptedException ex) {} + if (failed) { + throw new RuntimeException("Test FAILED"); + } + System.out.println("Test PASSED"); + } + + private void checkEffects() { + if (!AWTUtilities.isTranslucencySupported(PERPIXEL_TRANSPARENT)) { + shapedCb.setEnabled(false); + } + + if (!AWTUtilities.isTranslucencySupported(TRANSLUCENT)) { + transparencySld.setEnabled(false); + } + + GraphicsConfiguration gc = null; + if (AWTUtilities.isTranslucencySupported(PERPIXEL_TRANSLUCENT)) { + gc = findGraphicsConfig(); + if (gc == null) { + nonOpaqueChb.setEnabled(false); + } + } + + gcToUse = gc; + } + + private GraphicsConfiguration findGraphicsConfig() { + GraphicsDevice gd = + GraphicsEnvironment.getLocalGraphicsEnvironment(). + getDefaultScreenDevice(); + GraphicsConfiguration gcs[] = gd.getConfigurations(); + for (GraphicsConfiguration gc : gcs) { + if (AWTUtilities.isTranslucencyCapable(gc)) { + return gc; + } + } + return null; + } + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.ButtonGroup createDisposeGrp; + private javax.swing.JToggleButton createFrameBtn; + private javax.swing.JToggleButton disposeFrameBtn; + private javax.swing.JButton failedBtn; + private javax.swing.JLabel jLabel1; + private javax.swing.JLabel jLabel2; + private javax.swing.JScrollPane jScrollPane1; + private javax.swing.JTextArea jTextArea1; + private javax.swing.JCheckBox nonOpaqueChb; + private javax.swing.JButton passedBtn; + private javax.swing.JCheckBox shapedCb; + private javax.swing.JSlider transparencySld; + private javax.swing.JCheckBox useSwingCb; + // End of variables declaration//GEN-END:variables + +} diff --git a/jdk/test/com/sun/awt/Translucency/WindowOpacity.java b/jdk/test/com/sun/awt/Translucency/WindowOpacity.java new file mode 100644 index 00000000000..d5d8a11d3d9 --- /dev/null +++ b/jdk/test/com/sun/awt/Translucency/WindowOpacity.java @@ -0,0 +1,461 @@ +/* + * Copyright 2008-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 %W% %E% + @bug 6594131 + @summary Tests the AWTUtilities.get/setWindowOpacity() methods + @author anthony.petrov@...: area=awt.toplevel + @run main WindowOpacity +*/ + +import java.awt.*; +import java.awt.event.*; + +import com.sun.awt.AWTUtilities; +import sun.awt.SunToolkit; + +public class WindowOpacity +{ + //*** test-writer defined static variables go here *** + + private static void realSync() { + ((SunToolkit)Toolkit.getDefaultToolkit()).realSync(); + } + + + private static void init() + { + //*** Create instructions for the user here *** + String[] instructions = + { + "This is an AUTOMATIC test, simply wait until it is done.", + "The result (passed or failed) will be shown in the", + "message window below." + }; + Sysout.createDialog( ); + Sysout.printInstructions( instructions ); + + if (!AWTUtilities.isTranslucencySupported(AWTUtilities.Translucency.TRANSLUCENT)) { + System.out.println("Either the Toolkit or the native system does not support controlling the window opacity level."); + pass(); + } + + boolean passed; + + Frame f = new Frame("Opacity test"); + + passed = false; + try { + AWTUtilities.getWindowOpacity(null); + } catch (NullPointerException e) { + passed = true; + } + if (!passed) { + fail("getWindowOpacity() allows passing null."); + } + + + passed = false; + try { + AWTUtilities.setWindowOpacity(null, 0.5f); + } catch (NullPointerException e) { + passed = true; + } + if (!passed) { + fail("setWindowOpacity() allows passing null."); + } + + + float curOpacity = AWTUtilities.getWindowOpacity(f); + if (curOpacity < 1.0f || curOpacity > 1.0f) { + fail("getWindowOpacity() reports the initial opacity level other than 1.0: " + curOpacity); + } + + + + passed = false; + try { + AWTUtilities.setWindowOpacity(f, -0.5f); + } catch (IllegalArgumentException e) { + passed = true; + } + if (!passed) { + fail("setWindowOpacity() allows passing negative opacity level."); + } + + + + passed = false; + try { + AWTUtilities.setWindowOpacity(f, 1.5f); + } catch (IllegalArgumentException e) { + passed = true; + } + if (!passed) { + fail("setWindowOpacity() allows passing opacity level greater than 1.0."); + } + + + AWTUtilities.setWindowOpacity(f, 0.5f); + + curOpacity = AWTUtilities.getWindowOpacity(f); + if (curOpacity < 0.5f || curOpacity > 0.5f) { + fail("getWindowOpacity() reports the opacity level that differs from the value set with setWindowOpacity: " + curOpacity); + } + + + AWTUtilities.setWindowOpacity(f, 0.75f); + + curOpacity = AWTUtilities.getWindowOpacity(f); + if (curOpacity < 0.75f || curOpacity > 0.75f) { + fail("getWindowOpacity() reports the opacity level that differs from the value set with setWindowOpacity the second time: " + curOpacity); + } + + + f.setBounds(100, 100, 300, 200); + f.setVisible(true); + + realSync(); + + curOpacity = AWTUtilities.getWindowOpacity(f); + if (curOpacity < 0.75f || curOpacity > 0.75f) { + fail("getWindowOpacity() reports the opacity level that differs from the value set with setWindowOpacity before showing the frame: " + curOpacity); + } + + + + AWTUtilities.setWindowOpacity(f, 0.5f); + realSync(); + + curOpacity = AWTUtilities.getWindowOpacity(f); + if (curOpacity < 0.5f || curOpacity > 0.5f) { + fail("getWindowOpacity() reports the opacity level that differs from the value set with setWindowOpacity after showing the frame: " + curOpacity); + } + + WindowOpacity.pass(); + + }//End init() + + + + /***************************************************** + * Standard Test Machinery Section + * DO NOT modify anything in this section -- it's a + * standard chunk of code which has all of the + * synchronisation necessary for the test harness. + * By keeping it the same in all tests, it is easier + * to read and understand someone else's test, as + * well as insuring that all tests behave correctly + * with the test harness. + * There is a section following this for test- + * classes + ******************************************************/ + private static boolean theTestPassed = false; + private static boolean testGeneratedInterrupt = false; + private static String failureMessage = ""; + + private static Thread mainThread = null; + + private static int sleepTime = 300000; + + // Not sure about what happens if multiple of this test are + // instantiated in the same VM. Being static (and using + // static vars), it aint gonna work. Not worrying about + // it for now. + public static void main( String args[] ) throws InterruptedException + { + mainThread = Thread.currentThread(); + try + { + init(); + } + catch( TestPassedException e ) + { + //The test passed, so just return from main and harness will + // interepret this return as a pass + return; + } + //At this point, neither test pass nor test fail has been + // called -- either would have thrown an exception and ended the + // test, so we know we have multiple threads. + + //Test involves other threads, so sleep and wait for them to + // called pass() or fail() + try + { + Thread.sleep( sleepTime ); + //Timed out, so fail the test + throw new RuntimeException( "Timed out after " + sleepTime/1000 + " seconds" ); + } + catch (InterruptedException e) + { + //The test harness may have interrupted the test. If so, rethrow the exception + // so that the harness gets it and deals with it. + if( ! testGeneratedInterrupt ) throw e; + + //reset flag in case hit this code more than once for some reason (just safety) + testGeneratedInterrupt = false; + + if ( theTestPassed == false ) + { + throw new RuntimeException( failureMessage ); + } + } + + }//main + + public static synchronized void setTimeoutTo( int seconds ) + { + sleepTime = seconds * 1000; + } + + public static synchronized void pass() + { + Sysout.println( "The test passed." ); + Sysout.println( "The test is over, hit Ctl-C to stop Java VM" ); + //first check if this is executing in main thread + if ( mainThread == Thread.currentThread() ) + { + //Still in the main thread, so set the flag just for kicks, + // and throw a test passed exception which will be caught + // and end the test. + theTestPassed = true; + throw new TestPassedException(); + } + theTestPassed = true; + testGeneratedInterrupt = true; + mainThread.interrupt(); + }//pass() + + public static synchronized void fail() + { + //test writer didn't specify why test failed, so give generic + fail( "it just plain failed! :-)" ); + } + + public static synchronized void fail( String whyFailed ) + { + Sysout.println( "The test failed: " + whyFailed ); + Sysout.println( "The test is over, hit Ctl-C to stop Java VM" ); + //check if this called from main thread + if ( mainThread == Thread.currentThread() ) + { + //If main thread, fail now 'cause not sleeping + throw new RuntimeException( whyFailed ); + } + theTestPassed = false; + testGeneratedInterrupt = true; + failureMessage = whyFailed; + mainThread.interrupt(); + }//fail() + +}// class WindowOpacity + +//This exception is used to exit from any level of call nesting +// when it's determined that the test has passed, and immediately +// end the test. +class TestPassedException extends RuntimeException +{ +} + +//*********** End Standard Test Machinery Section ********** + + +//************ Begin classes defined for the test **************** + +// if want to make listeners, here is the recommended place for them, then instantiate +// them in init() + +/* Example of a class which may be written as part of a test +class NewClass implements anInterface + { + static int newVar = 0; + + public void eventDispatched(AWTEvent e) + { + //Counting events to see if we get enough + eventCount++; + + if( eventCount == 20 ) + { + //got enough events, so pass + + WindowOpacity.pass(); + } + else if( tries == 20 ) + { + //tried too many times without getting enough events so fail + + WindowOpacity.fail(); + } + + }// eventDispatched() + + }// NewClass class + +*/ + + +//************** End classes defined for the test ******************* + + + + +/**************************************************** + Standard Test Machinery + DO NOT modify anything below -- it's a standard + chunk of code whose purpose is to make user + interaction uniform, and thereby make it simpler + to read and understand someone else's test. + ****************************************************/ + +/** + This is part of the standard test machinery. + It creates a dialog (with the instructions), and is the interface + for sending text messages to the user. + To print the instructions, send an array of strings to Sysout.createDialog + WithInstructions method. Put one line of instructions per array entry. + To display a message for the tester to see, simply call Sysout.println + with the string to be displayed. + This mimics System.out.println but works within the test harness as well + as standalone. + */ + +class Sysout +{ + private static TestDialog dialog; + + public static void createDialogWithInstructions( String[] instructions ) + { + dialog = new TestDialog( new Frame(), "Instructions" ); + dialog.printInstructions( instructions ); + dialog.setVisible(true); + 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.setVisible(true); + 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 ); + System.out.println(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(); + + setVisible(true); + }// 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" ); + System.out.println(messageIn); + } + +}// TestDialog class diff --git a/jdk/test/sun/java2d/pipe/RegionOps.java b/jdk/test/sun/java2d/pipe/RegionOps.java new file mode 100644 index 00000000000..30f8c223a25 --- /dev/null +++ b/jdk/test/sun/java2d/pipe/RegionOps.java @@ -0,0 +1,510 @@ +/* + * @test %W% %E% + * @bug 6504874 + * @summary This test verifies the operation (and performance) of the + * various CAG operations on the internal Region class. + * @run main RegionOps + */ + +import java.awt.Rectangle; +import java.awt.geom.Area; +import java.awt.geom.AffineTransform; +import java.awt.image.BufferedImage; +import java.util.Random; +import sun.java2d.pipe.Region; + +public class RegionOps { + public static final int DEFAULT_NUMREGIONS = 50; + public static final int DEFAULT_MINSUBRECTS = 1; + public static final int DEFAULT_MAXSUBRECTS = 10; + + public static final int MINCOORD = -20; + public static final int MAXCOORD = 20; + + public static boolean useArea; + + static int numops; + static int numErrors; + static Random rand = new Random(); + static boolean skipCheck; + static boolean countErrors; + + static { + // Instantiating BufferedImage initializes sun.java2d + BufferedImage bimg = + new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB); + } + + public static void usage(String error) { + if (error != null) { + System.err.println("Error: "+error); + } + System.err.println("Usage: java RegionOps "+ + "[-regions N] [-rects M] "+ + "[-[min|max]rects M] [-area]"); + System.err.println(" "+ + "[-add|union] [-sub|diff] "+ + "[-int[ersect]] [-xor]"); + System.err.println(" "+ + "[-seed S] [-nocheck] [-count[errors]] [-help]"); + System.exit((error != null) ? 1 : 0); + } + + public static void error(RectListImpl a, RectListImpl b, String problem) { + System.err.println("Operating on: "+a); + if (b != null) { + System.err.println("and: "+b); + } + if (countErrors) { + System.err.println(problem); + numErrors++; + } else { + throw new RuntimeException(problem); + } + } + + public static void main(String argv[]) { + int numregions = DEFAULT_NUMREGIONS; + int minsubrects = DEFAULT_MINSUBRECTS; + int maxsubrects = DEFAULT_MAXSUBRECTS; + boolean doUnion = false; + boolean doIntersect = false; + boolean doSubtract = false; + boolean doXor = false; + + for (int i = 0; i < argv.length; i++) { + String arg = argv[i]; + if (arg.equalsIgnoreCase("-regions")) { + if (i+1 >= argv.length) { + usage("missing arg for -regions"); + } + numregions = Integer.parseInt(argv[++i]); + } else if (arg.equalsIgnoreCase("-rects")) { + if (i+1 >= argv.length) { + usage("missing arg for -rects"); + } + minsubrects = maxsubrects = Integer.parseInt(argv[++i]); + } else if (arg.equalsIgnoreCase("-minrects")) { + if (i+1 >= argv.length) { + usage("missing arg for -minrects"); + } + minsubrects = Integer.parseInt(argv[++i]); + } else if (arg.equalsIgnoreCase("-maxrects")) { + if (i+1 >= argv.length) { + usage("missing arg for -maxrects"); + } + maxsubrects = Integer.parseInt(argv[++i]); + } else if (arg.equalsIgnoreCase("-area")) { + useArea = true; + } else if (arg.equalsIgnoreCase("-add") || + arg.equalsIgnoreCase("-union")) + { + doUnion = true; + } else if (arg.equalsIgnoreCase("-sub") || + arg.equalsIgnoreCase("-diff")) + { + doSubtract = true; + } else if (arg.equalsIgnoreCase("-int") || + arg.equalsIgnoreCase("-intersect")) + { + doIntersect = true; + } else if (arg.equalsIgnoreCase("-xor")) { + doXor = true; + } else if (arg.equalsIgnoreCase("-seed")) { + if (i+1 >= argv.length) { + usage("missing arg for -seed"); + } + rand.setSeed(Long.decode(argv[++i]).longValue()); + } else if (arg.equalsIgnoreCase("-nocheck")) { + skipCheck = true; + } else if (arg.equalsIgnoreCase("-count") || + arg.equalsIgnoreCase("-counterrors")) + { + countErrors = true; + } else if (arg.equalsIgnoreCase("-help")) { + usage(null); + } else { + usage("Unknown argument: "+arg); + } + } + + if (maxsubrects < minsubrects) { + usage("maximum number of subrectangles less than minimum"); + } + + if (minsubrects <= 0) { + usage("minimum number of subrectangles must be positive"); + } + + if (!doUnion && !doSubtract && !doIntersect && !doXor) { + doUnion = doSubtract = doIntersect = doXor = true; + } + + long start = System.currentTimeMillis(); + RectListImpl rlist[] = new RectListImpl[numregions]; + int totalrects = 0; + for (int i = 0; i < rlist.length; i++) { + RectListImpl rli = RectListImpl.getInstance(); + int numsubrects = + minsubrects + rand.nextInt(maxsubrects - minsubrects + 1); + for (int j = 0; j < numsubrects; j++) { + addRectTo(rli); + totalrects++; + } + rlist[i] = rli; + } + long end = System.currentTimeMillis(); + System.out.println((end-start)+"ms to create "+ + rlist.length+" regions containing "+ + totalrects+" subrectangles"); + + start = System.currentTimeMillis(); + for (int i = 0; i < rlist.length; i++) { + RectListImpl a = rlist[i]; + testTranslate(a); + for (int j = i; j < rlist.length; j++) { + RectListImpl b = rlist[j]; + if (doUnion) testUnion(a, b); + if (doSubtract) testDifference(a, b); + if (doIntersect) testIntersection(a, b); + if (doXor) testExclusiveOr(a, b); + } + } + end = System.currentTimeMillis(); + System.out.println(numops+" ops took "+(end-start)+"ms"); + + if (numErrors > 0) { + throw new RuntimeException(numErrors+" errors encountered"); + } + } + + public static void addRectTo(RectListImpl rli) { + int lox = MINCOORD + rand.nextInt(MAXCOORD - MINCOORD + 1); + int hix = MINCOORD + rand.nextInt(MAXCOORD - MINCOORD + 1); + int loy = MINCOORD + rand.nextInt(MAXCOORD - MINCOORD + 1); + int hiy = MINCOORD + rand.nextInt(MAXCOORD - MINCOORD + 1); + rli.addRect(lox, loy, hix, hiy); + } + + public static void checkEqual(RectListImpl a, RectListImpl b, + String optype) + { + if (a.hashCode() != b.hashCode()) { + error(a, b, "hashcode failed for "+optype); + } + if (!a.equals(b)) { + error(a, b, "equals failed for "+optype); + } + } + + public static void testTranslate(RectListImpl a) { + RectListImpl maxTrans = + a.getTranslation(Integer.MAX_VALUE, Integer.MAX_VALUE) + .getTranslation(Integer.MAX_VALUE, Integer.MAX_VALUE) + .getTranslation(Integer.MAX_VALUE, Integer.MAX_VALUE); + if (!maxTrans.checkTransEmpty()) { + error(maxTrans, null, "overflow translated RectList not empty"); + } + RectListImpl minTrans = + a.getTranslation(Integer.MIN_VALUE, Integer.MIN_VALUE) + .getTranslation(Integer.MIN_VALUE, Integer.MIN_VALUE) + .getTranslation(Integer.MIN_VALUE, Integer.MIN_VALUE); + if (!minTrans.checkTransEmpty()) { + error(minTrans, null, "overflow translated RectList not empty"); + } + testTranslate(a, Integer.MAX_VALUE, Integer.MAX_VALUE, false, + MINCOORD, 0, MINCOORD, 0); + testTranslate(a, Integer.MAX_VALUE, Integer.MIN_VALUE, false, + MINCOORD, 0, 0, MAXCOORD); + testTranslate(a, Integer.MIN_VALUE, Integer.MAX_VALUE, false, + 0, MAXCOORD, MINCOORD, 0); + testTranslate(a, Integer.MIN_VALUE, Integer.MIN_VALUE, false, + 0, MAXCOORD, 0, MAXCOORD); + for (int dy = -100; dy <= 100; dy += 50) { + for (int dx = -100; dx <= 100; dx += 50) { + testTranslate(a, dx, dy, true, + MINCOORD, MAXCOORD, + MINCOORD, MAXCOORD); + } + } + } + + public static void testTranslate(RectListImpl a, int dx, int dy, + boolean isNonDestructive, + int xmin, int xmax, + int ymin, int ymax) + { + RectListImpl theTrans = a.getTranslation(dx, dy); numops++; + if (skipCheck) return; + RectListImpl unTrans = theTrans.getTranslation(-dx, -dy); + if (isNonDestructive) checkEqual(a, unTrans, "Translate"); + for (int x = xmin; x < xmax; x++) { + for (int y = ymin; y < ymax; y++) { + boolean inside = a.contains(x, y); + if (theTrans.contains(x+dx, y+dy) != inside) { + error(a, null, "translation failed for "+ + dx+", "+dy+" at "+x+", "+y); + } + } + } + } + + public static void testUnion(RectListImpl a, RectListImpl b) { + RectListImpl aUb = a.getUnion(b); numops++; + RectListImpl bUa = b.getUnion(a); numops++; + if (skipCheck) return; + checkEqual(aUb, bUa, "Union"); + testUnion(a, b, aUb); + testUnion(a, b, bUa); + } + + public static void testUnion(RectListImpl a, RectListImpl b, + RectListImpl theUnion) + { + for (int x = MINCOORD; x < MAXCOORD; x++) { + for (int y = MINCOORD; y < MAXCOORD; y++) { + boolean inside = (a.contains(x, y) || b.contains(x, y)); + if (theUnion.contains(x, y) != inside) { + error(a, b, "union failed at "+x+", "+y); + } + } + } + } + + public static void testDifference(RectListImpl a, RectListImpl b) { + RectListImpl aDb = a.getDifference(b); numops++; + RectListImpl bDa = b.getDifference(a); numops++; + if (skipCheck) return; + // Note that difference is not commutative so we cannot check equals + // checkEqual(a, b, "Difference"); + testDifference(a, b, aDb); + testDifference(b, a, bDa); + } + + public static void testDifference(RectListImpl a, RectListImpl b, + RectListImpl theDifference) + { + for (int x = MINCOORD; x < MAXCOORD; x++) { + for (int y = MINCOORD; y < MAXCOORD; y++) { + boolean inside = (a.contains(x, y) && !b.contains(x, y)); + if (theDifference.contains(x, y) != inside) { + error(a, b, "difference failed at "+x+", "+y); + } + } + } + } + + public static void testIntersection(RectListImpl a, RectListImpl b) { + RectListImpl aIb = a.getIntersection(b); numops++; + RectListImpl bIa = b.getIntersection(a); numops++; + if (skipCheck) return; + checkEqual(aIb, bIa, "Intersection"); + testIntersection(a, b, aIb); + testIntersection(a, b, bIa); + } + + public static void testIntersection(RectListImpl a, RectListImpl b, + RectListImpl theIntersection) + { + for (int x = MINCOORD; x < MAXCOORD; x++) { + for (int y = MINCOORD; y < MAXCOORD; y++) { + boolean inside = (a.contains(x, y) && b.contains(x, y)); + if (theIntersection.contains(x, y) != inside) { + error(a, b, "intersection failed at "+x+", "+y); + } + } + } + } + + public static void testExclusiveOr(RectListImpl a, RectListImpl b) { + RectListImpl aXb = a.getExclusiveOr(b); numops++; + RectListImpl bXa = b.getExclusiveOr(a); numops++; + if (skipCheck) return; + checkEqual(aXb, bXa, "ExclusiveOr"); + testExclusiveOr(a, b, aXb); + testExclusiveOr(a, b, bXa); + } + + public static void testExclusiveOr(RectListImpl a, RectListImpl b, + RectListImpl theExclusiveOr) + { + for (int x = MINCOORD; x < MAXCOORD; x++) { + for (int y = MINCOORD; y < MAXCOORD; y++) { + boolean inside = (a.contains(x, y) != b.contains(x, y)); + if (theExclusiveOr.contains(x, y) != inside) { + error(a, b, "xor failed at "+x+", "+y); + } + } + } + } + + public abstract static class RectListImpl { + public static RectListImpl getInstance() { + if (useArea) { + return new AreaImpl(); + } else { + return new RegionImpl(); + } + } + + public abstract void addRect(int lox, int loy, int hix, int hiy); + + public abstract RectListImpl getTranslation(int dx, int dy); + + public abstract RectListImpl getIntersection(RectListImpl rli); + public abstract RectListImpl getExclusiveOr(RectListImpl rli); + public abstract RectListImpl getDifference(RectListImpl rli); + public abstract RectListImpl getUnion(RectListImpl rli); + + // Used for making sure that 3xMAX translates yields an empty region + public abstract boolean checkTransEmpty(); + + public abstract boolean contains(int x, int y); + + public abstract int hashCode(); + public abstract boolean equals(RectListImpl other); + } + + public static class AreaImpl extends RectListImpl { + Area theArea; + + public AreaImpl() { + } + + public AreaImpl(Area a) { + theArea = a; + } + + public void addRect(int lox, int loy, int hix, int hiy) { + Area a2 = new Area(new Rectangle(lox, loy, hix-lox, hiy-loy)); + if (theArea == null) { + theArea = a2; + } else { + theArea.add(a2); + } + } + + public RectListImpl getTranslation(int dx, int dy) { + AffineTransform at = AffineTransform.getTranslateInstance(dx, dy); + return new AreaImpl(theArea.createTransformedArea(at)); + } + + public RectListImpl getIntersection(RectListImpl rli) { + Area a2 = new Area(theArea); + a2.intersect(((AreaImpl) rli).theArea); + return new AreaImpl(a2); + } + + public RectListImpl getExclusiveOr(RectListImpl rli) { + Area a2 = new Area(theArea); + a2.exclusiveOr(((AreaImpl) rli).theArea); + return new AreaImpl(a2); + } + + public RectListImpl getDifference(RectListImpl rli) { + Area a2 = new Area(theArea); + a2.subtract(((AreaImpl) rli).theArea); + return new AreaImpl(a2); + } + + public RectListImpl getUnion(RectListImpl rli) { + Area a2 = new Area(theArea); + a2.add(((AreaImpl) rli).theArea); + return new AreaImpl(a2); + } + + // Used for making sure that 3xMAX translates yields an empty region + public boolean checkTransEmpty() { + // Area objects will actually survive 3 MAX translates so just + // pretend that it had the intended effect... + return true; + } + + public boolean contains(int x, int y) { + return theArea.contains(x, y); + } + + public int hashCode() { + // Area does not override hashCode... + return 0; + } + + public boolean equals(RectListImpl other) { + return theArea.equals(((AreaImpl) other).theArea); + } + + public String toString() { + return theArea.toString(); + } + } + + public static class RegionImpl extends RectListImpl { + Region theRegion; + + public RegionImpl() { + } + + public RegionImpl(Region r) { + theRegion = r; + } + + public void addRect(int lox, int loy, int hix, int hiy) { + Region r2 = Region.getInstanceXYXY(lox, loy, hix, hiy); + if (theRegion == null) { + theRegion = r2; + } else { + theRegion = theRegion.getUnion(r2); + } + } + + public RectListImpl getTranslation(int dx, int dy) { + return new RegionImpl(theRegion.getTranslatedRegion(dx, dy)); + } + + public RectListImpl getIntersection(RectListImpl rli) { + Region r2 = ((RegionImpl) rli).theRegion; + r2 = theRegion.getIntersection(r2); + return new RegionImpl(r2); + } + + public RectListImpl getExclusiveOr(RectListImpl rli) { + Region r2 = ((RegionImpl) rli).theRegion; + r2 = theRegion.getExclusiveOr(r2); + return new RegionImpl(r2); + } + + public RectListImpl getDifference(RectListImpl rli) { + Region r2 = ((RegionImpl) rli).theRegion; + r2 = theRegion.getDifference(r2); + return new RegionImpl(r2); + } + + public RectListImpl getUnion(RectListImpl rli) { + Region r2 = ((RegionImpl) rli).theRegion; + r2 = theRegion.getUnion(r2); + return new RegionImpl(r2); + } + + // Used for making sure that 3xMAX translates yields an empty region + public boolean checkTransEmpty() { + // Region objects should be empty after 3 MAX translates... + return theRegion.isEmpty(); + } + + public boolean contains(int x, int y) { + return theRegion.contains(x, y); + } + + public int hashCode() { + return theRegion.hashCode(); + } + + public boolean equals(RectListImpl other) { + return theRegion.equals(((RegionImpl) other).theRegion); + } + + public String toString() { + return theRegion.toString(); + } + } +} From b8af3d50192f8bc98d83f8102f0fd1989f302e32 Mon Sep 17 00:00:00 2001 From: Artem Ananiev Date: Thu, 12 Feb 2009 14:19:06 +0300 Subject: [PATCH 036/292] 6799345: JFC demos threw exception in the Java Console when applets are closed Reviewed-by: alexp, peterz --- .../classes/javax/swing/SwingWorker.java | 50 +++-- .../share/classes/javax/swing/TimerQueue.java | 9 +- .../swing/system/6799345/TestShutdown.java | 203 ++++++++++++++++++ 3 files changed, 234 insertions(+), 28 deletions(-) create mode 100644 jdk/test/javax/swing/system/6799345/TestShutdown.java diff --git a/jdk/src/share/classes/javax/swing/SwingWorker.java b/jdk/src/share/classes/javax/swing/SwingWorker.java index 9eca7d535f6..263284acc4e 100644 --- a/jdk/src/share/classes/javax/swing/SwingWorker.java +++ b/jdk/src/share/classes/javax/swing/SwingWorker.java @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-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 @@ -778,35 +778,33 @@ public abstract class SwingWorker implements RunnableFuture { threadFactory); appContext.put(SwingWorker.class, executorService); - //register shutdown hook for this executor service + // Don't use ShutdownHook here as it's not enough. We should track + // AppContext disposal instead of JVM shutdown, see 6799345 for details final ExecutorService es = executorService; - final Runnable shutdownHook = - new Runnable() { - final WeakReference executorServiceRef = - new WeakReference(es); - public void run() { - final ExecutorService executorService = - executorServiceRef.get(); - if (executorService != null) { - AccessController.doPrivileged( - new PrivilegedAction() { - public Void run() { - executorService.shutdown(); - return null; + appContext.addPropertyChangeListener(AppContext.DISPOSED_PROPERTY_NAME, + new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent pce) { + boolean disposed = (Boolean)pce.getNewValue(); + if (disposed) { + final WeakReference executorServiceRef = + new WeakReference(es); + final ExecutorService executorService = + executorServiceRef.get(); + if (executorService != null) { + AccessController.doPrivileged( + new PrivilegedAction() { + public Void run() { + executorService.shutdown(); + return null; + } } - }); + ); + } } } - }; - - AccessController.doPrivileged( - new PrivilegedAction() { - public Void run() { - Runtime.getRuntime().addShutdownHook( - new Thread(shutdownHook)); - return null; - } - }); + } + ); } return executorService; } diff --git a/jdk/src/share/classes/javax/swing/TimerQueue.java b/jdk/src/share/classes/javax/swing/TimerQueue.java index f68f4e99688..642bc56bac7 100644 --- a/jdk/src/share/classes/javax/swing/TimerQueue.java +++ b/jdk/src/share/classes/javax/swing/TimerQueue.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -191,7 +191,12 @@ class TimerQueue implements Runnable } finally { timer.getLock().unlock(); } - } catch (InterruptedException ignore) { + } catch (InterruptedException ie) { + // Shouldn't ignore InterruptedExceptions here, so AppContext + // is disposed gracefully, see 6799345 for details + if (AppContext.getAppContext().isDisposed()) { + break; + } } } } diff --git a/jdk/test/javax/swing/system/6799345/TestShutdown.java b/jdk/test/javax/swing/system/6799345/TestShutdown.java new file mode 100644 index 00000000000..694df3eac01 --- /dev/null +++ b/jdk/test/javax/swing/system/6799345/TestShutdown.java @@ -0,0 +1,203 @@ +/* + * Copyright 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 6799345 + @summary Tests that no exceptions are thrown from TimerQueue and +SwingWorker on AppContext shutdown + @author art + @run main TestShutdown +*/ + +import java.awt.*; +import java.awt.event.*; + +import java.util.*; + +import javax.swing.*; + +import sun.awt.*; + +public class TestShutdown +{ + private static AppContext targetAppContext; + + private static JFrame f; + private static JTextField tf; + + private static volatile boolean exceptionsOccurred = false; + private static volatile boolean appcontextInitDone = false; + + private static int timerValue = 0; + + public static void main(String[] args) + throws Exception + { + ThreadGroup tg = new TestThreadGroup("TTG"); + Thread t = new Thread(tg, new TestRunnable(), "InitThread"); + t.start(); + + while (!appcontextInitDone) + { + Thread.sleep(500); + } + + targetAppContext.dispose(); + + if (exceptionsOccurred) + { + throw new RuntimeException("Test FAILED: some exceptions occurred"); + } + } + + static void initGUI() + { + f = new JFrame("F"); + f.setBounds(100, 100, 200, 100); + tf = new JTextField("Test"); + f.add(tf); + f.setVisible(true); + } + + static void startGUI() + { + // caret blink Timer + tf.requestFocusInWindow(); + + // misc Timer + ActionListener al = new ActionListener() + { + @Override + public void actionPerformed(ActionEvent ae) + { + System.out.println("Timer tick: " + timerValue++); + } + }; + new javax.swing.Timer(30, al).start(); + } + + static class TestThreadGroup extends ThreadGroup + { + public TestThreadGroup(String name) + { + super(name); + } + + @Override + public synchronized void uncaughtException(Thread thread, Throwable t) + { + if (t instanceof ThreadDeath) + { + // this one is expected, rethrow + throw (ThreadDeath)t; + } + System.err.println("Test FAILED: an exception is caught in the " + + "target thread group on thread " + thread.getName()); + t.printStackTrace(System.err); + exceptionsOccurred = true; + } + } + + static class TestRunnable implements Runnable + { + @Override + public void run() + { + SunToolkit stk = (SunToolkit)Toolkit.getDefaultToolkit(); + targetAppContext = stk.createNewAppContext(); + + // create and show frame and text field + SwingUtilities.invokeLater(new Runnable() + { + @Override + public void run() + { + initGUI(); + } + }); + stk.realSync(); + + // start some Timers + SwingUtilities.invokeLater(new Runnable() + { + @Override + public void run() + { + startGUI(); + } + }); + stk.realSync(); + + // start multiple SwingWorkers + while (!Thread.interrupted()) + { + try + { + new TestSwingWorker().execute(); + Thread.sleep(40); + } + catch (Exception e) + { + // exception here is expected, skip + break; + } + } + } + } + + static class TestSwingWorker extends SwingWorker + { + @Override + public String doInBackground() + { + Random r = new Random(); + for (int i = 0; i < 10; i++) + { + try + { + int delay = r.nextInt() % 50; + Thread.sleep(delay); + publish(delay); + } + catch (Exception z) + { + break; + } + } + if (!appcontextInitDone) + { + appcontextInitDone = true; + } + return "Done"; + } + + @Override + public void process(java.util.List chunks) + { + for (Integer i : chunks) + { + System.err.println("Processed: " + i); + } + } + } +} From 3ca96fa4452cd6ae18e07df6a10740c362c1e790 Mon Sep 17 00:00:00 2001 From: Artem Ananiev Date: Thu, 12 Feb 2009 17:27:39 +0300 Subject: [PATCH 037/292] 6804680: Solaris AMD64 build fails after the fix for 6633275/7 Addition to the fix for 6633275 Reviewed-by: yan --- .../classes/sun/awt/X11/generator/sizes.64-solaris-i386 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/jdk/src/solaris/classes/sun/awt/X11/generator/sizes.64-solaris-i386 b/jdk/src/solaris/classes/sun/awt/X11/generator/sizes.64-solaris-i386 index 38ec9071b05..f6e3beb3f1c 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/generator/sizes.64-solaris-i386 +++ b/jdk/src/solaris/classes/sun/awt/X11/generator/sizes.64-solaris-i386 @@ -774,7 +774,8 @@ AwtGraphicsConfigData.monoPixmapGC 128 AwtGraphicsConfigData.pixelStride 136 AwtGraphicsConfigData.color_data 144 AwtGraphicsConfigData.glxInfo 152 -AwtGraphicsConfigData 160 +AwtGraphicsConfigData.isTranslucencySupported 160 +AwtGraphicsConfigData 168 XColor.pixel 0 XColor.red 8 XColor.green 10 From ce1993bf8e883ea3571235bd6c314f01aa0baf57 Mon Sep 17 00:00:00 2001 From: Dmitry Cherepanov Date: Thu, 12 Feb 2009 18:24:35 +0300 Subject: [PATCH 038/292] 6724890: Deadlock between AWT-EventQueue-1 and AWT-XAWT threads during IDE start Reviewed-by: art, ant --- jdk/src/share/classes/java/awt/Frame.java | 36 ++++++++++++++----- .../share/classes/sun/awt/AWTAccessor.java | 36 +++++++++++++++++++ .../classes/sun/awt/X11/XFramePeer.java | 20 ++++++++--- .../classes/sun/awt/windows/WFramePeer.java | 29 ++++++++++++--- .../windows/native/sun/windows/awt_Frame.cpp | 35 ++++++++++++++---- .../windows/native/sun/windows/awt_Frame.h | 12 +++---- 6 files changed, 138 insertions(+), 30 deletions(-) diff --git a/jdk/src/share/classes/java/awt/Frame.java b/jdk/src/share/classes/java/awt/Frame.java index 290f7f9bb3d..761b9b8420b 100644 --- a/jdk/src/share/classes/java/awt/Frame.java +++ b/jdk/src/share/classes/java/awt/Frame.java @@ -36,6 +36,7 @@ import java.io.ObjectInputStream; import java.io.IOException; import sun.awt.AppContext; import sun.awt.SunToolkit; +import sun.awt.AWTAccessor; import java.lang.ref.WeakReference; import javax.accessibility.*; @@ -738,11 +739,15 @@ public class Frame extends Window implements MenuContainer { * @since 1.4 * @see java.awt.Window#addWindowStateListener */ - public synchronized void setExtendedState(int state) { + public void setExtendedState(int state) { if ( !isFrameStateSupported( state ) ) { return; } - this.state = state; + synchronized (getObjectLock()) { + this.state = state; + } + // peer.setState must be called outside of object lock + // synchronization block to avoid possible deadlock FramePeer peer = (FramePeer)this.peer; if (peer != null) { peer.setState(state); @@ -804,12 +809,27 @@ public class Frame extends Window implements MenuContainer { * @see #setExtendedState(int) * @since 1.4 */ - public synchronized int getExtendedState() { - FramePeer peer = (FramePeer)this.peer; - if (peer != null) { - state = peer.getState(); + public int getExtendedState() { + synchronized (getObjectLock()) { + return state; } - return state; + } + + static { + AWTAccessor.setFrameAccessor( + new AWTAccessor.FrameAccessor() { + public void setExtendedState(Frame frame, int state) { + synchronized(frame.getObjectLock()) { + frame.state = state; + } + } + public int getExtendedState(Frame frame) { + synchronized(frame.getObjectLock()) { + return frame.state; + } + } + } + ); } /** @@ -967,7 +987,7 @@ public class Frame extends Window implements MenuContainer { if (resizable) { str += ",resizable"; } - getExtendedState(); // sync with peer + int state = getExtendedState(); if (state == NORMAL) { str += ",normal"; } diff --git a/jdk/src/share/classes/sun/awt/AWTAccessor.java b/jdk/src/share/classes/sun/awt/AWTAccessor.java index 94d0bb25f0b..2145f0f10a4 100644 --- a/jdk/src/share/classes/sun/awt/AWTAccessor.java +++ b/jdk/src/share/classes/sun/awt/AWTAccessor.java @@ -132,6 +132,20 @@ public final class AWTAccessor { boolean isSystemGenerated(AWTEvent ev); } + /* + * An accessor for the java.awt.Frame class. + */ + public interface FrameAccessor { + /* + * Sets the state of this frame. + */ + void setExtendedState(Frame frame, int state); + /* + * Gets the state of this frame. + */ + int getExtendedState(Frame frame); + } + /* * The java.awt.Component class accessor object. */ @@ -147,6 +161,11 @@ public final class AWTAccessor { */ private static AWTEventAccessor awtEventAccessor; + /* + * The java.awt.Frame class accessor object. + */ + private static FrameAccessor frameAccessor; + /* * Set an accessor object for the java.awt.Component class. */ @@ -195,4 +214,21 @@ public final class AWTAccessor { public static AWTEventAccessor getAWTEventAccessor() { return awtEventAccessor; } + + /* + * Set an accessor object for the java.awt.Frame class. + */ + public static void setFrameAccessor(FrameAccessor fa) { + frameAccessor = fa; + } + + /* + * Retrieve the accessor object for the java.awt.Frame class. + */ + public static FrameAccessor getFrameAccessor() { + if (frameAccessor == null) { + unsafe.ensureClassInitialized(Frame.class); + } + return frameAccessor; + } } diff --git a/jdk/src/solaris/classes/sun/awt/X11/XFramePeer.java b/jdk/src/solaris/classes/sun/awt/X11/XFramePeer.java index 3820bf61013..22cb163ebbb 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XFramePeer.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XFramePeer.java @@ -36,6 +36,7 @@ import java.awt.Rectangle; import java.awt.peer.FramePeer; import java.util.logging.Level; import java.util.logging.Logger; +import sun.awt.AWTAccessor; class XFramePeer extends XDecoratedPeer implements FramePeer { private static Logger log = Logger.getLogger("sun.awt.X11.XFramePeer"); @@ -231,13 +232,19 @@ class XFramePeer extends XDecoratedPeer implements FramePeer { } } - public int getState() { return state; } + public int getState() { + synchronized(getStateLock()) { + return state; + } + } public void setState(int newState) { - if (!isShowing()) { - stateLog.finer("Frame is not showing"); - state = newState; - return; + synchronized(getStateLock()) { + if (!isShowing()) { + stateLog.finer("Frame is not showing"); + state = newState; + return; + } } changeState(newState); } @@ -296,6 +303,9 @@ class XFramePeer extends XDecoratedPeer implements FramePeer { int old_state = state; state = newState; + // sync target with peer + AWTAccessor.getFrameAccessor().setExtendedState((Frame)target, state); + if ((changed & Frame.ICONIFIED) != 0) { if ((state & Frame.ICONIFIED) != 0) { stateLog.finer("Iconified"); diff --git a/jdk/src/windows/classes/sun/awt/windows/WFramePeer.java b/jdk/src/windows/classes/sun/awt/windows/WFramePeer.java index 2353daf3d29..79bf6b77e41 100644 --- a/jdk/src/windows/classes/sun/awt/windows/WFramePeer.java +++ b/jdk/src/windows/classes/sun/awt/windows/WFramePeer.java @@ -25,27 +25,46 @@ package sun.awt.windows; import java.util.Vector; + import java.awt.*; import java.awt.peer.*; import java.awt.image.ImageObserver; -import sun.awt.image.ImageRepresentation; -import sun.awt.image.IntegerComponentRaster; -import sun.awt.image.ToolkitImage; + import java.awt.image.Raster; import java.awt.image.DataBuffer; import java.awt.image.DataBufferInt; import java.awt.image.BufferedImage; -import sun.awt.im.*; -import sun.awt.Win32GraphicsDevice; + import java.awt.image.ColorModel; +import sun.awt.image.ImageRepresentation; +import sun.awt.image.IntegerComponentRaster; +import sun.awt.image.ToolkitImage; +import sun.awt.im.*; +import sun.awt.Win32GraphicsDevice; +import sun.awt.AWTAccessor; class WFramePeer extends WWindowPeer implements FramePeer { + static { + initIDs(); + } + + // initialize JNI field and method IDs + private static native void initIDs(); + // FramePeer implementation public native void setState(int state); public native int getState(); + // sync target and peer + public void setExtendedState(int state) { + AWTAccessor.getFrameAccessor().setExtendedState((Frame)target, state); + } + public int getExtendedState() { + return AWTAccessor.getFrameAccessor().getExtendedState((Frame)target); + } + // Convenience methods to save us from trouble of extracting // Rectangle fields in native code. private native void setMaximizedBounds(int x, int y, int w, int h); diff --git a/jdk/src/windows/native/sun/windows/awt_Frame.cpp b/jdk/src/windows/native/sun/windows/awt_Frame.cpp index 60738e69357..888ed50b5cb 100644 --- a/jdk/src/windows/native/sun/windows/awt_Frame.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Frame.cpp @@ -90,8 +90,10 @@ struct BlockedThreadStruct { */ jfieldID AwtFrame::handleID; -jfieldID AwtFrame::stateID; + jfieldID AwtFrame::undecoratedID; +jmethodID AwtFrame::getExtendedStateMID; +jmethodID AwtFrame::setExtendedStateMID; jmethodID AwtFrame::activateEmbeddingTopLevelMID; @@ -232,7 +234,7 @@ AwtFrame* AwtFrame::Create(jobject self, jobject parent) frame->InitPeerGraphicsConfig(env, self); AwtToolkit::GetInstance().RegisterEmbedderProcessId(hwndParent); } else { - jint state = env->GetIntField(target, AwtFrame::stateID); + jint state = env->CallIntMethod(self, AwtFrame::getExtendedStateMID); DWORD exStyle; DWORD style; @@ -883,6 +885,11 @@ MsgRouting AwtFrame::WmSize(UINT type, int w, int h) if (changed != 0) { DTRACE_PRINTLN2("AwtFrame::WmSize: reporting state change %x -> %x", oldState, newState); + + // sync target with peer + JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); + env->CallVoidMethod(GetPeer(env), AwtFrame::setExtendedStateMID, newState); + // report (de)iconification to old clients if (changed & java_awt_Frame_ICONIFIED) { if (newState & java_awt_Frame_ICONIFIED) { @@ -1594,7 +1601,7 @@ void AwtFrame::_NotifyModalBlocked(void *param) extern "C" { /* - * Class: sun_awt_windows_WFramePeer + * Class: java_awt_Frame * Method: initIDs * Signature: ()V */ @@ -1603,15 +1610,31 @@ Java_java_awt_Frame_initIDs(JNIEnv *env, jclass cls) { TRY; - AwtFrame::stateID = env->GetFieldID(cls, "state", "I"); - DASSERT(AwtFrame::stateID != NULL); - AwtFrame::undecoratedID = env->GetFieldID(cls,"undecorated","Z"); DASSERT(AwtFrame::undecoratedID != NULL); CATCH_BAD_ALLOC; } +/* + * Class: sun_awt_windows_WFramePeer + * Method: initIDs + * Signature: ()V + */ +JNIEXPORT void JNICALL +Java_sun_awt_windows_WFramePeer_initIDs(JNIEnv *env, jclass cls) +{ + TRY; + + AwtFrame::setExtendedStateMID = env->GetMethodID(cls, "setExtendedState", "(I)V"); + AwtFrame::getExtendedStateMID = env->GetMethodID(cls, "getExtendedState", "()I"); + + DASSERT(AwtFrame::setExtendedStateMID); + DASSERT(AwtFrame::getExtendedStateMID); + + CATCH_BAD_ALLOC; +} + /* * Class: sun_awt_windows_WFramePeer * Method: setState diff --git a/jdk/src/windows/native/sun/windows/awt_Frame.h b/jdk/src/windows/native/sun/windows/awt_Frame.h index 3634f95924d..65a21655a03 100644 --- a/jdk/src/windows/native/sun/windows/awt_Frame.h +++ b/jdk/src/windows/native/sun/windows/awt_Frame.h @@ -48,14 +48,14 @@ public: FRAME_SETMENUBAR }; - /* int handle field for sun.awt.windows.WEmbeddedFrame */ + /* java.awt.Frame fields and method IDs */ + static jfieldID undecoratedID; + + /* sun.awt.windows.WEmbeddedFrame fields and method IDs */ static jfieldID handleID; - /* int state field for java.awt.Frame */ - static jfieldID stateID; - - /* boolean undecorated field for java.awt.Frame */ - static jfieldID undecoratedID; + static jmethodID setExtendedStateMID; + static jmethodID getExtendedStateMID; /* method id for WEmbeddedFrame.requestActivate() method */ static jmethodID activateEmbeddingTopLevelMID; From 022fb387d9bf5ea16e6599f2f5b55e6802c21310 Mon Sep 17 00:00:00 2001 From: Artem Ananiev Date: Tue, 17 Feb 2009 10:42:12 +0300 Subject: [PATCH 039/292] 6806035: Fix for 6804680 is incomplete Reviewed-by: yan --- .../solaris/classes/sun/awt/X11/generator/sizes.64-solaris-i386 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jdk/src/solaris/classes/sun/awt/X11/generator/sizes.64-solaris-i386 b/jdk/src/solaris/classes/sun/awt/X11/generator/sizes.64-solaris-i386 index f6e3beb3f1c..29d6603890e 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/generator/sizes.64-solaris-i386 +++ b/jdk/src/solaris/classes/sun/awt/X11/generator/sizes.64-solaris-i386 @@ -774,7 +774,7 @@ AwtGraphicsConfigData.monoPixmapGC 128 AwtGraphicsConfigData.pixelStride 136 AwtGraphicsConfigData.color_data 144 AwtGraphicsConfigData.glxInfo 152 -AwtGraphicsConfigData.isTranslucencySupported 160 +AwtGraphicsConfigData.isTranslucencySupported 160 AwtGraphicsConfigData 168 XColor.pixel 0 XColor.red 8 From 0d79cc7529927349921b4e825f529cb9160beb72 Mon Sep 17 00:00:00 2001 From: Dmitry Cherepanov Date: Tue, 17 Feb 2009 14:27:03 +0300 Subject: [PATCH 040/292] 6769607: PIT : Modal frame hangs for a while for few seconds in 6u12 b01 pit build Reviewed-by: art, anthony --- jdk/src/share/classes/java/awt/Window.java | 6 +- .../windows/native/sun/windows/awt_Dialog.cpp | 100 ++++++++++-------- .../windows/native/sun/windows/awt_Dialog.h | 3 + 3 files changed, 64 insertions(+), 45 deletions(-) diff --git a/jdk/src/share/classes/java/awt/Window.java b/jdk/src/share/classes/java/awt/Window.java index 64c611ac3c3..e1ff8db14c3 100644 --- a/jdk/src/share/classes/java/awt/Window.java +++ b/jdk/src/share/classes/java/awt/Window.java @@ -687,9 +687,9 @@ public class Window extends Container implements Accessible { } if (peer == null) { peer = getToolkit().createWindow(this); - synchronized (allWindows) { - allWindows.add(this); - } + } + synchronized (allWindows) { + allWindows.add(this); } super.addNotify(); } diff --git a/jdk/src/windows/native/sun/windows/awt_Dialog.cpp b/jdk/src/windows/native/sun/windows/awt_Dialog.cpp index ecf74549d46..77f80b7fac6 100644 --- a/jdk/src/windows/native/sun/windows/awt_Dialog.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Dialog.cpp @@ -230,25 +230,8 @@ LRESULT CALLBACK AwtDialog::ModalFilterProc(int code, if (::IsIconic(hWnd)) { ::ShowWindow(hWnd, SW_RESTORE); } - HWND topMostBlocker = blocker; - HWND toolkitHWnd = AwtToolkit::GetInstance().GetHWnd(); - while (::IsWindow(blocker)) { - topMostBlocker = blocker; - // fix for 6494032: restore the blocker if it was minimized - // together with its parent frame; in such cases the check - // ::IsIconic() for the blocker returns false, so we use - // ::IsWindowVisible() instead - if (!::IsWindowVisible(topMostBlocker) && - (topMostBlocker != toolkitHWnd)) - { - ::ShowWindow(topMostBlocker, SW_SHOWNA); - } - ::BringWindowToTop(blocker); - blocker = AwtWindow::GetModalBlocker(blocker); - } - if (topMostBlocker != toolkitHWnd) { - ::SetForegroundWindow(topMostBlocker); - } + PopupAllDialogs(blocker, TRUE, ::GetForegroundWindow(), FALSE); + // return 1 to prevent the system from allowing the operation return 1; } return CallNextHookEx(0, code, wParam, lParam); @@ -271,30 +254,11 @@ LRESULT CALLBACK AwtDialog::MouseHookProc(int nCode, (wParam == WM_NCRBUTTONDOWN)) { HWND blocker = AwtWindow::GetModalBlocker(AwtComponent::GetTopLevelParentForWindow(hWnd)); - HWND topMostBlocker = blocker; - HWND prevForegroundWindow = ::GetForegroundWindow(); if (::IsWindow(blocker)) { - ::BringWindowToTop(hWnd); - } - while (::IsWindow(blocker)) { - topMostBlocker = blocker; - ::BringWindowToTop(blocker); - blocker = AwtWindow::GetModalBlocker(blocker); - } - if (::IsWindow(topMostBlocker)) { - // no beep/flash if the mouse was clicked in the taskbar menu - // or the dialog is currently inactive - if ((::WindowFromPoint(mhs->pt) == hWnd) && - (prevForegroundWindow == topMostBlocker)) - { - ::MessageBeep(MB_OK); - // some heuristics: 3 times x 64 milliseconds - AwtWindow::FlashWindowEx(topMostBlocker, 3, 64, FLASHW_CAPTION); - } - if (topMostBlocker != AwtToolkit::GetInstance().GetHWnd()) { - ::BringWindowToTop(topMostBlocker); - ::SetForegroundWindow(topMostBlocker); - } + BOOL onTaskbar = !(::WindowFromPoint(mhs->pt) == hWnd); + PopupAllDialogs(hWnd, FALSE, ::GetForegroundWindow(), onTaskbar); + // return a nonzero value to prevent the system from passing + // the message to the target window procedure return 1; } } @@ -303,6 +267,58 @@ LRESULT CALLBACK AwtDialog::MouseHookProc(int nCode, return CallNextHookEx(0, nCode, wParam, lParam); } +/* + * The function goes through the heirarchy of the blocker dialogs and + * popups all the dialogs. Note that the function starts from the top + * blocker dialog and goes down to the dialog which is the bottom dialog. + * Using another traversal may cause to the flickering issue as a bottom + * dialog will cover a top dialog for some period of time. + */ +void AwtDialog::PopupAllDialogs(HWND dialog, BOOL isModalHook, HWND prevFGWindow, BOOL onTaskbar) +{ + HWND blocker = AwtWindow::GetModalBlocker(dialog); + BOOL isBlocked = ::IsWindow(blocker); + if (isBlocked) { + PopupAllDialogs(blocker, isModalHook, prevFGWindow, onTaskbar); + } + PopupOneDialog(dialog, blocker, isModalHook, prevFGWindow, onTaskbar); +} + +/* + * The function popups the dialog, it distinguishes non-blocked dialogs + * and activates the dialogs (sets as foreground window). If the dialog is + * blocked, then it changes the Z-order of the dialog. + */ +void AwtDialog::PopupOneDialog(HWND dialog, HWND blocker, BOOL isModalHook, HWND prevFGWindow, BOOL onTaskbar) +{ + if (dialog == AwtToolkit::GetInstance().GetHWnd()) { + return; + } + + // fix for 6494032 + if (isModalHook && !::IsWindowVisible(dialog)) { + ::ShowWindow(dialog, SW_SHOWNA); + } + + BOOL isBlocked = ::IsWindow(blocker); + UINT flags = SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE; + + if (isBlocked) { + ::SetWindowPos(dialog, blocker, 0, 0, 0, 0, flags); + } else { + ::SetWindowPos(dialog, HWND_TOP, 0, 0, 0, 0, flags); + // no beep/flash if the mouse was clicked in the taskbar menu + // or the dialog is currently inactive + if (!isModalHook && !onTaskbar && (dialog == prevFGWindow)) { + ::MessageBeep(MB_OK); + // some heuristics: 3 times x 64 milliseconds + AwtWindow::FlashWindowEx(dialog, 3, 64, FLASHW_CAPTION); + } + ::BringWindowToTop(dialog); + ::SetForegroundWindow(dialog); + } +} + LRESULT CALLBACK AwtDialog::MouseHookProc_NonTT(int nCode, WPARAM wParam, LPARAM lParam) { diff --git a/jdk/src/windows/native/sun/windows/awt_Dialog.h b/jdk/src/windows/native/sun/windows/awt_Dialog.h index 41ab6ad05b0..5f181e63422 100644 --- a/jdk/src/windows/native/sun/windows/awt_Dialog.h +++ b/jdk/src/windows/native/sun/windows/awt_Dialog.h @@ -113,6 +113,9 @@ private: */ static void ModalPerformActivation(HWND hWnd); + static void PopupAllDialogs(HWND dialog, BOOL isModalHook, HWND prevFGWindow, BOOL onTaskbar); + static void PopupOneDialog(HWND dialog, HWND blocker, BOOL isModalHook, HWND prevFGWindow, BOOL onTaskbar); + public: // WH_CBT hook procedure used in modality, prevents modal From e05fd5d6f5d9aa6aac7874903c290400c2d2501a Mon Sep 17 00:00:00 2001 From: Dmitry Cherepanov Date: Tue, 17 Feb 2009 14:30:52 +0300 Subject: [PATCH 041/292] 6792023: Print suspends on Windows 2000 Pro since 6u12 b01 Reviewed-by: art, anthony --- .../windows/native/sun/windows/awt_FileDialog.cpp | 12 ++++++++---- .../windows/native/sun/windows/awt_PrintDialog.cpp | 12 ++++++++---- jdk/src/windows/native/sun/windows/awt_PrintJob.cpp | 12 ++++++++---- jdk/src/windows/native/sun/windows/awt_Window.h | 1 + 4 files changed, 25 insertions(+), 12 deletions(-) diff --git a/jdk/src/windows/native/sun/windows/awt_FileDialog.cpp b/jdk/src/windows/native/sun/windows/awt_FileDialog.cpp index 84339e40eee..080e8d42741 100644 --- a/jdk/src/windows/native/sun/windows/awt_FileDialog.cpp +++ b/jdk/src/windows/native/sun/windows/awt_FileDialog.cpp @@ -101,7 +101,8 @@ LRESULT CALLBACK FileDialogWndProc(HWND hWnd, UINT message, } } - return ComCtl32Util::GetInstance().DefWindowProc(NULL, hWnd, message, wParam, lParam); + WNDPROC lpfnWndProc = (WNDPROC)(::GetProp(hWnd, NativeDialogWndProcProp)); + return ComCtl32Util::GetInstance().DefWindowProc(lpfnWndProc, hWnd, message, wParam, lParam); } static UINT_PTR CALLBACK @@ -135,16 +136,19 @@ FileDialogHookProc(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam) } // subclass dialog's parent to receive additional messages - ComCtl32Util::GetInstance().SubclassHWND(parent, - FileDialogWndProc); + WNDPROC lpfnWndProc = ComCtl32Util::GetInstance().SubclassHWND(parent, + FileDialogWndProc); + ::SetProp(parent, NativeDialogWndProcProp, reinterpret_cast(lpfnWndProc)); break; } case WM_DESTROY: { + WNDPROC lpfnWndProc = (WNDPROC)(::GetProp(parent, NativeDialogWndProcProp)); ComCtl32Util::GetInstance().UnsubclassHWND(parent, FileDialogWndProc, - NULL); + lpfnWndProc); ::RemoveProp(parent, ModalDialogPeerProp); + ::RemoveProp(parent, NativeDialogWndProcProp); break; } case WM_NOTIFY: { diff --git a/jdk/src/windows/native/sun/windows/awt_PrintDialog.cpp b/jdk/src/windows/native/sun/windows/awt_PrintDialog.cpp index 762ae2673eb..12b208b9493 100644 --- a/jdk/src/windows/native/sun/windows/awt_PrintDialog.cpp +++ b/jdk/src/windows/native/sun/windows/awt_PrintDialog.cpp @@ -65,7 +65,8 @@ LRESULT CALLBACK PrintDialogWndProc(HWND hWnd, UINT message, } } - return ComCtl32Util::GetInstance().DefWindowProc(NULL, hWnd, message, wParam, lParam); + WNDPROC lpfnWndProc = (WNDPROC)(::GetProp(hWnd, NativeDialogWndProcProp)); + return ComCtl32Util::GetInstance().DefWindowProc(lpfnWndProc, hWnd, message, wParam, lParam); } static UINT_PTR CALLBACK @@ -99,16 +100,19 @@ PrintDialogHookProc(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam) } // subclass dialog's parent to receive additional messages - ComCtl32Util::GetInstance().SubclassHWND(hdlg, - PrintDialogWndProc); + WNDPROC lpfnWndProc = ComCtl32Util::GetInstance().SubclassHWND(hdlg, + PrintDialogWndProc); + ::SetProp(hdlg, NativeDialogWndProcProp, reinterpret_cast(lpfnWndProc)); break; } case WM_DESTROY: { + WNDPROC lpfnWndProc = (WNDPROC)(::GetProp(hdlg, NativeDialogWndProcProp)); ComCtl32Util::GetInstance().UnsubclassHWND(hdlg, PrintDialogWndProc, - NULL); + lpfnWndProc); ::RemoveProp(hdlg, ModalDialogPeerProp); + ::RemoveProp(hdlg, NativeDialogWndProcProp); break; } } diff --git a/jdk/src/windows/native/sun/windows/awt_PrintJob.cpp b/jdk/src/windows/native/sun/windows/awt_PrintJob.cpp index 9136b786412..c3339778695 100644 --- a/jdk/src/windows/native/sun/windows/awt_PrintJob.cpp +++ b/jdk/src/windows/native/sun/windows/awt_PrintJob.cpp @@ -2885,7 +2885,8 @@ LRESULT CALLBACK PageDialogWndProc(HWND hWnd, UINT message, } } - return ComCtl32Util::GetInstance().DefWindowProc(NULL, hWnd, message, wParam, lParam); + WNDPROC lpfnWndProc = (WNDPROC)(::GetProp(hWnd, NativeDialogWndProcProp)); + return ComCtl32Util::GetInstance().DefWindowProc(lpfnWndProc, hWnd, message, wParam, lParam); } /** @@ -2919,16 +2920,19 @@ static UINT CALLBACK pageDlgHook(HWND hDlg, UINT msg, } // subclass dialog's parent to receive additional messages - ComCtl32Util::GetInstance().SubclassHWND(hDlg, - PageDialogWndProc); + WNDPROC lpfnWndProc = ComCtl32Util::GetInstance().SubclassHWND(hDlg, + PageDialogWndProc); + ::SetProp(hDlg, NativeDialogWndProcProp, reinterpret_cast(lpfnWndProc)); break; } case WM_DESTROY: { + WNDPROC lpfnWndProc = (WNDPROC)(::GetProp(hDlg, NativeDialogWndProcProp)); ComCtl32Util::GetInstance().UnsubclassHWND(hDlg, PageDialogWndProc, - NULL); + lpfnWndProc); ::RemoveProp(hDlg, ModalDialogPeerProp); + ::RemoveProp(hDlg, NativeDialogWndProcProp); break; } } diff --git a/jdk/src/windows/native/sun/windows/awt_Window.h b/jdk/src/windows/native/sun/windows/awt_Window.h index a3d57db7b2d..17f05ec164a 100644 --- a/jdk/src/windows/native/sun/windows/awt_Window.h +++ b/jdk/src/windows/native/sun/windows/awt_Window.h @@ -34,6 +34,7 @@ // property name tagging windows disabled by modality static LPCTSTR ModalBlockerProp = TEXT("SunAwtModalBlockerProp"); static LPCTSTR ModalDialogPeerProp = TEXT("SunAwtModalDialogPeerProp"); +static LPCTSTR NativeDialogWndProcProp = TEXT("SunAwtNativeDialogWndProcProp"); #ifndef WH_MOUSE_LL #define WH_MOUSE_LL 14 From c59552fc2d58cc2393a9f865e2ae13c1f926d5a1 Mon Sep 17 00:00:00 2001 From: Dmitry Cherepanov Date: Tue, 17 Feb 2009 14:44:58 +0300 Subject: [PATCH 042/292] 6723941: Crash in sun.awt.windows.WToolkit.eventLoop() Reviewed-by: art, ant --- jdk/src/windows/native/sun/windows/awt_Frame.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/jdk/src/windows/native/sun/windows/awt_Frame.cpp b/jdk/src/windows/native/sun/windows/awt_Frame.cpp index 888ed50b5cb..94bb0050c9e 100644 --- a/jdk/src/windows/native/sun/windows/awt_Frame.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Frame.cpp @@ -321,7 +321,8 @@ LRESULT CALLBACK AwtFrame::ProxyWindowProc(HWND hwnd, UINT message, AwtComponent::GetComponentImpl(::GetParent(hwnd)); if (!parent || parent->GetProxyFocusOwner() != hwnd || - message == AwtComponent::WmAwtIsComponent) + message == AwtComponent::WmAwtIsComponent || + message == WM_GETOBJECT) { return ComCtl32Util::GetInstance().DefWindowProc(NULL, hwnd, message, wParam, lParam); } From f1847266b7f75eff1d0ec63a15c71b4666beca18 Mon Sep 17 00:00:00 2001 From: Jon Masamitsu Date: Tue, 17 Feb 2009 15:35:58 -0800 Subject: [PATCH 043/292] 6786346: intermittent Internal Error (src/share/vm/memory/cardTableModRefBS.cpp:226) Two assertions were incorrectly composed. Reviewed-by: tonyp --- .../src/share/vm/memory/cardTableModRefBS.cpp | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/hotspot/src/share/vm/memory/cardTableModRefBS.cpp b/hotspot/src/share/vm/memory/cardTableModRefBS.cpp index ee9ed1fc8be..a47d62b7f1a 100644 --- a/hotspot/src/share/vm/memory/cardTableModRefBS.cpp +++ b/hotspot/src/share/vm/memory/cardTableModRefBS.cpp @@ -217,15 +217,28 @@ void CardTableModRefBS::resize_covered_region(MemRegion new_region) { (HeapWord*) align_size_up((uintptr_t)new_end, _page_size); assert(new_end_aligned >= (HeapWord*) new_end, "align up, but less"); + // Check the other regions (excludes "ind") to ensure that + // the new_end_aligned does not intrude onto the committed + // space of another region. int ri = 0; for (ri = 0; ri < _cur_covered_regions; ri++) { if (ri != ind) { if (_committed[ri].contains(new_end_aligned)) { - assert((new_end_aligned >= _committed[ri].start()) && - (_committed[ri].start() > _committed[ind].start()), + // The prior check included in the assert + // (new_end_aligned >= _committed[ri].start()) + // is redundant with the "contains" test. + // Any region containing the new end + // should start at or beyond the region found (ind) + // for the new end (committed regions are not expected to + // be proper subsets of other committed regions). + assert(_committed[ri].start() >= _committed[ind].start(), "New end of committed region is inconsistent"); new_end_aligned = _committed[ri].start(); - assert(new_end_aligned > _committed[ind].start(), + // new_end_aligned can be equal to the start of its + // committed region (i.e., of "ind") if a second + // region following "ind" also start at the same location + // as "ind". + assert(new_end_aligned >= _committed[ind].start(), "New end of committed region is before start"); debug_only(collided = true;) // Should only collide with 1 region From 73e8e582ba6980d01e17f5b480b0e4b94beaa374 Mon Sep 17 00:00:00 2001 From: Vladimir Kozlov Date: Wed, 18 Feb 2009 13:53:42 -0800 Subject: [PATCH 044/292] 6807084: AutoBox elimination is broken with compressed oops Add checks for DecodeN nodes into AutoBox elimination code. Reviewed-by: never --- hotspot/src/share/vm/opto/memnode.cpp | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/hotspot/src/share/vm/opto/memnode.cpp b/hotspot/src/share/vm/opto/memnode.cpp index 9c79f2ec936..95e41e0d592 100644 --- a/hotspot/src/share/vm/opto/memnode.cpp +++ b/hotspot/src/share/vm/opto/memnode.cpp @@ -1066,11 +1066,11 @@ Node* LoadNode::eliminate_autobox(PhaseGVN* phase) { break; } } - LoadNode* load = NULL; - if (allocation != NULL && base->in(load_index)->is_Load()) { - load = base->in(load_index)->as_Load(); - } - if (load != NULL && in(Memory)->is_Phi() && in(Memory)->in(0) == base->in(0)) { + bool has_load = ( allocation != NULL && + (base->in(load_index)->is_Load() || + base->in(load_index)->is_DecodeN() && + base->in(load_index)->in(1)->is_Load()) ); + if (has_load && in(Memory)->is_Phi() && in(Memory)->in(0) == base->in(0)) { // Push the loads from the phi that comes from valueOf up // through it to allow elimination of the loads and the recovery // of the original value. @@ -1106,11 +1106,20 @@ Node* LoadNode::eliminate_autobox(PhaseGVN* phase) { result->set_req(load_index, in2); return result; } - } else if (base->is_Load()) { + } else if (base->is_Load() || + base->is_DecodeN() && base->in(1)->is_Load()) { + if (base->is_DecodeN()) { + // Get LoadN node which loads cached Integer object + base = base->in(1); + } // Eliminate the load of Integer.value for integers from the cache // array by deriving the value from the index into the array. // Capture the offset of the load and then reverse the computation. Node* load_base = base->in(Address)->in(AddPNode::Base); + if (load_base->is_DecodeN()) { + // Get LoadN node which loads IntegerCache.cache field + load_base = load_base->in(1); + } if (load_base != NULL) { Compile::AliasType* atp = phase->C->alias_type(load_base->adr_type()); intptr_t cache_offset; From dcbd65a1c35d8e693d35275ae2a92e7ce891d32b Mon Sep 17 00:00:00 2001 From: Kumar Srinivasan Date: Wed, 18 Feb 2009 14:14:03 -0800 Subject: [PATCH 045/292] 6792554: Java JAR Pack200 header checks are insufficent Added several checks to ensure that the values read from the headers are consistent Reviewed-by: jrose --- .../com/sun/java/util/jar/pack/bands.cpp | 15 +- .../com/sun/java/util/jar/pack/coding.cpp | 3 +- .../com/sun/java/util/jar/pack/defines.h | 4 +- .../com/sun/java/util/jar/pack/unpack.cpp | 85 +++- .../tools/pack200/MemoryAllocatorTest.java | 369 ------------------ 5 files changed, 97 insertions(+), 379 deletions(-) delete mode 100644 jdk/test/tools/pack200/MemoryAllocatorTest.java diff --git a/jdk/src/share/native/com/sun/java/util/jar/pack/bands.cpp b/jdk/src/share/native/com/sun/java/util/jar/pack/bands.cpp index d900404dec4..e96d61c6b06 100644 --- a/jdk/src/share/native/com/sun/java/util/jar/pack/bands.cpp +++ b/jdk/src/share/native/com/sun/java/util/jar/pack/bands.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2002-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-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 @@ -94,6 +94,7 @@ void band::readData(int expectedLength) { assert(!valc->isMalloc); } xvs.init(u->rp, u->rplimit, valc); + CHECK; int X = xvs.getInt(); if (valc->S() != 0) { assert(valc->min <= -256); @@ -117,6 +118,7 @@ void band::readData(int expectedLength) { byte XB_byte = (byte) XB; byte* XB_ptr = &XB_byte; cm.init(u->rp, u->rplimit, XB_ptr, 0, defc, length, null); + CHECK; } else { NOT_PRODUCT(byte* meta_rp0 = u->meta_rp); assert(u->meta_rp != null); @@ -215,8 +217,19 @@ int band::getIntTotal() { if (length == 0) return 0; if (total_memo > 0) return total_memo-1; int total = getInt(); + // overflow checks require that none of the addends are <0, + // and that the partial sums never overflow (wrap negative) + if (total < 0) { + abort("overflow detected"); + return 0; + } for (int k = length-1; k > 0; k--) { + int prev_total = total; total += vs[0].getInt(); + if (total < prev_total) { + abort("overflow detected"); + return 0; + } } rewind(); total_memo = total+1; diff --git a/jdk/src/share/native/com/sun/java/util/jar/pack/coding.cpp b/jdk/src/share/native/com/sun/java/util/jar/pack/coding.cpp index d3ec4ae0e22..713ca999c98 100644 --- a/jdk/src/share/native/com/sun/java/util/jar/pack/coding.cpp +++ b/jdk/src/share/native/com/sun/java/util/jar/pack/coding.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2002-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-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 @@ -809,6 +809,7 @@ void coding_method::init(byte* &band_rp, byte* band_limit, } band_rp = vs.rp; } + CHECK; // Get an accurate upper limit now. vs0.rplimit = band_rp; diff --git a/jdk/src/share/native/com/sun/java/util/jar/pack/defines.h b/jdk/src/share/native/com/sun/java/util/jar/pack/defines.h index f780f247b2a..fa280ffb054 100644 --- a/jdk/src/share/native/com/sun/java/util/jar/pack/defines.h +++ b/jdk/src/share/native/com/sun/java/util/jar/pack/defines.h @@ -1,5 +1,5 @@ /* - * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 @@ -155,6 +155,8 @@ enum { false, true }; #define CHECK_NULL_(y,p) _CHECK_DO((p)==null, return y) #define CHECK_NULL_0(p) _CHECK_DO((p)==null, return 0) +#define CHECK_COUNT(t) if (t < 0){abort("bad value count");} CHECK + #define STR_TRUE "true" #define STR_FALSE "false" diff --git a/jdk/src/share/native/com/sun/java/util/jar/pack/unpack.cpp b/jdk/src/share/native/com/sun/java/util/jar/pack/unpack.cpp index 08fbbc2aa4a..e3a6945f30b 100644 --- a/jdk/src/share/native/com/sun/java/util/jar/pack/unpack.cpp +++ b/jdk/src/share/native/com/sun/java/util/jar/pack/unpack.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 @@ -504,15 +504,39 @@ void unpacker::read_file_header() { enum { MAGIC_BYTES = 4, AH_LENGTH_0 = 3, //minver, majver, options are outside of archive_size + AH_LENGTH_0_MAX = AH_LENGTH_0 + 1, // options might have 2 bytes AH_LENGTH = 26, //maximum archive header length (w/ all fields) // Length contributions from optional header fields: AH_FILE_HEADER_LEN = 5, // sizehi/lo/next/modtime/files + AH_ARCHIVE_SIZE_LEN = 2, // sizehi/lo only; part of AH_FILE_HEADER_LEN AH_CP_NUMBER_LEN = 4, // int/float/long/double AH_SPECIAL_FORMAT_LEN = 2, // layouts/band-headers AH_LENGTH_MIN = AH_LENGTH -(AH_FILE_HEADER_LEN+AH_SPECIAL_FORMAT_LEN+AH_CP_NUMBER_LEN), + ARCHIVE_SIZE_MIN = AH_LENGTH_MIN - (AH_LENGTH_0 + AH_ARCHIVE_SIZE_LEN), FIRST_READ = MAGIC_BYTES + AH_LENGTH_MIN }; + + assert(AH_LENGTH_MIN == 15); // # of UNSIGNED5 fields required after archive_magic + assert(ARCHIVE_SIZE_MIN == 10); // # of UNSIGNED5 fields required after archive_size + // An absolute minimum null archive is magic[4], {minver,majver,options}[3], + // archive_size[0], cp_counts[8], class_counts[4], for a total of 19 bytes. + // (Note that archive_size is optional; it may be 0..10 bytes in length.) + // The first read must capture everything up through the options field. + // This happens to work even if {minver,majver,options} is a pathological + // 15 bytes long. Legal pack files limit those three fields to 1+1+2 bytes. + assert(FIRST_READ >= MAGIC_BYTES + AH_LENGTH_0 * B_MAX); + + // Up through archive_size, the largest possible archive header is + // magic[4], {minver,majver,options}[4], archive_size[10]. + // (Note only the low 12 bits of options are allowed to be non-zero.) + // In order to parse archive_size, we need at least this many bytes + // in the first read. Of course, if archive_size_hi is more than + // a byte, we probably will fail to allocate the buffer, since it + // will be many gigabytes long. This is a practical, not an + // architectural limit to Pack200 archive sizes. + assert(FIRST_READ >= MAGIC_BYTES + AH_LENGTH_0_MAX + 2*B_MAX); + bool foreign_buf = (read_input_fn == null); byte initbuf[FIRST_READ + C_SLOP + 200]; // 200 is for JAR I/O if (foreign_buf) { @@ -528,7 +552,7 @@ void unpacker::read_file_header() { // There is no way to tell the caller that we used only part of them. // Therefore, the caller must use only a bare minimum of read-ahead. if (inbytes.len > FIRST_READ) { - abort("too much pushback"); + abort("too much read-ahead"); return; } input.set(initbuf, sizeof(initbuf)); @@ -538,7 +562,7 @@ void unpacker::read_file_header() { rplimit += inbytes.len; bytes_read += inbytes.len; } - // Read only 19 bytes, which is certain to contain #archive_size fields, + // Read only 19 bytes, which is certain to contain #archive_options fields, // but is certain not to overflow past the archive_header. input.b.len = FIRST_READ; if (!ensure_input(FIRST_READ)) @@ -610,9 +634,9 @@ void unpacker::read_file_header() { #undef ORBIT if ((archive_options & ~OPTION_LIMIT) != 0) { fprintf(errstrm, "Warning: Illegal archive options 0x%x\n", - archive_options); - // Do not abort. If the format really changes, version numbers will bump. - //abort("illegal archive options"); + archive_options); + abort("illegal archive options"); + return; } if ((archive_options & AO_HAVE_FILE_HEADERS) != 0) { @@ -643,8 +667,17 @@ void unpacker::read_file_header() { return; } } else if (archive_size != 0) { + if (archive_size < ARCHIVE_SIZE_MIN) { + abort("impossible archive size"); // bad input data + return; + } + if (archive_size < header_size_1) { + abort("too much read-ahead"); // somehow we pre-fetched too much? + return; + } input.set(U_NEW(byte, add_size(header_size_0, archive_size, C_SLOP)), (size_t) header_size_0 + archive_size); + CHECK; assert(input.limit()[0] == 0); // Move all the bytes we read initially into the real buffer. input.b.copyFrom(initbuf, header_size); @@ -659,6 +692,7 @@ void unpacker::read_file_header() { rp = rplimit = input.base(); // Set up input buffer as if we already read the header: input.b.copyFrom(initbuf, header_size); + CHECK; rplimit += header_size; while (ensure_input(input.limit() - rp)) { size_t dataSoFar = input_remaining(); @@ -694,8 +728,10 @@ void unpacker::read_file_header() { if ((archive_options & AO_HAVE_FILE_HEADERS) != 0) { archive_next_count = hdr.getInt(); + CHECK_COUNT(archive_next_count); archive_modtime = hdr.getInt(); file_count = hdr.getInt(); + CHECK_COUNT(file_count); hdrVals += 3; } else { hdrValsSkipped += 3; @@ -703,7 +739,9 @@ void unpacker::read_file_header() { if ((archive_options & AO_HAVE_SPECIAL_FORMATS) != 0) { band_headers_size = hdr.getInt(); + CHECK_COUNT(band_headers_size); attr_definition_count = hdr.getInt(); + CHECK_COUNT(attr_definition_count); hdrVals += 2; } else { hdrValsSkipped += 2; @@ -723,13 +761,16 @@ void unpacker::read_file_header() { } } cp_counts[k] = hdr.getInt(); + CHECK_COUNT(cp_counts[k]); hdrVals += 1; } ic_count = hdr.getInt(); + CHECK_COUNT(ic_count); default_class_minver = hdr.getInt(); default_class_majver = hdr.getInt(); class_count = hdr.getInt(); + CHECK_COUNT(class_count); hdrVals += 4; // done with archive_header @@ -783,7 +824,6 @@ void unpacker::read_file_header() { bytes::of(band_headers.limit(), C_SLOP).clear(_meta_error); } - void unpacker::finish() { if (verbose >= 1) { fprintf(errstrm, @@ -2089,6 +2129,7 @@ void unpacker::read_classes() { field_descr.readData(field_count); read_attrs(ATTR_CONTEXT_FIELD, field_count); + CHECK; method_descr.readData(method_count); read_attrs(ATTR_CONTEXT_METHOD, method_count); @@ -2096,6 +2137,7 @@ void unpacker::read_classes() { CHECK; read_attrs(ATTR_CONTEXT_CLASS, class_count); + CHECK; read_code_headers(); @@ -2122,10 +2164,12 @@ void unpacker::read_attrs(int attrc, int obj_count) { assert(endsWith(xxx_flags_hi.name, "_flags_hi")); if (haveLongFlags) xxx_flags_hi.readData(obj_count); + CHECK; band& xxx_flags_lo = ad.xxx_flags_lo(); assert(endsWith(xxx_flags_lo.name, "_flags_lo")); xxx_flags_lo.readData(obj_count); + CHECK; // pre-scan flags, counting occurrences of each index bit julong indexMask = ad.flagIndexMask(); // which flag bits are index bits? @@ -2148,11 +2192,13 @@ void unpacker::read_attrs(int attrc, int obj_count) { assert(endsWith(xxx_attr_count.name, "_attr_count")); // There is one count element for each 1<<16 bit set in flags: xxx_attr_count.readData(ad.predefCount(X_ATTR_OVERFLOW)); + CHECK; band& xxx_attr_indexes = ad.xxx_attr_indexes(); assert(endsWith(xxx_attr_indexes.name, "_attr_indexes")); int overflowIndexCount = xxx_attr_count.getIntTotal(); xxx_attr_indexes.readData(overflowIndexCount); + CHECK; // pre-scan attr indexes, counting occurrences of each value for (i = 0; i < overflowIndexCount; i++) { idx = xxx_attr_indexes.getInt(); @@ -2183,6 +2229,7 @@ void unpacker::read_attrs(int attrc, int obj_count) { } } ad.xxx_attr_calls().readData(backwardCounts); + CHECK; // Read built-in bands. // Mostly, these are hand-coded equivalents to readBandData(). @@ -2191,42 +2238,53 @@ void unpacker::read_attrs(int attrc, int obj_count) { count = ad.predefCount(CLASS_ATTR_SourceFile); class_SourceFile_RUN.readData(count); + CHECK; count = ad.predefCount(CLASS_ATTR_EnclosingMethod); class_EnclosingMethod_RC.readData(count); class_EnclosingMethod_RDN.readData(count); + CHECK; count = ad.predefCount(X_ATTR_Signature); class_Signature_RS.readData(count); + CHECK; ad.readBandData(X_ATTR_RuntimeVisibleAnnotations); ad.readBandData(X_ATTR_RuntimeInvisibleAnnotations); count = ad.predefCount(CLASS_ATTR_InnerClasses); class_InnerClasses_N.readData(count); + CHECK; + count = class_InnerClasses_N.getIntTotal(); class_InnerClasses_RC.readData(count); class_InnerClasses_F.readData(count); + CHECK; // Drop remaining columns wherever flags are zero: count -= class_InnerClasses_F.getIntCount(0); class_InnerClasses_outer_RCN.readData(count); class_InnerClasses_name_RUN.readData(count); + CHECK; count = ad.predefCount(CLASS_ATTR_ClassFile_version); class_ClassFile_version_minor_H.readData(count); class_ClassFile_version_major_H.readData(count); + CHECK; break; case ATTR_CONTEXT_FIELD: count = ad.predefCount(FIELD_ATTR_ConstantValue); field_ConstantValue_KQ.readData(count); + CHECK; count = ad.predefCount(X_ATTR_Signature); field_Signature_RS.readData(count); + CHECK; ad.readBandData(X_ATTR_RuntimeVisibleAnnotations); ad.readBandData(X_ATTR_RuntimeInvisibleAnnotations); + CHECK; break; case ATTR_CONTEXT_METHOD: @@ -2238,15 +2296,18 @@ void unpacker::read_attrs(int attrc, int obj_count) { method_Exceptions_N.readData(count); count = method_Exceptions_N.getIntTotal(); method_Exceptions_RC.readData(count); + CHECK; count = ad.predefCount(X_ATTR_Signature); method_Signature_RS.readData(count); + CHECK; ad.readBandData(X_ATTR_RuntimeVisibleAnnotations); ad.readBandData(X_ATTR_RuntimeInvisibleAnnotations); ad.readBandData(METHOD_ATTR_RuntimeVisibleParameterAnnotations); ad.readBandData(METHOD_ATTR_RuntimeInvisibleParameterAnnotations); ad.readBandData(METHOD_ATTR_AnnotationDefault); + CHECK; break; case ATTR_CONTEXT_CODE: @@ -2258,8 +2319,10 @@ void unpacker::read_attrs(int attrc, int obj_count) { return; } code_StackMapTable_N.readData(count); + CHECK; count = code_StackMapTable_N.getIntTotal(); code_StackMapTable_frame_T.readData(count); + CHECK; // the rest of it depends in a complicated way on frame tags { int fat_frame_count = 0; @@ -2293,18 +2356,23 @@ void unpacker::read_attrs(int attrc, int obj_count) { // deal completely with fat frames: offset_count += fat_frame_count; code_StackMapTable_local_N.readData(fat_frame_count); + CHECK; type_count += code_StackMapTable_local_N.getIntTotal(); code_StackMapTable_stack_N.readData(fat_frame_count); type_count += code_StackMapTable_stack_N.getIntTotal(); + CHECK; // read the rest: code_StackMapTable_offset.readData(offset_count); code_StackMapTable_T.readData(type_count); + CHECK; // (7) [RCH] count = code_StackMapTable_T.getIntCount(7); code_StackMapTable_RC.readData(count); + CHECK; // (8) [PH] count = code_StackMapTable_T.getIntCount(8); code_StackMapTable_P.readData(count); + CHECK; } count = ad.predefCount(CODE_ATTR_LineNumberTable); @@ -2626,6 +2694,7 @@ void unpacker::read_code_headers() { code_max_na_locals.readData(); code_handler_count.readData(); totalHandlerCount += code_handler_count.getIntTotal(); + CHECK; // Read handler specifications. // Cf. PackageReader.readCodeHandlers. @@ -2633,8 +2702,10 @@ void unpacker::read_code_headers() { code_handler_end_PO.readData(totalHandlerCount); code_handler_catch_PO.readData(totalHandlerCount); code_handler_class_RCN.readData(totalHandlerCount); + CHECK; read_attrs(ATTR_CONTEXT_CODE, totalFlagsCount); + CHECK; } static inline bool is_in_range(uint n, uint min, uint max) { diff --git a/jdk/test/tools/pack200/MemoryAllocatorTest.java b/jdk/test/tools/pack200/MemoryAllocatorTest.java deleted file mode 100644 index 6015a4e470d..00000000000 --- a/jdk/test/tools/pack200/MemoryAllocatorTest.java +++ /dev/null @@ -1,369 +0,0 @@ -/* - * Copyright 2008 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 6755943 - * @summary Checks any memory overruns in archive length. - * @run main/timeout=1200 MemoryAllocatorTest - */ -import java.io.BufferedReader; -import java.io.DataOutputStream; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.RandomAccessFile; -import java.nio.MappedByteBuffer; -import java.nio.channels.FileChannel; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -public class MemoryAllocatorTest { - - /* - * The smallest possible pack file with 1 empty resource - */ - static int[] magic = { - 0xCA, 0xFE, 0xD0, 0x0D - }; - static int[] version_info = { - 0x07, // minor - 0x96 // major - }; - static int[] option = { - 0x10 - }; - static int[] size_hi = { - 0x00 - }; - static int[] size_lo_ulong = { - 0xFF, 0xFC, 0xFC, 0xFC, 0xFC // ULONG_MAX 0xFFFFFFFF - }; - static int[] size_lo_correct = { - 0x17 - }; - static int[] data = { - 0x00, 0xEC, 0xDA, 0xDE, 0xF8, 0x45, 0x01, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x31, 0x01, 0x00 - }; - // End of pack file data - - static final String JAVA_HOME = System.getProperty("java.home"); - - static final boolean debug = Boolean.getBoolean("MemoryAllocatorTest.Debug"); - static final boolean WINDOWS = System.getProperty("os.name").startsWith("Windows"); - static final boolean LINUX = System.getProperty("os.name").startsWith("Linux"); - static final boolean SIXTYFOUR_BIT = System.getProperty("sun.arch.data.model", "32").equals("64"); - static final private int EXPECTED_EXIT_CODE = (WINDOWS) ? -1 : 255; - - static int testExitValue = 0; - - static byte[] bytes(int[] a) { - byte[] b = new byte[a.length]; - for (int i = 0; i < b.length; i++) { - b[i] = (byte) a[i]; - } - return b; - } - - static void createPackFile(boolean good, File packFile) throws IOException { - FileOutputStream fos = new FileOutputStream(packFile); - fos.write(bytes(magic)); - fos.write(bytes(version_info)); - fos.write(bytes(option)); - fos.write(bytes(size_hi)); - if (good) { - fos.write(bytes(size_lo_correct)); - } else { - fos.write(bytes(size_lo_ulong)); - } - fos.write(bytes(data)); - } - - /* - * This method modifies the LSB of the size_lo for various wicked - * values between MAXINT-0x3F and MAXINT. - */ - static int modifyPackFile(File packFile) throws IOException { - RandomAccessFile raf = new RandomAccessFile(packFile, "rws"); - long len = packFile.length(); - FileChannel fc = raf.getChannel(); - MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_WRITE, 0, len); - int pos = magic.length + version_info.length + option.length + - size_hi.length; - byte value = bb.get(pos); - value--; - bb.position(pos); - bb.put(value); - bb.force(); - fc.truncate(len); - fc.close(); - return value & 0xFF; - } - - static String getUnpack200Cmd() throws Exception { - File binDir = new File(JAVA_HOME, "bin"); - File unpack200File = WINDOWS - ? new File(binDir, "unpack200.exe") - : new File(binDir, "unpack200"); - - String cmd = unpack200File.getAbsolutePath(); - if (!unpack200File.canExecute()) { - throw new Exception("please check" + - cmd + " exists and is executable"); - } - return cmd; - } - - static TestResult runUnpacker(File packFile) throws Exception { - if (!packFile.exists()) { - throw new Exception("please check" + packFile + " exists"); - } - ArrayList alist = new ArrayList(); - ProcessBuilder pb = new ProcessBuilder(getUnpack200Cmd(), - packFile.getName(), "testout.jar"); - Map env = pb.environment(); - pb.directory(new File(".")); - int retval = 0; - try { - pb.redirectErrorStream(true); - Process p = pb.start(); - BufferedReader rd = new BufferedReader( - new InputStreamReader(p.getInputStream()), 8192); - String in = rd.readLine(); - while (in != null) { - alist.add(in); - System.out.println(in); - in = rd.readLine(); - } - retval = p.waitFor(); - p.destroy(); - } catch (Exception ex) { - ex.printStackTrace(); - throw new RuntimeException(ex.getMessage()); - } - return new TestResult("", retval, alist); - } - - /* - * The debug version builds of unpack200 call abort(3) which might set - * an unexpected return value, therefore this test is to determine - * if we are using a product or non-product build and check the - * return value appropriately. - */ - static boolean isNonProductVersion() throws Exception { - ArrayList alist = new ArrayList(); - ProcessBuilder pb = new ProcessBuilder(getUnpack200Cmd(), "--version"); - Map env = pb.environment(); - pb.directory(new File(".")); - int retval = 0; - try { - pb.redirectErrorStream(true); - Process p = pb.start(); - BufferedReader rd = new BufferedReader( - new InputStreamReader(p.getInputStream()), 8192); - String in = rd.readLine(); - while (in != null) { - alist.add(in); - System.out.println(in); - in = rd.readLine(); - } - retval = p.waitFor(); - p.destroy(); - } catch (Exception ex) { - ex.printStackTrace(); - throw new RuntimeException(ex.getMessage()); - } - for (String x : alist) { - if (x.contains("non-product")) { - return true; - } - } - return false; - } - - /** - * @param args the command line arguments - * @throws java.lang.Exception - */ - public static void main(String[] args) throws Exception { - - File packFile = new File("tiny.pack"); - boolean isNPVersion = isNonProductVersion(); - - // Create a good pack file and test if everything is ok - createPackFile(true, packFile); - TestResult tr = runUnpacker(packFile); - tr.setDescription("a good pack file"); - tr.checkPositive(); - tr.isOK(); - System.out.println(tr); - - /* - * jprt systems on windows and linux seem to have abundant memory - * therefore can take a very long time to run, and even if it does - * the error message is not accurate for us to discern if the test - * passess successfully. - */ - if (SIXTYFOUR_BIT && (LINUX || WINDOWS)) { - System.out.println("Warning: Windows/Linux 64bit tests passes vacuously"); - return; - } - - /* - * debug builds call abort, the exit code under these conditions - * are not really relevant. - */ - if (isNPVersion) { - System.out.println("Warning: non-product build: exit values not checked"); - } - - // create a bad pack file - createPackFile(false, packFile); - tr = runUnpacker(packFile); - tr.setDescription("a wicked pack file"); - tr.contains("Native allocation failed"); - if(!isNPVersion) { - tr.checkValue(EXPECTED_EXIT_CODE); - } - System.out.println(tr); - int value = modifyPackFile(packFile); - tr.setDescription("value=" + value); - - // continue creating bad pack files by modifying the specimen pack file. - while (value >= 0xc0) { - tr = runUnpacker(packFile); - tr.contains("Native allocation failed"); - if (!isNPVersion) { - tr.checkValue(EXPECTED_EXIT_CODE); - } - tr.setDescription("wicked value=0x" + - Integer.toHexString(value & 0xFF)); - System.out.println(tr); - value = modifyPackFile(packFile); - } - if (testExitValue != 0) { - throw new Exception("Pack200 archive length tests(" + - testExitValue + ") failed "); - } else { - System.out.println("All tests pass"); - } - } - - /* - * A class to encapsulate the test results and stuff, with some ease - * of use methods to check the test results. - */ - static class TestResult { - - StringBuilder status; - int exitValue; - List testOutput; - String description; - - public TestResult(String str, int rv, List oList) { - status = new StringBuilder(str); - exitValue = rv; - testOutput = oList; - } - - void setDescription(String description) { - this.description = description; - } - - void checkValue(int value) { - if (exitValue != value) { - status = - status.append(" Error: test expected exit value " + - value + "got " + exitValue); - testExitValue++; - } - } - - void checkNegative() { - if (exitValue == 0) { - status = status.append( - " Error: test did not expect 0 exit value"); - - testExitValue++; - } - } - - void checkPositive() { - if (exitValue != 0) { - status = status.append( - " Error: test did not return 0 exit value"); - testExitValue++; - } - } - - boolean isOK() { - return exitValue == 0; - } - - boolean isZeroOutput() { - if (!testOutput.isEmpty()) { - status = status.append(" Error: No message from cmd please"); - testExitValue++; - return false; - } - return true; - } - - boolean isNotZeroOutput() { - if (testOutput.isEmpty()) { - status = status.append(" Error: Missing message"); - testExitValue++; - return false; - } - return true; - } - - public String toString() { - if (debug) { - for (String x : testOutput) { - status = status.append(x + "\n"); - } - } - if (description != null) { - status.insert(0, description); - } - return status.append("\nexitValue = " + exitValue).toString(); - } - - boolean contains(String str) { - for (String x : testOutput) { - if (x.contains(str)) { - return true; - } - } - status = status.append(" Error: string <" + str + "> not found "); - testExitValue++; - return false; - } - } -} From 6aec7d2ea914a6afb8dcd4a6a921b1ff54ba9b15 Mon Sep 17 00:00:00 2001 From: Ivan P Krylov Date: Thu, 19 Feb 2009 04:54:22 -0500 Subject: [PATCH 046/292] 6806046: Hotspot build error when compiled from Visual Studio Define HOTSPOT_LIB_ARCH in the preprocessor flags of the generated projects Reviewed-by: kamg, xlu --- hotspot/src/share/tools/MakeDeps/BuildConfig.java | 1 + 1 file changed, 1 insertion(+) diff --git a/hotspot/src/share/tools/MakeDeps/BuildConfig.java b/hotspot/src/share/tools/MakeDeps/BuildConfig.java index 442972dab9c..accdab67550 100644 --- a/hotspot/src/share/tools/MakeDeps/BuildConfig.java +++ b/hotspot/src/share/tools/MakeDeps/BuildConfig.java @@ -247,6 +247,7 @@ class BuildConfig { sysDefines.add("HOTSPOT_BUILD_USER="+System.getProperty("user.name")); sysDefines.add("HOTSPOT_BUILD_TARGET=\\\""+get("Build")+"\\\""); sysDefines.add("_JNI_IMPLEMENTATION_"); + sysDefines.add("HOTSPOT_LIB_ARCH=\\\"i486\\\""); sysDefines.addAll(defines); From a1117d31b6e286fb36264f36827c1cd7efb41373 Mon Sep 17 00:00:00 2001 From: Dmitry Cherepanov Date: Thu, 19 Feb 2009 14:10:19 +0300 Subject: [PATCH 047/292] 6806224: PIT : Getting java.lang.NullPointerException while opening Filedialog Reviewed-by: art, dav --- .../classes/sun/awt/X11/XComponentPeer.java | 6 +--- .../classes/sun/awt/X11/XFileDialogPeer.java | 30 ++++++++----------- 2 files changed, 14 insertions(+), 22 deletions(-) diff --git a/jdk/src/solaris/classes/sun/awt/X11/XComponentPeer.java b/jdk/src/solaris/classes/sun/awt/X11/XComponentPeer.java index 8a14cfe5f0f..46c4a8768f0 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XComponentPeer.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XComponentPeer.java @@ -166,7 +166,7 @@ public class XComponentPeer extends XWindow implements ComponentPeer, DropTarget enableLog.log(Level.FINE, "Initial enable state: {0}", new Object[] {Boolean.valueOf(enabled)}); if (target.isVisible()) { - show(); + setVisible(true); } } @@ -496,10 +496,6 @@ public class XComponentPeer extends XWindow implements ComponentPeer, DropTarget xSetVisible(b); } - public void show() { - setVisible(true); - } - public void hide() { setVisible(false); } diff --git a/jdk/src/solaris/classes/sun/awt/X11/XFileDialogPeer.java b/jdk/src/solaris/classes/sun/awt/X11/XFileDialogPeer.java index 0675847af79..0b8085e759d 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XFileDialogPeer.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XFileDialogPeer.java @@ -739,7 +739,17 @@ class XFileDialogPeer extends XDialogPeer implements FileDialogPeer, ActionListe this.filter = filter; } - public void show() { + + public void dispose() { + FileDialog fd = (FileDialog)fileDialog; + if (fd != null) { + fd.removeAll(); + } + super.dispose(); + } + + // 03/02/2005 b5097243 Pressing 'ESC' on a file dlg does not dispose the dlg on Xtoolkit + public void setVisible(boolean b){ if (fileDialog == null) { init((FileDialog)target); } @@ -754,34 +764,20 @@ class XFileDialogPeer extends XDialogPeer implements FileDialogPeer, ActionListe setFile(savedFile); } - super.show(); - selectionField.requestFocusInWindow(); - } - - public void dispose() { - FileDialog fd = (FileDialog)fileDialog; - if (fd != null) { - fd.removeAll(); - } - super.dispose(); - } - - // 03/02/2005 b5097243 Pressing 'ESC' on a file dlg does not dispose the dlg on Xtoolkit - public void setVisible(boolean b){ super.setVisible(b); if (b == true){ // See 6240074 for more information XChoicePeer choicePeer = (XChoicePeer)pathChoice.getPeer(); choicePeer.addXChoicePeerListener(this); - KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(this); }else{ // See 6240074 for more information XChoicePeer choicePeer = (XChoicePeer)pathChoice.getPeer(); choicePeer.removeXChoicePeerListener(); - KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(this); } + + selectionField.requestFocusInWindow(); } /* From dc3008a5136187865130ec9f4acaf330cc256140 Mon Sep 17 00:00:00 2001 From: Vladimir Kozlov Date: Thu, 19 Feb 2009 17:38:53 -0800 Subject: [PATCH 048/292] 6802499: EA: assert(false,"unknown node on this path") Add missing checks for SCMemProj node in Escape analysis code. Reviewed-by: never --- hotspot/src/share/vm/opto/escape.cpp | 10 ++++++++++ hotspot/src/share/vm/opto/macro.cpp | 16 ++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/hotspot/src/share/vm/opto/escape.cpp b/hotspot/src/share/vm/opto/escape.cpp index bccfb9c64ba..2606d0df82a 100644 --- a/hotspot/src/share/vm/opto/escape.cpp +++ b/hotspot/src/share/vm/opto/escape.cpp @@ -756,6 +756,16 @@ Node* ConnectionGraph::find_inst_mem(Node *orig_mem, int alias_idx, GrowableArra } else { break; } + } else if (result->Opcode() == Op_SCMemProj) { + assert(result->in(0)->is_LoadStore(), "sanity"); + const Type *at = phase->type(result->in(0)->in(MemNode::Address)); + if (at != Type::TOP) { + assert (at->isa_ptr() != NULL, "pointer type required."); + int idx = C->get_alias_index(at->is_ptr()); + assert(idx != alias_idx, "Object is not scalar replaceable if a LoadStore node access its field"); + break; + } + result = result->in(0)->in(MemNode::Memory); } } if (result->is_Phi()) { diff --git a/hotspot/src/share/vm/opto/macro.cpp b/hotspot/src/share/vm/opto/macro.cpp index f77b14ada56..857568b6d05 100644 --- a/hotspot/src/share/vm/opto/macro.cpp +++ b/hotspot/src/share/vm/opto/macro.cpp @@ -250,6 +250,15 @@ static Node *scan_mem_chain(Node *mem, int alias_idx, int offset, Node *start_me assert(adr_idx == Compile::AliasIdxRaw, "address must match or be raw"); } mem = mem->in(MemNode::Memory); + } else if (mem->Opcode() == Op_SCMemProj) { + assert(mem->in(0)->is_LoadStore(), "sanity"); + const TypePtr* atype = mem->in(0)->in(MemNode::Address)->bottom_type()->is_ptr(); + int adr_idx = Compile::current()->get_alias_index(atype); + if (adr_idx == alias_idx) { + assert(false, "Object is not scalar replaceable if a LoadStore node access its field"); + return NULL; + } + mem = mem->in(0)->in(MemNode::Memory); } else { return mem; } @@ -329,8 +338,15 @@ Node *PhaseMacroExpand::value_from_mem_phi(Node *mem, BasicType ft, const Type * return NULL; } values.at_put(j, val); + } else if (val->Opcode() == Op_SCMemProj) { + assert(val->in(0)->is_LoadStore(), "sanity"); + assert(false, "Object is not scalar replaceable if a LoadStore node access its field"); + return NULL; } else { +#ifdef ASSERT + val->dump(); assert(false, "unknown node on this path"); +#endif return NULL; // unknown node on this path } } From 22f94de7e6abdcf00ef9893416ccf5c0c3436ab8 Mon Sep 17 00:00:00 2001 From: Andrew Brygin Date: Fri, 20 Feb 2009 13:48:32 +0300 Subject: [PATCH 049/292] 6804996: JWS PNG Decoding Integer Overflow [V-flrhat2ln8] Reviewed-by: prr --- .../sun/awt/splashscreen/splashscreen_gif.c | 4 ---- .../sun/awt/splashscreen/splashscreen_impl.h | 4 ++++ .../sun/awt/splashscreen/splashscreen_png.c | 23 +++++++++++++++++++ 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/jdk/src/share/native/sun/awt/splashscreen/splashscreen_gif.c b/jdk/src/share/native/sun/awt/splashscreen/splashscreen_gif.c index 71bc3a3b39d..f1651ab1f49 100644 --- a/jdk/src/share/native/sun/awt/splashscreen/splashscreen_gif.c +++ b/jdk/src/share/native/sun/awt/splashscreen/splashscreen_gif.c @@ -53,10 +53,6 @@ static const char szNetscape20ext[11] = "NETSCAPE2.0"; // convert libungif samples to our ones #define MAKE_QUAD_GIF(c,a) MAKE_QUAD((c).Red, (c).Green, (c).Blue, (a)) -#define SAFE_TO_ALLOC(c, sz) \ - (((c) > 0) && ((sz) > 0) && \ - ((0xffffffffu / ((unsigned int)(c))) > (unsigned int)(sz))) - /* stdio FILE* and memory input functions for libungif */ int SplashStreamGifInputFunc(GifFileType * gif, GifByteType * buf, int n) diff --git a/jdk/src/share/native/sun/awt/splashscreen/splashscreen_impl.h b/jdk/src/share/native/sun/awt/splashscreen/splashscreen_impl.h index c6bad14c45a..6f4e03ef53e 100644 --- a/jdk/src/share/native/sun/awt/splashscreen/splashscreen_impl.h +++ b/jdk/src/share/native/sun/awt/splashscreen/splashscreen_impl.h @@ -155,6 +155,10 @@ int BitmapToYXBandedRectangles(ImageRect * pSrcRect, RECT_T * out); void SplashInitFrameShape(Splash * splash, int imageIndex); +#define SAFE_TO_ALLOC(c, sz) \ + (((c) > 0) && ((sz) > 0) && \ + ((0xffffffffu / ((unsigned int)(c))) > (unsigned int)(sz))) + #define dbgprintf printf #endif diff --git a/jdk/src/share/native/sun/awt/splashscreen/splashscreen_png.c b/jdk/src/share/native/sun/awt/splashscreen/splashscreen_png.c index f0926ec90dc..abc54dcb753 100644 --- a/jdk/src/share/native/sun/awt/splashscreen/splashscreen_png.c +++ b/jdk/src/share/native/sun/awt/splashscreen/splashscreen_png.c @@ -103,9 +103,17 @@ SplashDecodePng(Splash * splash, png_rw_ptr read_func, void *io_ptr) rowbytes = png_get_rowbytes(png_ptr, info_ptr); + if (!SAFE_TO_ALLOC(rowbytes, height)) { + goto done; + } + if ((image_data = (unsigned char *) malloc(rowbytes * height)) == NULL) { goto done; } + + if (!SAFE_TO_ALLOC(height, sizeof(png_bytep))) { + goto done; + } if ((row_pointers = (png_bytepp) malloc(height * sizeof(png_bytep))) == NULL) { goto done; @@ -121,13 +129,28 @@ SplashDecodePng(Splash * splash, png_rw_ptr read_func, void *io_ptr) splash->width = width; splash->height = height; + if (!SAFE_TO_ALLOC(splash->width, splash->imageFormat.depthBytes)) { + goto done; + } stride = splash->width * splash->imageFormat.depthBytes; + if (!SAFE_TO_ALLOC(splash->height, stride)) { + goto done; + } splash->frameCount = 1; splash->frames = (SplashImage *) malloc(sizeof(SplashImage) * splash->frameCount); + + if (splash->frames == NULL) { + goto done; + } + splash->loopCount = 1; splash->frames[0].bitmapBits = malloc(stride * splash->height); + if (splash->frames[0].bitmapBits == NULL) { + free(splash->frames); + goto done; + } splash->frames[0].delay = 0; /* FIXME: sort out the real format */ From f9a987bf43ae09a989b51e70a88f5c14ae14ac39 Mon Sep 17 00:00:00 2001 From: Anthony Petrov Date: Fri, 20 Feb 2009 17:34:16 +0300 Subject: [PATCH 050/292] 6804747: Ensure consistent graphicsConfig member across components hierarchy Reviewed-by: art, dcherepanov --- jdk/src/share/classes/java/awt/Canvas.java | 13 +++- jdk/src/share/classes/java/awt/Component.java | 51 ++++-------- jdk/src/share/classes/java/awt/Container.java | 18 +++++ jdk/src/share/classes/java/awt/Window.java | 71 +++++++---------- .../classes/java/awt/peer/CanvasPeer.java | 10 +++ .../classes/java/awt/peer/ComponentPeer.java | 6 ++ .../share/classes/sun/awt/AWTAccessor.java | 5 ++ .../classes/sun/awt/ComponentAccessor.java | 16 ---- .../classes/sun/awt/NullComponentPeer.java | 8 ++ .../classes/sun/awt/X11/XCanvasPeer.java | 78 ++++++++----------- .../classes/sun/awt/X11/XComponentPeer.java | 5 ++ .../sun/awt/X11/XEmbedChildProxyPeer.java | 2 + .../classes/sun/awt/X11/XPanelPeer.java | 33 -------- .../classes/sun/awt/X11/XWindowPeer.java | 24 +++--- .../solaris/native/sun/awt/awt_Component.h | 5 -- jdk/src/solaris/native/sun/awt/awt_Window.h | 1 - jdk/src/solaris/native/sun/xawt/XToolkit.c | 6 -- .../classes/sun/awt/Win32GraphicsDevice.java | 1 - .../classes/sun/awt/windows/WCanvasPeer.java | 38 ++------- .../sun/awt/windows/WComponentPeer.java | 20 +---- .../classes/sun/awt/windows/WPanelPeer.java | 28 ------- .../classes/sun/awt/windows/WWindowPeer.java | 37 +++++---- 22 files changed, 181 insertions(+), 295 deletions(-) diff --git a/jdk/src/share/classes/java/awt/Canvas.java b/jdk/src/share/classes/java/awt/Canvas.java index 04b3bc2dca4..86315e7c12e 100644 --- a/jdk/src/share/classes/java/awt/Canvas.java +++ b/jdk/src/share/classes/java/awt/Canvas.java @@ -25,6 +25,7 @@ package java.awt; import java.awt.image.BufferStrategy; +import java.awt.peer.CanvasPeer; import javax.accessibility.*; /** @@ -65,7 +66,17 @@ public class Canvas extends Component implements Accessible { */ public Canvas(GraphicsConfiguration config) { this(); - graphicsConfig = config; + setGraphicsConfiguration(config); + } + + @Override + void setGraphicsConfiguration(GraphicsConfiguration gc) { + CanvasPeer peer = (CanvasPeer)getPeer(); + if (peer != null) { + gc = peer.getAppropriateGraphicsConfiguration(gc); + } + + super.setGraphicsConfiguration(gc); } /** diff --git a/jdk/src/share/classes/java/awt/Component.java b/jdk/src/share/classes/java/awt/Component.java index 9828ddb5661..e59d37a5826 100644 --- a/jdk/src/share/classes/java/awt/Component.java +++ b/jdk/src/share/classes/java/awt/Component.java @@ -300,7 +300,7 @@ public abstract class Component implements ImageObserver, MenuContainer, * @see GraphicsConfiguration * @see #getGraphicsConfiguration */ - transient GraphicsConfiguration graphicsConfig = null; + private transient GraphicsConfiguration graphicsConfig = null; /** * A reference to a BufferStrategy object @@ -845,6 +845,12 @@ public abstract class Component implements ImageObserver, MenuContainer, } } } + + public void setGraphicsConfiguration(Component comp, + GraphicsConfiguration gc) + { + comp.setGraphicsConfiguration(gc); + } }); } @@ -1012,50 +1018,21 @@ public abstract class Component implements ImageObserver, MenuContainer, */ public GraphicsConfiguration getGraphicsConfiguration() { synchronized(getTreeLock()) { - if (graphicsConfig != null) { - return graphicsConfig; - } else if (getParent() != null) { - return getParent().getGraphicsConfiguration(); - } else { - return null; - } + return getGraphicsConfiguration_NoClientCode(); } } final GraphicsConfiguration getGraphicsConfiguration_NoClientCode() { - GraphicsConfiguration graphicsConfig = this.graphicsConfig; - Container parent = this.parent; - if (graphicsConfig != null) { - return graphicsConfig; - } else if (parent != null) { - return parent.getGraphicsConfiguration_NoClientCode(); - } else { - return null; - } + return graphicsConfig; } - /** - * Resets this Component's - * GraphicsConfiguration back to a default - * value. For most componenets, this is null. - * Called from the Toolkit thread, so NO CLIENT CODE. - */ - void resetGC() { + void setGraphicsConfiguration(GraphicsConfiguration gc) { synchronized(getTreeLock()) { - graphicsConfig = null; - } - } + graphicsConfig = gc; - /* - * Not called on Component, but needed for Canvas and Window - */ - void setGCFromPeer() { - synchronized(getTreeLock()) { - if (peer != null) { // can't imagine how this will be false, - // but just in case - graphicsConfig = peer.getGraphicsConfiguration(); - } else { - graphicsConfig = null; + ComponentPeer peer = getPeer(); + if (peer != null) { + peer.updateGraphicsData(gc); } } } diff --git a/jdk/src/share/classes/java/awt/Container.java b/jdk/src/share/classes/java/awt/Container.java index 64de85477a7..fb520547e1e 100644 --- a/jdk/src/share/classes/java/awt/Container.java +++ b/jdk/src/share/classes/java/awt/Container.java @@ -506,6 +506,7 @@ public class Container extends Component { adjustDescendants(-(comp.countHierarchyMembers())); comp.parent = null; + comp.setGraphicsConfiguration(null); component.remove(index); invalidateIfValid(); @@ -789,6 +790,7 @@ public class Container extends Component { component.add(index, comp); } comp.parent = this; + comp.setGraphicsConfiguration(getGraphicsConfiguration()); adjustListeningChildren(AWTEvent.HIERARCHY_EVENT_MASK, comp.numListening(AWTEvent.HIERARCHY_EVENT_MASK)); @@ -1056,6 +1058,7 @@ public class Container extends Component { component.add(index, comp); } comp.parent = this; + comp.setGraphicsConfiguration(thisGC); adjustListeningChildren(AWTEvent.HIERARCHY_EVENT_MASK, comp.numListening(AWTEvent.HIERARCHY_EVENT_MASK)); @@ -1094,6 +1097,19 @@ public class Container extends Component { } } + @Override + void setGraphicsConfiguration(GraphicsConfiguration gc) { + synchronized (getTreeLock()) { + super.setGraphicsConfiguration(gc); + + for (Component comp : component) { + if (comp != null) { + comp.setGraphicsConfiguration(gc); + } + } + } + } + /** * Checks that all Components that this Container contains are on * the same GraphicsDevice as this Container. If not, throws an @@ -1151,6 +1167,7 @@ public class Container extends Component { comp.parent = null; component.remove(index); + comp.setGraphicsConfiguration(null); invalidateIfValid(); if (containerListener != null || @@ -1227,6 +1244,7 @@ public class Container extends Component { layoutMgr.removeLayoutComponent(comp); } comp.parent = null; + comp.setGraphicsConfiguration(null); if (containerListener != null || (eventMask & AWTEvent.CONTAINER_EVENT_MASK) != 0 || Toolkit.enabledOnToolkit(AWTEvent.CONTAINER_EVENT_MASK)) { diff --git a/jdk/src/share/classes/java/awt/Window.java b/jdk/src/share/classes/java/awt/Window.java index e1ff8db14c3..062870fe101 100644 --- a/jdk/src/share/classes/java/awt/Window.java +++ b/jdk/src/share/classes/java/awt/Window.java @@ -394,6 +394,18 @@ public class Window extends Container implements Accessible { } } + private GraphicsConfiguration initGC(GraphicsConfiguration gc) { + GraphicsEnvironment.checkHeadless(); + + if (gc == null) { + gc = GraphicsEnvironment.getLocalGraphicsEnvironment(). + getDefaultScreenDevice().getDefaultConfiguration(); + } + setGraphicsConfiguration(gc); + + return gc; + } + private void init(GraphicsConfiguration gc) { GraphicsEnvironment.checkHeadless(); @@ -405,14 +417,10 @@ public class Window extends Container implements Accessible { setWarningString(); this.cursor = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR); this.visible = false; - if (gc == null) { - this.graphicsConfig = - GraphicsEnvironment.getLocalGraphicsEnvironment(). - getDefaultScreenDevice().getDefaultConfiguration(); - } else { - this.graphicsConfig = gc; - } - if (graphicsConfig.getDevice().getType() != + + gc = initGC(gc); + + if (gc.getDevice().getType() != GraphicsDevice.TYPE_RASTER_SCREEN) { throw new IllegalArgumentException("not a screen device"); } @@ -420,8 +428,8 @@ public class Window extends Container implements Accessible { /* offset the initial location with the original of the screen */ /* and any insets */ - Rectangle screenBounds = graphicsConfig.getBounds(); - Insets screenInsets = getToolkit().getScreenInsets(graphicsConfig); + Rectangle screenBounds = gc.getBounds(); + Insets screenInsets = getToolkit().getScreenInsets(gc); int x = getX() + screenBounds.x + screenInsets.left; int y = getY() + screenBounds.y + screenInsets.top; if (x != this.x || y != this.y) { @@ -2765,7 +2773,7 @@ public class Window extends Container implements Accessible { sun.java2d.Disposer.addRecord(anchor, new WindowDisposerRecord(appContext, this)); addToWindowList(); - + initGC(null); } private void deserializeResources(ObjectInputStream s) @@ -2939,41 +2947,18 @@ public class Window extends Container implements Accessible { } // inner class AccessibleAWTWindow - /** - * This method returns the GraphicsConfiguration used by this Window. - * @since 1.3 - */ - public GraphicsConfiguration getGraphicsConfiguration() { - //NOTE: for multiscreen, this will need to take into account - //which screen the window is on/mostly on instead of returning the - //default or constructor argument config. - synchronized(getTreeLock()) { - if (graphicsConfig == null && !GraphicsEnvironment.isHeadless()) { - graphicsConfig = - GraphicsEnvironment. getLocalGraphicsEnvironment(). - getDefaultScreenDevice(). - getDefaultConfiguration(); - } - return graphicsConfig; - } - } - - /** - * Reset this Window's GraphicsConfiguration to match its peer. - */ - void resetGC() { - if (!GraphicsEnvironment.isHeadless()) { - // use the peer's GC - setGCFromPeer(); - // if it's still null, use the default - if (graphicsConfig == null) { - graphicsConfig = GraphicsEnvironment. + @Override + void setGraphicsConfiguration(GraphicsConfiguration gc) { + if (gc == null) { + gc = GraphicsEnvironment. getLocalGraphicsEnvironment(). getDefaultScreenDevice(). getDefaultConfiguration(); - } + } + synchronized (getTreeLock()) { + super.setGraphicsConfiguration(gc); if (log.isLoggable(Level.FINER)) { - log.finer("+ Window.resetGC(): new GC is \n+ " + graphicsConfig + "\n+ this is " + this); + log.finer("+ Window.setGraphicsConfiguration(): new GC is \n+ " + getGraphicsConfiguration_NoClientCode() + "\n+ this is " + this); } } } @@ -3033,7 +3018,7 @@ public class Window extends Container implements Accessible { // target location int dx = 0, dy = 0; // target GC - GraphicsConfiguration gc = this.graphicsConfig; + GraphicsConfiguration gc = getGraphicsConfiguration_NoClientCode(); Rectangle gcBounds = gc.getBounds(); Dimension windowSize = getSize(); diff --git a/jdk/src/share/classes/java/awt/peer/CanvasPeer.java b/jdk/src/share/classes/java/awt/peer/CanvasPeer.java index bbf6a111086..94b8d189d8d 100644 --- a/jdk/src/share/classes/java/awt/peer/CanvasPeer.java +++ b/jdk/src/share/classes/java/awt/peer/CanvasPeer.java @@ -25,6 +25,7 @@ package java.awt.peer; import java.awt.Canvas; +import java.awt.GraphicsConfiguration; /** * The peer interface for {@link Canvas}. @@ -36,4 +37,13 @@ import java.awt.Canvas; * instances. */ public interface CanvasPeer extends ComponentPeer { + /** + * Requests a GC that best suits this Canvas. The returned GC may differ + * from the requested GC passed as the argument to this method. This method + * must return a non-null value (given the argument is non-null as well). + * + * @since 1.7 + */ + GraphicsConfiguration getAppropriateGraphicsConfiguration( + GraphicsConfiguration gc); } diff --git a/jdk/src/share/classes/java/awt/peer/ComponentPeer.java b/jdk/src/share/classes/java/awt/peer/ComponentPeer.java index e71ab27f7ac..3a2845f37fa 100644 --- a/jdk/src/share/classes/java/awt/peer/ComponentPeer.java +++ b/jdk/src/share/classes/java/awt/peer/ComponentPeer.java @@ -539,4 +539,10 @@ public interface ComponentPeer { */ void applyShape(Region shape); + /** + * Updates internal data structures related to the component's GC. + * + * @since 1.7 + */ + void updateGraphicsData(GraphicsConfiguration gc); } diff --git a/jdk/src/share/classes/sun/awt/AWTAccessor.java b/jdk/src/share/classes/sun/awt/AWTAccessor.java index 2145f0f10a4..767b4147778 100644 --- a/jdk/src/share/classes/sun/awt/AWTAccessor.java +++ b/jdk/src/share/classes/sun/awt/AWTAccessor.java @@ -78,6 +78,11 @@ public final class AWTAccessor { * See 6797587, 6776743, 6768307, and 6768332 for details */ void setMixingCutoutShape(Component comp, Shape shape); + + /** + * Sets GraphicsConfiguration value for the component. + */ + void setGraphicsConfiguration(Component comp, GraphicsConfiguration gc); } /* diff --git a/jdk/src/share/classes/sun/awt/ComponentAccessor.java b/jdk/src/share/classes/sun/awt/ComponentAccessor.java index af3abcf8a95..49a383815db 100644 --- a/jdk/src/share/classes/sun/awt/ComponentAccessor.java +++ b/jdk/src/share/classes/sun/awt/ComponentAccessor.java @@ -73,7 +73,6 @@ public class ComponentAccessor private static Field fieldPacked; private static Field fieldIgnoreRepaint; private static Field fieldPeer; - private static Method methodResetGC; private static Field fieldVisible; private static Method methodIsEnabledImpl; private static Method methodGetCursorNoClientCode; @@ -124,9 +123,6 @@ public class ComponentAccessor fieldPeer = componentClass.getDeclaredField("peer"); fieldPeer.setAccessible(true); - methodResetGC = componentClass.getDeclaredMethod("resetGC", (Class[]) null); - methodResetGC.setAccessible(true); - fieldVisible = componentClass.getDeclaredField("visible"); fieldVisible.setAccessible(true); @@ -425,18 +421,6 @@ public class ComponentAccessor return false; } - public static void resetGC(Component c) { - try { - methodResetGC.invoke(c, (Object[]) null); - } - catch (IllegalAccessException e) { - log.log(Level.FINE, "Unable to access the Component object", e); - } - catch (InvocationTargetException e) { - log.log(Level.FINE, "Unable to invoke on the Component object", e); - } - } - public static boolean getVisible(Component c) { try { return fieldVisible.getBoolean(c); diff --git a/jdk/src/share/classes/sun/awt/NullComponentPeer.java b/jdk/src/share/classes/sun/awt/NullComponentPeer.java index 8818c472877..2feea7b518c 100644 --- a/jdk/src/share/classes/sun/awt/NullComponentPeer.java +++ b/jdk/src/share/classes/sun/awt/NullComponentPeer.java @@ -305,4 +305,12 @@ public class NullComponentPeer implements LightweightPeer, */ public void applyShape(Region shape) { } + + public void updateGraphicsData(GraphicsConfiguration gc) {} + + public GraphicsConfiguration getAppropriateGraphicsConfiguration( + GraphicsConfiguration gc) + { + return gc; + } } diff --git a/jdk/src/solaris/classes/sun/awt/X11/XCanvasPeer.java b/jdk/src/solaris/classes/sun/awt/X11/XCanvasPeer.java index 4c38c88b9fc..8fc6f1f7d28 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XCanvasPeer.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XCanvasPeer.java @@ -27,7 +27,6 @@ package sun.awt.X11; import java.awt.*; import java.awt.peer.*; -import sun.awt.ComponentAccessor; import sun.awt.SunToolkit; import sun.awt.X11GraphicsConfig; @@ -54,60 +53,45 @@ class XCanvasPeer extends XComponentPeer implements CanvasPeer { } } - void resetTargetGC(Component target) { - ComponentAccessor.resetGC(target); - } - - /* - * Called when the Window this - * Canvas is on is moved onto another Xinerama screen. - * - * Canvases can be created with a non-defulat GraphicsConfiguration. The - * GraphicsConfiguration needs to be changed to one on the new screen, - * preferably with the same visual ID. - * - * Up-called for other windows peer instances (XPanelPeer, XWindowPeer). - * - * Should only be called from the event thread. - */ - public void displayChanged(int screenNum) { - resetLocalGC(screenNum); - resetTargetGC(target); - } - - /* Set graphicsConfig to a GraphicsConfig with the same visual on the new + /* Get a GraphicsConfig with the same visual on the new * screen, which should be easy in Xinerama mode. - * - * Should only be called from displayChanged(), and therefore only from - * the event thread. */ - void resetLocalGC(int screenNum) { + public GraphicsConfiguration getAppropriateGraphicsConfiguration( + GraphicsConfiguration gc) + { + if (graphicsConfig == null || gc == null) { + return gc; + } // Opt: Only need to do if we're not using the default GC - if (graphicsConfig != null) { - X11GraphicsConfig parentgc; - // save vis id of current gc - int visual = graphicsConfig.getVisual(); - X11GraphicsDevice newDev = (X11GraphicsDevice) GraphicsEnvironment. - getLocalGraphicsEnvironment(). - getScreenDevices()[screenNum]; + int screenNum = ((X11GraphicsDevice)gc.getDevice()).getScreen(); - for (int i = 0; i < newDev.getNumConfigs(screenNum); i++) { - if (visual == newDev.getConfigVisualId(i, screenNum)) { - // use that - graphicsConfig = (X11GraphicsConfig)newDev.getConfigurations()[i]; - break; - } - } - // just in case... - if (graphicsConfig == null) { - graphicsConfig = (X11GraphicsConfig) GraphicsEnvironment. - getLocalGraphicsEnvironment(). - getScreenDevices()[screenNum]. - getDefaultConfiguration(); + X11GraphicsConfig parentgc; + // save vis id of current gc + int visual = graphicsConfig.getVisual(); + + X11GraphicsDevice newDev = (X11GraphicsDevice) GraphicsEnvironment. + getLocalGraphicsEnvironment(). + getScreenDevices()[screenNum]; + + for (int i = 0; i < newDev.getNumConfigs(screenNum); i++) { + if (visual == newDev.getConfigVisualId(i, screenNum)) { + // use that + graphicsConfig = (X11GraphicsConfig)newDev.getConfigurations()[i]; + break; } } + // just in case... + if (graphicsConfig == null) { + graphicsConfig = (X11GraphicsConfig) GraphicsEnvironment. + getLocalGraphicsEnvironment(). + getScreenDevices()[screenNum]. + getDefaultConfiguration(); + } + + return graphicsConfig; } + protected boolean shouldFocusOnClick() { // Canvas should always be able to be focused by mouse clicks. return true; diff --git a/jdk/src/solaris/classes/sun/awt/X11/XComponentPeer.java b/jdk/src/solaris/classes/sun/awt/X11/XComponentPeer.java index 46c4a8768f0..4c83ac750c8 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XComponentPeer.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XComponentPeer.java @@ -35,6 +35,7 @@ import java.awt.Dimension; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; +import java.awt.GraphicsConfiguration; import java.awt.Image; import java.awt.Insets; import java.awt.KeyboardFocusManager; @@ -1556,4 +1557,8 @@ public class XComponentPeer extends XWindow implements ComponentPeer, DropTarget } } } + + public void updateGraphicsData(GraphicsConfiguration gc) { + initGraphicsConfiguration(); + } } diff --git a/jdk/src/solaris/classes/sun/awt/X11/XEmbedChildProxyPeer.java b/jdk/src/solaris/classes/sun/awt/X11/XEmbedChildProxyPeer.java index e4500043ae1..eae300aee08 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XEmbedChildProxyPeer.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XEmbedChildProxyPeer.java @@ -379,4 +379,6 @@ public class XEmbedChildProxyPeer implements ComponentPeer, XEventDispatcher{ public void applyShape(Region shape) { } + + public void updateGraphicsData(GraphicsConfiguration gc) {} } diff --git a/jdk/src/solaris/classes/sun/awt/X11/XPanelPeer.java b/jdk/src/solaris/classes/sun/awt/X11/XPanelPeer.java index aac632569ad..c070fcf3ad8 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XPanelPeer.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XPanelPeer.java @@ -130,39 +130,6 @@ public class XPanelPeer extends XCanvasPeer implements PanelPeer { return getInsets(); } - /* - * This method is called from XWindowPeer.displayChanged, when - * the window this Panel is on is moved to the new screen, or - * display mode is changed. - * - * The notification is propagated to the child Canvas components. - * Top-level windows and other Panels are notified too as their - * peers are subclasses of XCanvasPeer. - */ - public void displayChanged(int screenNum) { - super.displayChanged(screenNum); - displayChanged((Container)target, screenNum); - } - - /* - * Recursively iterates through all the HW and LW children - * of the container and calls displayChanged() for HW peers. - * Iteration through children peers only is not enough as the - * displayChanged notification may not be propagated to HW - * components inside LW containers, see 4452373 for details. - */ - private static void displayChanged(Container target, int screenNum) { - Component children[] = ((Container)target).getComponents(); - for (Component child : children) { - ComponentPeer cpeer = child.getPeer(); - if (cpeer instanceof XCanvasPeer) { - ((XCanvasPeer)cpeer).displayChanged(screenNum); - } else if (child instanceof Container) { - displayChanged((Container)child, screenNum); - } - } - } - public void dispose() { if (embedder != null) { embedder.deinstall(); diff --git a/jdk/src/solaris/classes/sun/awt/X11/XWindowPeer.java b/jdk/src/solaris/classes/sun/awt/X11/XWindowPeer.java index 619ff8a9c9b..4f9fa56fd8f 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XWindowPeer.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XWindowPeer.java @@ -47,6 +47,7 @@ import java.util.logging.Logger; import sun.awt.AWTAccessor; import sun.awt.ComponentAccessor; import sun.awt.WindowAccessor; +import sun.awt.AWTAccessor; import sun.awt.DisplayChangedListener; import sun.awt.SunToolkit; import sun.awt.X11GraphicsDevice; @@ -711,6 +712,7 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, int curScreenNum = ((X11GraphicsDevice)getGraphicsConfiguration().getDevice()).getScreen(); int newScreenNum = 0; GraphicsDevice gds[] = XToolkit.localEnv.getScreenDevices(); + GraphicsConfiguration newGC = null; Rectangle screenBounds; for (int i = 0; i < gds.length; i++) { @@ -726,11 +728,13 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, if (intAmt == area) { // Completely on this screen - done! newScreenNum = i; + newGC = gds[i].getDefaultConfiguration(); break; } if (intAmt > largestAmt) { largestAmt = intAmt; newScreenNum = i; + newGC = gds[i].getDefaultConfiguration(); } } } @@ -738,28 +742,20 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, if (log.isLoggable(Level.FINEST)) { log.finest("XWindowPeer: Moved to a new screen"); } - draggedToNewScreen(newScreenNum); + executeDisplayChangedOnEDT(newGC); } } - /* Xinerama - * called to update our GC when dragged onto another screen - */ - public void draggedToNewScreen(int screenNum) { - executeDisplayChangedOnEDT(screenNum); - } - /** * Helper method that executes the displayChanged(screen) method on * the event dispatch thread. This method is used in the Xinerama case * and after display mode change events. */ - private void executeDisplayChangedOnEDT(final int screenNum) { + private void executeDisplayChangedOnEDT(final GraphicsConfiguration gc) { Runnable dc = new Runnable() { public void run() { - // Updates this window's GC and notifies all the children. - // See XPanelPeer/XCanvasPeer.displayChanged(int) for details. - displayChanged(screenNum); + AWTAccessor.getComponentAccessor(). + setGraphicsConfiguration((Component)target, gc); } }; SunToolkit.executeOnEventHandlerThread((Component)target, dc); @@ -770,9 +766,7 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, * X11GraphicsDevice when the display mode has been changed. */ public void displayChanged() { - GraphicsConfiguration gc = getGraphicsConfiguration(); - int curScreenNum = ((X11GraphicsDevice)gc.getDevice()).getScreen(); - executeDisplayChangedOnEDT(curScreenNum); + executeDisplayChangedOnEDT(getGraphicsConfiguration()); } /** diff --git a/jdk/src/solaris/native/sun/awt/awt_Component.h b/jdk/src/solaris/native/sun/awt/awt_Component.h index 8ee7fe82f45..d6ee776be01 100644 --- a/jdk/src/solaris/native/sun/awt/awt_Component.h +++ b/jdk/src/solaris/native/sun/awt/awt_Component.h @@ -41,7 +41,6 @@ struct ComponentIDs { jfieldID appContext; jmethodID getParent; jmethodID getLocationOnScreen; - jmethodID resetGCMID; }; /* field and method IDs for Container */ @@ -65,7 +64,3 @@ struct MComponentPeerIDs { extern void processTree(Widget from, Widget to, Boolean action); #endif // HEADLESS -/* fieldIDs for Canvas fields that may be accessed from C */ -struct CanvasIDs { - jmethodID setGCFromPeerMID; -}; diff --git a/jdk/src/solaris/native/sun/awt/awt_Window.h b/jdk/src/solaris/native/sun/awt/awt_Window.h index 875f55b2fa1..a93e4ad34d1 100644 --- a/jdk/src/solaris/native/sun/awt/awt_Window.h +++ b/jdk/src/solaris/native/sun/awt/awt_Window.h @@ -28,7 +28,6 @@ /* fieldIDs for Window fields that may be accessed from C */ struct WindowIDs { jfieldID warningString; - jmethodID resetGCMID; jfieldID locationByPlatform; jfieldID isAutoRequestFocus; }; diff --git a/jdk/src/solaris/native/sun/xawt/XToolkit.c b/jdk/src/solaris/native/sun/xawt/XToolkit.c index ac3fecc0c76..3b9669cb92b 100644 --- a/jdk/src/solaris/native/sun/xawt/XToolkit.c +++ b/jdk/src/solaris/native/sun/xawt/XToolkit.c @@ -182,9 +182,6 @@ Java_java_awt_Component_initIDs (*env)->GetMethodID(env, cls, "getLocationOnScreen_NoTreeLock", "()Ljava/awt/Point;"); - componentIDs.resetGCMID = - (*env)->GetMethodID(env, cls, "resetGC", "()V"); - keyclass = (*env)->FindClass(env, "java/awt/event/KeyEvent"); DASSERT (keyclass != NULL); @@ -197,9 +194,6 @@ Java_java_awt_Component_initIDs "Lsun/awt/AppContext;"); (*env)->DeleteLocalRef(env, keyclass); - - DASSERT(componentIDs.resetGCMID); - } diff --git a/jdk/src/windows/classes/sun/awt/Win32GraphicsDevice.java b/jdk/src/windows/classes/sun/awt/Win32GraphicsDevice.java index ba4769813d8..1da339ce9f1 100644 --- a/jdk/src/windows/classes/sun/awt/Win32GraphicsDevice.java +++ b/jdk/src/windows/classes/sun/awt/Win32GraphicsDevice.java @@ -380,7 +380,6 @@ public class Win32GraphicsDevice extends GraphicsDevice implements // fix for 4868278 peer.updateGC(); - peer.resetTargetGC(); } } diff --git a/jdk/src/windows/classes/sun/awt/windows/WCanvasPeer.java b/jdk/src/windows/classes/sun/awt/windows/WCanvasPeer.java index e1657102900..b97a3787b64 100644 --- a/jdk/src/windows/classes/sun/awt/windows/WCanvasPeer.java +++ b/jdk/src/windows/classes/sun/awt/windows/WCanvasPeer.java @@ -38,44 +38,12 @@ class WCanvasPeer extends WComponentPeer implements CanvasPeer { private boolean eraseBackground; - Method resetGCMethod; - // Toolkit & peer internals WCanvasPeer(Component target) { super(target); } - /* - * From the DisplayChangedListener interface. - * - * Overrides WComponentPeer version because Canvases can be created with - * a non-defulat GraphicsConfiguration, which is no longer valid. - * Up-called for other windows peer instances (WPanelPeer, WWindowPeer). - */ - public void displayChanged() { - clearLocalGC(); - resetTargetGC(); - super.displayChanged(); - } - - /* - * Reset the graphicsConfiguration member of our target Component. - * Component.resetGC() is a package-private method, so we have to call it - * through reflection. - */ - public void resetTargetGC() { - ComponentAccessor.resetGC((Component)target); - } - - /* - * Clears the peer's winGraphicsConfig member. - * Overridden by WWindowPeer, which shouldn't have a null winGraphicsConfig. - */ - void clearLocalGC() { - winGraphicsConfig = null; - } - native void create(WComponentPeer parent); void initialize() { @@ -152,4 +120,10 @@ class WCanvasPeer extends WComponentPeer implements CanvasPeer { */ private native void setNativeBackgroundErase(boolean doErase, boolean doEraseOnResize); + + public GraphicsConfiguration getAppropriateGraphicsConfiguration( + GraphicsConfiguration gc) + { + return gc; + } } diff --git a/jdk/src/windows/classes/sun/awt/windows/WComponentPeer.java b/jdk/src/windows/classes/sun/awt/windows/WComponentPeer.java index 3a414d1c328..56eb45fa3f5 100644 --- a/jdk/src/windows/classes/sun/awt/windows/WComponentPeer.java +++ b/jdk/src/windows/classes/sun/awt/windows/WComponentPeer.java @@ -59,7 +59,7 @@ import java.util.logging.*; public abstract class WComponentPeer extends WObjectPeer - implements ComponentPeer, DropTargetPeer, DisplayChangedListener + implements ComponentPeer, DropTargetPeer { /** * Handle to native window @@ -452,15 +452,8 @@ public abstract class WComponentPeer extends WObjectPeer } } - /** - * From the DisplayChangedListener interface. - * - * Called after a change in the display mode. This event - * triggers replacing the surfaceData object (since that object - * reflects the current display depth information, which has - * just changed). - */ - public void displayChanged() { + public void updateGraphicsData(GraphicsConfiguration gc) { + winGraphicsConfig = (Win32GraphicsConfig)gc; try { replaceSurfaceData(); } catch (InvalidPipeException e) { @@ -468,13 +461,6 @@ public abstract class WComponentPeer extends WObjectPeer } } - /** - * Part of the DisplayChangedListener interface: components - * do not need to react to this event - */ - public void paletteChanged() { - } - //This will return null for Components not yet added to a Container public ColorModel getColorModel() { GraphicsConfiguration gc = getGraphicsConfiguration(); diff --git a/jdk/src/windows/classes/sun/awt/windows/WPanelPeer.java b/jdk/src/windows/classes/sun/awt/windows/WPanelPeer.java index 8a0d7ffbcc1..10ca423146c 100644 --- a/jdk/src/windows/classes/sun/awt/windows/WPanelPeer.java +++ b/jdk/src/windows/classes/sun/awt/windows/WPanelPeer.java @@ -100,34 +100,6 @@ class WPanelPeer extends WCanvasPeer implements PanelPeer { return getInsets(); } - /* - * From the DisplayChangedListener interface. Often is - * up-called from a WWindowPeer instance. - */ - public void displayChanged() { - super.displayChanged(); - displayChanged((Container)target); - } - - /* - * Recursively iterates through all the HW and LW children - * of the container and calls displayChanged() for HW peers. - * Iteration through children peers only is not enough as the - * displayChanged notification may not be propagated to HW - * components inside LW containers, see 4452373 for details. - */ - private static void displayChanged(Container target) { - Component children[] = ((Container)target).getComponents(); - for (Component child : children) { - ComponentPeer cpeer = child.getPeer(); - if (cpeer instanceof WComponentPeer) { - ((WComponentPeer)cpeer).displayChanged(); - } else if (child instanceof Container) { - displayChanged((Container)child); - } - } - } - private native void pRestack(Object[] peers); private void restack(Container cont, Vector peers) { for (int i = 0; i < cont.getComponentCount(); i++) { diff --git a/jdk/src/windows/classes/sun/awt/windows/WWindowPeer.java b/jdk/src/windows/classes/sun/awt/windows/WWindowPeer.java index 79818431063..73f9e3f811f 100644 --- a/jdk/src/windows/classes/sun/awt/windows/WWindowPeer.java +++ b/jdk/src/windows/classes/sun/awt/windows/WWindowPeer.java @@ -41,7 +41,9 @@ import sun.awt.*; import sun.java2d.pipe.Region; -public class WWindowPeer extends WPanelPeer implements WindowPeer { +public class WWindowPeer extends WPanelPeer implements WindowPeer, + DisplayChangedListener +{ private static final Logger log = Logger.getLogger("sun.awt.windows.WWindowPeer"); private static final Logger screenLog = Logger.getLogger("sun.awt.windows.screen.WWindowPeer"); @@ -198,7 +200,6 @@ public class WWindowPeer extends WPanelPeer implements WindowPeer { // super.displayChanged() in WWindowPeer.displayChanged() regardless of whether // GraphicsDevice was really changed, or not. So we need to track it here. updateGC(); - resetTargetGC(); realShow(); updateMinimumSize(); @@ -400,14 +401,6 @@ public class WWindowPeer extends WPanelPeer implements WindowPeer { }); } - - /* - * Called from WCanvasPeer.displayChanged(). - * Override to do nothing - Window and WWindowPeer GC must never be set to - * null! - */ - void clearLocalGC() {} - public void updateGC() { int scrn = getScreenImOn(); if (screenLog.isLoggable(Level.FINER)) { @@ -446,18 +439,36 @@ public class WWindowPeer extends WPanelPeer implements WindowPeer { oldDev.removeDisplayChangedListener(this); newDev.addDisplayChangedListener(this); } + + SunToolkit.executeOnEventHandlerThread((Component)target, + new Runnable() { + public void run() { + AWTAccessor.getComponentAccessor(). + setGraphicsConfiguration((Component)target, winGraphicsConfig); + } + }); } - /* - * From the DisplayChangedListener interface + /** + * From the DisplayChangedListener interface. * * This method handles a display change - either when the display settings * are changed, or when the window has been dragged onto a different * display. + * Called after a change in the display mode. This event + * triggers replacing the surfaceData object (since that object + * reflects the current display depth information, which has + * just changed). */ public void displayChanged() { updateGC(); - super.displayChanged(); + } + + /** + * Part of the DisplayChangedListener interface: components + * do not need to react to this event + */ + public void paletteChanged() { } private native int getScreenImOn(); From 0723dab28bd58c6741f9fc7df3e195d06d391371 Mon Sep 17 00:00:00 2001 From: Christian Thalinger Date: Mon, 23 Feb 2009 12:02:30 -0800 Subject: [PATCH 051/292] 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp} There is very much duplicated code in vm_version_x86_{32,64}.{cpp,hpp}. Refactoring these would help maintainability. Reviewed-by: kvn, never --- ..._version_x86_32.cpp => vm_version_x86.cpp} | 62 ++- ..._version_x86_64.hpp => vm_version_x86.hpp} | 82 ++-- hotspot/src/cpu/x86/vm/vm_version_x86_32.hpp | 439 ------------------ hotspot/src/cpu/x86/vm/vm_version_x86_64.cpp | 419 ----------------- .../os_cpu/solaris_x86/vm/os_solaris_x86.cpp | 10 +- .../os_cpu/solaris_x86/vm/os_solaris_x86.hpp | 5 +- hotspot/src/share/vm/includeDB_core | 36 +- 7 files changed, 126 insertions(+), 927 deletions(-) rename hotspot/src/cpu/x86/vm/{vm_version_x86_32.cpp => vm_version_x86.cpp} (91%) rename hotspot/src/cpu/x86/vm/{vm_version_x86_64.hpp => vm_version_x86.hpp} (92%) delete mode 100644 hotspot/src/cpu/x86/vm/vm_version_x86_32.hpp delete mode 100644 hotspot/src/cpu/x86/vm/vm_version_x86_64.cpp diff --git a/hotspot/src/cpu/x86/vm/vm_version_x86_32.cpp b/hotspot/src/cpu/x86/vm/vm_version_x86.cpp similarity index 91% rename from hotspot/src/cpu/x86/vm/vm_version_x86_32.cpp rename to hotspot/src/cpu/x86/vm/vm_version_x86.cpp index edd1da4e31f..cf112067fe4 100644 --- a/hotspot/src/cpu/x86/vm/vm_version_x86_32.cpp +++ b/hotspot/src/cpu/x86/vm/vm_version_x86.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -23,7 +23,7 @@ */ # include "incls/_precompiled.incl" -# include "incls/_vm_version_x86_32.cpp.incl" +# include "incls/_vm_version_x86.cpp.incl" int VM_Version::_cpu; @@ -67,8 +67,14 @@ class VM_Version_StubGenerator: public StubCodeGenerator { // // void getPsrInfo(VM_Version::CpuidInfo* cpuid_info); // + // LP64: rcx and rdx are first and second argument registers on windows + __ push(rbp); +#ifdef _LP64 + __ mov(rbp, c_rarg0); // cpuid_info address +#else __ movptr(rbp, Address(rsp, 8)); // cpuid_info address +#endif __ push(rbx); __ push(rsi); __ pushf(); // preserve rbx, and flags @@ -110,12 +116,12 @@ class VM_Version_StubGenerator: public StubCodeGenerator { __ jmp(done); // - // at this point, we have a chip which supports the "cpuid" instruction + // At this point, we have a chip which supports the "cpuid" instruction // __ bind(detect_586); - __ xorptr(rax, rax); + __ xorl(rax, rax); __ cpuid(); - __ orptr(rax, rax); + __ orl(rax, rax); __ jcc(Assembler::equal, cpu486); // if cpuid doesn't support an input // value of at least 1, we give up and // assume a 486 @@ -131,12 +137,12 @@ class VM_Version_StubGenerator: public StubCodeGenerator { // // cpuid(0x4) Deterministic cache params // - __ movl(rax, 4); // and rcx already set to 0x0 - __ xorl(rcx, rcx); + __ movl(rax, 4); + __ xorl(rcx, rcx); // L1 cache __ cpuid(); __ push(rax); __ andl(rax, 0x1f); // Determine if valid cache parameters used - __ orl(rax, rax); // rax,[4:0] == 0 indicates invalid cache + __ orl(rax, rax); // eax[4:0] == 0 indicates invalid cache __ pop(rax); __ jccb(Assembler::equal, std_cpuid1); @@ -225,6 +231,7 @@ void VM_Version::get_processor_features() { _stepping = 0; _cpuFeatures = 0; _logical_processors_per_package = 1; + if (!Use486InstrsOnly) { // Get raw processor info getPsrInfo_stub(&_cpuid_info); @@ -232,6 +239,7 @@ void VM_Version::get_processor_features() { _cpu = extended_cpu_family(); _model = extended_cpu_model(); _stepping = cpu_stepping(); + if (cpu_family() > 4) { // it supports CPUID _cpuFeatures = feature_flags(); // Logical processors are only available on P4s and above, @@ -239,21 +247,34 @@ void VM_Version::get_processor_features() { _logical_processors_per_package = logical_processor_count(); } } + _supports_cx8 = supports_cmpxchg8(); - // if the OS doesn't support SSE, we can't use this feature even if the HW does - if( !os::supports_sse()) + +#ifdef _LP64 + // OS should support SSE for x64 and hardware should support at least SSE2. + if (!VM_Version::supports_sse2()) { + vm_exit_during_initialization("Unknown x64 processor: SSE2 not supported"); + } +#endif + + // If the OS doesn't support SSE, we can't use this feature even if the HW does + if (!os::supports_sse()) _cpuFeatures &= ~(CPU_SSE|CPU_SSE2|CPU_SSE3|CPU_SSSE3|CPU_SSE4A|CPU_SSE4_1|CPU_SSE4_2); + if (UseSSE < 4) { _cpuFeatures &= ~CPU_SSE4_1; _cpuFeatures &= ~CPU_SSE4_2; } + if (UseSSE < 3) { _cpuFeatures &= ~CPU_SSE3; _cpuFeatures &= ~CPU_SSSE3; _cpuFeatures &= ~CPU_SSE4A; } + if (UseSSE < 2) _cpuFeatures &= ~CPU_SSE2; + if (UseSSE < 1) _cpuFeatures &= ~CPU_SSE; @@ -418,10 +439,21 @@ void VM_Version::get_processor_features() { if( AllocatePrefetchStyle == 2 && is_intel() && cpu_family() == 6 && supports_sse3() ) { // watermark prefetching on Core +#ifdef _LP64 + AllocatePrefetchDistance = 384; +#else AllocatePrefetchDistance = 320; +#endif } assert(AllocatePrefetchDistance % AllocatePrefetchStepSize == 0, "invalid value"); +#ifdef _LP64 + // Prefetch settings + PrefetchCopyIntervalInBytes = prefetch_copy_interval_in_bytes(); + PrefetchScanIntervalInBytes = prefetch_scan_interval_in_bytes(); + PrefetchFieldsAhead = prefetch_fields_ahead(); +#endif + #ifndef PRODUCT if (PrintMiscellaneous && Verbose) { tty->print_cr("Logical CPUs per core: %u", @@ -450,6 +482,16 @@ void VM_Version::get_processor_features() { tty->print_cr(" %d, one line", AllocatePrefetchDistance); } } + + if (PrefetchCopyIntervalInBytes > 0) { + tty->print_cr("PrefetchCopyIntervalInBytes %d", PrefetchCopyIntervalInBytes); + } + if (PrefetchScanIntervalInBytes > 0) { + tty->print_cr("PrefetchScanIntervalInBytes %d", PrefetchScanIntervalInBytes); + } + if (PrefetchFieldsAhead > 0) { + tty->print_cr("PrefetchFieldsAhead %d", PrefetchFieldsAhead); + } } #endif // !PRODUCT } diff --git a/hotspot/src/cpu/x86/vm/vm_version_x86_64.hpp b/hotspot/src/cpu/x86/vm/vm_version_x86.hpp similarity index 92% rename from hotspot/src/cpu/x86/vm/vm_version_x86_64.hpp rename to hotspot/src/cpu/x86/vm/vm_version_x86.hpp index 43492f5fb16..bf876fc92a6 100644 --- a/hotspot/src/cpu/x86/vm/vm_version_x86_64.hpp +++ b/hotspot/src/cpu/x86/vm/vm_version_x86.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -112,20 +112,6 @@ public: } bits; }; - union ExtCpuid1Edx { - uint32_t value; - struct { - uint32_t : 22, - mmx_amd : 1, - mmx : 1, - fxsr : 1, - : 4, - long_mode : 1, - tdnow2 : 1, - tdnow : 1; - } bits; - }; - union ExtCpuid1Ecx { uint32_t value; struct { @@ -140,6 +126,20 @@ public: } bits; }; + union ExtCpuid1Edx { + uint32_t value; + struct { + uint32_t : 22, + mmx_amd : 1, + mmx : 1, + fxsr : 1, + : 4, + long_mode : 1, + tdnow2 : 1, + tdnow : 1; + } bits; + }; + union ExtCpuid5Ex { uint32_t value; struct { @@ -167,17 +167,17 @@ protected: static const char* _features_str; enum { - CPU_CX8 = (1 << 0), // next bits are from cpuid 1 (EDX) - CPU_CMOV = (1 << 1), - CPU_FXSR = (1 << 2), - CPU_HT = (1 << 3), - CPU_MMX = (1 << 4), - CPU_3DNOW= (1 << 5), - CPU_SSE = (1 << 6), - CPU_SSE2 = (1 << 7), - CPU_SSE3 = (1 << 8), - CPU_SSSE3= (1 << 9), - CPU_SSE4A= (1 <<10), + CPU_CX8 = (1 << 0), // next bits are from cpuid 1 (EDX) + CPU_CMOV = (1 << 1), + CPU_FXSR = (1 << 2), + CPU_HT = (1 << 3), + CPU_MMX = (1 << 4), + CPU_3DNOW = (1 << 5), // 3DNow comes from cpuid 0x80000001 (EDX) + CPU_SSE = (1 << 6), + CPU_SSE2 = (1 << 7), + CPU_SSE3 = (1 << 8), // SSE3 comes from cpuid 1 (ECX) + CPU_SSSE3 = (1 << 9), + CPU_SSE4A = (1 << 10), CPU_SSE4_1 = (1 << 11), CPU_SSE4_2 = (1 << 12) } cpuFeatureFlags; @@ -360,7 +360,7 @@ public: result = _cpuid_info.ext_cpuid5_ecx.bits.L1_line_size; } if (result < 32) // not defined ? - result = 32; // 32 bytes by default for other x64 + result = 32; // 32 bytes by default on x86 and other x64 return result; } @@ -395,26 +395,36 @@ public: // This method should be called before allocate_prefetch_style(). // // Hardware prefetching (distance/size in bytes): + // Pentium 3 - 64 / 32 // Pentium 4 - 256 / 128 + // Athlon - 64 / 32 ???? // Opteron - 128 / 64 only when 2 sequential cache lines accessed // Core - 128 / 64 // // Software prefetching (distance in bytes / instruction with best score): + // Pentium 3 - 128 / prefetchnta // Pentium 4 - 512 / prefetchnta + // Athlon - 128 / prefetchnta // Opteron - 256 / prefetchnta // Core - 256 / prefetchnta // It will be used only when AllocatePrefetchStyle > 0 intx count = AllocatePrefetchDistance; - if (count < 0) { // default ? - if (is_amd()) { // AMD - count = 256; // Opteron - } else { // Intel - if (cpu_family() == 6) { - count = 256;// Pentium M, Core, Core2 - } else { - count = 512;// Pentium 4 - } + if (count < 0) { // default ? + if (is_amd()) { // AMD + if (supports_sse2()) + count = 256; // Opteron + else + count = 128; // Athlon + } else { // Intel + if (supports_sse2()) + if (cpu_family() == 6) { + count = 256; // Pentium M, Core, Core2 + } else { + count = 512; // Pentium 4 + } + else + count = 128; // Pentium 3 (and all other old CPUs) } } return count; diff --git a/hotspot/src/cpu/x86/vm/vm_version_x86_32.hpp b/hotspot/src/cpu/x86/vm/vm_version_x86_32.hpp deleted file mode 100644 index 54b3cb0370d..00000000000 --- a/hotspot/src/cpu/x86/vm/vm_version_x86_32.hpp +++ /dev/null @@ -1,439 +0,0 @@ -/* - * Copyright 1997-2008 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. - * - */ - -class VM_Version: public Abstract_VM_Version { -public: - // cpuid result register layouts. These are all unions of a uint32_t - // (in case anyone wants access to the register as a whole) and a bitfield. - - union StdCpuid1Eax { - uint32_t value; - struct { - uint32_t stepping : 4, - model : 4, - family : 4, - proc_type : 2, - : 2, - ext_model : 4, - ext_family : 8, - : 4; - } bits; - }; - - union StdCpuid1Ebx { // example, unused - uint32_t value; - struct { - uint32_t brand_id : 8, - clflush_size : 8, - threads_per_cpu : 8, - apic_id : 8; - } bits; - }; - - union StdCpuid1Ecx { - uint32_t value; - struct { - uint32_t sse3 : 1, - : 2, - monitor : 1, - : 1, - vmx : 1, - : 1, - est : 1, - : 1, - ssse3 : 1, - cid : 1, - : 2, - cmpxchg16: 1, - : 4, - dca : 1, - sse4_1 : 1, - sse4_2 : 1, - : 11; - } bits; - }; - - union StdCpuid1Edx { - uint32_t value; - struct { - uint32_t : 4, - tsc : 1, - : 3, - cmpxchg8 : 1, - : 6, - cmov : 1, - : 7, - mmx : 1, - fxsr : 1, - sse : 1, - sse2 : 1, - : 1, - ht : 1, - : 3; - } bits; - }; - - union DcpCpuid4Eax { - uint32_t value; - struct { - uint32_t cache_type : 5, - : 21, - cores_per_cpu : 6; - } bits; - }; - - union DcpCpuid4Ebx { - uint32_t value; - struct { - uint32_t L1_line_size : 12, - partitions : 10, - associativity : 10; - } bits; - }; - - union ExtCpuid1Ecx { - uint32_t value; - struct { - uint32_t LahfSahf : 1, - CmpLegacy : 1, - : 4, - abm : 1, - sse4a : 1, - misalignsse : 1, - prefetchw : 1, - : 22; - } bits; - }; - - union ExtCpuid1Edx { - uint32_t value; - struct { - uint32_t : 22, - mmx_amd : 1, - mmx : 1, - fxsr : 1, - : 4, - long_mode : 1, - tdnow2 : 1, - tdnow : 1; - } bits; - }; - - union ExtCpuid5Ex { - uint32_t value; - struct { - uint32_t L1_line_size : 8, - L1_tag_lines : 8, - L1_assoc : 8, - L1_size : 8; - } bits; - }; - - union ExtCpuid8Ecx { - uint32_t value; - struct { - uint32_t cores_per_cpu : 8, - : 24; - } bits; - }; - -protected: - static int _cpu; - static int _model; - static int _stepping; - static int _cpuFeatures; // features returned by the "cpuid" instruction - // 0 if this instruction is not available - static const char* _features_str; - - enum { - CPU_CX8 = (1 << 0), // next bits are from cpuid 1 (EDX) - CPU_CMOV = (1 << 1), - CPU_FXSR = (1 << 2), - CPU_HT = (1 << 3), - CPU_MMX = (1 << 4), - CPU_3DNOW= (1 << 5), // 3DNow comes from cpuid 0x80000001 (EDX) - CPU_SSE = (1 << 6), - CPU_SSE2 = (1 << 7), - CPU_SSE3 = (1 << 8), // sse3 comes from cpuid 1 (ECX) - CPU_SSSE3= (1 << 9), - CPU_SSE4A= (1 <<10), - CPU_SSE4_1 = (1 << 11), - CPU_SSE4_2 = (1 << 12) - } cpuFeatureFlags; - - // cpuid information block. All info derived from executing cpuid with - // various function numbers is stored here. Intel and AMD info is - // merged in this block: accessor methods disentangle it. - // - // The info block is laid out in subblocks of 4 dwords corresponding to - // rax, rbx, rcx and rdx, whether or not they contain anything useful. - struct CpuidInfo { - // cpuid function 0 - uint32_t std_max_function; - uint32_t std_vendor_name_0; - uint32_t std_vendor_name_1; - uint32_t std_vendor_name_2; - - // cpuid function 1 - StdCpuid1Eax std_cpuid1_rax; - StdCpuid1Ebx std_cpuid1_rbx; - StdCpuid1Ecx std_cpuid1_rcx; - StdCpuid1Edx std_cpuid1_rdx; - - // cpuid function 4 (deterministic cache parameters) - DcpCpuid4Eax dcp_cpuid4_rax; - DcpCpuid4Ebx dcp_cpuid4_rbx; - uint32_t dcp_cpuid4_rcx; // unused currently - uint32_t dcp_cpuid4_rdx; // unused currently - - // cpuid function 0x80000000 // example, unused - uint32_t ext_max_function; - uint32_t ext_vendor_name_0; - uint32_t ext_vendor_name_1; - uint32_t ext_vendor_name_2; - - // cpuid function 0x80000001 - uint32_t ext_cpuid1_rax; // reserved - uint32_t ext_cpuid1_rbx; // reserved - ExtCpuid1Ecx ext_cpuid1_rcx; - ExtCpuid1Edx ext_cpuid1_rdx; - - // cpuid functions 0x80000002 thru 0x80000004: example, unused - uint32_t proc_name_0, proc_name_1, proc_name_2, proc_name_3; - uint32_t proc_name_4, proc_name_5, proc_name_6, proc_name_7; - uint32_t proc_name_8, proc_name_9, proc_name_10,proc_name_11; - - // cpuid function 0x80000005 //AMD L1, Intel reserved - uint32_t ext_cpuid5_rax; // unused currently - uint32_t ext_cpuid5_rbx; // reserved - ExtCpuid5Ex ext_cpuid5_rcx; // L1 data cache info (AMD) - ExtCpuid5Ex ext_cpuid5_rdx; // L1 instruction cache info (AMD) - - // cpuid function 0x80000008 - uint32_t ext_cpuid8_rax; // unused currently - uint32_t ext_cpuid8_rbx; // reserved - ExtCpuid8Ecx ext_cpuid8_rcx; - uint32_t ext_cpuid8_rdx; // reserved - }; - - // The actual cpuid info block - static CpuidInfo _cpuid_info; - - // Extractors and predicates - static uint32_t extended_cpu_family() { - uint32_t result = _cpuid_info.std_cpuid1_rax.bits.family; - result += _cpuid_info.std_cpuid1_rax.bits.ext_family; - return result; - } - static uint32_t extended_cpu_model() { - uint32_t result = _cpuid_info.std_cpuid1_rax.bits.model; - result |= _cpuid_info.std_cpuid1_rax.bits.ext_model << 4; - return result; - } - static uint32_t cpu_stepping() { - uint32_t result = _cpuid_info.std_cpuid1_rax.bits.stepping; - return result; - } - static uint logical_processor_count() { - uint result = threads_per_core(); - return result; - } - static uint32_t feature_flags() { - uint32_t result = 0; - if (_cpuid_info.std_cpuid1_rdx.bits.cmpxchg8 != 0) - result |= CPU_CX8; - if (_cpuid_info.std_cpuid1_rdx.bits.cmov != 0) - result |= CPU_CMOV; - if (_cpuid_info.std_cpuid1_rdx.bits.fxsr != 0 || is_amd() && - _cpuid_info.ext_cpuid1_rdx.bits.fxsr != 0) - result |= CPU_FXSR; - // HT flag is set for multi-core processors also. - if (threads_per_core() > 1) - result |= CPU_HT; - if (_cpuid_info.std_cpuid1_rdx.bits.mmx != 0 || is_amd() && - _cpuid_info.ext_cpuid1_rdx.bits.mmx != 0) - result |= CPU_MMX; - if (is_amd() && _cpuid_info.ext_cpuid1_rdx.bits.tdnow != 0) - result |= CPU_3DNOW; - if (_cpuid_info.std_cpuid1_rdx.bits.sse != 0) - result |= CPU_SSE; - if (_cpuid_info.std_cpuid1_rdx.bits.sse2 != 0) - result |= CPU_SSE2; - if (_cpuid_info.std_cpuid1_rcx.bits.sse3 != 0) - result |= CPU_SSE3; - if (_cpuid_info.std_cpuid1_rcx.bits.ssse3 != 0) - result |= CPU_SSSE3; - if (is_amd() && _cpuid_info.ext_cpuid1_rcx.bits.sse4a != 0) - result |= CPU_SSE4A; - if (_cpuid_info.std_cpuid1_rcx.bits.sse4_1 != 0) - result |= CPU_SSE4_1; - if (_cpuid_info.std_cpuid1_rcx.bits.sse4_2 != 0) - result |= CPU_SSE4_2; - return result; - } - - static void get_processor_features(); - -public: - // Offsets for cpuid asm stub - static ByteSize std_cpuid0_offset() { return byte_offset_of(CpuidInfo, std_max_function); } - static ByteSize std_cpuid1_offset() { return byte_offset_of(CpuidInfo, std_cpuid1_rax); } - static ByteSize dcp_cpuid4_offset() { return byte_offset_of(CpuidInfo, dcp_cpuid4_rax); } - static ByteSize ext_cpuid1_offset() { return byte_offset_of(CpuidInfo, ext_cpuid1_rax); } - static ByteSize ext_cpuid5_offset() { return byte_offset_of(CpuidInfo, ext_cpuid5_rax); } - static ByteSize ext_cpuid8_offset() { return byte_offset_of(CpuidInfo, ext_cpuid8_rax); } - - // Initialization - static void initialize(); - - // Asserts - static void assert_is_initialized() { - assert(_cpuid_info.std_cpuid1_rax.bits.family != 0, "VM_Version not initialized"); - } - - // - // Processor family: - // 3 - 386 - // 4 - 486 - // 5 - Pentium - // 6 - PentiumPro, Pentium II, Celeron, Xeon, Pentium III, Athlon, - // Pentium M, Core Solo, Core Duo, Core2 Duo - // family 6 model: 9, 13, 14, 15 - // 0x0f - Pentium 4, Opteron - // - // Note: The cpu family should be used to select between - // instruction sequences which are valid on all Intel - // processors. Use the feature test functions below to - // determine whether a particular instruction is supported. - // - static int cpu_family() { return _cpu;} - static bool is_P6() { return cpu_family() >= 6; } - - static bool is_amd() { assert_is_initialized(); return _cpuid_info.std_vendor_name_0 == 0x68747541; } // 'htuA' - static bool is_intel() { assert_is_initialized(); return _cpuid_info.std_vendor_name_0 == 0x756e6547; } // 'uneG' - - static uint cores_per_cpu() { - uint result = 1; - if (is_intel()) { - result = (_cpuid_info.dcp_cpuid4_rax.bits.cores_per_cpu + 1); - } else if (is_amd()) { - result = (_cpuid_info.ext_cpuid8_rcx.bits.cores_per_cpu + 1); - } - return result; - } - - static uint threads_per_core() { - uint result = 1; - if (_cpuid_info.std_cpuid1_rdx.bits.ht != 0) { - result = _cpuid_info.std_cpuid1_rbx.bits.threads_per_cpu / - cores_per_cpu(); - } - return result; - } - - static intx L1_data_cache_line_size() { - intx result = 0; - if (is_intel()) { - result = (_cpuid_info.dcp_cpuid4_rbx.bits.L1_line_size + 1); - } else if (is_amd()) { - result = _cpuid_info.ext_cpuid5_rcx.bits.L1_line_size; - } - if (result < 32) // not defined ? - result = 32; // 32 bytes by default on x86 - return result; - } - - // - // Feature identification - // - static bool supports_cpuid() { return _cpuFeatures != 0; } - static bool supports_cmpxchg8() { return (_cpuFeatures & CPU_CX8) != 0; } - static bool supports_cmov() { return (_cpuFeatures & CPU_CMOV) != 0; } - static bool supports_fxsr() { return (_cpuFeatures & CPU_FXSR) != 0; } - static bool supports_ht() { return (_cpuFeatures & CPU_HT) != 0; } - static bool supports_mmx() { return (_cpuFeatures & CPU_MMX) != 0; } - static bool supports_sse() { return (_cpuFeatures & CPU_SSE) != 0; } - static bool supports_sse2() { return (_cpuFeatures & CPU_SSE2) != 0; } - static bool supports_sse3() { return (_cpuFeatures & CPU_SSE3) != 0; } - static bool supports_ssse3() { return (_cpuFeatures & CPU_SSSE3)!= 0; } - static bool supports_sse4_1() { return (_cpuFeatures & CPU_SSE4_1) != 0; } - static bool supports_sse4_2() { return (_cpuFeatures & CPU_SSE4_2) != 0; } - // - // AMD features - // - static bool supports_3dnow() { return (_cpuFeatures & CPU_3DNOW) != 0; } - static bool supports_mmx_ext() { return is_amd() && _cpuid_info.ext_cpuid1_rdx.bits.mmx_amd != 0; } - static bool supports_3dnow2() { return is_amd() && _cpuid_info.ext_cpuid1_rdx.bits.tdnow2 != 0; } - static bool supports_sse4a() { return (_cpuFeatures & CPU_SSE4A) != 0; } - - static bool supports_compare_and_exchange() { return true; } - - static const char* cpu_features() { return _features_str; } - - static intx allocate_prefetch_distance() { - // This method should be called before allocate_prefetch_style(). - // - // Hardware prefetching (distance/size in bytes): - // Pentium 3 - 64 / 32 - // Pentium 4 - 256 / 128 - // Athlon - 64 / 32 ???? - // Opteron - 128 / 64 only when 2 sequential cache lines accessed - // Core - 128 / 64 - // - // Software prefetching (distance in bytes / instruction with best score): - // Pentium 3 - 128 / prefetchnta - // Pentium 4 - 512 / prefetchnta - // Athlon - 128 / prefetchnta - // Opteron - 256 / prefetchnta - // Core - 256 / prefetchnta - // It will be used only when AllocatePrefetchStyle > 0 - - intx count = AllocatePrefetchDistance; - if (count < 0) { // default ? - if (is_amd()) { // AMD - if (supports_sse2()) - count = 256; // Opteron - else - count = 128; // Athlon - } else { // Intel - if (supports_sse2()) - if (cpu_family() == 6) { - count = 256; // Pentium M, Core, Core2 - } else { - count = 512; // Pentium 4 - } - else - count = 128; // Pentium 3 (and all other old CPUs) - } - } - return count; - } - static intx allocate_prefetch_style() { - assert(AllocatePrefetchStyle >= 0, "AllocatePrefetchStyle should be positive"); - // Return 0 if AllocatePrefetchDistance was not defined or - // prefetch instruction is not supported. - return (AllocatePrefetchDistance > 0 && - (supports_3dnow() || supports_sse())) ? AllocatePrefetchStyle : 0; - } -}; diff --git a/hotspot/src/cpu/x86/vm/vm_version_x86_64.cpp b/hotspot/src/cpu/x86/vm/vm_version_x86_64.cpp deleted file mode 100644 index 7994aab7a78..00000000000 --- a/hotspot/src/cpu/x86/vm/vm_version_x86_64.cpp +++ /dev/null @@ -1,419 +0,0 @@ -/* - * Copyright 2003-2008 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. - * - */ - -# include "incls/_precompiled.incl" -# include "incls/_vm_version_x86_64.cpp.incl" - -int VM_Version::_cpu; -int VM_Version::_model; -int VM_Version::_stepping; -int VM_Version::_cpuFeatures; -const char* VM_Version::_features_str = ""; -VM_Version::CpuidInfo VM_Version::_cpuid_info = { 0, }; - -static BufferBlob* stub_blob; -static const int stub_size = 300; - -extern "C" { - typedef void (*getPsrInfo_stub_t)(void*); -} -static getPsrInfo_stub_t getPsrInfo_stub = NULL; - - -class VM_Version_StubGenerator: public StubCodeGenerator { - public: - - VM_Version_StubGenerator(CodeBuffer *c) : StubCodeGenerator(c) {} - - address generate_getPsrInfo() { - - Label std_cpuid1, ext_cpuid1, ext_cpuid5, done; - - StubCodeMark mark(this, "VM_Version", "getPsrInfo_stub"); -# define __ _masm-> - - address start = __ pc(); - - // - // void getPsrInfo(VM_Version::CpuidInfo* cpuid_info); - // - // rcx and rdx are first and second argument registers on windows - - __ push(rbp); - __ mov(rbp, c_rarg0); // cpuid_info address - __ push(rbx); - __ push(rsi); - - // - // we have a chip which supports the "cpuid" instruction - // - __ xorl(rax, rax); - __ cpuid(); - __ lea(rsi, Address(rbp, in_bytes(VM_Version::std_cpuid0_offset()))); - __ movl(Address(rsi, 0), rax); - __ movl(Address(rsi, 4), rbx); - __ movl(Address(rsi, 8), rcx); - __ movl(Address(rsi,12), rdx); - - __ cmpl(rax, 3); // Is cpuid(0x4) supported? - __ jccb(Assembler::belowEqual, std_cpuid1); - - // - // cpuid(0x4) Deterministic cache params - // - __ movl(rax, 4); - __ xorl(rcx, rcx); // L1 cache - __ cpuid(); - __ push(rax); - __ andl(rax, 0x1f); // Determine if valid cache parameters used - __ orl(rax, rax); // eax[4:0] == 0 indicates invalid cache - __ pop(rax); - __ jccb(Assembler::equal, std_cpuid1); - - __ lea(rsi, Address(rbp, in_bytes(VM_Version::dcp_cpuid4_offset()))); - __ movl(Address(rsi, 0), rax); - __ movl(Address(rsi, 4), rbx); - __ movl(Address(rsi, 8), rcx); - __ movl(Address(rsi,12), rdx); - - // - // Standard cpuid(0x1) - // - __ bind(std_cpuid1); - __ movl(rax, 1); - __ cpuid(); - __ lea(rsi, Address(rbp, in_bytes(VM_Version::std_cpuid1_offset()))); - __ movl(Address(rsi, 0), rax); - __ movl(Address(rsi, 4), rbx); - __ movl(Address(rsi, 8), rcx); - __ movl(Address(rsi,12), rdx); - - __ movl(rax, 0x80000000); - __ cpuid(); - __ cmpl(rax, 0x80000000); // Is cpuid(0x80000001) supported? - __ jcc(Assembler::belowEqual, done); - __ cmpl(rax, 0x80000004); // Is cpuid(0x80000005) supported? - __ jccb(Assembler::belowEqual, ext_cpuid1); - __ cmpl(rax, 0x80000007); // Is cpuid(0x80000008) supported? - __ jccb(Assembler::belowEqual, ext_cpuid5); - // - // Extended cpuid(0x80000008) - // - __ movl(rax, 0x80000008); - __ cpuid(); - __ lea(rsi, Address(rbp, in_bytes(VM_Version::ext_cpuid8_offset()))); - __ movl(Address(rsi, 0), rax); - __ movl(Address(rsi, 4), rbx); - __ movl(Address(rsi, 8), rcx); - __ movl(Address(rsi,12), rdx); - - // - // Extended cpuid(0x80000005) - // - __ bind(ext_cpuid5); - __ movl(rax, 0x80000005); - __ cpuid(); - __ lea(rsi, Address(rbp, in_bytes(VM_Version::ext_cpuid5_offset()))); - __ movl(Address(rsi, 0), rax); - __ movl(Address(rsi, 4), rbx); - __ movl(Address(rsi, 8), rcx); - __ movl(Address(rsi,12), rdx); - - // - // Extended cpuid(0x80000001) - // - __ bind(ext_cpuid1); - __ movl(rax, 0x80000001); - __ cpuid(); - __ lea(rsi, Address(rbp, in_bytes(VM_Version::ext_cpuid1_offset()))); - __ movl(Address(rsi, 0), rax); - __ movl(Address(rsi, 4), rbx); - __ movl(Address(rsi, 8), rcx); - __ movl(Address(rsi,12), rdx); - - // - // return - // - __ bind(done); - __ pop(rsi); - __ pop(rbx); - __ pop(rbp); - __ ret(0); - -# undef __ - - return start; - }; -}; - - -void VM_Version::get_processor_features() { - - _logical_processors_per_package = 1; - // Get raw processor info - getPsrInfo_stub(&_cpuid_info); - assert_is_initialized(); - _cpu = extended_cpu_family(); - _model = extended_cpu_model(); - _stepping = cpu_stepping(); - _cpuFeatures = feature_flags(); - // Logical processors are only available on P4s and above, - // and only if hyperthreading is available. - _logical_processors_per_package = logical_processor_count(); - _supports_cx8 = supports_cmpxchg8(); - // OS should support SSE for x64 and hardware should support at least SSE2. - if (!VM_Version::supports_sse2()) { - vm_exit_during_initialization("Unknown x64 processor: SSE2 not supported"); - } - if (UseSSE < 4) { - _cpuFeatures &= ~CPU_SSE4_1; - _cpuFeatures &= ~CPU_SSE4_2; - } - if (UseSSE < 3) { - _cpuFeatures &= ~CPU_SSE3; - _cpuFeatures &= ~CPU_SSSE3; - _cpuFeatures &= ~CPU_SSE4A; - } - if (UseSSE < 2) - _cpuFeatures &= ~CPU_SSE2; - if (UseSSE < 1) - _cpuFeatures &= ~CPU_SSE; - - if (logical_processors_per_package() == 1) { - // HT processor could be installed on a system which doesn't support HT. - _cpuFeatures &= ~CPU_HT; - } - - char buf[256]; - jio_snprintf(buf, sizeof(buf), "(%u cores per cpu, %u threads per core) family %d model %d stepping %d%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", - cores_per_cpu(), threads_per_core(), - cpu_family(), _model, _stepping, - (supports_cmov() ? ", cmov" : ""), - (supports_cmpxchg8() ? ", cx8" : ""), - (supports_fxsr() ? ", fxsr" : ""), - (supports_mmx() ? ", mmx" : ""), - (supports_sse() ? ", sse" : ""), - (supports_sse2() ? ", sse2" : ""), - (supports_sse3() ? ", sse3" : ""), - (supports_ssse3()? ", ssse3": ""), - (supports_sse4_1() ? ", sse4.1" : ""), - (supports_sse4_2() ? ", sse4.2" : ""), - (supports_mmx_ext() ? ", mmxext" : ""), - (supports_3dnow() ? ", 3dnow" : ""), - (supports_3dnow2() ? ", 3dnowext" : ""), - (supports_sse4a() ? ", sse4a": ""), - (supports_ht() ? ", ht": "")); - _features_str = strdup(buf); - - // UseSSE is set to the smaller of what hardware supports and what - // the command line requires. I.e., you cannot set UseSSE to 2 on - // older Pentiums which do not support it. - if( UseSSE > 4 ) UseSSE=4; - if( UseSSE < 0 ) UseSSE=0; - if( !supports_sse4_1() ) // Drop to 3 if no SSE4 support - UseSSE = MIN2((intx)3,UseSSE); - if( !supports_sse3() ) // Drop to 2 if no SSE3 support - UseSSE = MIN2((intx)2,UseSSE); - if( !supports_sse2() ) // Drop to 1 if no SSE2 support - UseSSE = MIN2((intx)1,UseSSE); - if( !supports_sse () ) // Drop to 0 if no SSE support - UseSSE = 0; - - // On new cpus instructions which update whole XMM register should be used - // to prevent partial register stall due to dependencies on high half. - // - // UseXmmLoadAndClearUpper == true --> movsd(xmm, mem) - // UseXmmLoadAndClearUpper == false --> movlpd(xmm, mem) - // UseXmmRegToRegMoveAll == true --> movaps(xmm, xmm), movapd(xmm, xmm). - // UseXmmRegToRegMoveAll == false --> movss(xmm, xmm), movsd(xmm, xmm). - - if( is_amd() ) { // AMD cpus specific settings - if( FLAG_IS_DEFAULT(UseAddressNop) ) { - // Use it on all AMD cpus starting from Opteron (don't need - // a cpu check since only Opteron and new cpus support 64-bits mode). - UseAddressNop = true; - } - if( FLAG_IS_DEFAULT(UseXmmLoadAndClearUpper) ) { - if( supports_sse4a() ) { - UseXmmLoadAndClearUpper = true; // use movsd only on '10h' Opteron - } else { - UseXmmLoadAndClearUpper = false; - } - } - if( FLAG_IS_DEFAULT(UseXmmRegToRegMoveAll) ) { - if( supports_sse4a() ) { - UseXmmRegToRegMoveAll = true; // use movaps, movapd only on '10h' - } else { - UseXmmRegToRegMoveAll = false; - } - } - if( FLAG_IS_DEFAULT(UseXmmI2F) ) { - if( supports_sse4a() ) { - UseXmmI2F = true; - } else { - UseXmmI2F = false; - } - } - if( FLAG_IS_DEFAULT(UseXmmI2D) ) { - if( supports_sse4a() ) { - UseXmmI2D = true; - } else { - UseXmmI2D = false; - } - } - } - - if( is_intel() ) { // Intel cpus specific settings - if( FLAG_IS_DEFAULT(UseStoreImmI16) ) { - UseStoreImmI16 = false; // don't use it on Intel cpus - } - if( FLAG_IS_DEFAULT(UseAddressNop) ) { - // Use it on all Intel cpus starting from PentiumPro - // (don't need a cpu check since only new cpus support 64-bits mode). - UseAddressNop = true; - } - if( FLAG_IS_DEFAULT(UseXmmLoadAndClearUpper) ) { - UseXmmLoadAndClearUpper = true; // use movsd on all Intel cpus - } - if( FLAG_IS_DEFAULT(UseXmmRegToRegMoveAll) ) { - if( supports_sse3() ) { - UseXmmRegToRegMoveAll = true; // use movaps, movapd on new Intel cpus - } else { - UseXmmRegToRegMoveAll = false; - } - } - if( cpu_family() == 6 && supports_sse3() ) { // New Intel cpus -#ifdef COMPILER2 - if( FLAG_IS_DEFAULT(MaxLoopPad) ) { - // For new Intel cpus do the next optimization: - // don't align the beginning of a loop if there are enough instructions - // left (NumberOfLoopInstrToAlign defined in c2_globals.hpp) - // in current fetch line (OptoLoopAlignment) or the padding - // is big (> MaxLoopPad). - // Set MaxLoopPad to 11 for new Intel cpus to reduce number of - // generated NOP instructions. 11 is the largest size of one - // address NOP instruction '0F 1F' (see Assembler::nop(i)). - MaxLoopPad = 11; - } -#endif // COMPILER2 - if( FLAG_IS_DEFAULT(UseXMMForArrayCopy) ) { - UseXMMForArrayCopy = true; // use SSE2 movq on new Intel cpus - } - if( supports_sse4_2() && supports_ht() ) { // Newest Intel cpus - if( FLAG_IS_DEFAULT(UseUnalignedLoadStores) && UseXMMForArrayCopy ) { - UseUnalignedLoadStores = true; // use movdqu on newest Intel cpus - } - } - } - } - - assert(0 <= ReadPrefetchInstr && ReadPrefetchInstr <= 3, "invalid value"); - assert(0 <= AllocatePrefetchInstr && AllocatePrefetchInstr <= 3, "invalid value"); - - // set valid Prefetch instruction - if( ReadPrefetchInstr < 0 ) ReadPrefetchInstr = 0; - if( ReadPrefetchInstr > 3 ) ReadPrefetchInstr = 3; - if( ReadPrefetchInstr == 3 && !supports_3dnow() ) ReadPrefetchInstr = 0; - - if( AllocatePrefetchInstr < 0 ) AllocatePrefetchInstr = 0; - if( AllocatePrefetchInstr > 3 ) AllocatePrefetchInstr = 3; - if( AllocatePrefetchInstr == 3 && !supports_3dnow() ) AllocatePrefetchInstr=0; - - // Allocation prefetch settings - intx cache_line_size = L1_data_cache_line_size(); - if( cache_line_size > AllocatePrefetchStepSize ) - AllocatePrefetchStepSize = cache_line_size; - if( FLAG_IS_DEFAULT(AllocatePrefetchLines) ) - AllocatePrefetchLines = 3; // Optimistic value - assert(AllocatePrefetchLines > 0, "invalid value"); - if( AllocatePrefetchLines < 1 ) // set valid value in product VM - AllocatePrefetchLines = 1; // Conservative value - - AllocatePrefetchDistance = allocate_prefetch_distance(); - AllocatePrefetchStyle = allocate_prefetch_style(); - - if( AllocatePrefetchStyle == 2 && is_intel() && - cpu_family() == 6 && supports_sse3() ) { // watermark prefetching on Core - AllocatePrefetchDistance = 384; - } - assert(AllocatePrefetchDistance % AllocatePrefetchStepSize == 0, "invalid value"); - - // Prefetch settings - PrefetchCopyIntervalInBytes = prefetch_copy_interval_in_bytes(); - PrefetchScanIntervalInBytes = prefetch_scan_interval_in_bytes(); - PrefetchFieldsAhead = prefetch_fields_ahead(); - -#ifndef PRODUCT - if (PrintMiscellaneous && Verbose) { - tty->print_cr("Logical CPUs per core: %u", - logical_processors_per_package()); - tty->print_cr("UseSSE=%d",UseSSE); - tty->print("Allocation: "); - if (AllocatePrefetchStyle <= 0) { - tty->print_cr("no prefetching"); - } else { - if (AllocatePrefetchInstr == 0) { - tty->print("PREFETCHNTA"); - } else if (AllocatePrefetchInstr == 1) { - tty->print("PREFETCHT0"); - } else if (AllocatePrefetchInstr == 2) { - tty->print("PREFETCHT2"); - } else if (AllocatePrefetchInstr == 3) { - tty->print("PREFETCHW"); - } - if (AllocatePrefetchLines > 1) { - tty->print_cr(" %d, %d lines with step %d bytes", AllocatePrefetchDistance, AllocatePrefetchLines, AllocatePrefetchStepSize); - } else { - tty->print_cr(" %d, one line", AllocatePrefetchDistance); - } - } - if (PrefetchCopyIntervalInBytes > 0) { - tty->print_cr("PrefetchCopyIntervalInBytes %d", PrefetchCopyIntervalInBytes); - } - if (PrefetchScanIntervalInBytes > 0) { - tty->print_cr("PrefetchScanIntervalInBytes %d", PrefetchScanIntervalInBytes); - } - if (PrefetchFieldsAhead > 0) { - tty->print_cr("PrefetchFieldsAhead %d", PrefetchFieldsAhead); - } - } -#endif // !PRODUCT -} - -void VM_Version::initialize() { - ResourceMark rm; - // Making this stub must be FIRST use of assembler - - stub_blob = BufferBlob::create("getPsrInfo_stub", stub_size); - if (stub_blob == NULL) { - vm_exit_during_initialization("Unable to allocate getPsrInfo_stub"); - } - CodeBuffer c(stub_blob->instructions_begin(), - stub_blob->instructions_size()); - VM_Version_StubGenerator g(&c); - getPsrInfo_stub = CAST_TO_FN_PTR(getPsrInfo_stub_t, - g.generate_getPsrInfo()); - - get_processor_features(); -} diff --git a/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp b/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp index c37370b572b..71f99cba0da 100644 --- a/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp +++ b/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-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 @@ -299,13 +299,17 @@ static void check_for_sse_support() { } +#endif // AMD64 + bool os::supports_sse() { +#ifdef AMD64 + return true; +#else if (sse_status == SSE_UNKNOWN) check_for_sse_support(); return sse_status == SSE_SUPPORTED; -} - #endif // AMD64 +} bool os::is_allocatable(size_t bytes) { #ifdef AMD64 diff --git a/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.hpp b/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.hpp index c7f1de37c6b..fd5707cbe37 100644 --- a/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.hpp +++ b/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-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 @@ -41,9 +41,10 @@ static void fence_bootstrap (); static void setup_fpu(); - static bool supports_sse(); #endif // AMD64 + static bool supports_sse(); + static bool is_allocatable(size_t bytes); // Used to register dynamic code cache area with the OS diff --git a/hotspot/src/share/vm/includeDB_core b/hotspot/src/share/vm/includeDB_core index 8d39f327758..603485132e8 100644 --- a/hotspot/src/share/vm/includeDB_core +++ b/hotspot/src/share/vm/includeDB_core @@ -1,5 +1,5 @@ // -// Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. +// Copyright 1997-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 @@ -176,7 +176,7 @@ arguments.cpp management.hpp arguments.cpp oop.inline.hpp arguments.cpp os_.inline.hpp arguments.cpp universe.inline.hpp -arguments.cpp vm_version_.hpp +arguments.cpp vm_version_.hpp arguments.hpp java.hpp arguments.hpp perfData.hpp @@ -241,7 +241,7 @@ assembler.hpp oopRecorder.hpp assembler.hpp register_.hpp assembler.hpp relocInfo.hpp assembler.hpp top.hpp -assembler.hpp vm_version_.hpp +assembler.hpp vm_version_.hpp assembler.inline.hpp assembler.hpp assembler.inline.hpp codeBuffer.hpp @@ -280,7 +280,7 @@ atomic.hpp allocation.hpp atomic_.inline.hpp atomic.hpp atomic_.inline.hpp os.hpp -atomic_.inline.hpp vm_version_.hpp +atomic_.inline.hpp vm_version_.hpp // attachListener is jck optional, put cpp deps in includeDB_features @@ -2176,7 +2176,7 @@ interpreterRuntime.cpp templateTable.hpp interpreterRuntime.cpp threadCritical.hpp interpreterRuntime.cpp universe.inline.hpp interpreterRuntime.cpp vmSymbols.hpp -interpreterRuntime.cpp vm_version_.hpp +interpreterRuntime.cpp vm_version_.hpp interpreterRuntime.hpp bytecode.hpp interpreterRuntime.hpp frame.inline.hpp @@ -2279,7 +2279,7 @@ java.cpp timer.hpp java.cpp universe.hpp java.cpp vmError.hpp java.cpp vm_operations.hpp -java.cpp vm_version_.hpp +java.cpp vm_version_.hpp java.cpp vtune.hpp java.hpp os.hpp @@ -3485,7 +3485,7 @@ register.hpp top.hpp register_.cpp register_.hpp register_.hpp register.hpp -register_.hpp vm_version_.hpp +register_.hpp vm_version_.hpp registerMap.hpp globalDefinitions.hpp registerMap.hpp register_.hpp @@ -3835,7 +3835,7 @@ statSampler.cpp resourceArea.hpp statSampler.cpp statSampler.hpp statSampler.cpp systemDictionary.hpp statSampler.cpp vmSymbols.hpp -statSampler.cpp vm_version_.hpp +statSampler.cpp vm_version_.hpp statSampler.hpp perfData.hpp statSampler.hpp task.hpp @@ -4579,22 +4579,22 @@ vm_operations.hpp top.hpp vm_version.cpp arguments.hpp vm_version.cpp oop.inline.hpp vm_version.cpp universe.hpp -vm_version.cpp vm_version_.hpp +vm_version.cpp vm_version_.hpp vm_version.hpp allocation.hpp vm_version.hpp ostream.hpp -vm_version_.cpp assembler_.inline.hpp -vm_version_.cpp java.hpp -vm_version_.cpp os_.inline.hpp -vm_version_.cpp resourceArea.hpp -vm_version_.cpp stubCodeGenerator.hpp -vm_version_.cpp vm_version_.hpp +vm_version_.cpp assembler_.inline.hpp +vm_version_.cpp java.hpp +vm_version_.cpp os_.inline.hpp +vm_version_.cpp resourceArea.hpp +vm_version_.cpp stubCodeGenerator.hpp +vm_version_.cpp vm_version_.hpp -vm_version_.hpp globals_extension.hpp -vm_version_.hpp vm_version.hpp +vm_version_.hpp globals_extension.hpp +vm_version_.hpp vm_version.hpp -vm_version_.cpp vm_version_.hpp +vm_version_.cpp vm_version_.hpp vmreg.cpp assembler.hpp vmreg.cpp vmreg.hpp From b07ac51bf3f9553fbdbc7fc8560646e6e97ea40b Mon Sep 17 00:00:00 2001 From: Vladimir Kozlov Date: Mon, 23 Feb 2009 16:03:19 -0800 Subject: [PATCH 052/292] 6791572: assert("duplicating node that's already been matched") Mark inputs for an address expression as shared if there are other uses besides address expressions. Reviewed-by: never --- hotspot/src/share/vm/opto/matcher.cpp | 48 ++++++++++++++++++++------- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/hotspot/src/share/vm/opto/matcher.cpp b/hotspot/src/share/vm/opto/matcher.cpp index e911c065ccd..9f424c0e46d 100644 --- a/hotspot/src/share/vm/opto/matcher.cpp +++ b/hotspot/src/share/vm/opto/matcher.cpp @@ -1707,11 +1707,18 @@ OptoReg::Name Matcher::find_receiver( bool is_outgoing ) { void Matcher::find_shared( Node *n ) { // Allocate stack of size C->unique() * 2 to avoid frequent realloc MStack mstack(C->unique() * 2); + // Mark nodes as address_visited if they are inputs to an address expression + VectorSet address_visited(Thread::current()->resource_area()); mstack.push(n, Visit); // Don't need to pre-visit root node while (mstack.is_nonempty()) { n = mstack.node(); // Leave node on stack Node_State nstate = mstack.state(); + uint nop = n->Opcode(); if (nstate == Pre_Visit) { + if (address_visited.test(n->_idx)) { // Visited in address already? + // Flag as visited and shared now. + set_visited(n); + } if (is_visited(n)) { // Visited already? // Node is shared and has no reason to clone. Flag it as shared. // This causes it to match into a register for the sharing. @@ -1726,7 +1733,7 @@ void Matcher::find_shared( Node *n ) { set_visited(n); // Flag as visited now bool mem_op = false; - switch( n->Opcode() ) { // Handle some opcodes special + switch( nop ) { // Handle some opcodes special case Op_Phi: // Treat Phis as shared roots case Op_Parm: case Op_Proj: // All handled specially during matching @@ -1887,34 +1894,51 @@ void Matcher::find_shared( Node *n ) { // to have a single use so force sharing here. set_shared(m->in(AddPNode::Base)->in(1)); } + + // Some inputs for address expression are not put on stack + // to avoid marking them as shared and forcing them into register + // if they are used only in address expressions. + // But they should be marked as shared if there are other uses + // besides address expressions. + Node *off = m->in(AddPNode::Offset); - if( off->is_Con() ) { - set_visited(m); // Flag as visited now + if( off->is_Con() && + // When there are other uses besides address expressions + // put it on stack and mark as shared. + !is_visited(m) ) { + address_visited.test_set(m->_idx); // Flag as address_visited Node *adr = m->in(AddPNode::Address); // Intel, ARM and friends can handle 2 adds in addressing mode if( clone_shift_expressions && adr->is_AddP() && // AtomicAdd is not an addressing expression. // Cheap to find it by looking for screwy base. - !adr->in(AddPNode::Base)->is_top() ) { - set_visited(adr); // Flag as visited now + !adr->in(AddPNode::Base)->is_top() && + // Are there other uses besides address expressions? + !is_visited(adr) ) { + address_visited.set(adr->_idx); // Flag as address_visited Node *shift = adr->in(AddPNode::Offset); // Check for shift by small constant as well if( shift->Opcode() == Op_LShiftX && shift->in(2)->is_Con() && - shift->in(2)->get_int() <= 3 ) { - set_visited(shift); // Flag as visited now + shift->in(2)->get_int() <= 3 && + // Are there other uses besides address expressions? + !is_visited(shift) ) { + address_visited.set(shift->_idx); // Flag as address_visited mstack.push(shift->in(2), Visit); + Node *conv = shift->in(1); #ifdef _LP64 // Allow Matcher to match the rule which bypass // ConvI2L operation for an array index on LP64 // if the index value is positive. - if( shift->in(1)->Opcode() == Op_ConvI2L && - shift->in(1)->as_Type()->type()->is_long()->_lo >= 0 ) { - set_visited(shift->in(1)); // Flag as visited now - mstack.push(shift->in(1)->in(1), Pre_Visit); + if( conv->Opcode() == Op_ConvI2L && + conv->as_Type()->type()->is_long()->_lo >= 0 && + // Are there other uses besides address expressions? + !is_visited(conv) ) { + address_visited.set(conv->_idx); // Flag as address_visited + mstack.push(conv->in(1), Pre_Visit); } else #endif - mstack.push(shift->in(1), Pre_Visit); + mstack.push(conv, Pre_Visit); } else { mstack.push(shift, Pre_Visit); } From 07338e17b5b23fc0d5df60d6ef839a5facd1fae3 Mon Sep 17 00:00:00 2001 From: Peter Zhelezniakov Date: Tue, 24 Feb 2009 19:17:51 +0300 Subject: [PATCH 053/292] 6804221: Three tests for JTabbedPane produce VM crash on rhel3 Reviewed-by: stayer, campbell --- jdk/src/solaris/native/sun/awt/gtk2_interface.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/jdk/src/solaris/native/sun/awt/gtk2_interface.c b/jdk/src/solaris/native/sun/awt/gtk2_interface.c index cfbc5ef6f6e..1afeeef173b 100644 --- a/jdk/src/solaris/native/sun/awt/gtk2_interface.c +++ b/jdk/src/solaris/native/sun/awt/gtk2_interface.c @@ -93,6 +93,7 @@ static int gtk2_pixbuf_height = 0; /* Static buffer for conversion from java.lang.String to UTF-8 */ static char convertionBuffer[CONV_BUFFER_SIZE]; +static gboolean new_combo = TRUE; const char ENV_PREFIX[] = "GTK_MODULES="; /*******************/ @@ -608,6 +609,7 @@ gboolean gtk2_load() dlsym(gtk2_libhandle, "gtk_combo_box_entry_new"); if (fp_gtk_combo_box_entry_new == NULL) { fp_gtk_combo_box_entry_new = dl_symbol("gtk_combo_new"); + new_combo = FALSE; } fp_gtk_separator_tool_item_new = @@ -1423,17 +1425,13 @@ static GtkWidget *gtk2_get_widget(WidgetType widget_type) */ GtkWidget *combo = (*fp_gtk_combo_box_entry_new)(); - if (widget_type == COMBO_BOX_TEXT_FIELD) - (*fp_gtk_container_add)((GtkContainer *)combo, result); - else - { + if (new_combo && widget_type == COMBO_BOX_ARROW_BUTTON) { (*fp_gtk_widget_set_parent)(result, combo); ((GtkBin*)combo)->child = result; + } else { + (*fp_gtk_container_add)((GtkContainer *)combo, result); } - (*fp_gtk_container_add)((GtkContainer *)gtk2_fixed, combo); - (*fp_gtk_widget_realize)(result); - return result; } else if (widget_type != TOOL_TIP && widget_type != INTERNAL_FRAME && From f883e6fde85a9dc0430b1af0a8686ffad76d8914 Mon Sep 17 00:00:00 2001 From: Antonios Printezis Date: Tue, 24 Feb 2009 15:50:23 -0500 Subject: [PATCH 054/292] 6804746: G1: guarantee(variance() > -1.0,"variance should be >= 0") (due to evacuation failure) Under certain circumstances (evacuation failure) the pause time is not communicated to the policy and, as a result, the pause time field is not initialized properly. Reviewed-by: jmasa --- .../share/vm/gc_implementation/g1/g1CollectedHeap.cpp | 5 ++--- .../share/vm/gc_implementation/g1/g1CollectorPolicy.cpp | 9 +++++---- .../share/vm/gc_implementation/g1/g1CollectorPolicy.hpp | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp index 1c6766b9947..8d7b5e18862 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp @@ -2626,9 +2626,8 @@ G1CollectedHeap::do_collection_pause_at_safepoint(HeapRegion* popular_region) { #endif // SCAN_ONLY_VERBOSE double end_time_sec = os::elapsedTime(); - if (!evacuation_failed()) { - g1_policy()->record_pause_time((end_time_sec - start_time_sec)*1000.0); - } + double pause_time_ms = (end_time_sec - start_time_sec) * MILLIUNITS; + g1_policy()->record_pause_time_ms(pause_time_ms); GCOverheadReporter::recordSTWEnd(end_time_sec); g1_policy()->record_collection_pause_end(popular_region != NULL, abandoned); diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp index 949e3f99700..142a4e24fcc 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp @@ -1014,7 +1014,7 @@ void G1CollectorPolicy::record_full_collection_end() { _all_full_gc_times_ms->add(full_gc_time_ms); - update_recent_gc_times(end_sec, full_gc_time_sec); + update_recent_gc_times(end_sec, full_gc_time_ms); _g1->clear_full_collection(); @@ -1475,6 +1475,7 @@ void G1CollectorPolicy::record_collection_pause_end(bool popular, size_t cur_used_bytes = _g1->used(); assert(cur_used_bytes == _g1->recalculate_used(), "It should!"); bool last_pause_included_initial_mark = false; + bool update_stats = !abandoned && !_g1->evacuation_failed(); #ifndef PRODUCT if (G1YoungSurvRateVerbose) { @@ -1535,7 +1536,7 @@ void G1CollectorPolicy::record_collection_pause_end(bool popular, _n_pauses++; - if (!abandoned) { + if (update_stats) { _recent_CH_strong_roots_times_ms->add(_cur_CH_strong_roots_dur_ms); _recent_G1_strong_roots_times_ms->add(_cur_G1_strong_roots_dur_ms); _recent_evac_times_ms->add(evac_ms); @@ -1636,7 +1637,7 @@ void G1CollectorPolicy::record_collection_pause_end(bool popular, double termination_time = avg_value(_par_last_termination_times_ms); double parallel_other_time; - if (!abandoned) { + if (update_stats) { MainBodySummary* body_summary = summary->main_body_summary(); guarantee(body_summary != NULL, "should not be null!"); @@ -1852,7 +1853,7 @@ void G1CollectorPolicy::record_collection_pause_end(bool popular, // - if (!popular && !abandoned) { + if (!popular && update_stats) { double pause_time_ms = elapsed_ms; size_t diff = 0; diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp index 1649584cd31..404e292b844 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp @@ -966,7 +966,7 @@ public: record_termination_time(0, ms); } - void record_pause_time(double ms) { + void record_pause_time_ms(double ms) { _last_pause_time_ms = ms; } From 34f01f340ef747ada113f4002f2f6b2e992678aa Mon Sep 17 00:00:00 2001 From: Jennifer Godinez Date: Tue, 24 Feb 2009 14:32:17 -0800 Subject: [PATCH 055/292] 6750383: 2D_PrintingTiger\PrintDocOrientationTest fails, wrong orientated images are printed Reviewed-by: campbell, prr --- jdk/src/solaris/classes/sun/print/IPPPrintService.java | 6 ++++++ jdk/src/solaris/classes/sun/print/UnixPrintJob.java | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/jdk/src/solaris/classes/sun/print/IPPPrintService.java b/jdk/src/solaris/classes/sun/print/IPPPrintService.java index 07b68b18fa8..ec5344ae379 100644 --- a/jdk/src/solaris/classes/sun/print/IPPPrintService.java +++ b/jdk/src/solaris/classes/sun/print/IPPPrintService.java @@ -661,6 +661,12 @@ public class IPPPrintService implements PrintService, SunPrinterJobService { } } } else if (category == OrientationRequested.class) { + if (flavor.equals(DocFlavor.INPUT_STREAM.POSTSCRIPT) || + flavor.equals(DocFlavor.URL.POSTSCRIPT) || + flavor.equals(DocFlavor.BYTE_ARRAY.POSTSCRIPT)) { + return null; + } + boolean revPort = false; OrientationRequested[] orientSup = null; diff --git a/jdk/src/solaris/classes/sun/print/UnixPrintJob.java b/jdk/src/solaris/classes/sun/print/UnixPrintJob.java index 1a96e92f2c8..b4da652a8fc 100644 --- a/jdk/src/solaris/classes/sun/print/UnixPrintJob.java +++ b/jdk/src/solaris/classes/sun/print/UnixPrintJob.java @@ -362,10 +362,10 @@ public class UnixPrintJob implements CancelablePrintJob { mOptions += " number-up="+nUp.getValue(); } - if (orient == OrientationRequested.LANDSCAPE && + if (orient != OrientationRequested.PORTRAIT && (flavor != null) && !flavor.equals(DocFlavor.SERVICE_FORMATTED.PAGEABLE)) { - mOptions += " landscape"; + mOptions += " orientation-requested="+orient.getValue(); } if (sides != null) { From 0b44eecef272e5910ce6b8bdb790a3db7cf34435 Mon Sep 17 00:00:00 2001 From: Joe Darcy Date: Tue, 24 Feb 2009 17:16:18 -0800 Subject: [PATCH 056/292] 6501749: 6501749 Filer should state connection between created files and root elements Reviewed-by: jjg --- .../share/classes/javax/annotation/processing/Filer.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/langtools/src/share/classes/javax/annotation/processing/Filer.java b/langtools/src/share/classes/javax/annotation/processing/Filer.java index e0da17b5169..7ebdc6fb72a 100644 --- a/langtools/src/share/classes/javax/annotation/processing/Filer.java +++ b/langtools/src/share/classes/javax/annotation/processing/Filer.java @@ -35,9 +35,11 @@ import java.io.IOException; * processor. Files created in this way will be known to the * annotation processing tool implementing this interface, better * enabling the tool to manage them. Source and class files so - * created will be considered for processing by the tool after the - * {@code close} method has been called on the {@code Writer} or - * {@code OutputStream} used to write the contents of the file. + * created will be {@linkplain RoundEnvironment#getRootElements + * considered for processing} by the tool in a subsequent {@linkplain + * RoundEnvironment round of processing} after the {@code close} + * method has been called on the {@code Writer} or {@code + * OutputStream} used to write the contents of the file. * * Three kinds of files are distinguished: source files, class files, * and auxiliary resource files. From 178049faf3b09f0ebb585cac30472b25a219e4e5 Mon Sep 17 00:00:00 2001 From: Joe Darcy Date: Tue, 24 Feb 2009 17:48:53 -0800 Subject: [PATCH 057/292] 6498938: Faulty comparison of TypeMirror objects in getElementsAnnotatedWith implementation Reviewed-by: jjg --- .../processing/JavacRoundEnvironment.java | 11 +++-- .../processing/environment/round/Foo.java | 27 +++++++++++ .../round/TestElementsAnnotatedWith.java | 46 +++++++++++++++++-- 3 files changed, 77 insertions(+), 7 deletions(-) create mode 100644 langtools/test/tools/javac/processing/environment/round/Foo.java diff --git a/langtools/src/share/classes/com/sun/tools/javac/processing/JavacRoundEnvironment.java b/langtools/src/share/classes/com/sun/tools/javac/processing/JavacRoundEnvironment.java index f6af2af4698..bdf2671bff0 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/processing/JavacRoundEnvironment.java +++ b/langtools/src/share/classes/com/sun/tools/javac/processing/JavacRoundEnvironment.java @@ -1,5 +1,5 @@ /* - * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-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 @@ -111,6 +111,7 @@ public class JavacRoundEnvironment implements RoundEnvironment { */ public Set getElementsAnnotatedWith(TypeElement a) { Set result = Collections.emptySet(); + Types typeUtil = processingEnv.getTypeUtils(); if (a.getKind() != ElementKind.ANNOTATION_TYPE) throw new IllegalArgumentException(NOT_AN_ANNOTATION_TYPE + a); @@ -122,7 +123,7 @@ public class JavacRoundEnvironment implements RoundEnvironment { throw new AssertionError("Bad implementation type for " + tm); ElementScanner6, DeclaredType> scanner = - new AnnotationSetScanner(result); + new AnnotationSetScanner(result, typeUtil); for (Element element : rootElements) result = scanner.scan(element, annotationTypeElement); @@ -135,9 +136,11 @@ public class JavacRoundEnvironment implements RoundEnvironment { ElementScanner6, DeclaredType> { // Insertion-order preserving set Set annotatedElements = new LinkedHashSet(); + Types typeUtil; - AnnotationSetScanner(Set defaultSet) { + AnnotationSetScanner(Set defaultSet, Types typeUtil) { super(defaultSet); + this.typeUtil = typeUtil; } @Override @@ -145,7 +148,7 @@ public class JavacRoundEnvironment implements RoundEnvironment { java.util.List annotationMirrors = processingEnv.getElementUtils().getAllAnnotationMirrors(e); for (AnnotationMirror annotationMirror : annotationMirrors) { - if (annotationMirror.getAnnotationType().equals(p)) + if (typeUtil.isSameType(annotationMirror.getAnnotationType(), p)) annotatedElements.add(e); } e.accept(this, p); diff --git a/langtools/test/tools/javac/processing/environment/round/Foo.java b/langtools/test/tools/javac/processing/environment/round/Foo.java new file mode 100644 index 00000000000..58ada1d4f95 --- /dev/null +++ b/langtools/test/tools/javac/processing/environment/round/Foo.java @@ -0,0 +1,27 @@ +/* + * Copyright 2006 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. + */ + +@AnnotatedElementInfo(annotationName="AnnotatedElementInfo", + expectedSize=1, + names="Foo") +public class Foo {} diff --git a/langtools/test/tools/javac/processing/environment/round/TestElementsAnnotatedWith.java b/langtools/test/tools/javac/processing/environment/round/TestElementsAnnotatedWith.java index 2a948350bab..867c3c40b97 100644 --- a/langtools/test/tools/javac/processing/environment/round/TestElementsAnnotatedWith.java +++ b/langtools/test/tools/javac/processing/environment/round/TestElementsAnnotatedWith.java @@ -1,5 +1,5 @@ /* - * Copyright 2006-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2006-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 @@ -23,7 +23,7 @@ /* * @test - * @bug 6397298 6400986 6425592 6449798 6453386 6508401 + * @bug 6397298 6400986 6425592 6449798 6453386 6508401 6498938 * @summary Tests that getElementsAnnotatedWith works properly. * @author Joseph D. Darcy * @compile TestElementsAnnotatedWith.java @@ -31,16 +31,22 @@ * @compile -processor TestElementsAnnotatedWith -proc:only SurfaceAnnotations.java * @compile -processor TestElementsAnnotatedWith -proc:only BuriedAnnotations.java * @compile -processor TestElementsAnnotatedWith -proc:only Part1.java Part2.java - * @compile -processor TestElementsAnnotatedWith -proc:only TestElementsAnnotatedWith.java * @compile -processor TestElementsAnnotatedWith -proc:only C2.java + * @compile -processor TestElementsAnnotatedWith -proc:only Foo.java + * @compile -XD-d=. Foo.java + * @compile -processor TestElementsAnnotatedWith -proc:only TestElementsAnnotatedWith.java */ import java.lang.annotation.Annotation; +import java.io.*; import java.util.Collections; import java.util.Set; import java.util.HashSet; +import java.util.List; +import java.util.ArrayList; import java.util.Arrays; import javax.annotation.processing.*; +import javax.tools.*; import javax.lang.model.SourceVersion; import javax.lang.model.element.*; import javax.lang.model.util.*; @@ -120,6 +126,9 @@ public class TestElementsAnnotatedWith extends AbstractProcessor { System.err.println("AnnotatedElementInfo: " + annotatedElementInfo); throw new RuntimeException(); } + + if("TestElementsAnnotatedWith".equals(firstType.getSimpleName().toString())) + writeClassFile(); // Start another round to test class file input } else { // If processing is over without an error, the specified // elements should be empty so an empty set should be returned. @@ -161,6 +170,37 @@ public class TestElementsAnnotatedWith extends AbstractProcessor { } catch(IllegalArgumentException iae) {} } + /* + * Hack alert! The class file read below is generated by the + * "@compile -XD-d=. Foo.java" directive above. This sneakily + * overrides the output location to the current directory where a + * subsequent @compile can read the file. This could be improved + * if either a new directive like @process accepted class file + * arguments (the javac command accepts such arguments but + * @compile does not) or the test.src and test.classes properties + * were set to be read with @compile jobs. + */ + private void writeClassFile() { + try { + Filer filer = processingEnv.getFiler(); + JavaFileObject jfo = filer.createClassFile("Foo"); + OutputStream os = jfo.openOutputStream(); + // Copy the bytes over + System.out.println((new File(".")).getAbsolutePath()); + InputStream io = new BufferedInputStream(new FileInputStream(new File(".", "Foo.class"))); + int datum = io.read(); + while(datum != -1) { + os.write(datum); + datum = io.read(); + } + os.close(); + } catch (IOException io) { + throw new RuntimeException(io); + } + + + } + @Override public SourceVersion getSupportedSourceVersion() { return SourceVersion.latest(); From b051a23591c41c16d1368b78e00fcf4df14f3db8 Mon Sep 17 00:00:00 2001 From: Jon Masamitsu Date: Tue, 24 Feb 2009 22:12:24 -0800 Subject: [PATCH 058/292] 6806226: Signed integer overflow in growable array code causes JVM crash Workaround the overflow by doing the intermediate calculations in an unsigned variable. Reviewed-by: ysr, jcoomes --- hotspot/src/share/vm/utilities/growableArray.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/hotspot/src/share/vm/utilities/growableArray.cpp b/hotspot/src/share/vm/utilities/growableArray.cpp index eeb259c5317..8ad410249b4 100644 --- a/hotspot/src/share/vm/utilities/growableArray.cpp +++ b/hotspot/src/share/vm/utilities/growableArray.cpp @@ -43,11 +43,13 @@ void GenericGrowableArray::check_nesting() { #endif void* GenericGrowableArray::raw_allocate(int elementSize) { + assert(_max >= 0, "integer overflow"); + size_t byte_size = elementSize * (size_t) _max; if (on_stack()) { - return (void*)resource_allocate_bytes(elementSize * _max); + return (void*)resource_allocate_bytes(byte_size); } else if (on_C_heap()) { - return (void*)AllocateHeap(elementSize * _max, "GrET in " __FILE__); + return (void*)AllocateHeap(byte_size, "GrET in " __FILE__); } else { - return _arena->Amalloc(elementSize * _max); + return _arena->Amalloc(byte_size); } } From a82243d8874d390a58956c5752ac72c7a2024631 Mon Sep 17 00:00:00 2001 From: Tom Rodriguez Date: Wed, 25 Feb 2009 10:53:14 -0800 Subject: [PATCH 059/292] 6805427: adlc compiler may generate incorrect machnode emission code Reviewed-by: kvn, twisti --- hotspot/src/share/vm/adlc/formssel.cpp | 19 ++++++++++++------- hotspot/src/share/vm/adlc/formssel.hpp | 9 ++++++--- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/hotspot/src/share/vm/adlc/formssel.cpp b/hotspot/src/share/vm/adlc/formssel.cpp index c265c1d04c7..12477be68ac 100644 --- a/hotspot/src/share/vm/adlc/formssel.cpp +++ b/hotspot/src/share/vm/adlc/formssel.cpp @@ -1217,13 +1217,17 @@ void InstructForm::rep_var_format(FILE *fp, const char *rep_var) { // Seach through operands to determine parameters unique positions. void InstructForm::set_unique_opnds() { uint* uniq_idx = NULL; - uint nopnds = num_opnds(); + int nopnds = num_opnds(); uint num_uniq = nopnds; - uint i; + int i; + _uniq_idx_length = 0; if ( nopnds > 0 ) { - // Allocate index array with reserve. - uniq_idx = (uint*) malloc(sizeof(uint)*(nopnds + 2)); - for( i = 0; i < nopnds+2; i++ ) { + // Allocate index array. Worst case we're mapping from each + // component back to an index and any DEF always goes at 0 so the + // length of the array has to be the number of components + 1. + _uniq_idx_length = _components.count() + 1; + uniq_idx = (uint*) malloc(sizeof(uint)*(_uniq_idx_length)); + for( i = 0; i < _uniq_idx_length; i++ ) { uniq_idx[i] = i; } } @@ -1238,8 +1242,8 @@ void InstructForm::set_unique_opnds() { _parameters.reset(); while( (name = _parameters.iter()) != NULL ) { count = 0; - uint position = 0; - uint uniq_position = 0; + int position = 0; + int uniq_position = 0; _components.reset(); Component *comp = NULL; if( sets_result() ) { @@ -1255,6 +1259,7 @@ void InstructForm::set_unique_opnds() { } if( strcmp(name, comp->_name)==0 ) { if( ++count > 1 ) { + assert(position < _uniq_idx_length, "out of bounds"); uniq_idx[position] = uniq_position; has_dupl_use = true; } else { diff --git a/hotspot/src/share/vm/adlc/formssel.hpp b/hotspot/src/share/vm/adlc/formssel.hpp index a363f16ee41..e1aa84d91ca 100644 --- a/hotspot/src/share/vm/adlc/formssel.hpp +++ b/hotspot/src/share/vm/adlc/formssel.hpp @@ -101,6 +101,7 @@ public: const char *_ins_pipe; // Instruction Scheduline description class uint *_uniq_idx; // Indexes of unique operands + int _uniq_idx_length; // Length of _uniq_idx array uint _num_uniq; // Number of unique operands ComponentList _components; // List of Components matches MachNode's // operand structure @@ -257,11 +258,13 @@ public: void set_unique_opnds(); uint num_unique_opnds() { return _num_uniq; } uint unique_opnds_idx(int idx) { - if( _uniq_idx != NULL && idx > 0 ) + if( _uniq_idx != NULL && idx > 0 ) { + assert(idx < _uniq_idx_length, "out of bounds"); return _uniq_idx[idx]; - else + } else { return idx; - } + } + } // Operands which are only KILLs aren't part of the input array and // require special handling in some cases. Their position in this From f7098831dde98a67b776d0bc9bdc22c963e95579 Mon Sep 17 00:00:00 2001 From: Tom Rodriguez Date: Wed, 25 Feb 2009 14:36:27 -0800 Subject: [PATCH 060/292] 6807963: need tool to make sense of LogCompilaton output Reviewed-by: kvn --- .../src/share/tools/LogCompilation/Makefile | 75 +++ hotspot/src/share/tools/LogCompilation/README | 18 + .../share/tools/LogCompilation/manifest.mf | 1 + .../hotspot/tools/compiler/BasicLogEvent.java | 75 +++ .../sun/hotspot/tools/compiler/CallSite.java | 183 ++++++++ .../hotspot/tools/compiler/Compilation.java | 236 ++++++++++ .../sun/hotspot/tools/compiler/Constants.java | 46 ++ .../tools/compiler/LogCleanupReader.java | 212 +++++++++ .../tools/compiler/LogCompilation.java | 177 +++++++ .../sun/hotspot/tools/compiler/LogEvent.java | 38 ++ .../sun/hotspot/tools/compiler/LogParser.java | 430 ++++++++++++++++++ .../tools/compiler/MakeNotEntrantEvent.java | 55 +++ .../sun/hotspot/tools/compiler/Method.java | 120 +++++ .../sun/hotspot/tools/compiler/NMethod.java | 60 +++ .../com/sun/hotspot/tools/compiler/Phase.java | 63 +++ .../tools/compiler/UncommonTrapEvent.java | 84 ++++ 16 files changed, 1873 insertions(+) create mode 100644 hotspot/src/share/tools/LogCompilation/Makefile create mode 100644 hotspot/src/share/tools/LogCompilation/README create mode 100644 hotspot/src/share/tools/LogCompilation/manifest.mf create mode 100644 hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/BasicLogEvent.java create mode 100644 hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/CallSite.java create mode 100644 hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/Compilation.java create mode 100644 hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/Constants.java create mode 100644 hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/LogCleanupReader.java create mode 100644 hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/LogCompilation.java create mode 100644 hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/LogEvent.java create mode 100644 hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/LogParser.java create mode 100644 hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/MakeNotEntrantEvent.java create mode 100644 hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/Method.java create mode 100644 hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/NMethod.java create mode 100644 hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/Phase.java create mode 100644 hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/UncommonTrapEvent.java diff --git a/hotspot/src/share/tools/LogCompilation/Makefile b/hotspot/src/share/tools/LogCompilation/Makefile new file mode 100644 index 00000000000..2a2e2a5d71a --- /dev/null +++ b/hotspot/src/share/tools/LogCompilation/Makefile @@ -0,0 +1,75 @@ +# +# Copyright 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. +# +# +PKGLIST = \ +com.sun.hotspot.tools.compiler +#END PKGLIST + +FILELIST = com/sun/hotspot/tools/compiler/*.java + +ifneq "x$(ALT_BOOTDIR)" "x" + BOOTDIR := $(ALT_BOOTDIR) +endif + +ifeq "x$(BOOTDIR)" "x" + JDK_HOME := $(shell dirname $(shell which java))/.. +else + JDK_HOME := $(BOOTDIR) +endif + +isUnix := $(shell test -r c:/; echo $$?) + +ifeq "$(isUnix)" "1" + CPS := : +else + CPS := ";" +endif + +SRC_DIR = src +BUILD_DIR = build +OUTPUT_DIR = $(BUILD_DIR)/classes + +# gnumake 3.78.1 does not accept the *s, +# so use the shell to expand them +ALLFILES := $(patsubst %,$(SRC_DIR)/%,$(FILELIST)) +ALLFILES := $(shell /bin/ls $(ALLFILES)) + +JAVAC = $(JDK_HOME)/bin/javac +JAR = $(JDK_HOME)/bin/jar + +# Tagging it on because there's no reason not to run it +all: logc.jar + +logc.jar: filelist manifest.mf + @mkdir -p $(OUTPUT_DIR) + $(JAVAC) -source 1.5 -deprecation -sourcepath $(SRC_DIR) -d $(OUTPUT_DIR) @filelist + $(JAR) cvfm logc.jar manifest.mf -C $(OUTPUT_DIR) com + +.PHONY: filelist +filelist: $(ALLFILES) + @rm -f $@ + @echo $(ALLFILES) > $@ + +clean:: + rm -rf filelist logc.jar + rm -rf $(BUILD_DIR) diff --git a/hotspot/src/share/tools/LogCompilation/README b/hotspot/src/share/tools/LogCompilation/README new file mode 100644 index 00000000000..ed3cbbc8121 --- /dev/null +++ b/hotspot/src/share/tools/LogCompilation/README @@ -0,0 +1,18 @@ +This is a very rough tool for parsing -XX:+LogCompilation output. +It's main purpose is to recreate output similar to +-XX:+PrintCompilation -XX:+PrintInlining output from a debug JVM. It +requires a 1.5 JDK to build and simply typing make should build it. + +It produces a jar file, logc.jar, that can be run on the +hotspot.log from LogCompilation output like this: + + java -jar logc.jar hotspot.log + +This will produce something like the normal PrintCompilation output. +Adding the -i option with also report inlining like PrintInlining. + +More information about the LogCompilation output can be found at + +http://wikis.sun.com/display/HotSpotInternals/LogCompilation+overview +http://wikis.sun.com/display/HotSpotInternals/PrintCompilation +http://wikis.sun.com/display/HotSpotInternals/LogCompilation+tool diff --git a/hotspot/src/share/tools/LogCompilation/manifest.mf b/hotspot/src/share/tools/LogCompilation/manifest.mf new file mode 100644 index 00000000000..62a36155dd0 --- /dev/null +++ b/hotspot/src/share/tools/LogCompilation/manifest.mf @@ -0,0 +1 @@ +Main-Class: com.sun.hotspot.tools.compiler.LogCompilation diff --git a/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/BasicLogEvent.java b/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/BasicLogEvent.java new file mode 100644 index 00000000000..8d9d630a474 --- /dev/null +++ b/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/BasicLogEvent.java @@ -0,0 +1,75 @@ +/* + * Copyright 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. + * + */ + +package com.sun.hotspot.tools.compiler; + +import java.io.PrintStream; + +/** + * + * @author never + */ +public abstract class BasicLogEvent implements LogEvent { + + protected final String id; + protected final double start; + protected double end; + protected Compilation compilation; + + BasicLogEvent(double start, String id) { + this.start = start; + this.end = start; + this.id = id; + } + + public double getStart() { + return start; + } + + public double getEnd() { + return end; + } + + public void setEnd(double end) { + this.end = end; + } + + public double getElapsedTime() { + return ((int) ((getEnd() - getStart()) * 1000)) / 1000.0; + } + + public String getId() { + return id; + } + + public Compilation getCompilation() { + return compilation; + } + + public void setCompilation(Compilation compilation) { + this.compilation = compilation; + } + + abstract public void print(PrintStream stream); +} diff --git a/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/CallSite.java b/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/CallSite.java new file mode 100644 index 00000000000..bf96b1fbc91 --- /dev/null +++ b/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/CallSite.java @@ -0,0 +1,183 @@ +/* + * Copyright 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. + * + */ + +package com.sun.hotspot.tools.compiler; + +import java.io.PrintStream; +import java.util.ArrayList; +import java.util.List; + +public class CallSite { + + private int bci; + private Method method; + private int count; + private String receiver; + private int receiver_count; + private String reason; + private List calls; + + CallSite() { + } + + CallSite(int bci, Method m) { + this.bci = bci; + this.method = m; + } + + void add(CallSite site) { + if (getCalls() == null) { + setCalls(new ArrayList()); + } + getCalls().add(site); + } + + CallSite last() { + return last(-1); + } + + CallSite last(int fromEnd) { + return getCalls().get(getCalls().size() + fromEnd); + } + + public String toString() { + StringBuilder sb = new StringBuilder(); + if (getReason() == null) { + sb.append(" @ " + getBci() + " " + getMethod()); + } else { + sb.append("- @ " + getBci() + " " + getMethod() + " " + getReason()); + } + sb.append("\n"); + if (getCalls() != null) { + for (CallSite site : getCalls()) { + sb.append(site); + sb.append("\n"); + } + } + return sb.toString(); + } + + public void print(PrintStream stream) { + print(stream, 0); + } + + void emit(PrintStream stream, int indent) { + for (int i = 0; i < indent; i++) { + stream.print(' '); + } + } + private static boolean compat = true; + + public void print(PrintStream stream, int indent) { + emit(stream, indent); + String m = getMethod().getHolder().replace('/', '.') + "::" + getMethod().getName(); + if (getReason() == null) { + stream.println(" @ " + getBci() + " " + m + " (" + getMethod().getBytes() + " bytes)"); + + } else { + if (isCompat()) { + stream.println(" @ " + getBci() + " " + m + " " + getReason()); + } else { + stream.println("- @ " + getBci() + " " + m + + " (" + getMethod().getBytes() + " bytes) " + getReason()); + } + } + if (getReceiver() != null) { + emit(stream, indent + 3); + // stream.println("type profile " + method.holder + " -> " + receiver + " (" + + // receiver_count + "/" + count + "," + (receiver_count * 100 / count) + "%)"); + stream.println("type profile " + getMethod().getHolder() + " -> " + getReceiver() + " (" + + (getReceiverCount() * 100 / getCount()) + "%)"); + } + if (getCalls() != null) { + for (CallSite site : getCalls()) { + site.print(stream, indent + 2); + } + } + } + + public int getBci() { + return bci; + } + + public void setBci(int bci) { + this.bci = bci; + } + + public Method getMethod() { + return method; + } + + public void setMethod(Method method) { + this.method = method; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public String getReceiver() { + return receiver; + } + + public void setReceiver(String receiver) { + this.receiver = receiver; + } + + public int getReceiverCount() { + return receiver_count; + } + + public void setReceiver_count(int receiver_count) { + this.receiver_count = receiver_count; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + + public List getCalls() { + return calls; + } + + public void setCalls(List calls) { + this.calls = calls; + } + + public static boolean isCompat() { + return compat; + } + + public static void setCompat(boolean aCompat) { + compat = aCompat; + } +} diff --git a/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/Compilation.java b/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/Compilation.java new file mode 100644 index 00000000000..3695ebd01e0 --- /dev/null +++ b/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/Compilation.java @@ -0,0 +1,236 @@ +/* + * Copyright 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. + * + */ + +package com.sun.hotspot.tools.compiler; + +import java.io.PrintStream; +import java.util.ArrayList; + +public class Compilation implements LogEvent { + + private int id; + private boolean osr; + private Method method; + private CallSite call = new CallSite(); + private int osrBci; + private String icount; + private String bcount; + private String special; + private double start; + private double end; + private int attempts; + private NMethod nmethod; + private ArrayList phases = new ArrayList(4); + private String failureReason; + + Compilation(int id) { + this.id = id; + } + + Phase getPhase(String s) { + for (Phase p : getPhases()) { + if (p.getName().equals(s)) { + return p; + } + } + return null; + } + + double getRegallocTime() { + return getPhase("regalloc").getElapsedTime(); + } + + public double getStart() { + return start; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(getId()); + sb.append(" "); + sb.append(getMethod()); + sb.append(" "); + sb.append(getIcount()); + sb.append("+"); + sb.append(getBcount()); + sb.append("\n"); + for (CallSite site : getCall().getCalls()) { + sb.append(site); + sb.append("\n"); + } + return sb.toString(); + } + + public void printShort(PrintStream stream) { + if (getMethod() == null) { + stream.println(getSpecial()); + } else { + int bc = isOsr() ? getOsr_bci() : -1; + stream.print(getId() + getMethod().decodeFlags(bc) + getMethod().format(bc)); + } + } + + public void print(PrintStream stream) { + print(stream, 0, false); + } + + public void print(PrintStream stream, boolean printInlining) { + print(stream, 0, printInlining); + } + + public void print(PrintStream stream, int indent, boolean printInlining) { + if (getMethod() == null) { + stream.println(getSpecial()); + } else { + int bc = isOsr() ? getOsr_bci() : -1; + stream.print(getId() + getMethod().decodeFlags(bc) + getMethod().format(bc)); + stream.println(); + if (getFailureReason() != null) { + stream.println("COMPILE FAILED " + getFailureReason()); + } + if (printInlining && call.getCalls() != null) { + for (CallSite site : call.getCalls()) { + site.print(stream, indent + 2); + } + } + } + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public boolean isOsr() { + return osr; + } + + public void setOsr(boolean osr) { + this.osr = osr; + } + + public int getOsr_bci() { + return osrBci; + } + + public void setOsr_bci(int osrBci) { + this.osrBci = osrBci; + } + + public String getIcount() { + return icount; + } + + public void setICount(String icount) { + this.icount = icount; + } + + public String getBcount() { + return bcount; + } + + public void setBCount(String bcount) { + this.bcount = bcount; + } + + public String getSpecial() { + return special; + } + + public void setSpecial(String special) { + this.special = special; + } + + public void setStart(double start) { + this.start = start; + } + + public double getEnd() { + return end; + } + + public void setEnd(double end) { + this.end = end; + } + + public int getAttempts() { + return attempts; + } + + public void setAttempts(int attempts) { + this.attempts = attempts; + } + + public NMethod getNMethod() { + return nmethod; + } + + public void setNMethod(NMethod NMethod) { + this.nmethod = NMethod; + } + + public ArrayList getPhases() { + return phases; + } + + public void setPhases(ArrayList phases) { + this.setPhases(phases); + } + + public String getFailureReason() { + return failureReason; + } + + public void setFailureReason(String failureReason) { + this.failureReason = failureReason; + } + + public Method getMethod() { + return method; + } + + public void setMethod(Method method) { + this.method = method; + } + + public CallSite getCall() { + return call; + } + + public void setCall(CallSite call) { + this.call = call; + } + + public double getElapsedTime() { + return end - start; + } + + public Compilation getCompilation() { + return this; + } +} diff --git a/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/Constants.java b/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/Constants.java new file mode 100644 index 00000000000..e06dd05db54 --- /dev/null +++ b/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/Constants.java @@ -0,0 +1,46 @@ +/* + * Copyright 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. + * + */ + +package com.sun.hotspot.tools.compiler; + +interface Constants { + static final int JVM_ACC_PUBLIC = 0x0001; /* visible to everyone */ + static final int JVM_ACC_PRIVATE = 0x0002; /* visible only to the defining class */ + static final int JVM_ACC_PROTECTED = 0x0004; /* visible to subclasses */ + static final int JVM_ACC_STATIC = 0x0008; /* instance variable is static */ + static final int JVM_ACC_FINAL = 0x0010; /* no further subclassing, overriding */ + static final int JVM_ACC_SYNCHRONIZED = 0x0020; /* wrap method call in monitor lock */ + static final int JVM_ACC_SUPER = 0x0020; /* funky handling of invokespecial */ + static final int JVM_ACC_VOLATILE = 0x0040; /* can not cache in registers */ + static final int JVM_ACC_BRIDGE = 0x0040; /* bridge method generated by compiler */ + static final int JVM_ACC_TRANSIENT = 0x0080; /* not persistent */ + static final int JVM_ACC_VARARGS = 0x0080; /* method declared with variable number of args */ + static final int JVM_ACC_NATIVE = 0x0100; /* implemented in C */ + static final int JVM_ACC_INTERFACE = 0x0200; /* class is an interface */ + static final int JVM_ACC_ABSTRACT = 0x0400; /* no definition provided */ + static final int JVM_ACC_STRICT = 0x0800; /* strict floating point */ + static final int JVM_ACC_SYNTHETIC = 0x1000; /* compiler-generated class, method or field */ + static final int JVM_ACC_ANNOTATION = 0x2000; /* annotation type */ + static final int JVM_ACC_ENUM = 0x4000; /* field is declared as element of enum */ +} diff --git a/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/LogCleanupReader.java b/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/LogCleanupReader.java new file mode 100644 index 00000000000..eb3140c171b --- /dev/null +++ b/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/LogCleanupReader.java @@ -0,0 +1,212 @@ +/* + * Copyright 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. + * + */ + +package com.sun.hotspot.tools.compiler; + +import java.io.*; +import java.util.regex.*; + +/** + * This class is a filter class to deal with malformed XML that used + * to be produced by the JVM when generating LogCompilation. In 1.6 + * and later releases it shouldn't be required. + * @author never + */ + +class LogCleanupReader extends Reader { + private Reader reader; + + private char[] buffer = new char[4096]; + + private int bufferCount; + + private int bufferOffset; + + private char[] line = new char[1024]; + + private int index; + + private int length; + + private char[] one = new char[1]; + + LogCleanupReader(Reader r) { + reader = r; + } + + static final private Matcher pattern = Pattern.compile(".+ compile_id='[0-9]+'.*( compile_id='[0-9]+)").matcher(""); + static final private Matcher pattern2 = Pattern.compile("' (C[12]) compile_id=").matcher(""); + static final private Matcher pattern3 = Pattern.compile("'(destroy_vm)/").matcher(""); + + private void fill() throws IOException { + rawFill(); + if (length != -1) { + boolean changed = false; + String s = new String(line, 0, length); + String orig = s; + + pattern2.reset(s); + if (pattern2.find()) { + s = s.substring(0, pattern2.start(1)) + s.substring(pattern2.end(1) + 1); + changed = true; + } + + pattern.reset(s); + if (pattern.lookingAt()) { + s = s.substring(0, pattern.start(1)) + s.substring(pattern.end(1) + 1); + changed = true; + } + + pattern3.reset(s); + if (pattern3.find()) { + s = s.substring(0, pattern3.start(1)) + s.substring(pattern3.end(1)); + changed = true; + } + + if (changed) { + s.getChars(0, s.length(), line, 0); + length = s.length(); + } + } + } + + private void rawFill() throws IOException { + if (bufferCount == -1) { + length = -1; + return; + } + + int i = 0; + boolean fillNonEOL = true; + outer: + while (true) { + if (fillNonEOL) { + int p; + for (p = bufferOffset; p < bufferCount; p++) { + char c = buffer[p]; + if (c == '\r' || c == '\n') { + bufferOffset = p; + fillNonEOL = false; + continue outer; + } + if (i >= line.length) { + // copy and enlarge the line array + char[] newLine = new char[line.length * 2]; + System.arraycopy(line, 0, newLine, 0, line.length); + line = newLine; + } + line[i++] = c; + } + bufferOffset = p; + } else { + int p; + for (p = bufferOffset; p < bufferCount; p++) { + char c = buffer[p]; + if (c != '\r' && c != '\n') { + bufferOffset = p; + length = i; + index = 0; + return; + } + line[i++] = c; + } + bufferOffset = p; + } + if (bufferCount == -1) { + if (i == 0) { + length = -1; + } else { + length = i; + } + index = 0; + return; + } + if (bufferOffset != bufferCount) { + System.out.println(bufferOffset); + System.out.println(bufferCount); + throw new InternalError("how did we get here"); + } + // load more data and try again. + bufferCount = reader.read(buffer, 0, buffer.length); + bufferOffset = 0; + } + } + + public int read() throws java.io.IOException { + read(one, 0, 1); + return one[0]; + } + + public int read(char[] buffer) throws java.io.IOException { + return read(buffer, 0, buffer.length); + } + + public int read(char[] b, int off, int len) throws java.io.IOException { + if (length == -1) { + return -1; + } + + if (index == length) { + fill(); + if (length == -1) { + return -1; + } + } + int n = Math.min(length - index, Math.min(b.length - off, len)); + // System.out.printf("%d %d %d %d %d\n", index, length, off, len, n); + System.arraycopy(line, index, b, off, n); + index += n; + return n; + } + + public long skip(long n) throws java.io.IOException { + long result = n; + while (n-- > 0) read(); + return result; + } + + public boolean ready() throws java.io.IOException { + return reader.ready() || (line != null && length > 0); + } + + public boolean markSupported() { + return false; + } + + public void mark(int unused) throws java.io.IOException { + throw new UnsupportedOperationException("mark not supported"); + } + + public void reset() throws java.io.IOException { + reader.reset(); + line = null; + index = 0; + } + + public void close() throws java.io.IOException { + reader.close(); + line = null; + index = 0; + } +} diff --git a/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/LogCompilation.java b/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/LogCompilation.java new file mode 100644 index 00000000000..5edbad656ee --- /dev/null +++ b/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/LogCompilation.java @@ -0,0 +1,177 @@ +/* + * Copyright 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. + * + */ + +/** + * The main command line driver of a parser for LogCompilation output. + * @author never + */ + +package com.sun.hotspot.tools.compiler; + +import java.io.PrintStream; +import java.util.*; +import org.xml.sax.*; +import org.xml.sax.helpers.*; + +public class LogCompilation extends DefaultHandler implements ErrorHandler, Constants { + + public static void usage(int exitcode) { + System.out.println("Usage: LogCompilation [ -v ] [ -c ] [ -s ] [ -e | -N ] file1 ..."); + System.out.println(" -c: clean up malformed 1.5 xml"); + System.out.println(" -i: print inlining decisions"); + System.out.println(" -S: print compilation statistics"); + System.out.println(" -s: sort events by start time"); + System.out.println(" -e: sort events by elapsed time"); + System.out.println(" -N: sort events by name and start"); + System.exit(exitcode); + } + + public static void main(String[] args) throws Exception { + Comparator defaultSort = LogParser.sortByStart; + boolean statistics = false; + boolean printInlining = false; + boolean cleanup = false; + int index = 0; + + while (args.length > index) { + if (args[index].equals("-e")) { + defaultSort = LogParser.sortByElapsed; + index++; + } else if (args[index].equals("-n")) { + defaultSort = LogParser.sortByNameAndStart; + index++; + } else if (args[index].equals("-s")) { + defaultSort = LogParser.sortByStart; + index++; + } else if (args[index].equals("-c")) { + cleanup = true; + index++; + } else if (args[index].equals("-S")) { + statistics = true; + index++; + } else if (args[index].equals("-h")) { + usage(0); + } else if (args[index].equals("-i")) { + printInlining = true; + index++; + } else { + break; + } + } + + if (index >= args.length) { + usage(1); + } + + while (index < args.length) { + ArrayList events = LogParser.parse(args[index], cleanup); + + if (statistics) { + printStatistics(events, System.out); + } else { + Collections.sort(events, defaultSort); + for (LogEvent c : events) { + if (printInlining && c instanceof Compilation) { + Compilation comp = (Compilation)c; + comp.print(System.out, true); + } else { + c.print(System.out); + } + } + } + index++; + } + } + + public static void printStatistics(ArrayList events, PrintStream out) { + long cacheSize = 0; + long maxCacheSize = 0; + int nmethodsCreated = 0; + int nmethodsLive = 0; + int[] attempts = new int[32]; + double regallocTime = 0; + int maxattempts = 0; + + LinkedHashMap phaseTime = new LinkedHashMap(7); + LinkedHashMap phaseNodes = new LinkedHashMap(7); + double elapsed = 0; + + for (LogEvent e : events) { + if (e instanceof Compilation) { + Compilation c = (Compilation) e; + c.printShort(out); + out.printf(" %6.4f\n", c.getElapsedTime()); + attempts[c.getAttempts()]++; + maxattempts = Math.max(maxattempts,c.getAttempts()); + elapsed += c.getElapsedTime(); + for (Phase phase : c.getPhases()) { + out.printf("\t%s %6.4f\n", phase.getName(), phase.getElapsedTime()); + Double v = phaseTime.get(phase.getName()); + if (v == null) { + v = Double.valueOf(0.0); + } + phaseTime.put(phase.getName(), Double.valueOf(v.doubleValue() + phase.getElapsedTime())); + + Integer v2 = phaseNodes.get(phase.getName()); + if (v2 == null) { + v2 = Integer.valueOf(0); + } + phaseNodes.put(phase.getName(), Integer.valueOf(v2.intValue() + phase.getNodes())); + } + } else if (e instanceof MakeNotEntrantEvent) { + MakeNotEntrantEvent mne = (MakeNotEntrantEvent) e; + NMethod nm = mne.getNMethod(); + if (mne.isZombie()) { + if (nm == null) { + System.err.println(mne.getId()); + } + cacheSize -= nm.getSize(); + nmethodsLive--; + } + } else if (e instanceof NMethod) { + nmethodsLive++; + nmethodsCreated++; + NMethod nm = (NMethod) e; + cacheSize += nm.getSize(); + maxCacheSize = Math.max(cacheSize, maxCacheSize); + } + } + out.printf("NMethods: %d created %d live %d bytes (%d peak) in the code cache\n", + nmethodsCreated, nmethodsLive, cacheSize, maxCacheSize); + out.println("Phase times:"); + for (String name : phaseTime.keySet()) { + Double v = phaseTime.get(name); + Integer v2 = phaseNodes.get(name); + out.printf("%20s %6.4f %d\n", name, v.doubleValue(), v2.intValue()); + } + out.printf("%20s %6.4f\n", "total", elapsed); + + if (maxattempts > 0) { + out.println("Distribution of regalloc passes:"); + for (int i = 0; i <= maxattempts; i++) { + out.printf("%2d %8d\n", i, attempts[i]); + } + } + } +} diff --git a/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/LogEvent.java b/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/LogEvent.java new file mode 100644 index 00000000000..69f6d385b0e --- /dev/null +++ b/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/LogEvent.java @@ -0,0 +1,38 @@ +/* + * Copyright 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. + * + */ + +package com.sun.hotspot.tools.compiler; + +import java.io.PrintStream; +import java.util.*; + +public interface LogEvent { + public double getStart(); + + public double getElapsedTime(); + + public Compilation getCompilation(); + + public void print(PrintStream stream); +} diff --git a/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/LogParser.java b/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/LogParser.java new file mode 100644 index 00000000000..bfff7dfa916 --- /dev/null +++ b/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/LogParser.java @@ -0,0 +1,430 @@ +/* + * Copyright 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. + * + */ + +/** + * A SAX based parser of LogCompilation output from HotSpot. It takes a complete + * @author never + */ + +package com.sun.hotspot.tools.compiler; + +import java.io.FileReader; +import java.io.Reader; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Stack; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; +import org.xml.sax.Attributes; +import org.xml.sax.ErrorHandler; +import org.xml.sax.InputSource; +import org.xml.sax.helpers.DefaultHandler; + +public class LogParser extends DefaultHandler implements ErrorHandler, Constants { + + static final HashMap typeMap; + static { + typeMap = new HashMap(); + typeMap.put("[I", "int[]"); + typeMap.put("[C", "char[]"); + typeMap.put("[Z", "boolean[]"); + typeMap.put("[L", "Object[]"); + typeMap.put("[B", "byte[]"); + } + + static Comparator sortByStart = new Comparator() { + + public int compare(LogEvent a, LogEvent b) { + double difference = (a.getStart() - b.getStart()); + if (difference < 0) { + return -1; + } + if (difference > 0) { + return 1; + } + return 0; + } + + @Override + public boolean equals(Object other) { + return false; + } + + @Override + public int hashCode() { + return 7; + } + }; + static Comparator sortByNameAndStart = new Comparator() { + + public int compare(LogEvent a, LogEvent b) { + Compilation c1 = a.getCompilation(); + Compilation c2 = b.getCompilation(); + if (c1 != null && c2 != null) { + int result = c1.getMethod().toString().compareTo(c2.getMethod().toString()); + if (result != 0) { + return result; + } + } + double difference = (a.getStart() - b.getStart()); + if (difference < 0) { + return -1; + } + if (difference > 0) { + return 1; + } + return 0; + } + + public boolean equals(Object other) { + return false; + } + + @Override + public int hashCode() { + return 7; + } + }; + static Comparator sortByElapsed = new Comparator() { + + public int compare(LogEvent a, LogEvent b) { + double difference = (a.getElapsedTime() - b.getElapsedTime()); + if (difference < 0) { + return -1; + } + if (difference > 0) { + return 1; + } + return 0; + } + + @Override + public boolean equals(Object other) { + return false; + } + + @Override + public int hashCode() { + return 7; + } + }; + + private ArrayList events = new ArrayList(); + + private HashMap types = new HashMap(); + private HashMap methods = new HashMap(); + private LinkedHashMap nmethods = new LinkedHashMap(); + private HashMap compiles = new HashMap(); + private String failureReason; + private int bci; + private Stack scopes = new Stack(); + private Compilation compile; + private CallSite site; + private Stack phaseStack = new Stack(); + private UncommonTrapEvent currentTrap; + + long parseLong(String l) { + try { + return Long.decode(l).longValue(); + } catch (NumberFormatException nfe) { + int split = l.length() - 8; + String s1 = "0x" + l.substring(split); + String s2 = l.substring(0, split); + long v1 = Long.decode(s1).longValue() & 0xffffffffL; + long v2 = (Long.decode(s2).longValue() & 0xffffffffL) << 32; + if (!l.equals("0x" + Long.toHexString(v1 + v2))) { + System.out.println(l); + System.out.println(s1); + System.out.println(s2); + System.out.println(v1); + System.out.println(v2); + System.out.println(Long.toHexString(v1 + v2)); + throw new InternalError("bad conversion"); + } + return v1 + v2; + } + } + + public static ArrayList parse(String file, boolean cleanup) throws Exception { + return parse(new FileReader(file), cleanup); + } + + public static ArrayList parse(Reader reader, boolean cleanup) throws Exception { + // Create the XML input factory + SAXParserFactory factory = SAXParserFactory.newInstance(); + + // Create the XML LogEvent reader + SAXParser p = factory.newSAXParser(); + + if (cleanup) { + // some versions of the log have slightly malformed XML, so clean it + // up before passing it to SAX + reader = new LogCleanupReader(reader); + } + + LogParser log = new LogParser(); + p.parse(new InputSource(reader), log); + + // Associate compilations with their NMethods + for (NMethod nm : log.nmethods.values()) { + Compilation c = log.compiles.get(nm.getId()); + nm.setCompilation(c); + // Native wrappers for methods don't have a compilation + if (c != null) { + c.setNMethod(nm); + } + } + + // Initially we want the LogEvent log sorted by timestamp + Collections.sort(log.events, sortByStart); + + return log.events; + } + + String search(Attributes attr, String name) { + return search(attr, name, null); + } + + String search(Attributes attr, String name, String defaultValue) { + String result = attr.getValue(name); + if (result != null) { + return result; + } + if (defaultValue != null) { + return defaultValue; + } + for (int i = 0; i < attr.getLength(); i++) { + System.out.println(attr.getQName(i) + " " + attr.getValue(attr.getQName(i))); + } + throw new InternalError("can't find " + name); + } + int indent = 0; + String compile_id; + + String type(String id) { + String result = types.get(id); + if (result == null) { + throw new InternalError(id); + } + String remapped = typeMap.get(result); + if (remapped != null) { + return remapped; + } + return result; + } + + void type(String id, String name) { + assert type(id) == null; + types.put(id, name); + } + + Method method(String id) { + Method result = methods.get(id); + if (result == null) { + throw new InternalError(id); + } + return result; + } + + public String makeId(Attributes atts) { + String id = atts.getValue("compile_id"); + String kind = atts.getValue("kind"); + if (kind != null && kind.equals("osr")) { + id += "%"; + } + return id; + } + + @Override + public void startElement(String uri, + String localName, + String qname, + Attributes atts) { + if (qname.equals("phase")) { + Phase p = new Phase(search(atts, "name"), + Double.parseDouble(search(atts, "stamp")), + Integer.parseInt(search(atts, "nodes"))); + phaseStack.push(p); + } else if (qname.equals("phase_done")) { + Phase p = phaseStack.pop(); + p.setEndNodes(Integer.parseInt(search(atts, "nodes"))); + p.setEnd(Double.parseDouble(search(atts, "stamp"))); + compile.getPhases().add(p); + } else if (qname.equals("task")) { + compile = new Compilation(Integer.parseInt(search(atts, "compile_id", "-1"))); + compile.setStart(Double.parseDouble(search(atts, "stamp"))); + compile.setICount(search(atts, "count", "0")); + compile.setBCount(search(atts, "backedge_count", "0")); + + String method = atts.getValue("method"); + int space = method.indexOf(' '); + method = method.substring(0, space) + "::" + + method.substring(space + 1, method.indexOf(' ', space + 1) + 1); + String compiler = atts.getValue("compiler"); + if (compiler == null) { + compiler = ""; + } + String kind = atts.getValue("compile_kind"); + if (kind == null) { + kind = "normal"; + } + if (kind.equals("osr")) { + compile.setOsr(true); + compile.setOsr_bci(Integer.parseInt(search(atts, "osr_bci"))); + } else if (kind.equals("c2i")) { + compile.setSpecial("--- adapter " + method); + } else { + compile.setSpecial(compile.getId() + " " + method + " (0 bytes)"); + } + events.add(compile); + compiles.put(makeId(atts), compile); + } else if (qname.equals("type")) { + type(search(atts, "id"), search(atts, "name")); + } else if (qname.equals("bc")) { + bci = Integer.parseInt(search(atts, "bci")); + } else if (qname.equals("klass")) { + type(search(atts, "id"), search(atts, "name")); + } else if (qname.equals("method")) { + String id = search(atts, "id"); + Method m = new Method(); + m.setHolder(type(search(atts, "holder"))); + m.setName(search(atts, "name")); + m.setReturnType(type(search(atts, "return"))); + m.setArguments(search(atts, "arguments", "void")); + m.setBytes(search(atts, "bytes")); + m.setIICount(search(atts, "iicount")); + m.setFlags(search(atts, "flags")); + methods.put(id, m); + } else if (qname.equals("call")) { + site = new CallSite(bci, method(search(atts, "method"))); + site.setCount(Integer.parseInt(search(atts, "count"))); + String receiver = atts.getValue("receiver"); + if (receiver != null) { + site.setReceiver(type(receiver)); + site.setReceiver_count(Integer.parseInt(search(atts, "receiver_count"))); + } + scopes.peek().add(site); + } else if (qname.equals("regalloc")) { + compile.setAttempts(Integer.parseInt(search(atts, "attempts"))); + } else if (qname.equals("inline_fail")) { + scopes.peek().last().setReason(search(atts, "reason")); + } else if (qname.equals("failure")) { + failureReason = search(atts, "reason"); + } else if (qname.equals("task_done")) { + compile.setEnd(Double.parseDouble(search(atts, "stamp"))); + if (Integer.parseInt(search(atts, "success")) == 0) { + compile.setFailureReason(failureReason); + } + } else if (qname.equals("make_not_entrant")) { + String id = makeId(atts); + NMethod nm = nmethods.get(id); + if (nm == null) throw new InternalError(); + LogEvent e = new MakeNotEntrantEvent(Double.parseDouble(search(atts, "stamp")), id, + atts.getValue("zombie") != null, nm); + events.add(e); + } else if (qname.equals("uncommon_trap")) { + String id = atts.getValue("compile_id"); + if (id != null) { + id = makeId(atts); + currentTrap = new UncommonTrapEvent(Double.parseDouble(search(atts, "stamp")), + id, + atts.getValue("reason"), + atts.getValue("action"), + Integer.parseInt(search(atts, "count", "0"))); + events.add(currentTrap); + } else { + // uncommon trap inserted during parsing. + // ignore for now + } + } else if (qname.equals("jvms")) { + // + if (currentTrap != null) { + currentTrap.addJVMS(atts.getValue("method"), Integer.parseInt(atts.getValue("bci"))); + } else { + System.err.println("Missing uncommon_trap for jvms"); + } + } else if (qname.equals("nmethod")) { + String id = makeId(atts); + NMethod nm = new NMethod(Double.parseDouble(search(atts, "stamp")), + id, + parseLong(atts.getValue("address")), + parseLong(atts.getValue("size"))); + nmethods.put(id, nm); + events.add(nm); + } else if (qname.equals("parse")) { + Method m = method(search(atts, "method")); + if (scopes.size() == 0) { + compile.setMethod(m); + scopes.push(compile.getCall()); + } else { + if (site.getMethod() == m) { + scopes.push(site); + } else if (scopes.peek().getCalls().size() > 2 && m == scopes.peek().last(-2).getMethod()) { + scopes.push(scopes.peek().last(-2)); + } else { + System.out.println(site.getMethod()); + System.out.println(m); + throw new InternalError("call site and parse don't match"); + } + } + } + } + + @Override + public void endElement(String uri, + String localName, + String qname) { + if (qname.equals("parse")) { + indent -= 2; + scopes.pop(); + } else if (qname.equals("uncommon_trap")) { + currentTrap = null; + } else if (qname.equals("task")) { + types.clear(); + methods.clear(); + site = null; + } + } + + @Override + public void warning(org.xml.sax.SAXParseException e) { + System.err.println(e.getMessage() + " at line " + e.getLineNumber() + ", column " + e.getColumnNumber()); + e.printStackTrace(); + } + + @Override + public void error(org.xml.sax.SAXParseException e) { + System.err.println(e.getMessage() + " at line " + e.getLineNumber() + ", column " + e.getColumnNumber()); + e.printStackTrace(); + } + + @Override + public void fatalError(org.xml.sax.SAXParseException e) { + System.err.println(e.getMessage() + " at line " + e.getLineNumber() + ", column " + e.getColumnNumber()); + e.printStackTrace(); + } +} diff --git a/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/MakeNotEntrantEvent.java b/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/MakeNotEntrantEvent.java new file mode 100644 index 00000000000..2b3fc56b359 --- /dev/null +++ b/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/MakeNotEntrantEvent.java @@ -0,0 +1,55 @@ +/* + * Copyright 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. + * + */ + +package com.sun.hotspot.tools.compiler; + +import java.io.PrintStream; + +class MakeNotEntrantEvent extends BasicLogEvent { + private final boolean zombie; + + private NMethod nmethod; + + MakeNotEntrantEvent(double s, String i, boolean z, NMethod nm) { + super(s, i); + zombie = z; + nmethod = nm; + } + + public NMethod getNMethod() { + return nmethod; + } + + public void print(PrintStream stream) { + if (isZombie()) { + stream.printf("%s make_zombie\n", getId()); + } else { + stream.printf("%s make_not_entrant\n", getId()); + } + } + + public boolean isZombie() { + return zombie; + } +} diff --git a/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/Method.java b/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/Method.java new file mode 100644 index 00000000000..f2c9a9c710b --- /dev/null +++ b/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/Method.java @@ -0,0 +1,120 @@ +/* + * Copyright 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. + * + */ + +package com.sun.hotspot.tools.compiler; + +import java.util.Arrays; + +public class Method implements Constants { + + private String holder; + private String name; + private String returnType; + private String arguments; + private String bytes; + private String iicount; + private String flags; + + String decodeFlags(int osr_bci) { + int f = Integer.parseInt(getFlags()); + char[] c = new char[4]; + Arrays.fill(c, ' '); + if (osr_bci >= 0) { + c[0] = '%'; + } + if ((f & JVM_ACC_SYNCHRONIZED) != 0) { + c[1] = 's'; + } + return new String(c); + } + + String format(int osr_bci) { + if (osr_bci >= 0) { + return getHolder().replace('/', '.') + "::" + getName() + " @ " + osr_bci + " (" + getBytes() + " bytes)"; + } else { + return getHolder().replace('/', '.') + "::" + getName() + " (" + getBytes() + " bytes)"; + } + } + + @Override + public String toString() { + return getHolder().replace('/', '.') + "::" + getName() + " (" + getBytes() + " bytes)"; + } + + public String getHolder() { + return holder; + } + + public void setHolder(String holder) { + this.holder = holder; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getReturnType() { + return returnType; + } + + public void setReturnType(String returnType) { + this.returnType = returnType; + } + + public String getArguments() { + return arguments; + } + + public void setArguments(String arguments) { + this.arguments = arguments; + } + + public String getBytes() { + return bytes; + } + + public void setBytes(String bytes) { + this.bytes = bytes; + } + + public String getIICount() { + return iicount; + } + + public void setIICount(String iicount) { + this.iicount = iicount; + } + + public String getFlags() { + return flags; + } + + public void setFlags(String flags) { + this.flags = flags; + } +} diff --git a/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/NMethod.java b/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/NMethod.java new file mode 100644 index 00000000000..8fb277d00d6 --- /dev/null +++ b/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/NMethod.java @@ -0,0 +1,60 @@ +/* + * Copyright 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. + * + */ + +package com.sun.hotspot.tools.compiler; + +import java.io.PrintStream; + +public class NMethod extends BasicLogEvent { + + private long address; + private long size; + + NMethod(double s, String i, long a, long sz) { + super(s, i); + address = a; + size = sz; + } + + public void print(PrintStream out) { + // XXX Currently we do nothing + // throw new InternalError(); + } + + public long getAddress() { + return address; + } + + public void setAddress(long address) { + this.address = address; + } + + public long getSize() { + return size; + } + + public void setSize(long size) { + this.size = size; + } +} diff --git a/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/Phase.java b/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/Phase.java new file mode 100644 index 00000000000..8c29149a217 --- /dev/null +++ b/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/Phase.java @@ -0,0 +1,63 @@ +/* + * Copyright 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. + * + */ + +package com.sun.hotspot.tools.compiler; + +import java.io.PrintStream; + +public class Phase extends BasicLogEvent { + + private final int startNodes; + private int endNodes; + + Phase(String n, double s, int nodes) { + super(s, n); + startNodes = nodes; + } + + int getNodes() { + return getStartNodes(); + } + + void setEndNodes(int n) { + endNodes = n; + } + + public String getName() { + return getId(); + } + + public int getStartNodes() { + return startNodes; + } + + public int getEndNodes() { + return endNodes; + } + + @Override + public void print(PrintStream stream) { + throw new UnsupportedOperationException("Not supported yet."); + } +} diff --git a/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/UncommonTrapEvent.java b/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/UncommonTrapEvent.java new file mode 100644 index 00000000000..894cbdc7724 --- /dev/null +++ b/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/UncommonTrapEvent.java @@ -0,0 +1,84 @@ +/* + * Copyright 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. + * + */ + +package com.sun.hotspot.tools.compiler; + +import java.io.PrintStream; + +class UncommonTrapEvent extends BasicLogEvent { + + private final String reason; + private final String action; + private int count; + private String jvms = ""; + + UncommonTrapEvent(double s, String i, String r, String a, int c) { + super(s, i); + reason = r; + action = a; + count = c; + } + + + public void addJVMS(String method, int bci) { + setJvms(getJvms() + " @" + bci + " " + method + "\n"); + } + + public void updateCount(UncommonTrapEvent trap) { + setCount(Math.max(getCount(), trap.getCount())); + } + + public void print(PrintStream stream) { + stream.printf("%s uncommon trap %s %s\n", getId(), getReason(), getAction()); + stream.print(getJvms()); + } + + public String getReason() { + return reason; + } + + public String getAction() { + return action; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public String getJvms() { + return jvms; + } + + public void setJvms(String jvms) { + this.jvms = jvms; + } + + public void setCompilation(Compilation compilation) { + this.compilation = compilation; + } +} From 95a3c4a81f7e58041681cfc6da30f9a016bf6b92 Mon Sep 17 00:00:00 2001 From: Pavel Porvatov Date: Thu, 26 Feb 2009 11:44:43 +0300 Subject: [PATCH 061/292] 6794831: Infinite loop while painting ticks on Slider with maximum=MAX_INT Reviewed-by: malenkov --- .../javax/swing/plaf/basic/BasicSliderUI.java | 66 +++++++---- .../swing/JSlider/6794831/bug6794831.java | 105 ++++++++++++++++++ 2 files changed, 148 insertions(+), 23 deletions(-) create mode 100644 jdk/test/javax/swing/JSlider/6794831/bug6794831.java diff --git a/jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java b/jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java index 864ad13264a..0a858d41c18 100644 --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java @@ -1004,47 +1004,62 @@ public class BasicSliderUI extends SliderUI{ g.setColor(DefaultLookup.getColor(slider, this, "Slider.tickColor", Color.black)); if ( slider.getOrientation() == JSlider.HORIZONTAL ) { - g.translate( 0, tickBounds.y); + g.translate(0, tickBounds.y); - int value = slider.getMinimum(); - int xPos; + if (slider.getMinorTickSpacing() > 0) { + int value = slider.getMinimum(); - if ( slider.getMinorTickSpacing() > 0 ) { while ( value <= slider.getMaximum() ) { - xPos = xPositionForValue( value ); + int xPos = xPositionForValue(value); paintMinorTickForHorizSlider( g, tickBounds, xPos ); + + // Overflow checking + if (Integer.MAX_VALUE - slider.getMinorTickSpacing() < value) { + break; + } + value += slider.getMinorTickSpacing(); } } - if ( slider.getMajorTickSpacing() > 0 ) { - value = slider.getMinimum(); + if (slider.getMajorTickSpacing() > 0) { + int value = slider.getMinimum(); while ( value <= slider.getMaximum() ) { - xPos = xPositionForValue( value ); + int xPos = xPositionForValue(value); paintMajorTickForHorizSlider( g, tickBounds, xPos ); + + // Overflow checking + if (Integer.MAX_VALUE - slider.getMajorTickSpacing() < value) { + break; + } + value += slider.getMajorTickSpacing(); } } g.translate( 0, -tickBounds.y); - } - else { - g.translate(tickBounds.x, 0); + } else { + g.translate(tickBounds.x, 0); - int value = slider.getMinimum(); - int yPos; - - if ( slider.getMinorTickSpacing() > 0 ) { + if (slider.getMinorTickSpacing() > 0) { int offset = 0; if(!BasicGraphicsUtils.isLeftToRight(slider)) { offset = tickBounds.width - tickBounds.width / 2; g.translate(offset, 0); } - while ( value <= slider.getMaximum() ) { - yPos = yPositionForValue( value ); + int value = slider.getMinimum(); + + while (value <= slider.getMaximum()) { + int yPos = yPositionForValue(value); paintMinorTickForVertSlider( g, tickBounds, yPos ); + + // Overflow checking + if (Integer.MAX_VALUE - slider.getMinorTickSpacing() < value) { + break; + } + value += slider.getMinorTickSpacing(); } @@ -1053,15 +1068,22 @@ public class BasicSliderUI extends SliderUI{ } } - if ( slider.getMajorTickSpacing() > 0 ) { - value = slider.getMinimum(); + if (slider.getMajorTickSpacing() > 0) { if(!BasicGraphicsUtils.isLeftToRight(slider)) { g.translate(2, 0); } - while ( value <= slider.getMaximum() ) { - yPos = yPositionForValue( value ); + int value = slider.getMinimum(); + + while (value <= slider.getMaximum()) { + int yPos = yPositionForValue(value); paintMajorTickForVertSlider( g, tickBounds, yPos ); + + // Overflow checking + if (Integer.MAX_VALUE - slider.getMajorTickSpacing() < value) { + break; + } + value += slider.getMajorTickSpacing(); } @@ -1775,8 +1797,6 @@ public class BasicSliderUI extends SliderUI{ thumbMiddle = thumbLeft + halfThumbWidth; slider.setValue(valueForXPosition(thumbMiddle)); break; - default: - return; } } diff --git a/jdk/test/javax/swing/JSlider/6794831/bug6794831.java b/jdk/test/javax/swing/JSlider/6794831/bug6794831.java new file mode 100644 index 00000000000..a147987d417 --- /dev/null +++ b/jdk/test/javax/swing/JSlider/6794831/bug6794831.java @@ -0,0 +1,105 @@ +/* + * Copyright 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 6794831 + * @summary Infinite loop while painting ticks on Slider with maximum=MAX_INT + * @author Pavel Porvatov + @run main bug6794831 + */ + +import javax.swing.*; +import javax.swing.plaf.basic.BasicSliderUI; +import java.awt.image.BufferedImage; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +public class bug6794831 { + private final CountDownLatch countDownLatch = new CountDownLatch(1); + + public static void main(String args[]) throws InterruptedException { + new bug6794831().run(); + } + + private void run() throws InterruptedException { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + for (UIManager.LookAndFeelInfo lookAndFeelInfo : UIManager.getInstalledLookAndFeels()) { + try { + UIManager.setLookAndFeel(lookAndFeelInfo.getClassName()); + } catch (Exception e) { + fail(e.getMessage()); + } + + BufferedImage image = new BufferedImage(300, 200, BufferedImage.TYPE_INT_ARGB); + + // Test 1 + JSlider slider = new JSlider(0, Integer.MAX_VALUE - 1, 0); + + slider.setMajorTickSpacing((Integer.MAX_VALUE - 1) / 4); + slider.setPaintTicks(true); + + ((BasicSliderUI) slider.getUI()).paintTicks(image.getGraphics()); + + // Test 2 + slider = new JSlider(0, Integer.MAX_VALUE - 1, 0); + + slider.setMinorTickSpacing((Integer.MAX_VALUE - 1) / 4); + slider.setPaintTicks(true); + + ((BasicSliderUI) slider.getUI()).paintTicks(image.getGraphics()); + + // Test 3 + slider = new JSlider(0, Integer.MAX_VALUE - 1, 0); + + slider.setOrientation(JSlider.VERTICAL); + slider.setMajorTickSpacing((Integer.MAX_VALUE - 1) / 4); + slider.setPaintTicks(true); + + ((BasicSliderUI) slider.getUI()).paintTicks(image.getGraphics()); + + // Test 4 + slider = new JSlider(0, Integer.MAX_VALUE - 1, 0); + + slider.setOrientation(JSlider.VERTICAL); + slider.setMinorTickSpacing((Integer.MAX_VALUE - 1) / 4); + slider.setPaintTicks(true); + + ((BasicSliderUI) slider.getUI()).paintTicks(image.getGraphics()); + + countDownLatch.countDown(); + } + } + }); + + if (countDownLatch.await(3000, TimeUnit.MILLISECONDS)) { + System.out.println("bug6794831 passed"); + } else { + fail("bug6794831 failed"); + } + } + + private static void fail(String msg) { + throw new RuntimeException(msg); + } +} From 4fd14806a47371139817f7e496da823066954fd1 Mon Sep 17 00:00:00 2001 From: Clemens Eisserer Date: Thu, 26 Feb 2009 13:38:38 -0800 Subject: [PATCH 062/292] 6791612: OGLBat tests are failed in jdk 7 b42 Reviewed-by: tdv --- jdk/make/sun/xawt/mapfile-vers | 2 ++ 1 file changed, 2 insertions(+) diff --git a/jdk/make/sun/xawt/mapfile-vers b/jdk/make/sun/xawt/mapfile-vers index d4b5b6e32ba..07b16cefcc8 100644 --- a/jdk/make/sun/xawt/mapfile-vers +++ b/jdk/make/sun/xawt/mapfile-vers @@ -302,12 +302,14 @@ SUNWprivate_1.1 { Java_java_awt_FileDialog_initIDs; Java_sun_awt_X11_XWindow_initIDs; + Java_sun_java2d_opengl_OGLContext_getOGLIdString; Java_sun_java2d_opengl_OGLMaskFill_maskFill; Java_sun_java2d_opengl_OGLRenderer_drawPoly; Java_sun_java2d_opengl_OGLRenderQueue_flushBuffer; Java_sun_java2d_opengl_OGLSurfaceData_initTexture; Java_sun_java2d_opengl_OGLSurfaceData_initFBObject; Java_sun_java2d_opengl_OGLSurfaceData_initFlipBackbuffer; + Java_sun_java2d_opengl_OGLSurfaceData_getTextureID; Java_sun_java2d_opengl_OGLSurfaceData_getTextureTarget; Java_sun_java2d_opengl_OGLTextRenderer_drawGlyphList; Java_sun_java2d_opengl_GLXGraphicsConfig_getGLXConfigInfo; From 9b31d58b9817aeabba733861cb2b2c3a5ed84843 Mon Sep 17 00:00:00 2001 From: Vladimir Kozlov Date: Thu, 26 Feb 2009 14:26:02 -0800 Subject: [PATCH 063/292] 6809798: SafePointScalarObject node placed into incorrect block during GCM Replace the control edge of a pinned node before scheduling. Reviewed-by: never --- hotspot/src/share/vm/opto/block.cpp | 4 ++ hotspot/src/share/vm/opto/block.hpp | 2 + hotspot/src/share/vm/opto/callnode.cpp | 1 + hotspot/src/share/vm/opto/callnode.hpp | 4 ++ hotspot/src/share/vm/opto/gcm.cpp | 67 +++++++++++++++----------- hotspot/src/share/vm/opto/macro.cpp | 1 + 6 files changed, 52 insertions(+), 27 deletions(-) diff --git a/hotspot/src/share/vm/opto/block.cpp b/hotspot/src/share/vm/opto/block.cpp index cf15fa7c4fb..28400047756 100644 --- a/hotspot/src/share/vm/opto/block.cpp +++ b/hotspot/src/share/vm/opto/block.cpp @@ -909,6 +909,10 @@ void PhaseCFG::verify( ) const { !(n->jvms() != NULL && n->jvms()->is_monitor_use(k)) ) { assert( b->find_node(def) < j, "uses must follow definitions" ); } + if( def->is_SafePointScalarObject() ) { + assert(_bbs[def->_idx] == b, "SafePointScalarObject Node should be at the same block as its SafePoint node"); + assert(_bbs[def->_idx] == _bbs[def->in(0)->_idx], "SafePointScalarObject Node should be at the same block as its control edge"); + } } } } diff --git a/hotspot/src/share/vm/opto/block.hpp b/hotspot/src/share/vm/opto/block.hpp index 43ce09fe9ad..0da859abbba 100644 --- a/hotspot/src/share/vm/opto/block.hpp +++ b/hotspot/src/share/vm/opto/block.hpp @@ -347,6 +347,8 @@ class PhaseCFG : public Phase { // Helper function to insert a node into a block void schedule_node_into_block( Node *n, Block *b ); + void PhaseCFG::replace_block_proj_ctrl( Node *n ); + // Set the basic block for pinned Nodes void schedule_pinned_nodes( VectorSet &visited ); diff --git a/hotspot/src/share/vm/opto/callnode.cpp b/hotspot/src/share/vm/opto/callnode.cpp index 7dff291fc1c..811693cce7b 100644 --- a/hotspot/src/share/vm/opto/callnode.cpp +++ b/hotspot/src/share/vm/opto/callnode.cpp @@ -975,6 +975,7 @@ SafePointScalarObjectNode::SafePointScalarObjectNode(const TypeOopPtr* tp, } bool SafePointScalarObjectNode::pinned() const { return true; } +bool SafePointScalarObjectNode::depends_only_on_test() const { return false; } uint SafePointScalarObjectNode::ideal_reg() const { return 0; // No matching to machine instruction diff --git a/hotspot/src/share/vm/opto/callnode.hpp b/hotspot/src/share/vm/opto/callnode.hpp index 06c783364c0..40a4abeae1d 100644 --- a/hotspot/src/share/vm/opto/callnode.hpp +++ b/hotspot/src/share/vm/opto/callnode.hpp @@ -437,6 +437,10 @@ public: // of the SafePoint node for which it was generated. virtual bool pinned() const; // { return true; } + // SafePointScalarObject depends on the SafePoint node + // for which it was generated. + virtual bool depends_only_on_test() const; // { return false; } + virtual uint size_of() const { return sizeof(*this); } // Assumes that "this" is an argument to a safepoint node "s", and that diff --git a/hotspot/src/share/vm/opto/gcm.cpp b/hotspot/src/share/vm/opto/gcm.cpp index b56fb157119..65c63339e29 100644 --- a/hotspot/src/share/vm/opto/gcm.cpp +++ b/hotspot/src/share/vm/opto/gcm.cpp @@ -57,6 +57,37 @@ void PhaseCFG::schedule_node_into_block( Node *n, Block *b ) { } } +//----------------------------replace_block_proj_ctrl------------------------- +// Nodes that have is_block_proj() nodes as their control need to use +// the appropriate Region for their actual block as their control since +// the projection will be in a predecessor block. +void PhaseCFG::replace_block_proj_ctrl( Node *n ) { + const Node *in0 = n->in(0); + assert(in0 != NULL, "Only control-dependent"); + const Node *p = in0->is_block_proj(); + if (p != NULL && p != n) { // Control from a block projection? + assert(!n->pinned() || n->is_SafePointScalarObject(), "only SafePointScalarObject pinned node is expected here"); + // Find trailing Region + Block *pb = _bbs[in0->_idx]; // Block-projection already has basic block + uint j = 0; + if (pb->_num_succs != 1) { // More then 1 successor? + // Search for successor + uint max = pb->_nodes.size(); + assert( max > 1, "" ); + uint start = max - pb->_num_succs; + // Find which output path belongs to projection + for (j = start; j < max; j++) { + if( pb->_nodes[j] == in0 ) + break; + } + assert( j < max, "must find" ); + // Change control to match head of successor basic block + j -= start; + } + n->set_req(0, pb->_succs[j]->head()); + } +} + //------------------------------schedule_pinned_nodes-------------------------- // Set the basic block for Nodes pinned into blocks @@ -68,8 +99,10 @@ void PhaseCFG::schedule_pinned_nodes( VectorSet &visited ) { Node *n = spstack.pop(); if( !visited.test_set(n->_idx) ) { // Test node and flag it as visited if( n->pinned() && !_bbs.lookup(n->_idx) ) { // Pinned? Nail it down! + assert( n->in(0), "pinned Node must have Control" ); + // Before setting block replace block_proj control edge + replace_block_proj_ctrl(n); Node *input = n->in(0); - assert( input, "pinned Node must have Control" ); while( !input->is_block_start() ) input = input->in(0); Block *b = _bbs[input->_idx]; // Basic block of controlling input @@ -158,34 +191,12 @@ bool PhaseCFG::schedule_early(VectorSet &visited, Node_List &roots) { uint i = nstack_top_i; if (i == 0) { - // Special control input processing. - // While I am here, go ahead and look for Nodes which are taking control - // from a is_block_proj Node. After I inserted RegionNodes to make proper - // blocks, the control at a is_block_proj more properly comes from the - // Region being controlled by the block_proj Node. + // Fixup some control. Constants without control get attached + // to root and nodes that use is_block_proj() nodes should be attached + // to the region that starts their block. const Node *in0 = n->in(0); if (in0 != NULL) { // Control-dependent? - const Node *p = in0->is_block_proj(); - if (p != NULL && p != n) { // Control from a block projection? - // Find trailing Region - Block *pb = _bbs[in0->_idx]; // Block-projection already has basic block - uint j = 0; - if (pb->_num_succs != 1) { // More then 1 successor? - // Search for successor - uint max = pb->_nodes.size(); - assert( max > 1, "" ); - uint start = max - pb->_num_succs; - // Find which output path belongs to projection - for (j = start; j < max; j++) { - if( pb->_nodes[j] == in0 ) - break; - } - assert( j < max, "must find" ); - // Change control to match head of successor basic block - j -= start; - } - n->set_req(0, pb->_succs[j]->head()); - } + replace_block_proj_ctrl(n); } else { // n->in(0) == NULL if (n->req() == 1) { // This guy is a constant with NO inputs? n->set_req(0, _root); @@ -226,6 +237,8 @@ bool PhaseCFG::schedule_early(VectorSet &visited, Node_List &roots) { if (!n->pinned()) { // Set earliest legal block. _bbs.map(n->_idx, find_deepest_input(n, _bbs)); + } else { + assert(_bbs[n->_idx] == _bbs[n->in(0)->_idx], "Pinned Node should be at the same block as its control edge"); } if (nstack.is_empty()) { diff --git a/hotspot/src/share/vm/opto/macro.cpp b/hotspot/src/share/vm/opto/macro.cpp index 857568b6d05..aa8bc492116 100644 --- a/hotspot/src/share/vm/opto/macro.cpp +++ b/hotspot/src/share/vm/opto/macro.cpp @@ -64,6 +64,7 @@ void PhaseMacroExpand::copy_call_debug_info(CallNode *oldcall, CallNode * newcal uint old_unique = C->unique(); Node* new_in = old_sosn->clone(jvms_adj, sosn_map); if (old_unique != C->unique()) { + new_in->set_req(0, newcall->in(0)); // reset control edge new_in = transform_later(new_in); // Register new node. } old_in = new_in; From 114da9bcfc6b22248fd697c33c6a9474c3f1597d Mon Sep 17 00:00:00 2001 From: Tom Rodriguez Date: Thu, 26 Feb 2009 16:57:21 -0800 Subject: [PATCH 064/292] 6810855: KILL vs. TEMP ordering restrictions are too strong Reviewed-by: kvn --- hotspot/src/share/vm/adlc/formssel.cpp | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/hotspot/src/share/vm/adlc/formssel.cpp b/hotspot/src/share/vm/adlc/formssel.cpp index 12477be68ac..d26a94c3bc7 100644 --- a/hotspot/src/share/vm/adlc/formssel.cpp +++ b/hotspot/src/share/vm/adlc/formssel.cpp @@ -858,19 +858,7 @@ void InstructForm::build_components() { OperandForm* kill = (OperandForm*)_localNames[kill_name]; globalAD->syntax_err(_linenum, "%s: %s %s must be at the end of the argument list\n", _ident, kill->_ident, kill_name); - } else if (e->isa(Component::KILL)) { - kill_name = name; - } - - // TEMPs are real uses and need to be among the first parameters - // listed, otherwise the numbering of operands and inputs gets - // screwy, so enforce this restriction during parse. - if (kill_name != NULL && - e->isa(Component::TEMP) && !e->isa(Component::DEF)) { - OperandForm* kill = (OperandForm*)_localNames[kill_name]; - globalAD->syntax_err(_linenum, "%s: %s %s must follow %s %s in the argument list\n", - _ident, kill->_ident, kill_name, opForm->_ident, name); - } else if (e->isa(Component::KILL)) { + } else if (e->isa(Component::KILL) && !e->isa(Component::USE)) { kill_name = name; } } From c50a9c66cc420550000af4562abf5de34935504b Mon Sep 17 00:00:00 2001 From: Jonathan Gibbons Date: Thu, 26 Feb 2009 18:28:21 -0800 Subject: [PATCH 065/292] 6809563: corba build in JDK uses invalid bootclasspath for javah Reviewed-by: ohair --- corba/make/common/shared/Defs-java.gmk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/corba/make/common/shared/Defs-java.gmk b/corba/make/common/shared/Defs-java.gmk index f811bee0859..d36ef8022d2 100644 --- a/corba/make/common/shared/Defs-java.gmk +++ b/corba/make/common/shared/Defs-java.gmk @@ -117,7 +117,7 @@ JAVACFLAGS += -classpath $(BOOTDIR)/lib/tools.jar JAVACFLAGS += $(OTHER_JAVACFLAGS) # Needed for javah -JAVAHFLAGS += -bootclasspath $(CLASSBINDIR) +JAVAHFLAGS += -classpath $(CLASSBINDIR) # Langtools ifdef LANGTOOLS_DIST From 8ecfee604a4b9f03ecd7cbdca3c9d23d92fdef9c Mon Sep 17 00:00:00 2001 From: Jonathan Gibbons Date: Thu, 26 Feb 2009 18:32:46 -0800 Subject: [PATCH 066/292] 6810915: Sun proprietary warnings in JDK build Reviewed-by: ohair --- corba/make/Makefile | 2 -- corba/make/common/shared/Defs-java.gmk | 3 +++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/corba/make/Makefile b/corba/make/Makefile index 0b5c31d7001..5eebabb2cd5 100644 --- a/corba/make/Makefile +++ b/corba/make/Makefile @@ -112,8 +112,6 @@ ifndef TARGET_JAVA TARGET_JAVA = java endif -NO_PROPRIETARY_API_WARNINGS = -XDignore.symbol.file=true - SELF = $(lastword $(MAKEFILE_LIST)) # for jdk, we generate the following: diff --git a/corba/make/common/shared/Defs-java.gmk b/corba/make/common/shared/Defs-java.gmk index d36ef8022d2..f80f0ffa4e1 100644 --- a/corba/make/common/shared/Defs-java.gmk +++ b/corba/make/common/shared/Defs-java.gmk @@ -104,6 +104,9 @@ ifeq ($(COMPILER_WARNINGS_FATAL), true) JAVACFLAGS += -Werror endif +NO_PROPRIETARY_API_WARNINGS = -XDignore.symbol.file=true +JAVACFLAGS += $(NO_PROPRIETARY_API_WARNINGS) + # Add the source level (currently all source is 1.5, should this be 1.6?) LANGUAGE_VERSION = -source 1.5 JAVACFLAGS += $(LANGUAGE_VERSION) From d6cdfde9d9a5cf3a5c0ec1cf4730a8161a1cc751 Mon Sep 17 00:00:00 2001 From: Lillian Angel Date: Fri, 27 Feb 2009 03:35:40 -0800 Subject: [PATCH 067/292] 6778669: Patch from Red Hat -- fixes compilation errors Some fixes which are required to build on recent GCCs. Reviewed-by: never, kvn --- hotspot/make/linux/makefiles/adlc.make | 6 +- hotspot/make/solaris/makefiles/adlc.make | 4 +- hotspot/src/share/vm/adlc/adlc.hpp | 1 + hotspot/src/share/vm/adlc/adlparse.cpp | 56 ++++++++------- hotspot/src/share/vm/adlc/archDesc.cpp | 16 +++-- hotspot/src/share/vm/adlc/dfa.cpp | 6 +- hotspot/src/share/vm/adlc/filebuff.cpp | 6 +- hotspot/src/share/vm/adlc/filebuff.hpp | 7 +- hotspot/src/share/vm/adlc/forms.cpp | 4 +- hotspot/src/share/vm/adlc/forms.hpp | 4 +- hotspot/src/share/vm/adlc/formsopt.cpp | 44 ++++++------ hotspot/src/share/vm/adlc/formsopt.hpp | 24 +++---- hotspot/src/share/vm/adlc/formssel.cpp | 52 +++++++------- hotspot/src/share/vm/adlc/formssel.hpp | 26 +++---- hotspot/src/share/vm/adlc/main.cpp | 9 +-- hotspot/src/share/vm/adlc/output_c.cpp | 83 +++++++++++----------- hotspot/src/share/vm/adlc/output_h.cpp | 4 +- hotspot/src/share/vm/includeDB_core | 1 + hotspot/src/share/vm/utilities/vmError.cpp | 6 +- hotspot/src/share/vm/utilities/vmError.hpp | 4 +- 20 files changed, 188 insertions(+), 175 deletions(-) diff --git a/hotspot/make/linux/makefiles/adlc.make b/hotspot/make/linux/makefiles/adlc.make index 5e48fed1567..927462967f7 100644 --- a/hotspot/make/linux/makefiles/adlc.make +++ b/hotspot/make/linux/makefiles/adlc.make @@ -1,5 +1,5 @@ # -# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1999-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 @@ -61,8 +61,8 @@ CPPFLAGS = $(SYSDEFS) $(INCLUDES) CPPFLAGS += -DASSERT # CFLAGS_WARN holds compiler options to suppress/enable warnings. -# Suppress warnings (for now) -CFLAGS_WARN = -w +# Compiler warnings are treated as errors +CFLAGS_WARN = -Werror CFLAGS += $(CFLAGS_WARN) OBJECTNAMES = \ diff --git a/hotspot/make/solaris/makefiles/adlc.make b/hotspot/make/solaris/makefiles/adlc.make index 2d1a87a20b4..b13e1fa528f 100644 --- a/hotspot/make/solaris/makefiles/adlc.make +++ b/hotspot/make/solaris/makefiles/adlc.make @@ -1,5 +1,5 @@ # -# Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1997-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 @@ -67,6 +67,8 @@ ifndef USE_GCC endif # CFLAGS_WARN holds compiler options to suppress/enable warnings. +# Compiler warnings are treated as errors +CFLAGS_WARN = +w -errwarn CFLAGS += $(CFLAGS_WARN) ifeq ("${Platform_compiler}", "sparcWorks") diff --git a/hotspot/src/share/vm/adlc/adlc.hpp b/hotspot/src/share/vm/adlc/adlc.hpp index 14bc5d6b738..3d59b539b3e 100644 --- a/hotspot/src/share/vm/adlc/adlc.hpp +++ b/hotspot/src/share/vm/adlc/adlc.hpp @@ -79,6 +79,7 @@ typedef unsigned int uintptr_t; // Macros // Debugging note: Put a breakpoint on "abort". +#undef assert #define assert(cond, msg) { if (!(cond)) { fprintf(stderr, "assert fails %s %d: %s\n", __FILE__, __LINE__, msg); abort(); }} #define max(a, b) (((a)>(b)) ? (a) : (b)) diff --git a/hotspot/src/share/vm/adlc/adlparse.cpp b/hotspot/src/share/vm/adlc/adlparse.cpp index 81a95e861ab..f212d3f5756 100644 --- a/hotspot/src/share/vm/adlc/adlparse.cpp +++ b/hotspot/src/share/vm/adlc/adlparse.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -298,7 +298,7 @@ void ADLParser::matchrule_clone_and_swap(MatchRule* rule, const char* instr_iden rule->count_commutative_op(count); if (count > 0) { // Clone match rule and swap commutative operation's operands. - rule->swap_commutative_op(instr_ident, count, match_rules_cnt); + rule->matchrule_swap_commutative_op(instr_ident, count, match_rules_cnt); } } @@ -2586,7 +2586,7 @@ void ADLParser::peep_constraint_parse(Peephole &peep) { while( _curchar != ')' ) { // Get information on the left instruction and its operand // left-instructions's number - intptr_t left_inst = get_int(); + int left_inst = get_int(); // Left-instruction's operand skipws(); if( _curchar != '.' ) { @@ -2602,7 +2602,7 @@ void ADLParser::peep_constraint_parse(Peephole &peep) { skipws(); // Get information on the right instruction and its operand - intptr_t right_inst; // Right-instructions's number + int right_inst; // Right-instructions's number if( isdigit(_curchar) ) { right_inst = get_int(); // Right-instruction's operand @@ -3497,22 +3497,24 @@ FormatRule* ADLParser::template_parse(void) { // (1) // Check if there is a string to pass through to output - char *start = _ptr; // Record start of the next string - while ((_curchar != '$') && ((_curchar != '%') || (*(_ptr+1) != '}')) ) { - // If at the start of a comment, skip past it - if( (_curchar == '/') && ((*(_ptr+1) == '/') || (*(_ptr+1) == '*')) ) { - skipws_no_preproc(); - } else { - // ELSE advance to the next character, or start of the next line - next_char_or_line(); + { + char *start = _ptr; // Record start of the next string + while ((_curchar != '$') && ((_curchar != '%') || (*(_ptr+1) != '}')) ) { + // If at the start of a comment, skip past it + if( (_curchar == '/') && ((*(_ptr+1) == '/') || (*(_ptr+1) == '*')) ) { + skipws_no_preproc(); + } else { + // ELSE advance to the next character, or start of the next line + next_char_or_line(); + } + } + // If a string was found, terminate it and record in EncClass + if ( start != _ptr ) { + *_ptr = '\0'; // Terminate the string + // Add flag to _strings list indicating we should check _rep_vars + format->_strings.addName(NameList::_signal2); + format->_strings.addName(start); } - } - // If a string was found, terminate it and record in EncClass - if ( start != _ptr ) { - *_ptr = '\0'; // Terminate the string - // Add flag to _strings list indicating we should check _rep_vars - format->_strings.addName(NameList::_signal2); - format->_strings.addName(start); } // (2) @@ -3563,10 +3565,10 @@ FormatRule* ADLParser::template_parse(void) { // copy it and record in FormatRule if ( _curchar == '$' ) { next_char(); // Move past the '$' - char* rep_var = get_ident(); // Nil terminate the variable name - rep_var = strdup(rep_var);// Copy the string + char* next_rep_var = get_ident(); // Nil terminate the variable name + next_rep_var = strdup(next_rep_var);// Copy the string *_ptr = _curchar; // and replace Nil with original character - format->_rep_vars.addName(rep_var); + format->_rep_vars.addName(next_rep_var); // Add flag to _strings list indicating we should check _rep_vars format->_strings.addName(NameList::_signal); } @@ -3714,13 +3716,13 @@ ExpandRule* ADLParser::expand_parse(InstructForm *instr) { parse_err(SYNERR, "identifier expected at %c\n", _curchar); continue; } // Check that you have a valid operand - const Form *form = instr->_localNames[ident2]; - if (!form) { + const Form *form2 = instr->_localNames[ident2]; + if (!form2) { parse_err(SYNERR, "operand name expected at %s\n", ident2); continue; } - oper = form->is_operand(); - if (oper == NULL && !form->is_opclass()) { + oper = form2->is_operand(); + if (oper == NULL && !form2->is_opclass()) { parse_err(SYNERR, "operand name expected at %s\n", ident2); continue; } // Add operand to list @@ -4271,7 +4273,7 @@ int ADLParser::get_int(void) { int result; // Storage for integer result if( _curline == NULL ) // Return NULL at EOF. - return NULL; + return 0; skipws(); // Skip whitespace before identifier start = end = _ptr; // Start points at first character diff --git a/hotspot/src/share/vm/adlc/archDesc.cpp b/hotspot/src/share/vm/adlc/archDesc.cpp index a73ad76da23..408f0323cd1 100644 --- a/hotspot/src/share/vm/adlc/archDesc.cpp +++ b/hotspot/src/share/vm/adlc/archDesc.cpp @@ -1,5 +1,5 @@ // -// Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. +// Copyright 1997-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 @@ -436,10 +436,12 @@ void ArchDesc::build_chain_rule(OperandForm *oper) { if ((oper->_matrule) && (oper->_matrule->_lChild == NULL) && (oper->_matrule->_rChild == NULL)) { - const Form *form = _globalNames[oper->_matrule->_opType]; - if ((form) && form->is_operand() && - (form->ideal_only() == false)) { - add_chain_rule_entry(oper->_matrule->_opType, oper->cost(), oper->_ident); + { + const Form *form = _globalNames[oper->_matrule->_opType]; + if ((form) && form->is_operand() && + (form->ideal_only() == false)) { + add_chain_rule_entry(oper->_matrule->_opType, oper->cost(), oper->_ident); + } } // Check for additional chain rules if (oper->_matrule->_next) { @@ -1015,12 +1017,12 @@ void ArchDesc::initBaseOpTypes() { int idealIndex = 0; for (idealIndex = 1; idealIndex < _last_machine_leaf; ++idealIndex) { const char *idealName = NodeClassNames[idealIndex]; - _idealIndex.Insert((void*)idealName, (void*)idealIndex); + _idealIndex.Insert((void*) idealName, (void*) (intptr_t) idealIndex); } for ( idealIndex = _last_machine_leaf+1; idealIndex < _last_opcode; ++idealIndex) { const char *idealName = NodeClassNames[idealIndex]; - _idealIndex.Insert((void*)idealName, (void*)idealIndex); + _idealIndex.Insert((void*) idealName, (void*) (intptr_t) idealIndex); } } diff --git a/hotspot/src/share/vm/adlc/dfa.cpp b/hotspot/src/share/vm/adlc/dfa.cpp index 1075c9da774..20834184732 100644 --- a/hotspot/src/share/vm/adlc/dfa.cpp +++ b/hotspot/src/share/vm/adlc/dfa.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -870,7 +870,7 @@ void ExprDict::print_asserts(FILE *fp) { } // Print out the dictionary contents as key-value pairs -static void dumpekey(const void* key) { fprintf(stdout, "%s", key); } +static void dumpekey(const void* key) { fprintf(stdout, "%s", (char*) key); } static void dumpexpr(const void* expr) { fflush(stdout); ((Expr*)expr)->print(); } void ExprDict::dump() { @@ -1020,7 +1020,7 @@ void ProductionState::set_cost_bounds(const char *result, const Expr *cost, bool } // Print out the dictionary contents as key-value pairs -static void print_key (const void* key) { fprintf(stdout, "%s", key); } +static void print_key (const void* key) { fprintf(stdout, "%s", (char*) key); } static void print_production(const void* production) { fflush(stdout); ((Production*)production)->print(); } void ProductionState::print() { diff --git a/hotspot/src/share/vm/adlc/filebuff.cpp b/hotspot/src/share/vm/adlc/filebuff.cpp index 9cccb5d069e..36e611e15b6 100644 --- a/hotspot/src/share/vm/adlc/filebuff.cpp +++ b/hotspot/src/share/vm/adlc/filebuff.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -25,6 +25,8 @@ // FILEBUFF.CPP - Routines for handling a parser file buffer #include "adlc.hpp" +using namespace std; + //------------------------------FileBuff--------------------------------------- // Create a new parsing buffer FileBuff::FileBuff( BufferedFile *fptr, ArchDesc& archDesc) : _fp(fptr), _AD(archDesc) { @@ -217,7 +219,7 @@ static int printline( ostream& os, const char *fname, int line, off = expandtab(os,off,*s++,'-','-'); if( i == len ) os << '^'; // Mark end of region os << '\n'; // End of marked line - return 0L; // All done + return 0; // All done } //------------------------------print------------------------------------------ diff --git a/hotspot/src/share/vm/adlc/filebuff.hpp b/hotspot/src/share/vm/adlc/filebuff.hpp index 8f12f9262d9..e5e8cccbea0 100644 --- a/hotspot/src/share/vm/adlc/filebuff.hpp +++ b/hotspot/src/share/vm/adlc/filebuff.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -26,6 +26,7 @@ #include using namespace std; + // STRUCTURE FOR HANDLING INPUT AND OUTPUT FILES typedef struct { const char *_name; @@ -72,7 +73,7 @@ class FileBuff { // This converts a pointer into the buffer to a file offset. It only works // when the pointer is valid (i.e. just obtained from getline()). - int getoff(const char *s) { return _bufoff+(int)(s-_buf); } + long getoff(const char* s) { return _bufoff + (s - _buf); } }; //------------------------------FileBuffRegion--------------------------------- @@ -95,8 +96,6 @@ class FileBuffRegion { FileBuffRegion *copy(); // Deep copy FileBuffRegion *merge(FileBuffRegion*); // Merge 2 regions; delete input -// void print(std::ostream&); -// friend std::ostream& operator<< (std::ostream&, FileBuffRegion&); void print(ostream&); friend ostream& operator<< (ostream&, FileBuffRegion&); }; diff --git a/hotspot/src/share/vm/adlc/forms.cpp b/hotspot/src/share/vm/adlc/forms.cpp index cfcfd0a36d8..17bbe7f9657 100644 --- a/hotspot/src/share/vm/adlc/forms.cpp +++ b/hotspot/src/share/vm/adlc/forms.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -370,7 +370,7 @@ bool FormDict::operator ==(const FormDict &d) const { } // Print out the dictionary contents as key-value pairs -static void dumpkey (const void* key) { fprintf(stdout, "%s", key); } +static void dumpkey (const void* key) { fprintf(stdout, "%s", (char*) key); } static void dumpform(const void* form) { fflush(stdout); ((Form*)form)->dump(); } void FormDict::dump() { diff --git a/hotspot/src/share/vm/adlc/forms.hpp b/hotspot/src/share/vm/adlc/forms.hpp index bf930b8e6da..8a0011b711c 100644 --- a/hotspot/src/share/vm/adlc/forms.hpp +++ b/hotspot/src/share/vm/adlc/forms.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -124,7 +124,7 @@ protected: public: // Public Data Form *_next; // Next pointer for form lists - long _linenum; // Line number for debugging + int _linenum; // Line number for debugging // Dynamic type check for common forms. virtual OpClassForm *is_opclass() const; diff --git a/hotspot/src/share/vm/adlc/formsopt.cpp b/hotspot/src/share/vm/adlc/formsopt.cpp index df1f912e9a6..3b601897690 100644 --- a/hotspot/src/share/vm/adlc/formsopt.cpp +++ b/hotspot/src/share/vm/adlc/formsopt.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-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 @@ -273,13 +273,13 @@ int RegClass::regs_in_word( int wordnum, bool stack_also ) { for(_regDefs.reset(); (name = _regDefs.iter()) != NULL;) { int rnum = ((RegDef*)_regDef[name])->register_num(); if( (rnum >> 5) == wordnum ) - word |= (1L<<(rnum&31)); + word |= (1 << (rnum & 31)); } if( stack_also ) { // Now also collect stack bits for( int i = 0; i < 32; i++ ) if( wordnum*32+i >= RegisterForm::_reg_ctr ) - word |= (1L< _max_position ) _max_position = position; - _parent.addName((char *)parent); - _position.addName((char *)position); + _parent.addName((char*) (intptr_t) parent); + _position.addName((char*) (intptr_t) position); _instrs.addName(name); - _input.addName((char *)input); + _input.addName((char*) (intptr_t) input); } // Access info about instructions in the peep-match rule @@ -603,7 +603,7 @@ int PeepMatch::max_position() { return _max_position; } -const char *PeepMatch::instruction_name(intptr_t position) { +const char *PeepMatch::instruction_name(int position) { return _instrs.name(position); } @@ -615,11 +615,11 @@ void PeepMatch::reset() { _input.reset(); } -void PeepMatch::next_instruction( intptr_t &parent, intptr_t &position, const char * &name, intptr_t &input ){ - parent = (intptr_t)_parent.iter(); - position = (intptr_t)_position.iter(); +void PeepMatch::next_instruction(int &parent, int &position, const char* &name, int &input) { + parent = (int) (intptr_t) _parent.iter(); + position = (int) (intptr_t) _position.iter(); name = _instrs.iter(); - input = (intptr_t)_input.iter(); + input = (int) (intptr_t) _input.iter(); } // 'true' if current position in iteration is a placeholder, not matched. @@ -637,15 +637,15 @@ void PeepMatch::output(FILE *fp) { // Write info to output files } //------------------------------PeepConstraint--------------------------------- -PeepConstraint::PeepConstraint(intptr_t left_inst, char *left_op, char *relation, - intptr_t right_inst, char *right_op) +PeepConstraint::PeepConstraint(int left_inst, char* left_op, char* relation, + int right_inst, char* right_op) : _left_inst(left_inst), _left_op(left_op), _relation(relation), _right_inst(right_inst), _right_op(right_op), _next(NULL) {} PeepConstraint::~PeepConstraint() { } // Check if constraints use instruction at position -bool PeepConstraint::constrains_instruction(intptr_t position) { +bool PeepConstraint::constrains_instruction(int position) { // Check local instruction constraints if( _left_inst == position ) return true; if( _right_inst == position ) return true; @@ -692,7 +692,7 @@ void PeepReplace::add_instruction(char *root) { } void PeepReplace::add_operand( int inst_num, char *inst_operand ) { _instruction.add_signal(); - _operand_inst_num.addName((char*)inst_num); + _operand_inst_num.addName((char*) (intptr_t) inst_num); _operand_op_name.addName(inst_operand); } @@ -702,15 +702,15 @@ void PeepReplace::reset() { _operand_inst_num.reset(); _operand_op_name.reset(); } -void PeepReplace::next_instruction(const char * &inst){ +void PeepReplace::next_instruction(const char* &inst){ inst = _instruction.iter(); - intptr_t inst_num = (intptr_t)_operand_inst_num.iter(); - const char *inst_operand = _operand_op_name.iter(); + int inst_num = (int) (intptr_t) _operand_inst_num.iter(); + const char* inst_operand = _operand_op_name.iter(); } -void PeepReplace::next_operand( intptr_t &inst_num, const char * &inst_operand ) { - const char *inst = _instruction.iter(); - inst_num = (intptr_t)_operand_inst_num.iter(); - inst_operand = _operand_op_name.iter(); +void PeepReplace::next_operand(int &inst_num, const char* &inst_operand) { + const char* inst = _instruction.iter(); + inst_num = (int) (intptr_t) _operand_inst_num.iter(); + inst_operand = _operand_op_name.iter(); } diff --git a/hotspot/src/share/vm/adlc/formsopt.hpp b/hotspot/src/share/vm/adlc/formsopt.hpp index 627dc4de035..bb4ba107212 100644 --- a/hotspot/src/share/vm/adlc/formsopt.hpp +++ b/hotspot/src/share/vm/adlc/formsopt.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-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 @@ -457,10 +457,10 @@ public: // Access info about instructions in the peep-match rule int max_position(); - const char *instruction_name(intptr_t position); + const char *instruction_name(int position); // Iterate through all info on matched instructions void reset(); - void next_instruction( intptr_t &parent, intptr_t &position, const char * &name, intptr_t &input ); + void next_instruction(int &parent, int &position, const char* &name, int &input); // 'true' if current position in iteration is a placeholder, not matched. bool is_placeholder(); @@ -474,20 +474,20 @@ private: PeepConstraint *_next; // Additional constraints ANDed together public: - const intptr_t _left_inst; - const char *_left_op; - const char *_relation; - const intptr_t _right_inst; - const char *_right_op; + const int _left_inst; + const char* _left_op; + const char* _relation; + const int _right_inst; + const char* _right_op; public: // Public Methods - PeepConstraint(intptr_t left_inst, char *left_op, char *relation, - intptr_t right_inst, char *right_op); + PeepConstraint(int left_inst, char* left_op, char* relation, + int right_inst, char* right_op); ~PeepConstraint(); // Check if constraints use instruction at position - bool constrains_instruction(intptr_t position); + bool constrains_instruction(int position); // Add another constraint void append(PeepConstraint *next_peep_constraint); @@ -519,7 +519,7 @@ public: // Access contents of peepreplace void reset(); void next_instruction(const char * &root); - void next_operand( intptr_t &inst_num, const char * &inst_operand ); + void next_operand(int &inst_num, const char * &inst_operand ); // Utilities void dump(); diff --git a/hotspot/src/share/vm/adlc/formssel.cpp b/hotspot/src/share/vm/adlc/formssel.cpp index d26a94c3bc7..cf48d265084 100644 --- a/hotspot/src/share/vm/adlc/formssel.cpp +++ b/hotspot/src/share/vm/adlc/formssel.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-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 @@ -844,8 +844,12 @@ void InstructForm::build_components() { for (_parameters.reset(); (name = _parameters.iter()) != NULL;) { OperandForm *opForm = (OperandForm*)_localNames[name]; - const Form *form = _effects[name]; - Effect *e = form ? form->is_effect() : NULL; + Effect* e = NULL; + { + const Form* form = _effects[name]; + e = form ? form->is_effect() : NULL; + } + if (e != NULL) { has_temp |= e->is(Component::TEMP); @@ -1110,7 +1114,7 @@ bool InstructForm::cisc_spills_to(ArchDesc &AD, InstructForm *instr) { const char *op_name = NULL; const char *reg_type = NULL; FormDict &globals = AD.globalNames(); - cisc_spill_operand = _matrule->cisc_spill_match(globals, AD.get_registers(), instr->_matrule, op_name, reg_type); + cisc_spill_operand = _matrule->matchrule_cisc_spill_match(globals, AD.get_registers(), instr->_matrule, op_name, reg_type); if( (cisc_spill_operand != Not_cisc_spillable) && (op_name != NULL) && equivalent_predicates(this, instr) ) { cisc_spill_operand = operand_position(op_name, Component::USE); int def_oper = operand_position(op_name, Component::DEF); @@ -2194,7 +2198,7 @@ int OperandForm::operand_position(const char *name, int usedef) { // Return -1 if not in list. int OperandForm::constant_position(FormDict &globals, const Component *last) { // Iterate through components and count constants preceeding 'constant' - uint position = 0; + int position = 0; Component *comp; _components.reset(); while( (comp = _components.iter()) != NULL && (comp != last) ) { @@ -2297,7 +2301,7 @@ void OperandForm::disp_is_oop(FILE *fp, FormDict &globals) { if ( op->is_base_constant(globals) == Form::idealP ) { // Find the constant's index: _c0, _c1, _c2, ... , _cN uint idx = op->constant_position( globals, rep_var); - fprintf(fp," virtual bool disp_is_oop() const {", _ident); + fprintf(fp," virtual bool disp_is_oop() const {"); fprintf(fp, " return _c%d->isa_oop_ptr();", idx); fprintf(fp, " }\n"); } @@ -3035,9 +3039,9 @@ bool MatchNode::find_type(const char *type, int &position) const { // Recursive call collecting info on top-level operands, not transitive. // Implementation does not modify state of internal structures. -void MatchNode::append_components(FormDict &locals, ComponentList &components, - bool deflag) const { - int usedef = deflag ? Component::DEF : Component::USE; +void MatchNode::append_components(FormDict& locals, ComponentList& components, + bool def_flag) const { + int usedef = def_flag ? Component::DEF : Component::USE; FormDict &globals = _AD.globalNames(); assert (_name != NULL, "MatchNode::build_components encountered empty node\n"); @@ -3055,10 +3059,10 @@ void MatchNode::append_components(FormDict &locals, ComponentList &components, return; } // Promote results of "Set" to DEF - bool def_flag = (!strcmp(_opType, "Set")) ? true : false; - if (_lChild) _lChild->append_components(locals, components, def_flag); - def_flag = false; // only applies to component immediately following 'Set' - if (_rChild) _rChild->append_components(locals, components, def_flag); + bool tmpdef_flag = (!strcmp(_opType, "Set")) ? true : false; + if (_lChild) _lChild->append_components(locals, components, tmpdef_flag); + tmpdef_flag = false; // only applies to component immediately following 'Set' + if (_rChild) _rChild->append_components(locals, components, tmpdef_flag); } // Find the n'th base-operand in the match node, @@ -3404,9 +3408,9 @@ bool static root_ops_match(FormDict &globals, const char *op1, const char *op2) return (form1 == form2); } -//-------------------------cisc_spill_match------------------------------------ +//-------------------------cisc_spill_match_node------------------------------- // Recursively check two MatchRules for legal conversion via cisc-spilling -int MatchNode::cisc_spill_match(FormDict &globals, RegisterForm *registers, MatchNode *mRule2, const char * &operand, const char * ®_type) { +int MatchNode::cisc_spill_match(FormDict& globals, RegisterForm* registers, MatchNode* mRule2, const char* &operand, const char* ®_type) { int cisc_spillable = Maybe_cisc_spillable; int left_spillable = Maybe_cisc_spillable; int right_spillable = Maybe_cisc_spillable; @@ -3480,13 +3484,13 @@ int MatchNode::cisc_spill_match(FormDict &globals, RegisterForm *registers, Mat return cisc_spillable; } -//---------------------------cisc_spill_match---------------------------------- +//---------------------------cisc_spill_match_rule------------------------------ // Recursively check two MatchRules for legal conversion via cisc-spilling // This method handles the root of Match tree, // general recursive checks done in MatchNode -int MatchRule::cisc_spill_match(FormDict &globals, RegisterForm *registers, - MatchRule *mRule2, const char * &operand, - const char * ®_type) { +int MatchRule::matchrule_cisc_spill_match(FormDict& globals, RegisterForm* registers, + MatchRule* mRule2, const char* &operand, + const char* ®_type) { int cisc_spillable = Maybe_cisc_spillable; int left_spillable = Maybe_cisc_spillable; int right_spillable = Maybe_cisc_spillable; @@ -3524,7 +3528,7 @@ int MatchRule::cisc_spill_match(FormDict &globals, RegisterForm *registers, //----------------------------- equivalent ------------------------------------ // Recursively check to see if two match rules are equivalent. // This rule handles the root. -bool MatchRule::equivalent(FormDict &globals, MatchRule *mRule2) { +bool MatchRule::equivalent(FormDict &globals, MatchNode *mRule2) { // Check that each sets a result if (sets_result() != mRule2->sets_result()) { return false; @@ -3640,7 +3644,7 @@ void MatchNode::swap_commutative_op(bool atroot, int id) { //-------------------------- swap_commutative_op ------------------------------ // Recursively swap specified commutative operation with subtree operands. -void MatchRule::swap_commutative_op(const char* instr_ident, int count, int& match_rules_cnt) { +void MatchRule::matchrule_swap_commutative_op(const char* instr_ident, int count, int& match_rules_cnt) { assert(match_rules_cnt < 100," too many match rule clones"); // Clone MatchRule* clone = new MatchRule(_AD, this); @@ -3653,8 +3657,8 @@ void MatchRule::swap_commutative_op(const char* instr_ident, int count, int& mat clone->_next = this->_next; this-> _next = clone; if( (--count) > 0 ) { - this-> swap_commutative_op(instr_ident, count, match_rules_cnt); - clone->swap_commutative_op(instr_ident, count, match_rules_cnt); + this-> matchrule_swap_commutative_op(instr_ident, count, match_rules_cnt); + clone->matchrule_swap_commutative_op(instr_ident, count, match_rules_cnt); } } @@ -3686,7 +3690,7 @@ MatchRule::~MatchRule() { // Recursive call collecting info on top-level operands, not transitive. // Implementation does not modify state of internal structures. -void MatchRule::append_components(FormDict &locals, ComponentList &components) const { +void MatchRule::append_components(FormDict& locals, ComponentList& components, bool def_flag) const { assert (_name != NULL, "MatchNode::build_components encountered empty node\n"); MatchNode::append_components(locals, components, diff --git a/hotspot/src/share/vm/adlc/formssel.hpp b/hotspot/src/share/vm/adlc/formssel.hpp index e1aa84d91ca..84c49be69eb 100644 --- a/hotspot/src/share/vm/adlc/formssel.hpp +++ b/hotspot/src/share/vm/adlc/formssel.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-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 @@ -920,8 +920,8 @@ public: // return 1 if found and position is incremented by operand offset in rule bool find_name(const char *str, int &position) const; bool find_type(const char *str, int &position) const; - void append_components(FormDict &locals, ComponentList &components, - bool def_flag) const; + virtual void append_components(FormDict& locals, ComponentList& components, + bool def_flag = false) const; bool base_operand(uint &position, FormDict &globals, const char * &result, const char * &name, const char * &opType) const; @@ -947,12 +947,12 @@ public: const char *reduce_left (FormDict &globals) const; // Recursive version of check in MatchRule - int cisc_spill_match(FormDict &globals, RegisterForm *registers, - MatchNode *mRule2, const char * &operand, - const char * ®_type); + int cisc_spill_match(FormDict& globals, RegisterForm* registers, + MatchNode* mRule2, const char* &operand, + const char* ®_type); int cisc_spill_merge(int left_result, int right_result); - bool equivalent(FormDict &globals, MatchNode *mNode2); + virtual bool equivalent(FormDict& globals, MatchNode* mNode2); void count_commutative_op(int& count); void swap_commutative_op(bool atroot, int count); @@ -979,7 +979,7 @@ public: MatchRule(ArchDesc &ad, MatchNode* mroot, int depth, char* construct, int numleaves); ~MatchRule(); - void append_components(FormDict &locals, ComponentList &components) const; + virtual void append_components(FormDict& locals, ComponentList& components, bool def_flag = false) const; // Recursive call on all operands' match rules in my match rule. bool base_operand(uint &position, FormDict &globals, const char * &result, const char * &name, @@ -1006,14 +1006,14 @@ public: Form::DataType is_ideal_store() const;// node matches ideal 'StoreXNode' // Check if 'mRule2' is a cisc-spill variant of this MatchRule - int cisc_spill_match(FormDict &globals, RegisterForm *registers, - MatchRule *mRule2, const char * &operand, - const char * ®_type); + int matchrule_cisc_spill_match(FormDict &globals, RegisterForm* registers, + MatchRule* mRule2, const char* &operand, + const char* ®_type); // Check if 'mRule2' is equivalent to this MatchRule - bool equivalent(FormDict &globals, MatchRule *mRule2); + virtual bool equivalent(FormDict& globals, MatchNode* mRule2); - void swap_commutative_op(const char* instr_ident, int count, int& match_rules_cnt); + void matchrule_swap_commutative_op(const char* instr_ident, int count, int& match_rules_cnt); void dump(); void output(FILE *fp); diff --git a/hotspot/src/share/vm/adlc/main.cpp b/hotspot/src/share/vm/adlc/main.cpp index c5b405d0208..7fb780935a3 100644 --- a/hotspot/src/share/vm/adlc/main.cpp +++ b/hotspot/src/share/vm/adlc/main.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -349,7 +349,7 @@ void ArchDesc::close_files(int delete_out) } else { if (_ADL_file._name) printf("%s --> ", _ADL_file._name); - printf("%s, %s, %s, %s, %s, %s, %s, %s, %s", + printf("%s, %s, %s, %s, %s, %s, %s, %s, %s, %s", _CPP_file._name, _CPP_CLONE_file._name, _CPP_EXPAND_file._name, @@ -358,7 +358,8 @@ void ArchDesc::close_files(int delete_out) _CPP_MISC_file._name, _CPP_PEEPHOLE_file._name, _CPP_PIPELINE_file._name, - _HPP_file._name, _DFA_file._name); + _HPP_file._name, + _DFA_file._name); } printf("\n"); } @@ -431,7 +432,7 @@ int get_legal_text(FileBuff &fbuf, char **legal_text) legal_end = fbuf.get_line(); } *legal_text = legal_start; - return (legal_end - legal_start); + return (int) (legal_end - legal_start); } // VS2005 has its own definition, identical to this one. diff --git a/hotspot/src/share/vm/adlc/output_c.cpp b/hotspot/src/share/vm/adlc/output_c.cpp index dbc287b1d1a..f1d010979f6 100644 --- a/hotspot/src/share/vm/adlc/output_c.cpp +++ b/hotspot/src/share/vm/adlc/output_c.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-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 @@ -225,11 +225,11 @@ static int pipeline_reads_initializer(FILE *fp_cpp, NameList &pipeline_reads, Pi pipeclass->_parameters.reset(); while ( (paramname = pipeclass->_parameters.iter()) != NULL ) { - const PipeClassOperandForm *pipeopnd = + const PipeClassOperandForm *tmppipeopnd = (const PipeClassOperandForm *)pipeclass->_localUsage[paramname]; - if (pipeopnd) - templen += 10 + (int)strlen(pipeopnd->_stage); + if (tmppipeopnd) + templen += 10 + (int)strlen(tmppipeopnd->_stage); else templen += 19; @@ -253,10 +253,10 @@ static int pipeline_reads_initializer(FILE *fp_cpp, NameList &pipeline_reads, Pi pipeclass->_parameters.reset(); while ( (paramname = pipeclass->_parameters.iter()) != NULL ) { - const PipeClassOperandForm *pipeopnd = + const PipeClassOperandForm *tmppipeopnd = (const PipeClassOperandForm *)pipeclass->_localUsage[paramname]; templen += sprintf(&operand_stages[templen], " stage_%s%c\n", - pipeopnd ? pipeopnd->_stage : "undefined", + tmppipeopnd ? tmppipeopnd->_stage : "undefined", (++i < paramcount ? ',' : ' ') ); } @@ -1042,10 +1042,10 @@ static void defineOut_RegMask(FILE *fp, const char *node, const char *regMask) { // Scan the peepmatch and output a test for each instruction static void check_peepmatch_instruction_tree(FILE *fp, PeepMatch *pmatch, PeepConstraint *pconstraint) { - intptr_t parent = -1; - intptr_t inst_position = 0; - const char *inst_name = NULL; - intptr_t input = 0; + int parent = -1; + int inst_position = 0; + const char* inst_name = NULL; + int input = 0; fprintf(fp, " // Check instruction sub-tree\n"); pmatch->reset(); for( pmatch->next_instruction( parent, inst_position, inst_name, input ); @@ -1055,14 +1055,14 @@ static void check_peepmatch_instruction_tree(FILE *fp, PeepMatch *pmatch, PeepCo if( ! pmatch->is_placeholder() ) { // Define temporaries 'inst#', based on parent and parent's input index if( parent != -1 ) { // root was initialized - fprintf(fp, " inst%ld = inst%ld->in(%ld);\n", + fprintf(fp, " inst%d = inst%d->in(%d);\n", inst_position, parent, input); } // When not the root // Test we have the correct instruction by comparing the rule if( parent != -1 ) { - fprintf(fp, " matches = matches && ( inst%ld->rule() == %s_rule );", + fprintf(fp, " matches = matches && ( inst%d->rule() == %s_rule );", inst_position, inst_name); } } else { @@ -1073,20 +1073,20 @@ static void check_peepmatch_instruction_tree(FILE *fp, PeepMatch *pmatch, PeepCo } } -static void print_block_index(FILE *fp, intptr_t inst_position) { +static void print_block_index(FILE *fp, int inst_position) { assert( inst_position >= 0, "Instruction number less than zero"); fprintf(fp, "block_index"); if( inst_position != 0 ) { - fprintf(fp, " - %ld", inst_position); + fprintf(fp, " - %d", inst_position); } } // Scan the peepmatch and output a test for each instruction static void check_peepmatch_instruction_sequence(FILE *fp, PeepMatch *pmatch, PeepConstraint *pconstraint) { - intptr_t parent = -1; - intptr_t inst_position = 0; - const char *inst_name = NULL; - intptr_t input = 0; + int parent = -1; + int inst_position = 0; + const char* inst_name = NULL; + int input = 0; fprintf(fp, " // Check instruction sub-tree\n"); pmatch->reset(); for( pmatch->next_instruction( parent, inst_position, inst_name, input ); @@ -1101,14 +1101,14 @@ static void check_peepmatch_instruction_sequence(FILE *fp, PeepMatch *pmatch, Pe print_block_index(fp, inst_position); fprintf(fp, " > 0 ) {\n Node *n = block->_nodes.at("); print_block_index(fp, inst_position); - fprintf(fp, ");\n inst%ld = (n->is_Mach()) ? ", inst_position); + fprintf(fp, ");\n inst%d = (n->is_Mach()) ? ", inst_position); fprintf(fp, "n->as_Mach() : NULL;\n }\n"); } // When not the root // Test we have the correct instruction by comparing the rule. if( parent != -1 ) { - fprintf(fp, " matches = matches && (inst%ld != NULL) && (inst%ld->rule() == %s_rule);\n", + fprintf(fp, " matches = matches && (inst%d != NULL) && (inst%d->rule() == %s_rule);\n", inst_position, inst_position, inst_name); } } else { @@ -1121,10 +1121,10 @@ static void check_peepmatch_instruction_sequence(FILE *fp, PeepMatch *pmatch, Pe // Build mapping for register indices, num_edges to input static void build_instruction_index_mapping( FILE *fp, FormDict &globals, PeepMatch *pmatch ) { - intptr_t parent = -1; - intptr_t inst_position = 0; - const char *inst_name = NULL; - intptr_t input = 0; + int parent = -1; + int inst_position = 0; + const char* inst_name = NULL; + int input = 0; fprintf(fp, " // Build map to register info\n"); pmatch->reset(); for( pmatch->next_instruction( parent, inst_position, inst_name, input ); @@ -1136,9 +1136,9 @@ static void build_instruction_index_mapping( FILE *fp, FormDict &globals, PeepMa InstructForm *inst = globals[inst_name]->is_instruction(); if( inst != NULL ) { char inst_prefix[] = "instXXXX_"; - sprintf(inst_prefix, "inst%ld_", inst_position); + sprintf(inst_prefix, "inst%d_", inst_position); char receiver[] = "instXXXX->"; - sprintf(receiver, "inst%ld->", inst_position); + sprintf(receiver, "inst%d->", inst_position); inst->index_temps( fp, globals, inst_prefix, receiver ); } } @@ -1168,7 +1168,7 @@ static void check_peepconstraints(FILE *fp, FormDict &globals, PeepMatch *pmatch } // LEFT - intptr_t left_index = pconstraint->_left_inst; + int left_index = pconstraint->_left_inst; const char *left_op = pconstraint->_left_op; // Access info on the instructions whose operands are compared InstructForm *inst_left = globals[pmatch->instruction_name(left_index)]->is_instruction(); @@ -1191,7 +1191,7 @@ static void check_peepconstraints(FILE *fp, FormDict &globals, PeepMatch *pmatch // RIGHT int right_op_index = -1; - intptr_t right_index = pconstraint->_right_inst; + int right_index = pconstraint->_right_inst; const char *right_op = pconstraint->_right_op; if( right_index != -1 ) { // Match operand // Access info on the instructions whose operands are compared @@ -1351,7 +1351,7 @@ static void generate_peepreplace( FILE *fp, FormDict &globals, PeepMatch *pmatch assert( root_form != NULL, "Replacement instruction was not previously defined"); fprintf(fp, " %sNode *root = new (C) %sNode();\n", root_inst, root_inst); - intptr_t inst_num; + int inst_num; const char *op_name; int opnds_index = 0; // define result operand // Then install the use-operands for the new sub-tree @@ -1362,7 +1362,6 @@ static void generate_peepreplace( FILE *fp, FormDict &globals, PeepMatch *pmatch InstructForm *inst_form; inst_form = globals[pmatch->instruction_name(inst_num)]->is_instruction(); assert( inst_form, "Parser should guaranty this is an instruction"); - int op_base = inst_form->oper_input_base(globals); int inst_op_num = inst_form->operand_position(op_name, Component::USE); if( inst_op_num == NameList::Not_in_list ) inst_op_num = inst_form->operand_position(op_name, Component::USE_DEF); @@ -1379,32 +1378,32 @@ static void generate_peepreplace( FILE *fp, FormDict &globals, PeepMatch *pmatch // Add unmatched edges from root of match tree int op_base = root_form->oper_input_base(globals); for( int unmatched_edge = 1; unmatched_edge < op_base; ++unmatched_edge ) { - fprintf(fp, " root->add_req(inst%ld->in(%d)); // unmatched ideal edge\n", + fprintf(fp, " root->add_req(inst%d->in(%d)); // unmatched ideal edge\n", inst_num, unmatched_edge); } // If new instruction captures bottom type if( root_form->captures_bottom_type() ) { // Get bottom type from instruction whose result we are replacing - fprintf(fp, " root->_bottom_type = inst%ld->bottom_type();\n", inst_num); + fprintf(fp, " root->_bottom_type = inst%d->bottom_type();\n", inst_num); } // Define result register and result operand - fprintf(fp, " ra_->add_reference(root, inst%ld);\n", inst_num); - fprintf(fp, " ra_->set_oop (root, ra_->is_oop(inst%ld));\n", inst_num); - fprintf(fp, " ra_->set_pair(root->_idx, ra_->get_reg_second(inst%ld), ra_->get_reg_first(inst%ld));\n", inst_num, inst_num); - fprintf(fp, " root->_opnds[0] = inst%ld->_opnds[0]->clone(C); // result\n", inst_num); + fprintf(fp, " ra_->add_reference(root, inst%d);\n", inst_num); + fprintf(fp, " ra_->set_oop (root, ra_->is_oop(inst%d));\n", inst_num); + fprintf(fp, " ra_->set_pair(root->_idx, ra_->get_reg_second(inst%d), ra_->get_reg_first(inst%d));\n", inst_num, inst_num); + fprintf(fp, " root->_opnds[0] = inst%d->_opnds[0]->clone(C); // result\n", inst_num); fprintf(fp, " // ----- Done with initial setup -----\n"); } else { if( (op_form == NULL) || (op_form->is_base_constant(globals) == Form::none) ) { // Do not have ideal edges for constants after matching - fprintf(fp, " for( unsigned x%d = inst%ld_idx%d; x%d < inst%ld_idx%d; x%d++ )\n", + fprintf(fp, " for( unsigned x%d = inst%d_idx%d; x%d < inst%d_idx%d; x%d++ )\n", inst_op_num, inst_num, inst_op_num, inst_op_num, inst_num, inst_op_num+1, inst_op_num ); - fprintf(fp, " root->add_req( inst%ld->in(x%d) );\n", + fprintf(fp, " root->add_req( inst%d->in(x%d) );\n", inst_num, inst_op_num ); } else { fprintf(fp, " // no ideal edge for constants after matching\n"); } - fprintf(fp, " root->_opnds[%d] = inst%ld->_opnds[%d]->clone(C);\n", + fprintf(fp, " root->_opnds[%d] = inst%d->_opnds[%d]->clone(C);\n", opnds_index, inst_num, inst_op_num ); } ++opnds_index; @@ -1443,7 +1442,7 @@ void ArchDesc::definePeephole(FILE *fp, InstructForm *node) { } for( int i = 0; i <= max_position; ++i ) { if( i == 0 ) { - fprintf(fp, " MachNode *inst0 = this;\n", i); + fprintf(fp, " MachNode *inst0 = this;\n"); } else { fprintf(fp, " MachNode *inst%d = NULL;\n", i); } @@ -1743,7 +1742,7 @@ void ArchDesc::defineExpand(FILE *fp, InstructForm *node) { } // delete the rest of edges fprintf(fp," for(int i = idx%d - 1; i >= (int)idx%d; i--) {\n", cur_num_opnds, new_num_opnds); - fprintf(fp," del_req(i);\n", i); + fprintf(fp," del_req(i);\n"); fprintf(fp," }\n"); fprintf(fp," _num_opnds = %d;\n", new_num_opnds); } @@ -1817,7 +1816,7 @@ void ArchDesc::defineExpand(FILE *fp, InstructForm *node) { fprintf(fp,"\n"); if( node->expands() ) { - fprintf(fp," return result;\n",cnt-1); + fprintf(fp," return result;\n"); } else { fprintf(fp," return this;\n"); } diff --git a/hotspot/src/share/vm/adlc/output_h.cpp b/hotspot/src/share/vm/adlc/output_h.cpp index d2fd489abe9..764dcd03dc4 100644 --- a/hotspot/src/share/vm/adlc/output_h.cpp +++ b/hotspot/src/share/vm/adlc/output_h.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-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 @@ -1832,7 +1832,7 @@ void ArchDesc::declareClasses(FILE *fp) { break; case Form::idealP: case Form::idealN: - fprintf(fp," return opnd_array(1)->type();\n",result); + fprintf(fp," return opnd_array(1)->type();\n"); break; case Form::idealD: fprintf(fp," return TypeD::make(opnd_array(1)->constantD());\n"); diff --git a/hotspot/src/share/vm/includeDB_core b/hotspot/src/share/vm/includeDB_core index 603485132e8..85e710c5b50 100644 --- a/hotspot/src/share/vm/includeDB_core +++ b/hotspot/src/share/vm/includeDB_core @@ -474,6 +474,7 @@ cardTableModRefBS.cpp java.hpp cardTableModRefBS.cpp mutexLocker.hpp cardTableModRefBS.cpp sharedHeap.hpp cardTableModRefBS.cpp space.hpp +cardTableModRefBS.cpp space.inline.hpp cardTableModRefBS.cpp universe.hpp cardTableModRefBS.cpp virtualspace.hpp diff --git a/hotspot/src/share/vm/utilities/vmError.cpp b/hotspot/src/share/vm/utilities/vmError.cpp index a4d0cb0baf0..f3f3edc12fc 100644 --- a/hotspot/src/share/vm/utilities/vmError.cpp +++ b/hotspot/src/share/vm/utilities/vmError.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-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 @@ -306,7 +306,7 @@ void VMError::report(outputStream* st) { strncpy(buf, file, buflen); if (len + 10 < buflen) { - sprintf(buf + len, ":" SIZE_FORMAT, _lineno); + sprintf(buf + len, ":%d", _lineno); } st->print(" (%s)", buf); } else { @@ -420,7 +420,7 @@ void VMError::report(outputStream* st) { if (fr.sp()) { st->print(", sp=" PTR_FORMAT, fr.sp()); - st->print(", free space=%dk", + st->print(", free space=%" INTPTR_FORMAT "k", ((intptr_t)fr.sp() - (intptr_t)stack_bottom) >> 10); } diff --git a/hotspot/src/share/vm/utilities/vmError.hpp b/hotspot/src/share/vm/utilities/vmError.hpp index 8e618d91462..4a8cc23523d 100644 --- a/hotspot/src/share/vm/utilities/vmError.hpp +++ b/hotspot/src/share/vm/utilities/vmError.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-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 @@ -50,7 +50,7 @@ class VMError : public StackObj { // additional info for VM internal errors const char * _filename; - size_t _lineno; + int _lineno; // used by fatal error handler int _current_step; From 67a5668b16866b9b0fea7e813a2d9cd1437e6cd1 Mon Sep 17 00:00:00 2001 From: Vladimir Kozlov Date: Fri, 27 Feb 2009 08:34:19 -0800 Subject: [PATCH 068/292] 6811267: Fix for 6809798 broke linux build Fix method's declaration. Reviewed-by: phh, twisti --- hotspot/src/share/vm/opto/block.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hotspot/src/share/vm/opto/block.hpp b/hotspot/src/share/vm/opto/block.hpp index 0da859abbba..f678983ddaf 100644 --- a/hotspot/src/share/vm/opto/block.hpp +++ b/hotspot/src/share/vm/opto/block.hpp @@ -347,7 +347,7 @@ class PhaseCFG : public Phase { // Helper function to insert a node into a block void schedule_node_into_block( Node *n, Block *b ); - void PhaseCFG::replace_block_proj_ctrl( Node *n ); + void replace_block_proj_ctrl( Node *n ); // Set the basic block for pinned Nodes void schedule_pinned_nodes( VectorSet &visited ); From 05d1de77274ccd96bb5a98505da0317b5ad617c1 Mon Sep 17 00:00:00 2001 From: Christian Thalinger Date: Fri, 27 Feb 2009 13:27:09 -0800 Subject: [PATCH 069/292] 6810672: Comment typos I have collected some typos I have found while looking at the code. Reviewed-by: kvn, never --- .../src/cpu/sparc/vm/interp_masm_sparc.cpp | 2 +- hotspot/src/cpu/sparc/vm/nativeInst_sparc.hpp | 2 +- hotspot/src/cpu/sparc/vm/sparc.ad | 16 +++++------ .../src/cpu/sparc/vm/templateTable_sparc.cpp | 4 +-- .../src/cpu/x86/vm/c1_LIRGenerator_x86.cpp | 2 +- hotspot/src/cpu/x86/vm/cppInterpreter_x86.cpp | 6 ++-- .../src/cpu/x86/vm/sharedRuntime_x86_64.cpp | 2 +- .../cpu/x86/vm/templateInterpreter_x86_64.cpp | 2 +- .../src/cpu/x86/vm/templateTable_x86_32.cpp | 2 +- .../src/cpu/x86/vm/templateTable_x86_64.cpp | 2 +- hotspot/src/cpu/x86/vm/x86_32.ad | 6 ++-- hotspot/src/cpu/x86/vm/x86_64.ad | 6 ++-- hotspot/src/os/linux/launcher/java.c | 4 +-- hotspot/src/os/linux/launcher/java_md.h | 2 +- hotspot/src/os/linux/vm/perfMemory_linux.cpp | 2 +- hotspot/src/os/solaris/launcher/java.c | 4 +-- hotspot/src/os/solaris/launcher/java_md.h | 2 +- .../src/os/solaris/vm/perfMemory_solaris.cpp | 2 +- .../src/os/windows/vm/perfMemory_windows.cpp | 6 ++-- .../solaris_sparc/vm/os_solaris_sparc.cpp | 2 +- .../os_cpu/solaris_x86/vm/os_solaris_x86.cpp | 2 +- .../src/share/tools/MakeDeps/Database.java | 2 +- hotspot/src/share/vm/adlc/Doc/Syntax.doc | 4 +-- hotspot/src/share/vm/adlc/adlparse.cpp | 2 +- hotspot/src/share/vm/adlc/dict2.cpp | 6 ++-- hotspot/src/share/vm/adlc/dict2.hpp | 4 +-- hotspot/src/share/vm/adlc/filebuff.cpp | 12 ++++---- hotspot/src/share/vm/adlc/filebuff.hpp | 6 ++-- hotspot/src/share/vm/adlc/formssel.cpp | 6 ++-- hotspot/src/share/vm/adlc/formssel.hpp | 4 +-- hotspot/src/share/vm/adlc/output_h.cpp | 2 +- hotspot/src/share/vm/asm/assembler.cpp | 2 +- hotspot/src/share/vm/asm/assembler.hpp | 2 +- hotspot/src/share/vm/ci/ciTypeFlow.cpp | 2 +- .../src/share/vm/classfile/symbolTable.cpp | 4 +-- hotspot/src/share/vm/code/nmethod.cpp | 2 +- hotspot/src/share/vm/code/nmethod.hpp | 2 +- .../cmsAdaptiveSizePolicy.hpp | 2 +- .../cmsGCAdaptivePolicyCounters.hpp | 2 +- .../concurrentMarkSweepGeneration.cpp | 4 +-- .../gc_implementation/g1/g1CollectedHeap.cpp | 2 +- .../parallelScavenge/cardTableExtension.cpp | 4 +-- .../parallelScavenge/objectStartArray.hpp | 2 +- .../parallelScavenge/prefetchQueue.hpp | 2 +- .../shared/mutableNUMASpace.cpp | 2 +- .../vm/interpreter/abstractInterpreter.hpp | 2 +- .../vm/interpreter/bytecodeInterpreter.cpp | 2 +- .../bytecodeInterpreter.inline.hpp | 2 +- .../share/vm/interpreter/cppInterpreter.hpp | 2 +- .../interpreter/cppInterpreterGenerator.hpp | 2 +- .../src/share/vm/interpreter/interpreter.hpp | 2 +- .../vm/interpreter/interpreterGenerator.hpp | 2 +- .../vm/interpreter/templateInterpreter.hpp | 2 +- .../templateInterpreterGenerator.hpp | 2 +- hotspot/src/share/vm/libadt/dict.cpp | 6 ++-- hotspot/src/share/vm/libadt/dict.hpp | 4 +-- hotspot/src/share/vm/memory/filemap.cpp | 4 +-- hotspot/src/share/vm/memory/permGen.hpp | 2 +- hotspot/src/share/vm/oops/generateOopMap.cpp | 2 +- hotspot/src/share/vm/oops/generateOopMap.hpp | 4 +-- hotspot/src/share/vm/oops/instanceKlass.cpp | 2 +- hotspot/src/share/vm/oops/klass.cpp | 2 +- hotspot/src/share/vm/oops/klass.hpp | 2 +- hotspot/src/share/vm/oops/methodOop.hpp | 2 +- hotspot/src/share/vm/opto/block.cpp | 6 ++-- hotspot/src/share/vm/opto/block.hpp | 2 +- hotspot/src/share/vm/opto/buildOopMap.cpp | 2 +- hotspot/src/share/vm/opto/cfgnode.cpp | 12 ++++---- hotspot/src/share/vm/opto/chaitin.cpp | 2 +- hotspot/src/share/vm/opto/chaitin.hpp | 4 +-- hotspot/src/share/vm/opto/coalesce.cpp | 8 +++--- hotspot/src/share/vm/opto/compile.cpp | 8 +++--- hotspot/src/share/vm/opto/connode.cpp | 2 +- hotspot/src/share/vm/opto/divnode.cpp | 6 ++-- hotspot/src/share/vm/opto/domgraph.cpp | 2 +- hotspot/src/share/vm/opto/escape.cpp | 10 +++---- hotspot/src/share/vm/opto/gcm.cpp | 8 +++--- hotspot/src/share/vm/opto/graphKit.cpp | 4 +-- hotspot/src/share/vm/opto/ifg.cpp | 2 +- hotspot/src/share/vm/opto/ifnode.cpp | 10 +++---- hotspot/src/share/vm/opto/library_call.cpp | 22 +++++++-------- hotspot/src/share/vm/opto/live.cpp | 2 +- hotspot/src/share/vm/opto/locknode.cpp | 2 +- hotspot/src/share/vm/opto/loopTransform.cpp | 4 +-- hotspot/src/share/vm/opto/loopUnswitch.cpp | 2 +- hotspot/src/share/vm/opto/loopnode.cpp | 24 ++++++++-------- hotspot/src/share/vm/opto/loopnode.hpp | 4 +-- hotspot/src/share/vm/opto/loopopts.cpp | 4 +-- hotspot/src/share/vm/opto/machnode.cpp | 2 +- hotspot/src/share/vm/opto/macro.cpp | 6 ++-- hotspot/src/share/vm/opto/matcher.cpp | 8 +++--- hotspot/src/share/vm/opto/memnode.cpp | 14 +++++----- hotspot/src/share/vm/opto/memnode.hpp | 4 +-- hotspot/src/share/vm/opto/node.cpp | 27 +++++++++--------- hotspot/src/share/vm/opto/node.hpp | 4 +-- hotspot/src/share/vm/opto/output.cpp | 14 +++++----- hotspot/src/share/vm/opto/parse.hpp | 2 +- hotspot/src/share/vm/opto/parse1.cpp | 2 +- hotspot/src/share/vm/opto/parse2.cpp | 14 +++++----- hotspot/src/share/vm/opto/phase.cpp | 2 +- hotspot/src/share/vm/opto/phaseX.cpp | 8 +++--- hotspot/src/share/vm/opto/postaloc.cpp | 4 +-- hotspot/src/share/vm/opto/reg_split.cpp | 10 +++---- hotspot/src/share/vm/opto/runtime.cpp | 2 +- hotspot/src/share/vm/opto/split_if.cpp | 2 +- hotspot/src/share/vm/opto/superword.cpp | 4 +-- hotspot/src/share/vm/opto/superword.hpp | 2 +- hotspot/src/share/vm/opto/type.cpp | 10 +++---- .../share/vm/prims/jvmtiRedefineClasses.cpp | 28 +++++++++---------- hotspot/src/share/vm/runtime/extendedPC.hpp | 2 +- hotspot/src/share/vm/runtime/fprofiler.cpp | 4 +-- hotspot/src/share/vm/runtime/frame.cpp | 2 +- hotspot/src/share/vm/runtime/frame.inline.hpp | 2 +- hotspot/src/share/vm/runtime/mutex.hpp | 2 +- hotspot/src/share/vm/runtime/orderAccess.hpp | 2 +- hotspot/src/share/vm/runtime/os.cpp | 2 +- hotspot/src/share/vm/runtime/safepoint.cpp | 2 +- hotspot/src/share/vm/runtime/signature.hpp | 2 +- .../src/share/vm/runtime/threadCritical.hpp | 2 +- .../share/vm/utilities/globalDefinitions.hpp | 4 +-- 120 files changed, 278 insertions(+), 277 deletions(-) diff --git a/hotspot/src/cpu/sparc/vm/interp_masm_sparc.cpp b/hotspot/src/cpu/sparc/vm/interp_masm_sparc.cpp index f134852e4d6..d1ac3e5b302 100644 --- a/hotspot/src/cpu/sparc/vm/interp_masm_sparc.cpp +++ b/hotspot/src/cpu/sparc/vm/interp_masm_sparc.cpp @@ -2465,7 +2465,7 @@ void InterpreterMacroAssembler::verify_FPU(int stack_depth, TosState state) { // InterpreterRuntime::post_method_entry(); // } // if (DTraceMethodProbes) { -// SharedRuntime::dtrace_method_entry(method, reciever); +// SharedRuntime::dtrace_method_entry(method, receiver); // } void InterpreterMacroAssembler::notify_method_entry() { diff --git a/hotspot/src/cpu/sparc/vm/nativeInst_sparc.hpp b/hotspot/src/cpu/sparc/vm/nativeInst_sparc.hpp index 2527e35b3e9..81bdca4cd28 100644 --- a/hotspot/src/cpu/sparc/vm/nativeInst_sparc.hpp +++ b/hotspot/src/cpu/sparc/vm/nativeInst_sparc.hpp @@ -243,7 +243,7 @@ class NativeInstruction VALUE_OBJ_CLASS_SPEC { // Regenerate the instruction sequence that performs the 64 bit // sethi. This only does the sethi. The disp field (bottom 10 bits) - // must be handled seperately. + // must be handled separately. static void set_data64_sethi(address instaddr, intptr_t x); // combine the fields of a sethi/simm13 pair (simm13 = or, add, jmpl, ld/st) diff --git a/hotspot/src/cpu/sparc/vm/sparc.ad b/hotspot/src/cpu/sparc/vm/sparc.ad index b4a94ac240a..0095f652caa 100644 --- a/hotspot/src/cpu/sparc/vm/sparc.ad +++ b/hotspot/src/cpu/sparc/vm/sparc.ad @@ -189,7 +189,7 @@ reg_def R_F31( SOC, SOC, Op_RegF, 31, F31->as_VMReg()); // double fp register numbers. FloatRegisterImpl in register_sparc.hpp // wants 0-63, so we have to convert every time we want to use fp regs // with the macroassembler, using reg_to_DoubleFloatRegister_object(). -// 255 is a flag meaning 'dont go here'. +// 255 is a flag meaning "don't go here". // I believe we can't handle callee-save doubles D32 and up until // the place in the sparc stack crawler that asserts on the 255 is // fixed up. @@ -462,7 +462,7 @@ extern bool can_branch_register( Node *bol, Node *cmp ); // Macros to extract hi & lo halves from a long pair. // G0 is not part of any long pair, so assert on that. -// Prevents accidently using G1 instead of G0. +// Prevents accidentally using G1 instead of G0. #define LONG_HI_REG(x) (x) #define LONG_LO_REG(x) (x) @@ -1431,7 +1431,7 @@ uint MachSpillCopyNode::implementation( CodeBuffer *cbuf, #ifndef _LP64 // In the LP64 build, all registers can be moved as aligned/adjacent - // pairs, so there's never any need to move the high bits seperately. + // pairs, so there's never any need to move the high bits separately. // The 32-bit builds have to deal with the 32-bit ABI which can force // all sorts of silly alignment problems. @@ -1624,7 +1624,7 @@ void MachUEPNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const { Register temp_reg = G3; assert( G5_ic_reg != temp_reg, "conflicting registers" ); - // Load klass from reciever + // Load klass from receiver __ load_klass(O0, temp_reg); // Compare against expected klass __ cmp(temp_reg, G5_ic_reg); @@ -4149,7 +4149,7 @@ operand cmpOp_commute() %{ //----------OPERAND CLASSES---------------------------------------------------- // Operand Classes are groups of operands that are used to simplify -// instruction definitions by not requiring the AD writer to specify seperate +// instruction definitions by not requiring the AD writer to specify separate // instructions for every form of operand when the instruction accepts // multiple operand types with the same basic encoding and format. The classic // case of this is memory operands. @@ -6847,7 +6847,7 @@ instruct mul_hi(iRegIsafe dst, iRegIsafe src1, iRegIsafe src2 ) %{ ins_pipe(sdiv_reg_reg); %} -// Magic constant, reciprical of 10 +// Magic constant, reciprocal of 10 instruct loadConI_x66666667(iRegIsafe dst) %{ effect( DEF dst ); @@ -6857,7 +6857,7 @@ instruct loadConI_x66666667(iRegIsafe dst) %{ ins_pipe(ialu_hi_lo_reg); %} -// Register Shift Right Arithmatic Long by 32-63 +// Register Shift Right Arithmetic Long by 32-63 instruct sra_31( iRegI dst, iRegI src ) %{ effect( DEF dst, USE src ); format %{ "SRA $src,31,$dst\t! Used in div-by-10" %} @@ -9048,7 +9048,7 @@ instruct storeL_reversed(memory dst, iRegL src) %{ // These must follow all instruction definitions as they use the names // defined in the instructions definitions. // -// peepmatch ( root_instr_name [preceeding_instruction]* ); +// peepmatch ( root_instr_name [preceding_instruction]* ); // // peepconstraint %{ // (instruction_number.operand_name relational_op instruction_number.operand_name diff --git a/hotspot/src/cpu/sparc/vm/templateTable_sparc.cpp b/hotspot/src/cpu/sparc/vm/templateTable_sparc.cpp index 6ba85859c2b..a4c1fa89258 100644 --- a/hotspot/src/cpu/sparc/vm/templateTable_sparc.cpp +++ b/hotspot/src/cpu/sparc/vm/templateTable_sparc.cpp @@ -1545,7 +1545,7 @@ void TemplateTable::branch(bool is_jsr, bool is_wide) { // Handle all the JSR stuff here, then exit. // It's much shorter and cleaner than intermingling with the - // non-JSR normal-branch stuff occuring below. + // non-JSR normal-branch stuff occurring below. if( is_jsr ) { // compute return address as bci in Otos_i __ ld_ptr(Address(Lmethod, 0, in_bytes(methodOopDesc::const_offset())), G3_scratch); @@ -3079,7 +3079,7 @@ void TemplateTable::invokeinterface(int byte_no) { Label ok; // Check that entry is non-null. Null entries are probably a bytecode - // problem. If the interface isn't implemented by the reciever class, + // problem. If the interface isn't implemented by the receiver class, // the VM should throw IncompatibleClassChangeError. linkResolver checks // this too but that's only if the entry isn't already resolved, so we // need to check again. diff --git a/hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp b/hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp index 26acffbb321..5b46c4a88ce 100644 --- a/hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp +++ b/hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp @@ -501,7 +501,7 @@ void LIRGenerator::do_ArithmeticOp_Long(ArithmeticOp* x) { LIRItem right(x->y(), this); left.load_item(); - // dont load constants to save register + // don't load constants to save register right.load_nonconstant(); rlock_result(x); arithmetic_op_long(x->op(), x->operand(), left.result(), right.result(), NULL); diff --git a/hotspot/src/cpu/x86/vm/cppInterpreter_x86.cpp b/hotspot/src/cpu/x86/vm/cppInterpreter_x86.cpp index a3621ad886c..377d0f2617b 100644 --- a/hotspot/src/cpu/x86/vm/cppInterpreter_x86.cpp +++ b/hotspot/src/cpu/x86/vm/cppInterpreter_x86.cpp @@ -523,7 +523,7 @@ void CppInterpreterGenerator::generate_compute_interpreter_state(const Register #ifdef _LP64 // Make sure stack is properly aligned and sized for the abi __ subptr(rsp, frame::arg_reg_save_area_bytes); // windows - __ andptr(rsp, -16); // must be 16 byte boundry (see amd64 ABI) + __ andptr(rsp, -16); // must be 16 byte boundary (see amd64 ABI) #endif // _LP64 @@ -970,7 +970,7 @@ address InterpreterGenerator::generate_native_entry(bool synchronized) { #ifdef _LP64 // duplicate the alignment rsp got after setting stack_base __ subptr(rax, frame::arg_reg_save_area_bytes); // windows - __ andptr(rax, -16); // must be 16 byte boundry (see amd64 ABI) + __ andptr(rax, -16); // must be 16 byte boundary (see amd64 ABI) #endif // _LP64 __ cmpptr(rax, rsp); __ jcc(Assembler::equal, L); @@ -1067,7 +1067,7 @@ address InterpreterGenerator::generate_native_entry(bool synchronized) { #ifdef _LP64 __ subptr(rsp, t); __ subptr(rsp, frame::arg_reg_save_area_bytes); // windows - __ andptr(rsp, -16); // must be 16 byte boundry (see amd64 ABI) + __ andptr(rsp, -16); // must be 16 byte boundary (see amd64 ABI) #else __ addptr(t, 2*wordSize); // allocate two more slots for JNIEnv and possible mirror __ subptr(rsp, t); diff --git a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp index 7fc2b6685e4..2fbcb7010fa 100644 --- a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp +++ b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp @@ -1350,7 +1350,7 @@ nmethod *SharedRuntime::generate_native_wrapper(MacroAssembler *masm, { Label L; __ mov(rax, rsp); - __ andptr(rax, -16); // must be 16 byte boundry (see amd64 ABI) + __ andptr(rax, -16); // must be 16 byte boundary (see amd64 ABI) __ cmpptr(rax, rsp); __ jcc(Assembler::equal, L); __ stop("improperly aligned stack"); diff --git a/hotspot/src/cpu/x86/vm/templateInterpreter_x86_64.cpp b/hotspot/src/cpu/x86/vm/templateInterpreter_x86_64.cpp index 9caf33f6b09..b237b7b5fff 100644 --- a/hotspot/src/cpu/x86/vm/templateInterpreter_x86_64.cpp +++ b/hotspot/src/cpu/x86/vm/templateInterpreter_x86_64.cpp @@ -826,7 +826,7 @@ address InterpreterGenerator::generate_native_entry(bool synchronized) { __ subptr(rsp, t); __ subptr(rsp, frame::arg_reg_save_area_bytes); // windows - __ andptr(rsp, -16); // must be 16 byte boundry (see amd64 ABI) + __ andptr(rsp, -16); // must be 16 byte boundary (see amd64 ABI) // get signature handler { diff --git a/hotspot/src/cpu/x86/vm/templateTable_x86_32.cpp b/hotspot/src/cpu/x86/vm/templateTable_x86_32.cpp index 13242651c7e..6acbc8e2836 100644 --- a/hotspot/src/cpu/x86/vm/templateTable_x86_32.cpp +++ b/hotspot/src/cpu/x86/vm/templateTable_x86_32.cpp @@ -1586,7 +1586,7 @@ void TemplateTable::branch(bool is_jsr, bool is_wide) { // Handle all the JSR stuff here, then exit. // It's much shorter and cleaner than intermingling with the - // non-JSR normal-branch stuff occuring below. + // non-JSR normal-branch stuff occurring below. if (is_jsr) { // Pre-load the next target bytecode into EBX __ load_unsigned_byte(rbx, Address(rsi, rdx, Address::times_1, 0)); diff --git a/hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp b/hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp index e4b4cb96980..50c23fd458c 100644 --- a/hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp +++ b/hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp @@ -1559,7 +1559,7 @@ void TemplateTable::branch(bool is_jsr, bool is_wide) { // Handle all the JSR stuff here, then exit. // It's much shorter and cleaner than intermingling with the non-JSR - // normal-branch stuff occuring below. + // normal-branch stuff occurring below. if (is_jsr) { // Pre-load the next target bytecode into rbx __ load_unsigned_byte(rbx, Address(r13, rdx, Address::times_1, 0)); diff --git a/hotspot/src/cpu/x86/vm/x86_32.ad b/hotspot/src/cpu/x86/vm/x86_32.ad index edc6a63e79f..43daf35fc22 100644 --- a/hotspot/src/cpu/x86/vm/x86_32.ad +++ b/hotspot/src/cpu/x86/vm/x86_32.ad @@ -130,7 +130,7 @@ reg_def XMM7b( SOC, SOC, Op_RegF, 7, xmm7->as_VMReg()->next()); // allocation. Highest priority is first. A useful heuristic is to // give registers a low priority when they are required by machine // instructions, like EAX and EDX. Registers which are used as -// pairs must fall on an even boundry (witness the FPR#L's in this list). +// pairs must fall on an even boundary (witness the FPR#L's in this list). // For the Intel integer registers, the equivalent Long pairs are // EDX:EAX, EBX:ECX, and EDI:EBP. alloc_class chunk0( ECX, EBX, EBP, EDI, EAX, EDX, ESI, ESP, @@ -5857,7 +5857,7 @@ operand cmpOp_commute() %{ //----------OPERAND CLASSES---------------------------------------------------- // Operand Classes are groups of operands that are used as to simplify -// instruction definitions by not requiring the AD writer to specify seperate +// instruction definitions by not requiring the AD writer to specify separate // instructions for every form of operand when the instruction accepts // multiple operand types with the same basic encoding and format. The classic // case of this is memory operands. @@ -13220,7 +13220,7 @@ instruct safePoint_poll(eFlagsReg cr) %{ // These must follow all instruction definitions as they use the names // defined in the instructions definitions. // -// peepmatch ( root_instr_name [preceeding_instruction]* ); +// peepmatch ( root_instr_name [preceding_instruction]* ); // // peepconstraint %{ // (instruction_number.operand_name relational_op instruction_number.operand_name diff --git a/hotspot/src/cpu/x86/vm/x86_64.ad b/hotspot/src/cpu/x86/vm/x86_64.ad index ad4f03b23a3..09157f3a34b 100644 --- a/hotspot/src/cpu/x86/vm/x86_64.ad +++ b/hotspot/src/cpu/x86/vm/x86_64.ad @@ -5483,7 +5483,7 @@ operand cmpOpUCF2() %{ //----------OPERAND CLASSES---------------------------------------------------- // Operand Classes are groups of operands that are used as to simplify -// instruction definitions by not requiring the AD writer to specify seperate +// instruction definitions by not requiring the AD writer to specify separate // instructions for every form of operand when the instruction accepts // multiple operand types with the same basic encoding and format. The classic // case of this is memory operands. @@ -8363,7 +8363,7 @@ instruct divModL_rReg_divmod(rax_RegL rax, rdx_RegL rdx, no_rax_rdx_RegL div, //----------- DivL-By-Constant-Expansions-------------------------------------- // DivI cases are handled by the compiler -// Magic constant, reciprical of 10 +// Magic constant, reciprocal of 10 instruct loadConL_0x6666666666666667(rRegL dst) %{ effect(DEF dst); @@ -12082,7 +12082,7 @@ instruct RethrowException() // These must follow all instruction definitions as they use the names // defined in the instructions definitions. // -// peepmatch ( root_instr_name [precerding_instruction]* ); +// peepmatch ( root_instr_name [preceding_instruction]* ); // // peepconstraint %{ // (instruction_number.operand_name relational_op instruction_number.operand_name diff --git a/hotspot/src/os/linux/launcher/java.c b/hotspot/src/os/linux/launcher/java.c index a13782ec437..e335776325d 100644 --- a/hotspot/src/os/linux/launcher/java.c +++ b/hotspot/src/os/linux/launcher/java.c @@ -419,7 +419,7 @@ main(int argc, char ** argv) goto leave; } mainClass = LoadClass(env, classname); - if(mainClass == NULL) { /* exception occured */ + if(mainClass == NULL) { /* exception occurred */ ReportExceptionDescription(env); message = "Could not find the main class. Program will exit."; goto leave; @@ -441,7 +441,7 @@ main(int argc, char ** argv) goto leave; } mainClass = LoadClass(env, classname); - if(mainClass == NULL) { /* exception occured */ + if(mainClass == NULL) { /* exception occurred */ ReportExceptionDescription(env); message = "Could not find the main class. Program will exit."; goto leave; diff --git a/hotspot/src/os/linux/launcher/java_md.h b/hotspot/src/os/linux/launcher/java_md.h index 89e4d0b7ac8..6016621754a 100644 --- a/hotspot/src/os/linux/launcher/java_md.h +++ b/hotspot/src/os/linux/launcher/java_md.h @@ -47,7 +47,7 @@ #ifdef JAVA_ARGS /* * ApplicationHome is prepended to each of these entries; the resulting - * strings are concatenated (seperated by PATH_SEPARATOR) and used as the + * strings are concatenated (separated by PATH_SEPARATOR) and used as the * value of -cp option to the launcher. */ #ifndef APP_CLASSPATH diff --git a/hotspot/src/os/linux/vm/perfMemory_linux.cpp b/hotspot/src/os/linux/vm/perfMemory_linux.cpp index c56798c0187..38165056267 100644 --- a/hotspot/src/os/linux/vm/perfMemory_linux.cpp +++ b/hotspot/src/os/linux/vm/perfMemory_linux.cpp @@ -192,7 +192,7 @@ static pid_t filename_to_pid(const char* filename) { // check if the given path is considered a secure directory for // the backing store files. Returns true if the directory exists // and is considered a secure location. Returns false if the path -// is a symbolic link or if an error occured. +// is a symbolic link or if an error occurred. // static bool is_directory_secure(const char* path) { struct stat statbuf; diff --git a/hotspot/src/os/solaris/launcher/java.c b/hotspot/src/os/solaris/launcher/java.c index e4fc014de6d..866be7c65b7 100644 --- a/hotspot/src/os/solaris/launcher/java.c +++ b/hotspot/src/os/solaris/launcher/java.c @@ -419,7 +419,7 @@ main(int argc, char ** argv) goto leave; } mainClass = LoadClass(env, classname); - if(mainClass == NULL) { /* exception occured */ + if(mainClass == NULL) { /* exception occurred */ ReportExceptionDescription(env); message = "Could not find the main class. Program will exit."; goto leave; @@ -441,7 +441,7 @@ main(int argc, char ** argv) goto leave; } mainClass = LoadClass(env, classname); - if(mainClass == NULL) { /* exception occured */ + if(mainClass == NULL) { /* exception occurred */ ReportExceptionDescription(env); message = "Could not find the main class. Program will exit."; goto leave; diff --git a/hotspot/src/os/solaris/launcher/java_md.h b/hotspot/src/os/solaris/launcher/java_md.h index c65b42e2a3f..5122de9fc25 100644 --- a/hotspot/src/os/solaris/launcher/java_md.h +++ b/hotspot/src/os/solaris/launcher/java_md.h @@ -47,7 +47,7 @@ #ifdef JAVA_ARGS /* * ApplicationHome is prepended to each of these entries; the resulting - * strings are concatenated (seperated by PATH_SEPARATOR) and used as the + * strings are concatenated (separated by PATH_SEPARATOR) and used as the * value of -cp option to the launcher. */ #ifndef APP_CLASSPATH diff --git a/hotspot/src/os/solaris/vm/perfMemory_solaris.cpp b/hotspot/src/os/solaris/vm/perfMemory_solaris.cpp index 4626d7299b4..459ef573a90 100644 --- a/hotspot/src/os/solaris/vm/perfMemory_solaris.cpp +++ b/hotspot/src/os/solaris/vm/perfMemory_solaris.cpp @@ -194,7 +194,7 @@ static pid_t filename_to_pid(const char* filename) { // check if the given path is considered a secure directory for // the backing store files. Returns true if the directory exists // and is considered a secure location. Returns false if the path -// is a symbolic link or if an error occured. +// is a symbolic link or if an error occurred. // static bool is_directory_secure(const char* path) { struct stat statbuf; diff --git a/hotspot/src/os/windows/vm/perfMemory_windows.cpp b/hotspot/src/os/windows/vm/perfMemory_windows.cpp index 42a45ee6527..95063df2eb0 100644 --- a/hotspot/src/os/windows/vm/perfMemory_windows.cpp +++ b/hotspot/src/os/windows/vm/perfMemory_windows.cpp @@ -195,7 +195,7 @@ static int filename_to_pid(const char* filename) { // check if the given path is considered a secure directory for // the backing store files. Returns true if the directory exists // and is considered a secure location. Returns false if the path -// is a symbolic link or if an error occured. +// is a symbolic link or if an error occurred. // static bool is_directory_secure(const char* path) { @@ -994,7 +994,7 @@ static bool add_allow_aces(PSECURITY_DESCRIPTOR pSD, return false; } - // if running on windows 2000 or later, set the automatic inheritence + // if running on windows 2000 or later, set the automatic inheritance // control flags. SetSecurityDescriptorControlFnPtr _SetSecurityDescriptorControl; _SetSecurityDescriptorControl = (SetSecurityDescriptorControlFnPtr) @@ -1002,7 +1002,7 @@ static bool add_allow_aces(PSECURITY_DESCRIPTOR pSD, "SetSecurityDescriptorControl"); if (_SetSecurityDescriptorControl != NULL) { - // We do not want to further propogate inherited DACLs, so making them + // We do not want to further propagate inherited DACLs, so making them // protected prevents that. if (!_SetSecurityDescriptorControl(pSD, SE_DACL_PROTECTED, SE_DACL_PROTECTED)) { diff --git a/hotspot/src/os_cpu/solaris_sparc/vm/os_solaris_sparc.cpp b/hotspot/src/os_cpu/solaris_sparc/vm/os_solaris_sparc.cpp index 012c170a980..802934511af 100644 --- a/hotspot/src/os_cpu/solaris_sparc/vm/os_solaris_sparc.cpp +++ b/hotspot/src/os_cpu/solaris_sparc/vm/os_solaris_sparc.cpp @@ -532,7 +532,7 @@ int JVM_handle_solaris_signal(int sig, siginfo_t* info, void* ucVoid, int abort_ if (oldAct.sa_sigaction != signalHandler) { void* sighand = oldAct.sa_sigaction ? CAST_FROM_FN_PTR(void*, oldAct.sa_sigaction) : CAST_FROM_FN_PTR(void*, oldAct.sa_handler); - warning("Unexpected Signal %d occured under user-defined signal handler " INTPTR_FORMAT, sig, (intptr_t)sighand); + warning("Unexpected Signal %d occurred under user-defined signal handler " INTPTR_FORMAT, sig, (intptr_t)sighand); } } diff --git a/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp b/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp index 71f99cba0da..e6b1edca5a4 100644 --- a/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp +++ b/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp @@ -694,7 +694,7 @@ int JVM_handle_solaris_signal(int sig, siginfo_t* info, void* ucVoid, int abort_ if (oldAct.sa_sigaction != signalHandler) { void* sighand = oldAct.sa_sigaction ? CAST_FROM_FN_PTR(void*, oldAct.sa_sigaction) : CAST_FROM_FN_PTR(void*, oldAct.sa_handler); - warning("Unexpected Signal %d occured under user-defined signal handler %#lx", sig, (long)sighand); + warning("Unexpected Signal %d occurred under user-defined signal handler %#lx", sig, (long)sighand); } } diff --git a/hotspot/src/share/tools/MakeDeps/Database.java b/hotspot/src/share/tools/MakeDeps/Database.java index 5cec93b7d03..3cdffebca49 100644 --- a/hotspot/src/share/tools/MakeDeps/Database.java +++ b/hotspot/src/share/tools/MakeDeps/Database.java @@ -365,7 +365,7 @@ public class Database { // HACK ALERT. The compilation of ad_ files is very slow. // We want to start compiling them as early as possible. The compilation - // order on unix is dependant on the order we emit files here. + // order on unix is dependent on the order we emit files here. // By sorting the output before emitting it, we expect // that ad_ will be compiled early. boolean shouldSortObjFiles = true; diff --git a/hotspot/src/share/vm/adlc/Doc/Syntax.doc b/hotspot/src/share/vm/adlc/Doc/Syntax.doc index ade893410c3..c2a24afc3a8 100644 --- a/hotspot/src/share/vm/adlc/Doc/Syntax.doc +++ b/hotspot/src/share/vm/adlc/Doc/Syntax.doc @@ -88,7 +88,7 @@ reg_class X_REG(AX, BX); // form a matcher register class of X_REG // these are used for constraints, etc. alloc_class class1(AX, BX); // form an allocation class of registers - // used by the register allocator for seperate + // used by the register allocator for separate // allocation of target register classes 3. Pipeline Syntax for Scheduling @@ -150,7 +150,7 @@ D. Delimiters b. %} (block terminator) c. EOF (file terminator) - 4. Each statement must start on a seperate line + 4. Each statement must start on a separate line 5. Identifiers cannot contain: (){}%;,"/\ diff --git a/hotspot/src/share/vm/adlc/adlparse.cpp b/hotspot/src/share/vm/adlc/adlparse.cpp index f212d3f5756..61ba5e2483c 100644 --- a/hotspot/src/share/vm/adlc/adlparse.cpp +++ b/hotspot/src/share/vm/adlc/adlparse.cpp @@ -4555,7 +4555,7 @@ void ADLParser::parse_err(int flag, const char *fmt, ...) { //---------------------------ensure_start_of_line------------------------------ // A preprocessor directive has been encountered. Be sure it has fallen at -// the begining of a line, or else report an error. +// the beginning of a line, or else report an error. void ADLParser::ensure_start_of_line(void) { if (_curchar == '\n') { next_line(); return; } assert( _ptr >= _curline && _ptr < _curline+strlen(_curline), diff --git a/hotspot/src/share/vm/adlc/dict2.cpp b/hotspot/src/share/vm/adlc/dict2.cpp index f46693fd06c..d1816423dc6 100644 --- a/hotspot/src/share/vm/adlc/dict2.cpp +++ b/hotspot/src/share/vm/adlc/dict2.cpp @@ -275,7 +275,7 @@ void Dict::print(PrintKeyOrValue print_key, PrintKeyOrValue print_value) { // Convert string to hash key. This algorithm implements a universal hash // function with the multipliers frozen (ok, so it's not universal). The // multipliers (and allowable characters) are all odd, so the resultant sum -// is odd - guarenteed not divisible by any power of two, so the hash tables +// is odd - guaranteed not divisible by any power of two, so the hash tables // can be any power of two with good results. Also, I choose multipliers // that have only 2 bits set (the low is always set to be odd) so // multiplication requires only shifts and adds. Characters are required to @@ -296,7 +296,7 @@ int hashstr(const void *t) { } //------------------------------hashptr-------------------------------------- -// Slimey cheap hash function; no guarenteed performance. Better than the +// Slimey cheap hash function; no guaranteed performance. Better than the // default for pointers, especially on MS-DOS machines. int hashptr(const void *key) { #ifdef __TURBOC__ @@ -306,7 +306,7 @@ int hashptr(const void *key) { #endif } -// Slimey cheap hash function; no guarenteed performance. +// Slimey cheap hash function; no guaranteed performance. int hashkey(const void *key) { return (int)((intptr_t)key); } diff --git a/hotspot/src/share/vm/adlc/dict2.hpp b/hotspot/src/share/vm/adlc/dict2.hpp index 41a1b19d167..14c75e5df49 100644 --- a/hotspot/src/share/vm/adlc/dict2.hpp +++ b/hotspot/src/share/vm/adlc/dict2.hpp @@ -89,10 +89,10 @@ class Dict { // Dictionary structure // Hashing functions int hashstr(const void *s); // Nice string hash -// Slimey cheap hash function; no guarenteed performance. Better than the +// Slimey cheap hash function; no guaranteed performance. Better than the // default for pointers, especially on MS-DOS machines. int hashptr(const void *key); -// Slimey cheap hash function; no guarenteed performance. +// Slimey cheap hash function; no guaranteed performance. int hashkey(const void *key); // Key comparators diff --git a/hotspot/src/share/vm/adlc/filebuff.cpp b/hotspot/src/share/vm/adlc/filebuff.cpp index 36e611e15b6..d5dfd218651 100644 --- a/hotspot/src/share/vm/adlc/filebuff.cpp +++ b/hotspot/src/share/vm/adlc/filebuff.cpp @@ -50,10 +50,10 @@ FileBuff::FileBuff( BufferedFile *fptr, ArchDesc& archDesc) : _fp(fptr), _AD(arc file_error(SEMERR, 0, "Buffer allocation failed\n"); exit(1); // Exit on allocation failure } - *_bigbuf = '\n'; // Lead with a sentinal newline - _buf = _bigbuf+1; // Skip sentinal + *_bigbuf = '\n'; // Lead with a sentinel newline + _buf = _bigbuf+1; // Skip sentinel _bufmax = _buf; // Buffer is empty - _bufeol = _bigbuf; // _bufeol points at sentinal + _bufeol = _bigbuf; // _bufeol points at sentinel _filepos = -1; // filepos is in sync with _bufeol _bufoff = _offset = 0L; // Offset at file start @@ -62,8 +62,8 @@ FileBuff::FileBuff( BufferedFile *fptr, ArchDesc& archDesc) : _fp(fptr), _AD(arc file_error(SEMERR, 0, "File read error, no input read\n"); exit(1); // Exit on read error } - *_bufmax = '\n'; // End with a sentinal new-line - *(_bufmax+1) = '\0'; // Then end with a sentinal NULL + *_bufmax = '\n'; // End with a sentinel new-line + *(_bufmax+1) = '\0'; // Then end with a sentinel NULL } //------------------------------~FileBuff-------------------------------------- @@ -81,7 +81,7 @@ char *FileBuff::get_line(void) { _linenum++; retval = ++_bufeol; // return character following end of previous line - if (*retval == '\0') return NULL; // Check for EOF sentinal + if (*retval == '\0') return NULL; // Check for EOF sentinel // Search for newline character which must end each line for(_filepos++; *_bufeol != '\n'; _bufeol++) _filepos++; // keep filepos in sync with _bufeol diff --git a/hotspot/src/share/vm/adlc/filebuff.hpp b/hotspot/src/share/vm/adlc/filebuff.hpp index e5e8cccbea0..6967d64a39c 100644 --- a/hotspot/src/share/vm/adlc/filebuff.hpp +++ b/hotspot/src/share/vm/adlc/filebuff.hpp @@ -37,7 +37,7 @@ class ArchDesc; //------------------------------FileBuff-------------------------------------- // This class defines a nicely behaved buffer of text. Entire file of text -// is read into buffer at creation, with sentinals at start and end. +// is read into buffer at creation, with sentinels at start and end. class FileBuff { friend class FileBuffRegion; private: @@ -46,8 +46,8 @@ class FileBuff { long _bufoff; // Start of buffer file offset char *_buf; // The buffer itself. - char *_bigbuf; // The buffer plus sentinals; actual heap area - char *_bufmax; // A pointer to the buffer end sentinal + char *_bigbuf; // The buffer plus sentinels; actual heap area + char *_bufmax; // A pointer to the buffer end sentinel char *_bufeol; // A pointer to the last complete line end int _err; // Error flag for file seek/read operations diff --git a/hotspot/src/share/vm/adlc/formssel.cpp b/hotspot/src/share/vm/adlc/formssel.cpp index cf48d265084..d203e2d7f6d 100644 --- a/hotspot/src/share/vm/adlc/formssel.cpp +++ b/hotspot/src/share/vm/adlc/formssel.cpp @@ -1281,7 +1281,7 @@ void InstructForm::set_unique_opnds() { _num_uniq = num_uniq; } -// Generate index values needed for determing the operand position +// Generate index values needed for determining the operand position void InstructForm::index_temps(FILE *fp, FormDict &globals, const char *prefix, const char *receiver) { uint idx = 0; // position of operand in match rule int cur_num_opnds = num_opnds(); @@ -2197,7 +2197,7 @@ int OperandForm::operand_position(const char *name, int usedef) { // Return zero-based position in component list, only counting constants; // Return -1 if not in list. int OperandForm::constant_position(FormDict &globals, const Component *last) { - // Iterate through components and count constants preceeding 'constant' + // Iterate through components and count constants preceding 'constant' int position = 0; Component *comp; _components.reset(); @@ -2235,7 +2235,7 @@ int OperandForm::constant_position(FormDict &globals, const char *name) { // Return zero-based position in component list, only counting constants; // Return -1 if not in list. int OperandForm::register_position(FormDict &globals, const char *reg_name) { - // Iterate through components and count registers preceeding 'last' + // Iterate through components and count registers preceding 'last' uint position = 0; Component *comp; _components.reset(); diff --git a/hotspot/src/share/vm/adlc/formssel.hpp b/hotspot/src/share/vm/adlc/formssel.hpp index 84c49be69eb..2a7bfbb7934 100644 --- a/hotspot/src/share/vm/adlc/formssel.hpp +++ b/hotspot/src/share/vm/adlc/formssel.hpp @@ -277,7 +277,7 @@ public: // // Generate the format call for the replacement variable void rep_var_format(FILE *fp, const char *rep_var); - // Generate index values needed for determing the operand position + // Generate index values needed for determining the operand position void index_temps (FILE *fp, FormDict &globals, const char *prefix = "", const char *receiver = ""); // --------------------------- @@ -344,7 +344,7 @@ public: // --------------------------- Code Block // Add code - void add_code(const char *string_preceeding_replacement_var); + void add_code(const char *string_preceding_replacement_var); // Add a replacement variable or one of its subfields // Subfields are stored with a leading '$' void add_rep_var(char *replacement_var); diff --git a/hotspot/src/share/vm/adlc/output_h.cpp b/hotspot/src/share/vm/adlc/output_h.cpp index 764dcd03dc4..4668d68f9fa 100644 --- a/hotspot/src/share/vm/adlc/output_h.cpp +++ b/hotspot/src/share/vm/adlc/output_h.cpp @@ -574,7 +574,7 @@ void gen_inst_format(FILE *fp, FormDict &globals, InstructForm &inst, bool for_c // Generate the user-defined portion of the format if( inst._format ) { // If there are replacement variables, - // Generate index values needed for determing the operand position + // Generate index values needed for determining the operand position if( inst._format->_rep_vars.count() ) inst.index_temps(fp, globals); diff --git a/hotspot/src/share/vm/asm/assembler.cpp b/hotspot/src/share/vm/asm/assembler.cpp index e9d99621b6b..0afc3960422 100644 --- a/hotspot/src/share/vm/asm/assembler.cpp +++ b/hotspot/src/share/vm/asm/assembler.cpp @@ -31,7 +31,7 @@ // The AbstractAssembler is generating code into a CodeBuffer. To make code generation faster, // the assembler keeps a copy of the code buffers boundaries & modifies them when // emitting bytes rather than using the code buffers accessor functions all the time. -// The code buffer is updated via set_code_end(...) after emiting a whole instruction. +// The code buffer is updated via set_code_end(...) after emitting a whole instruction. AbstractAssembler::AbstractAssembler(CodeBuffer* code) { if (code == NULL) return; diff --git a/hotspot/src/share/vm/asm/assembler.hpp b/hotspot/src/share/vm/asm/assembler.hpp index 7af6e5dffa1..b8a29ceadca 100644 --- a/hotspot/src/share/vm/asm/assembler.hpp +++ b/hotspot/src/share/vm/asm/assembler.hpp @@ -22,7 +22,7 @@ * */ -// This file contains platform-independant assembler declarations. +// This file contains platform-independent assembler declarations. class CodeBuffer; class MacroAssembler; diff --git a/hotspot/src/share/vm/ci/ciTypeFlow.cpp b/hotspot/src/share/vm/ci/ciTypeFlow.cpp index 08396235067..51f49132b61 100644 --- a/hotspot/src/share/vm/ci/ciTypeFlow.cpp +++ b/hotspot/src/share/vm/ci/ciTypeFlow.cpp @@ -541,7 +541,7 @@ void ciTypeFlow::StateVector::do_aaload(ciBytecodeStream* str) { // is report a value that will meet correctly with any downstream // reference types on paths that will truly be executed. This null type // meets with any reference type to yield that same reference type. - // (The compiler will generate an unconditonal exception here.) + // (The compiler will generate an unconditional exception here.) push(null_type()); return; } diff --git a/hotspot/src/share/vm/classfile/symbolTable.cpp b/hotspot/src/share/vm/classfile/symbolTable.cpp index 0c2d6bbb3e9..b77db6bd952 100644 --- a/hotspot/src/share/vm/classfile/symbolTable.cpp +++ b/hotspot/src/share/vm/classfile/symbolTable.cpp @@ -156,7 +156,7 @@ symbolOop SymbolTable::basic_add(int index, u1 *name, int len, symbolOop test = lookup(index, (char*)name, len, hashValue); if (test != NULL) { - // A race occured and another thread introduced the symbol, this one + // A race occurred and another thread introduced the symbol, this one // will be dropped and collected. return test; } @@ -193,7 +193,7 @@ bool SymbolTable::basic_add(constantPoolHandle cp, int names_count, int index = hash_to_index(hashValues[i]); symbolOop test = lookup(index, names[i], lengths[i], hashValues[i]); if (test != NULL) { - // A race occured and another thread introduced the symbol, this one + // A race occurred and another thread introduced the symbol, this one // will be dropped and collected. Use test instead. cp->symbol_at_put(cp_indices[i], test); } else { diff --git a/hotspot/src/share/vm/code/nmethod.cpp b/hotspot/src/share/vm/code/nmethod.cpp index 6baa28690db..ff5985f1e2a 100644 --- a/hotspot/src/share/vm/code/nmethod.cpp +++ b/hotspot/src/share/vm/code/nmethod.cpp @@ -380,7 +380,7 @@ address nmethod::handler_for_exception_and_pc(Handle exception, address pc) { void nmethod::add_handler_for_exception_and_pc(Handle exception, address pc, address handler) { // There are potential race conditions during exception cache updates, so we // must own the ExceptionCache_lock before doing ANY modifications. Because - // we dont lock during reads, it is possible to have several threads attempt + // we don't lock during reads, it is possible to have several threads attempt // to update the cache with the same data. We need to check for already inserted // copies of the current data before adding it. diff --git a/hotspot/src/share/vm/code/nmethod.hpp b/hotspot/src/share/vm/code/nmethod.hpp index d2c4af89501..8305f7949d0 100644 --- a/hotspot/src/share/vm/code/nmethod.hpp +++ b/hotspot/src/share/vm/code/nmethod.hpp @@ -167,7 +167,7 @@ class nmethod : public CodeBlob { nmFlags flags; // various flags to keep track of nmethod state bool _markedForDeoptimization; // Used for stack deoptimization enum { alive = 0, - not_entrant = 1, // uncommon trap has happend but activations may still exist + not_entrant = 1, // uncommon trap has happened but activations may still exist zombie = 2, unloaded = 3 }; diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsAdaptiveSizePolicy.hpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsAdaptiveSizePolicy.hpp index 3a07470e395..b21dab7ff7a 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsAdaptiveSizePolicy.hpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsAdaptiveSizePolicy.hpp @@ -393,7 +393,7 @@ class CMSAdaptiveSizePolicy : public AdaptiveSizePolicy { // Restarts the concurrent phases timer. void concurrent_phases_resume(); - // Time begining and end of the marking phase for + // Time beginning and end of the marking phase for // a synchronous MS collection. A MS collection // that finishes in the foreground can have started // in the background. These methods capture the diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsGCAdaptivePolicyCounters.hpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsGCAdaptivePolicyCounters.hpp index 33321824520..f9054002078 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsGCAdaptivePolicyCounters.hpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsGCAdaptivePolicyCounters.hpp @@ -69,7 +69,7 @@ class CMSGCAdaptivePolicyCounters : public GCAdaptivePolicyCounters { // end of the sweep of the tenured generation. PerfVariable* _avg_cms_free_counter; // Average of the free space in the tenured generation at the - // start of the sweep of the tenured genertion. + // start of the sweep of the tenured generation. PerfVariable* _avg_cms_free_at_sweep_counter; // Average of the free space in the tenured generation at the // after any resizing of the tenured generation at the end diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp index d716797bab4..11480430f4a 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp @@ -4178,7 +4178,7 @@ bool CMSCollector::do_marking_mt(bool asynch) { // and is deferred for now; see CR# TBF. 07252005YSR. XXX assert(!CMSAbortSemantics || tsk.aborted(), "Inconsistency"); // If _restart_addr is non-NULL, a marking stack overflow - // occured; we need to do a fresh marking iteration from the + // occurred; we need to do a fresh marking iteration from the // indicated restart address. if (_foregroundGCIsActive && asynch) { // We may be running into repeated stack overflows, having @@ -4221,7 +4221,7 @@ bool CMSCollector::do_marking_st(bool asynch) { // should be incremental with periodic yields. _markBitMap.iterate(&markFromRootsClosure); // If _restart_addr is non-NULL, a marking stack overflow - // occured; we need to do a fresh iteration from the + // occurred; we need to do a fresh iteration from the // indicated restart address. while (_restart_addr != NULL) { if (_foregroundGCIsActive && asynch) { diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp index 1c6766b9947..38e49da9360 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp @@ -2513,7 +2513,7 @@ G1CollectedHeap::do_collection_pause_at_safepoint(HeapRegion* popular_region) { } save_marks(); - // We must do this before any possible evacuation that should propogate + // We must do this before any possible evacuation that should propagate // marks, including evacuation of popular objects in a popular pause. if (mark_in_progress()) { double start_time_sec = os::elapsedTime(); diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/cardTableExtension.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/cardTableExtension.cpp index cd260de6c82..8bf1a3e69f2 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/cardTableExtension.cpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/cardTableExtension.cpp @@ -78,7 +78,7 @@ class CheckForUnmarkedObjects : public ObjectClosure { } // Card marks are not precise. The current system can leave us with - // a mismash of precise marks and begining of object marks. This means + // a mismash of precise marks and beginning of object marks. This means // we test for missing precise marks first. If any are found, we don't // fail unless the object head is also unmarked. virtual void do_object(oop obj) { @@ -258,7 +258,7 @@ void CardTableExtension::scavenge_contents_parallel(ObjectStartArray* start_arra if (!start_array->object_starts_in_range(slice_start, slice_end)) { continue; } - // Update our begining addr + // Update our beginning addr HeapWord* first_object = start_array->object_start(slice_start); debug_only(oop* first_object_within_slice = (oop*) first_object;) if (first_object < slice_start) { diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/objectStartArray.hpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/objectStartArray.hpp index d587d0ae291..f44bcbbb083 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/objectStartArray.hpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/objectStartArray.hpp @@ -127,7 +127,7 @@ class ObjectStartArray : public CHeapObj { // Optimized for finding the first object that crosses into // a given block. The blocks contain the offset of the last // object in that block. Scroll backwards by one, and the first - // object hit should be at the begining of the block + // object hit should be at the beginning of the block HeapWord* object_start(HeapWord* addr) const { assert(_covered_region.contains(addr), "Must be in covered region"); jbyte* block = block_for_addr(addr); diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/prefetchQueue.hpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/prefetchQueue.hpp index 5266d67319b..7c6f86d3ff8 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/prefetchQueue.hpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/prefetchQueue.hpp @@ -26,7 +26,7 @@ // PrefetchQueue is a FIFO queue of variable length (currently 8). // // We need to examine the performance penalty of variable lengths. -// We may also want to split this into cpu dependant bits. +// We may also want to split this into cpu dependent bits. // const int PREFETCH_QUEUE_SIZE = 8; diff --git a/hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp b/hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp index a3787c8cd29..e710fd77918 100644 --- a/hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp +++ b/hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp @@ -74,7 +74,7 @@ void MutableNUMASpace::ensure_parsability() { for (int i = 0; i < lgrp_spaces()->length(); i++) { LGRPSpace *ls = lgrp_spaces()->at(i); MutableSpace *s = ls->space(); - if (s->top() < top()) { // For all spaces preceeding the one containing top() + if (s->top() < top()) { // For all spaces preceding the one containing top() if (s->free_in_words() > 0) { size_t area_touched_words = pointer_delta(s->end(), s->top()); CollectedHeap::fill_with_object(s->top(), area_touched_words); diff --git a/hotspot/src/share/vm/interpreter/abstractInterpreter.hpp b/hotspot/src/share/vm/interpreter/abstractInterpreter.hpp index 76fbb53b83c..581ddfb160b 100644 --- a/hotspot/src/share/vm/interpreter/abstractInterpreter.hpp +++ b/hotspot/src/share/vm/interpreter/abstractInterpreter.hpp @@ -22,7 +22,7 @@ * */ -// This file contains the platform-independant parts +// This file contains the platform-independent parts // of the abstract interpreter and the abstract interpreter generator. // Organization of the interpreter(s). There exists two different interpreters in hotpot diff --git a/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp b/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp index 351d29cc9cc..c9343622b65 100644 --- a/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp +++ b/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp @@ -2642,7 +2642,7 @@ handle_return: // two interpreted frames). We need to save the current arguments in C heap so that // the deoptimized frame when it restarts can copy the arguments to its expression // stack and re-execute the call. We also have to notify deoptimization that this - // has occured and to pick the preerved args copy them to the deoptimized frame's + // has occurred and to pick the preserved args copy them to the deoptimized frame's // java expression stack. Yuck. // THREAD->popframe_preserve_args(in_ByteSize(METHOD->size_of_parameters() * wordSize), diff --git a/hotspot/src/share/vm/interpreter/bytecodeInterpreter.inline.hpp b/hotspot/src/share/vm/interpreter/bytecodeInterpreter.inline.hpp index b765dcebe98..a40991d09ab 100644 --- a/hotspot/src/share/vm/interpreter/bytecodeInterpreter.inline.hpp +++ b/hotspot/src/share/vm/interpreter/bytecodeInterpreter.inline.hpp @@ -22,7 +22,7 @@ * */ -// This file holds platform-independant bodies of inline functions for the C++ based interpreter +// This file holds platform-independent bodies of inline functions for the C++ based interpreter #ifdef CC_INTERP diff --git a/hotspot/src/share/vm/interpreter/cppInterpreter.hpp b/hotspot/src/share/vm/interpreter/cppInterpreter.hpp index 9e4b87fba5a..bb61d4009eb 100644 --- a/hotspot/src/share/vm/interpreter/cppInterpreter.hpp +++ b/hotspot/src/share/vm/interpreter/cppInterpreter.hpp @@ -24,7 +24,7 @@ #ifdef CC_INTERP -// This file contains the platform-independant parts +// This file contains the platform-independent parts // of the c++ interpreter class CppInterpreter: public AbstractInterpreter { diff --git a/hotspot/src/share/vm/interpreter/cppInterpreterGenerator.hpp b/hotspot/src/share/vm/interpreter/cppInterpreterGenerator.hpp index 3ce3ce15628..b077f4224c6 100644 --- a/hotspot/src/share/vm/interpreter/cppInterpreterGenerator.hpp +++ b/hotspot/src/share/vm/interpreter/cppInterpreterGenerator.hpp @@ -22,7 +22,7 @@ * */ -// This file contains the platform-independant parts +// This file contains the platform-independent parts // of the template interpreter generator. #ifdef CC_INTERP diff --git a/hotspot/src/share/vm/interpreter/interpreter.hpp b/hotspot/src/share/vm/interpreter/interpreter.hpp index eb316c5bce7..767b748dadc 100644 --- a/hotspot/src/share/vm/interpreter/interpreter.hpp +++ b/hotspot/src/share/vm/interpreter/interpreter.hpp @@ -22,7 +22,7 @@ * */ -// This file contains the platform-independant parts +// This file contains the platform-independent parts // of the interpreter and the interpreter generator. //------------------------------------------------------------------------------------------------------------------------ diff --git a/hotspot/src/share/vm/interpreter/interpreterGenerator.hpp b/hotspot/src/share/vm/interpreter/interpreterGenerator.hpp index 791b4777ae3..cf6089c3b81 100644 --- a/hotspot/src/share/vm/interpreter/interpreterGenerator.hpp +++ b/hotspot/src/share/vm/interpreter/interpreterGenerator.hpp @@ -22,7 +22,7 @@ * */ -// This file contains the platform-independant parts +// This file contains the platform-independent parts // of the interpreter generator. diff --git a/hotspot/src/share/vm/interpreter/templateInterpreter.hpp b/hotspot/src/share/vm/interpreter/templateInterpreter.hpp index f6c89f9bd18..e6442351647 100644 --- a/hotspot/src/share/vm/interpreter/templateInterpreter.hpp +++ b/hotspot/src/share/vm/interpreter/templateInterpreter.hpp @@ -22,7 +22,7 @@ * */ -// This file contains the platform-independant parts +// This file contains the platform-independent parts // of the template interpreter and the template interpreter generator. #ifndef CC_INTERP diff --git a/hotspot/src/share/vm/interpreter/templateInterpreterGenerator.hpp b/hotspot/src/share/vm/interpreter/templateInterpreterGenerator.hpp index 452e1c534ec..52425a04538 100644 --- a/hotspot/src/share/vm/interpreter/templateInterpreterGenerator.hpp +++ b/hotspot/src/share/vm/interpreter/templateInterpreterGenerator.hpp @@ -22,7 +22,7 @@ * */ -// This file contains the platform-independant parts +// This file contains the platform-independent parts // of the template interpreter generator. #ifndef CC_INTERP diff --git a/hotspot/src/share/vm/libadt/dict.cpp b/hotspot/src/share/vm/libadt/dict.cpp index 003dd6a4f05..5620f15c54b 100644 --- a/hotspot/src/share/vm/libadt/dict.cpp +++ b/hotspot/src/share/vm/libadt/dict.cpp @@ -306,7 +306,7 @@ void Dict::print() { // Convert string to hash key. This algorithm implements a universal hash // function with the multipliers frozen (ok, so it's not universal). The // multipliers (and allowable characters) are all odd, so the resultant sum -// is odd - guarenteed not divisible by any power of two, so the hash tables +// is odd - guaranteed not divisible by any power of two, so the hash tables // can be any power of two with good results. Also, I choose multipliers // that have only 2 bits set (the low is always set to be odd) so // multiplication requires only shifts and adds. Characters are required to @@ -326,7 +326,7 @@ int hashstr(const void *t) { } //------------------------------hashptr-------------------------------------- -// Slimey cheap hash function; no guarenteed performance. Better than the +// Slimey cheap hash function; no guaranteed performance. Better than the // default for pointers, especially on MS-DOS machines. int hashptr(const void *key) { #ifdef __TURBOC__ @@ -336,7 +336,7 @@ int hashptr(const void *key) { #endif } -// Slimey cheap hash function; no guarenteed performance. +// Slimey cheap hash function; no guaranteed performance. int hashkey(const void *key) { return (intptr_t)key; } diff --git a/hotspot/src/share/vm/libadt/dict.hpp b/hotspot/src/share/vm/libadt/dict.hpp index 93f86829e09..a3553ed873e 100644 --- a/hotspot/src/share/vm/libadt/dict.hpp +++ b/hotspot/src/share/vm/libadt/dict.hpp @@ -86,10 +86,10 @@ class Dict : public ResourceObj { // Dictionary structure // Hashing functions int hashstr(const void *s); // Nice string hash -// Slimey cheap hash function; no guarenteed performance. Better than the +// Slimey cheap hash function; no guaranteed performance. Better than the // default for pointers, especially on MS-DOS machines. int hashptr(const void *key); -// Slimey cheap hash function; no guarenteed performance. +// Slimey cheap hash function; no guaranteed performance. int hashkey(const void *key); // Key comparators diff --git a/hotspot/src/share/vm/memory/filemap.cpp b/hotspot/src/share/vm/memory/filemap.cpp index b68f94c0aeb..2f317bf77d8 100644 --- a/hotspot/src/share/vm/memory/filemap.cpp +++ b/hotspot/src/share/vm/memory/filemap.cpp @@ -35,14 +35,14 @@ extern address JVM_FunctionAtStart(); extern address JVM_FunctionAtEnd(); -// Complain and stop. All error conditions occuring during the writing of +// Complain and stop. All error conditions occurring during the writing of // an archive file should stop the process. Unrecoverable errors during // the reading of the archive file should stop the process. static void fail(const char *msg, va_list ap) { // This occurs very early during initialization: tty is not initialized. jio_fprintf(defaultStream::error_stream(), - "An error has occured while processing the" + "An error has occurred while processing the" " shared archive file.\n"); jio_vfprintf(defaultStream::error_stream(), msg, ap); jio_fprintf(defaultStream::error_stream(), "\n"); diff --git a/hotspot/src/share/vm/memory/permGen.hpp b/hotspot/src/share/vm/memory/permGen.hpp index 454b10f7986..1b57828499e 100644 --- a/hotspot/src/share/vm/memory/permGen.hpp +++ b/hotspot/src/share/vm/memory/permGen.hpp @@ -36,7 +36,7 @@ class PermGen : public CHeapObj { friend class VMStructs; protected: size_t _capacity_expansion_limit; // maximum expansion allowed without a - // full gc occuring + // full gc occurring HeapWord* mem_allocate_in_gen(size_t size, Generation* gen); diff --git a/hotspot/src/share/vm/oops/generateOopMap.cpp b/hotspot/src/share/vm/oops/generateOopMap.cpp index 4a9741c0fc8..5828a6d3783 100644 --- a/hotspot/src/share/vm/oops/generateOopMap.cpp +++ b/hotspot/src/share/vm/oops/generateOopMap.cpp @@ -2003,7 +2003,7 @@ void GenerateOopMap::print_time() { // ============ Main Entry Point =========== // GenerateOopMap::GenerateOopMap(methodHandle method) { - // We have to initialize all variables here, that can be queried direcly + // We have to initialize all variables here, that can be queried directly _method = method; _max_locals=0; _init_vars = NULL; diff --git a/hotspot/src/share/vm/oops/generateOopMap.hpp b/hotspot/src/share/vm/oops/generateOopMap.hpp index 432902ef362..00057d574b5 100644 --- a/hotspot/src/share/vm/oops/generateOopMap.hpp +++ b/hotspot/src/share/vm/oops/generateOopMap.hpp @@ -292,7 +292,7 @@ class GenerateOopMap VALUE_OBJ_CLASS_SPEC { int _max_stack; // Cached value of max. stack depth int _max_monitors; // Cached value of max. monitor stack depth int _has_exceptions; // True, if exceptions exist for method - bool _got_error; // True, if an error occured during interpretation. + bool _got_error; // True, if an error occurred during interpretation. Handle _exception; // Exception if got_error is true. bool _did_rewriting; // was bytecodes rewritten bool _did_relocation; // was relocation neccessary @@ -422,7 +422,7 @@ class GenerateOopMap VALUE_OBJ_CLASS_SPEC { void add_to_ref_init_set (int localNo); // Conflicts rewrite logic - bool _conflict; // True, if a conflict occured during interpretation + bool _conflict; // True, if a conflict occurred during interpretation int _nof_refval_conflicts; // No. of conflicts that require rewrites int * _new_var_map; diff --git a/hotspot/src/share/vm/oops/instanceKlass.cpp b/hotspot/src/share/vm/oops/instanceKlass.cpp index 7a2d3408747..12adb12aba6 100644 --- a/hotspot/src/share/vm/oops/instanceKlass.cpp +++ b/hotspot/src/share/vm/oops/instanceKlass.cpp @@ -1917,7 +1917,7 @@ methodOop instanceKlass::method_at_itable(klassOop holder, int index, TRAPS) { / itableOffsetEntry::size(); for (int cnt = 0 ; ; cnt ++, ioe ++) { - // If the interface isn't implemented by the reciever class, + // If the interface isn't implemented by the receiver class, // the VM should throw IncompatibleClassChangeError. if (cnt >= nof_interfaces) { THROW_OOP_0(vmSymbols::java_lang_IncompatibleClassChangeError()); diff --git a/hotspot/src/share/vm/oops/klass.cpp b/hotspot/src/share/vm/oops/klass.cpp index a028f65bb4e..63a342e5b67 100644 --- a/hotspot/src/share/vm/oops/klass.cpp +++ b/hotspot/src/share/vm/oops/klass.cpp @@ -71,7 +71,7 @@ Klass *Klass::up_cast_abstract() { return r; // Return the 1 concrete class } -// Find LCA in class heirarchy +// Find LCA in class hierarchy Klass *Klass::LCA( Klass *k2 ) { Klass *k1 = this; while( 1 ) { diff --git a/hotspot/src/share/vm/oops/klass.hpp b/hotspot/src/share/vm/oops/klass.hpp index 881da970d03..7fac5288670 100644 --- a/hotspot/src/share/vm/oops/klass.hpp +++ b/hotspot/src/share/vm/oops/klass.hpp @@ -471,7 +471,7 @@ class Klass : public Klass_vtbl { } bool search_secondary_supers(klassOop k) const; - // Find LCA in class heirarchy + // Find LCA in class hierarchy Klass *LCA( Klass *k ); // Check whether reflection/jni/jvm code is allowed to instantiate this class; diff --git a/hotspot/src/share/vm/oops/methodOop.hpp b/hotspot/src/share/vm/oops/methodOop.hpp index 8b03a68380a..d266c9a3377 100644 --- a/hotspot/src/share/vm/oops/methodOop.hpp +++ b/hotspot/src/share/vm/oops/methodOop.hpp @@ -296,7 +296,7 @@ class methodOopDesc : public oopDesc { void set_compiled_invocation_count(int count) { _compiled_invocation_count = count; } #endif // not PRODUCT - // Clear (non-shared space) pointers which could not be relevent + // Clear (non-shared space) pointers which could not be relevant // if this (shared) method were mapped into another JVM. void remove_unshareable_info(); diff --git a/hotspot/src/share/vm/opto/block.cpp b/hotspot/src/share/vm/opto/block.cpp index 28400047756..4749dc34dd5 100644 --- a/hotspot/src/share/vm/opto/block.cpp +++ b/hotspot/src/share/vm/opto/block.cpp @@ -181,7 +181,7 @@ int Block::is_Empty() const { } //------------------------------has_uncommon_code------------------------------ -// Return true if the block's code implies that it is not likely to be +// Return true if the block's code implies that it is likely to be // executed infrequently. Check to see if the block ends in a Halt or // a low probability call. bool Block::has_uncommon_code() const { @@ -1311,7 +1311,7 @@ void PhaseBlockLayout::merge_traces(bool fall_thru_only) } } else if (e->state() == CFGEdge::open) { // Append traces, even without a fall-thru connection. - // But leave root entry at the begining of the block list. + // But leave root entry at the beginning of the block list. if (targ_trace != trace(_cfg._broot)) { e->set_state(CFGEdge::connected); src_trace->append(targ_trace); @@ -1434,7 +1434,7 @@ bool Trace::backedge(CFGEdge *e) { } // Backbranch to the top of a trace - // Scroll foward through the trace from the targ_block. If we find + // Scroll forward through the trace from the targ_block. If we find // a loop head before another loop top, use the the loop head alignment. for (Block *b = targ_block; b != NULL; b = next(b)) { if (b->has_loop_alignment()) { diff --git a/hotspot/src/share/vm/opto/block.hpp b/hotspot/src/share/vm/opto/block.hpp index f678983ddaf..f4c46ba2a50 100644 --- a/hotspot/src/share/vm/opto/block.hpp +++ b/hotspot/src/share/vm/opto/block.hpp @@ -609,7 +609,7 @@ class Trace : public ResourceObj { Block * next(Block *b) const { return _next_list[b->_pre_order]; } void set_next(Block *b, Block *n) const { _next_list[b->_pre_order] = n; } - // Return the block that preceeds "b" in the trace. + // Return the block that precedes "b" in the trace. Block * prev(Block *b) const { return _prev_list[b->_pre_order]; } void set_prev(Block *b, Block *p) const { _prev_list[b->_pre_order] = p; } diff --git a/hotspot/src/share/vm/opto/buildOopMap.cpp b/hotspot/src/share/vm/opto/buildOopMap.cpp index 30a9d2684d0..4a8612687f0 100644 --- a/hotspot/src/share/vm/opto/buildOopMap.cpp +++ b/hotspot/src/share/vm/opto/buildOopMap.cpp @@ -55,7 +55,7 @@ // breadth-first approach but it was worse (showed O(n^2) in the // pick-next-block code). // -// The relevent data is kept in a struct of arrays (it could just as well be +// The relevant data is kept in a struct of arrays (it could just as well be // an array of structs, but the struct-of-arrays is generally a little more // efficient). The arrays are indexed by register number (including // stack-slots as registers) and so is bounded by 200 to 300 elements in diff --git a/hotspot/src/share/vm/opto/cfgnode.cpp b/hotspot/src/share/vm/opto/cfgnode.cpp index e29cc0d58e3..139672ed725 100644 --- a/hotspot/src/share/vm/opto/cfgnode.cpp +++ b/hotspot/src/share/vm/opto/cfgnode.cpp @@ -1350,7 +1350,7 @@ static void split_once(PhaseIterGVN *igvn, Node *phi, Node *val, Node *n, Node * } // Register the new node but do not transform it. Cannot transform until the - // entire Region/Phi conglerate has been hacked as a single huge transform. + // entire Region/Phi conglomerate has been hacked as a single huge transform. igvn->register_new_node_with_optimizer( newn ); // Now I can point to the new node. n->add_req(newn); @@ -1381,7 +1381,7 @@ static Node* split_flow_path(PhaseGVN *phase, PhiNode *phi) { Node *val = phi->in(i); // Constant to split for uint hit = 0; // Number of times it occurs - for( ; i < phi->req(); i++ ){ // Count occurances of constant + for( ; i < phi->req(); i++ ){ // Count occurrences of constant Node *n = phi->in(i); if( !n ) return NULL; if( phase->type(n) == Type::TOP ) return NULL; @@ -1423,7 +1423,7 @@ static Node* split_flow_path(PhaseGVN *phase, PhiNode *phi) { //============================================================================= //------------------------------simple_data_loop_check------------------------- -// Try to determing if the phi node in a simple safe/unsafe data loop. +// Try to determining if the phi node in a simple safe/unsafe data loop. // Returns: // enum LoopSafety { Safe = 0, Unsafe, UnsafeLoop }; // Safe - safe case when the phi and it's inputs reference only safe data @@ -1687,7 +1687,7 @@ Node *PhiNode::Ideal(PhaseGVN *phase, bool can_reshape) { progress = phase->C->top(); break; } - // If tranformed to a MergeMem, get the desired slice + // If transformed to a MergeMem, get the desired slice // Otherwise the returned node represents memory for every slice Node *new_mem = (m->is_MergeMem()) ? m->as_MergeMem()->memory_at(alias_idx) : m; @@ -1962,7 +1962,7 @@ const Type *CatchNode::Value( PhaseTransform *phase ) const { f[CatchProjNode::fall_through_index] = Type::TOP; } else if( call->req() > TypeFunc::Parms ) { const Type *arg0 = phase->type( call->in(TypeFunc::Parms) ); - // Check for null reciever to virtual or interface calls + // Check for null receiver to virtual or interface calls if( call->is_CallDynamicJava() && arg0->higher_equal(TypePtr::NULL_PTR) ) { f[CatchProjNode::fall_through_index] = Type::TOP; @@ -1995,7 +1995,7 @@ Node *CatchProjNode::Identity( PhaseTransform *phase ) { // also remove any exception table entry. Thus we must know the call // feeding the Catch will not really throw an exception. This is ok for // the main fall-thru control (happens when we know a call can never throw - // an exception) or for "rethrow", because a further optimnization will + // an exception) or for "rethrow", because a further optimization will // yank the rethrow (happens when we inline a function that can throw an // exception and the caller has no handler). Not legal, e.g., for passing // a NULL receiver to a v-call, or passing bad types to a slow-check-cast. diff --git a/hotspot/src/share/vm/opto/chaitin.cpp b/hotspot/src/share/vm/opto/chaitin.cpp index 82558d8f577..363db91175c 100644 --- a/hotspot/src/share/vm/opto/chaitin.cpp +++ b/hotspot/src/share/vm/opto/chaitin.cpp @@ -1246,7 +1246,7 @@ uint PhaseChaitin::Select( ) { // If the live range is not bound, then we actually had some choices // to make. In this case, the mask has more bits in it than the colors - // choosen. Restrict the mask to just what was picked. + // chosen. Restrict the mask to just what was picked. if( lrg->num_regs() == 1 ) { // Size 1 live range lrg->Clear(); // Clear the mask lrg->Insert(reg); // Set regmask to match selected reg diff --git a/hotspot/src/share/vm/opto/chaitin.hpp b/hotspot/src/share/vm/opto/chaitin.hpp index 307d6110c04..bbf828d590c 100644 --- a/hotspot/src/share/vm/opto/chaitin.hpp +++ b/hotspot/src/share/vm/opto/chaitin.hpp @@ -327,7 +327,7 @@ class PhaseChaitin : public PhaseRegAlloc { // True if lidx is used before any real register is def'd in the block bool prompt_use( Block *b, uint lidx ); Node *get_spillcopy_wide( Node *def, Node *use, uint uidx ); - // Insert the spill at chosen location. Skip over any interveneing Proj's or + // Insert the spill at chosen location. Skip over any intervening Proj's or // Phis. Skip over a CatchNode and projs, inserting in the fall-through block // instead. Update high-pressure indices. Create a new live range. void insert_proj( Block *b, uint i, Node *spill, uint maxlrg ); @@ -431,7 +431,7 @@ private: void Simplify(); // Select colors by re-inserting edges into the IFG. - // Return TRUE if any spills occured. + // Return TRUE if any spills occurred. uint Select( ); // Helper function for select which allows biased coloring OptoReg::Name choose_color( LRG &lrg, int chunk ); diff --git a/hotspot/src/share/vm/opto/coalesce.cpp b/hotspot/src/share/vm/opto/coalesce.cpp index 7d9ab008398..52c00992719 100644 --- a/hotspot/src/share/vm/opto/coalesce.cpp +++ b/hotspot/src/share/vm/opto/coalesce.cpp @@ -123,7 +123,7 @@ void PhaseChaitin::new_lrg( const Node *x, uint lrg ) { } //------------------------------clone_projs------------------------------------ -// After cloning some rematierialized instruction, clone any MachProj's that +// After cloning some rematerialized instruction, clone any MachProj's that // follow it. Example: Intel zero is XOR, kills flags. Sparc FP constants // use G3 as an address temp. int PhaseChaitin::clone_projs( Block *b, uint idx, Node *con, Node *copy, uint &maxlrg ) { @@ -694,8 +694,8 @@ uint PhaseConservativeCoalesce::compute_separating_interferences(Node *dst_copy, } // End of if not infinite-stack neighbor } // End of if actually inserted } // End of if live range overlaps - } // End of else collect intereferences for 1 node - } // End of while forever, scan back for intereferences + } // End of else collect interferences for 1 node + } // End of while forever, scan back for interferences return reg_degree; } @@ -786,7 +786,7 @@ bool PhaseConservativeCoalesce::copy_copy( Node *dst_copy, Node *src_copy, Block if( rm_size == 0 ) return false; // Another early bail-out test is when we are double-coalescing and the - // 2 copies are seperated by some control flow. + // 2 copies are separated by some control flow. if( dst_copy != src_copy ) { Block *src_b = _phc._cfg._bbs[src_copy->_idx]; Block *b2 = b; diff --git a/hotspot/src/share/vm/opto/compile.cpp b/hotspot/src/share/vm/opto/compile.cpp index 7c6f751f8ff..5790af4c6e1 100644 --- a/hotspot/src/share/vm/opto/compile.cpp +++ b/hotspot/src/share/vm/opto/compile.cpp @@ -337,7 +337,7 @@ void Compile::print_compile_messages() { tty->print_cr("*********************************************************"); } if (env()->break_at_compile()) { - // Open the debugger when compiing this method. + // Open the debugger when compiling this method. tty->print("### Breaking when compiling: "); method()->print_short_name(); tty->cr(); @@ -1191,8 +1191,8 @@ const TypePtr *Compile::flatten_alias_type( const TypePtr *tj ) const { default: ShouldNotReachHere(); } break; - case 2: // No collasping at level 2; keep all splits - case 3: // No collasping at level 3; keep all splits + case 2: // No collapsing at level 2; keep all splits + case 3: // No collapsing at level 3; keep all splits break; default: Unimplemented(); @@ -2102,7 +2102,7 @@ static void final_graph_reshaping_impl( Node *n, Final_Reshape_Counts &fpu ) { // [base_reg + offset] // NullCheck base_reg // - // Pin the new DecodeN node to non-null path on these patforms (Sparc) + // Pin the new DecodeN node to non-null path on these platform (Sparc) // to keep the information to which NULL check the new DecodeN node // corresponds to use it as value in implicit_null_check(). // diff --git a/hotspot/src/share/vm/opto/connode.cpp b/hotspot/src/share/vm/opto/connode.cpp index 7e1cafefa57..d46b6d4e952 100644 --- a/hotspot/src/share/vm/opto/connode.cpp +++ b/hotspot/src/share/vm/opto/connode.cpp @@ -71,7 +71,7 @@ testing. to figure out which test post-dominates. The real problem is that it doesn't matter which one you pick. After you pick up, the dominating-test elider in IGVN can remove the test and allow you to hoist up to the dominating test on -the choosen oop bypassing the test on the not-choosen oop. Seen in testing. +the chosen oop bypassing the test on the not-chosen oop. Seen in testing. Oops. (3) Leave the CastPP's in. This makes the graph more accurate in some sense; diff --git a/hotspot/src/share/vm/opto/divnode.cpp b/hotspot/src/share/vm/opto/divnode.cpp index 67cad067960..55350e11f66 100644 --- a/hotspot/src/share/vm/opto/divnode.cpp +++ b/hotspot/src/share/vm/opto/divnode.cpp @@ -35,7 +35,7 @@ // by constant into a multiply/shift/add series. Return false if calculations // fail. // -// Borrowed almost verbatum from Hacker's Delight by Henry S. Warren, Jr. with +// Borrowed almost verbatim from Hacker's Delight by Henry S. Warren, Jr. with // minor type name and parameter changes. static bool magic_int_divide_constants(jint d, jint &M, jint &s) { int32_t p; @@ -202,7 +202,7 @@ static Node *transform_int_divide( PhaseGVN *phase, Node *dividend, jint divisor // by constant into a multiply/shift/add series. Return false if calculations // fail. // -// Borrowed almost verbatum from Hacker's Delight by Henry S. Warren, Jr. with +// Borrowed almost verbatim from Hacker's Delight by Henry S. Warren, Jr. with // minor type name and parameter changes. Adjusted to 64 bit word width. static bool magic_long_divide_constants(jlong d, jlong &M, jint &s) { int64_t p; @@ -1069,7 +1069,7 @@ Node *ModLNode::Ideal(PhaseGVN *phase, bool can_reshape) { int log2_con = -1; - // If this is a power of two, they maybe we can mask it + // If this is a power of two, then maybe we can mask it if( is_power_of_2_long(pos_con) ) { log2_con = log2_long(pos_con); diff --git a/hotspot/src/share/vm/opto/domgraph.cpp b/hotspot/src/share/vm/opto/domgraph.cpp index 2ef02fd0cec..af198e3c71f 100644 --- a/hotspot/src/share/vm/opto/domgraph.cpp +++ b/hotspot/src/share/vm/opto/domgraph.cpp @@ -183,7 +183,7 @@ class Block_Stack { if (pre_order == 1) t->_parent = NULL; // first block doesn't have parent else { - // Save parent (currernt top block on stack) in DFS + // Save parent (current top block on stack) in DFS t->_parent = &_tarjan[_stack_top->block->_pre_order]; } // Now put this block on stack diff --git a/hotspot/src/share/vm/opto/escape.cpp b/hotspot/src/share/vm/opto/escape.cpp index 2606d0df82a..c9ddc95dcfb 100644 --- a/hotspot/src/share/vm/opto/escape.cpp +++ b/hotspot/src/share/vm/opto/escape.cpp @@ -515,7 +515,7 @@ bool ConnectionGraph::split_AddP(Node *addp, Node *base, PhaseGVN *igvn) { // cause the failure in add_offset() with narrow oops since TypeOopPtr() // constructor verifies correctness of the offset. // - // It could happend on subclass's branch (from the type profiling + // It could happened on subclass's branch (from the type profiling // inlining) which was not eliminated during parsing since the exactness // of the allocation type was not propagated to the subclass type check. // @@ -703,7 +703,7 @@ Node* ConnectionGraph::find_inst_mem(Node *orig_mem, int alias_idx, GrowableArra while (prev != result) { prev = result; if (result == start_mem) - break; // hit one of our sentinals + break; // hit one of our sentinels if (result->is_Mem()) { const Type *at = phase->type(result->in(MemNode::Address)); if (at != Type::TOP) { @@ -720,7 +720,7 @@ Node* ConnectionGraph::find_inst_mem(Node *orig_mem, int alias_idx, GrowableArra if (result->is_Proj() && result->as_Proj()->_con == TypeFunc::Memory) { Node *proj_in = result->in(0); if (proj_in->is_Allocate() && proj_in->_idx == (uint)tinst->instance_id()) { - break; // hit one of our sentinals + break; // hit one of our sentinels } else if (proj_in->is_Call()) { CallNode *call = proj_in->as_Call(); if (!call->may_modify(tinst, phase)) { @@ -804,7 +804,7 @@ Node* ConnectionGraph::find_inst_mem(Node *orig_mem, int alias_idx, GrowableArra // Phase 2: Process MemNode's from memnode_worklist. compute new address type and // search the Memory chain for a store with the appropriate type // address type. If a Phi is found, create a new version with -// the approriate memory slices from each of the Phi inputs. +// the appropriate memory slices from each of the Phi inputs. // For stores, process the users as follows: // MemNode: push on memnode_worklist // MergeMem: push on mergemem_worklist @@ -1558,7 +1558,7 @@ bool ConnectionGraph::compute_escape() { has_non_escaping_obj = true; // Non GlobalEscape Node* n = ptn->_node; if (n->is_Allocate() && ptn->_scalar_replaceable ) { - // Push scalar replaceable alocations on alloc_worklist + // Push scalar replaceable allocations on alloc_worklist // for processing in split_unique_types(). alloc_worklist.append(n); } diff --git a/hotspot/src/share/vm/opto/gcm.cpp b/hotspot/src/share/vm/opto/gcm.cpp index 65c63339e29..27ccc8126df 100644 --- a/hotspot/src/share/vm/opto/gcm.cpp +++ b/hotspot/src/share/vm/opto/gcm.cpp @@ -606,7 +606,7 @@ Block* PhaseCFG::insert_anti_dependences(Block* LCA, Node* load, bool verify) { if (pred_block != early) { // If any predecessor of the Phi matches the load's "early block", // we do not need a precedence edge between the Phi and 'load' - // since the load will be forced into a block preceeding the Phi. + // since the load will be forced into a block preceding the Phi. pred_block->set_raise_LCA_mark(load_index); assert(!LCA_orig->dominates(pred_block) || early->dominates(pred_block), "early is high enough"); @@ -1399,7 +1399,7 @@ void PhaseCFG::Estimate_Block_Frequency() { #ifdef ASSERT for (uint i = 0; i < _num_blocks; i++ ) { Block *b = _blocks[i]; - assert(b->_freq >= MIN_BLOCK_FREQUENCY, "Register Allocator requiers meaningful block frequency"); + assert(b->_freq >= MIN_BLOCK_FREQUENCY, "Register Allocator requires meaningful block frequency"); } #endif @@ -1652,7 +1652,7 @@ float Block::succ_prob(uint i) { // successor blocks. assert(_num_succs == 2, "expecting 2 successors of a null check"); // If either successor has only one predecessor, then the - // probabiltity estimate can be derived using the + // probability estimate can be derived using the // relative frequency of the successor and this block. if (_succs[i]->num_preds() == 2) { return _succs[i]->_freq / _freq; @@ -1854,7 +1854,7 @@ void Block::update_uncommon_branch(Block* ub) { } //------------------------------update_succ_freq------------------------------- -// Update the appropriate frequency associated with block 'b', a succesor of +// Update the appropriate frequency associated with block 'b', a successor of // a block in this loop. void CFGLoop::update_succ_freq(Block* b, float freq) { if (b->_loop == this) { diff --git a/hotspot/src/share/vm/opto/graphKit.cpp b/hotspot/src/share/vm/opto/graphKit.cpp index c0cb4ba0132..e81e0075340 100644 --- a/hotspot/src/share/vm/opto/graphKit.cpp +++ b/hotspot/src/share/vm/opto/graphKit.cpp @@ -1148,7 +1148,7 @@ Node* GraphKit::null_check_common(Node* value, BasicType type, Node *tst = _gvn.transform( btst ); //----------- - // if peephole optimizations occured, a prior test existed. + // if peephole optimizations occurred, a prior test existed. // If a prior test existed, maybe it dominates as we can avoid this test. if (tst != btst && type == T_OBJECT) { // At this point we want to scan up the CFG to see if we can @@ -1196,7 +1196,7 @@ Node* GraphKit::null_check_common(Node* value, BasicType type, // Consider using 'Reason_class_check' instead? // To cause an implicit null check, we set the not-null probability - // to the maximum (PROB_MAX). For an explicit check the probablity + // to the maximum (PROB_MAX). For an explicit check the probability // is set to a smaller value. if (null_control != NULL || too_many_traps(reason)) { // probability is less likely diff --git a/hotspot/src/share/vm/opto/ifg.cpp b/hotspot/src/share/vm/opto/ifg.cpp index b3250513d7a..d5b7dc9b493 100644 --- a/hotspot/src/share/vm/opto/ifg.cpp +++ b/hotspot/src/share/vm/opto/ifg.cpp @@ -292,7 +292,7 @@ void PhaseIFG::verify( const PhaseChaitin *pc ) const { //------------------------------interfere_with_live---------------------------- // Interfere this register with everything currently live. Use the RegMasks // to trim the set of possible interferences. Return a count of register-only -// inteferences as an estimate of register pressure. +// interferences as an estimate of register pressure. void PhaseChaitin::interfere_with_live( uint r, IndexSet *liveout ) { uint retval = 0; // Interfere with everything live. diff --git a/hotspot/src/share/vm/opto/ifnode.cpp b/hotspot/src/share/vm/opto/ifnode.cpp index 4f230765ab8..38fab34a50d 100644 --- a/hotspot/src/share/vm/opto/ifnode.cpp +++ b/hotspot/src/share/vm/opto/ifnode.cpp @@ -81,7 +81,7 @@ static Node* split_if(IfNode *iff, PhaseIterGVN *igvn) { uint i4; for( i4 = 1; i4 < phi->req(); i4++ ) { con1 = phi->in(i4); - if( !con1 ) return NULL; // Do not optimize partially collaped merges + if( !con1 ) return NULL; // Do not optimize partially collapsed merges if( con1->is_Con() ) break; // Found a constant // Also allow null-vs-not-null checks const TypePtr *tp = igvn->type(con1)->isa_ptr(); @@ -204,7 +204,7 @@ static Node* split_if(IfNode *iff, PhaseIterGVN *igvn) { // T F T F T F // ..s.. ..t .. ..s.. ..t.. ..s.. ..t.. // - // Split the paths coming into the merge point into 2 seperate groups of + // Split the paths coming into the merge point into 2 separate groups of // merges. On the left will be all the paths feeding constants into the // Cmp's Phi. On the right will be the remaining paths. The Cmp's Phi // will fold up into a constant; this will let the Cmp fold up as well as @@ -236,7 +236,7 @@ static Node* split_if(IfNode *iff, PhaseIterGVN *igvn) { } // Register the new RegionNodes but do not transform them. Cannot - // transform until the entire Region/Phi conglerate has been hacked + // transform until the entire Region/Phi conglomerate has been hacked // as a single huge transform. igvn->register_new_node_with_optimizer( region_c ); igvn->register_new_node_with_optimizer( region_x ); @@ -599,7 +599,7 @@ const TypeInt* IfNode::filtered_int_type(PhaseGVN* gvn, Node *val, Node* if_proj //------------------------------fold_compares---------------------------- // See if a pair of CmpIs can be converted into a CmpU. In some cases -// the direction of this if is determined by the preciding if so it +// the direction of this if is determined by the preceding if so it // can be eliminate entirely. Given an if testing (CmpI n c) check // for an immediately control dependent if that is testing (CmpI n c2) // and has one projection leading to this if and the other projection @@ -811,7 +811,7 @@ Node *IfNode::Ideal(PhaseGVN *phase, bool can_reshape) { // Try to remove extra range checks. All 'up_one_dom' gives up at merges // so all checks we inspect post-dominate the top-most check we find. // If we are going to fail the current check and we reach the top check - // then we are guarenteed to fail, so just start interpreting there. + // then we are guaranteed to fail, so just start interpreting there. // We 'expand' the top 2 range checks to include all post-dominating // checks. diff --git a/hotspot/src/share/vm/opto/library_call.cpp b/hotspot/src/share/vm/opto/library_call.cpp index 17a5c1f79d1..6cbcee84b51 100644 --- a/hotspot/src/share/vm/opto/library_call.cpp +++ b/hotspot/src/share/vm/opto/library_call.cpp @@ -992,7 +992,7 @@ bool LibraryCallKit::inline_string_indexOf() { Node *argument = pop(); // pop non-receiver first: it was pushed second Node *receiver = pop(); - // don't intrinsify is argument isn't a constant string. + // don't intrinsify if argument isn't a constant string. if (!argument->is_Con()) { return false; } @@ -1267,7 +1267,7 @@ bool LibraryCallKit::inline_pow(vmIntrinsics::ID id) { // result = DPow(x,y); // } // if (result != result)? { - // ucommon_trap(); + // uncommon_trap(); // } // return result; @@ -1324,7 +1324,7 @@ bool LibraryCallKit::inline_pow(vmIntrinsics::ID id) { // Check if (y isn't int) then go to slow path Node *bol2 = _gvn.transform( new (C, 2) BoolNode( cmpinty, BoolTest::ne ) ); - // Branch eith way + // Branch either way IfNode *if2 = create_and_xform_if(complex_path,bol2, PROB_STATIC_INFREQUENT, COUNT_UNKNOWN); Node *slow_path = opt_iff(r,if2); // Set region path 2 @@ -1715,8 +1715,8 @@ inline Node* LibraryCallKit::make_unsafe_address(Node* base, Node* offset) { } //----------------------------inline_reverseBytes_int/long------------------- -// inline Int.reverseBytes(int) -// inline Long.reverseByes(long) +// inline Integer.reverseBytes(int) +// inline Long.reverseBytes(long) bool LibraryCallKit::inline_reverseBytes(vmIntrinsics::ID id) { assert(id == vmIntrinsics::_reverseBytes_i || id == vmIntrinsics::_reverseBytes_l, "not reverse Bytes"); if (id == vmIntrinsics::_reverseBytes_i && !Matcher::has_match_rule(Op_ReverseBytesI)) return false; @@ -1915,7 +1915,7 @@ bool LibraryCallKit::inline_unsafe_access(bool is_native_ptr, bool is_store, Bas // addition to memory membars when is_volatile. This is a little // too strong, but avoids the need to insert per-alias-type // volatile membars (for stores; compare Parse::do_put_xxx), which - // we cannot do effctively here because we probably only have a + // we cannot do effectively here because we probably only have a // rough approximation of type. need_mem_bar = true; // For Stores, place a memory ordering barrier now. @@ -2099,7 +2099,7 @@ bool LibraryCallKit::inline_unsafe_CAS(BasicType type) { // overly confusing. (This is a true fact! I originally combined // them, but even I was confused by it!) As much code/comments as // possible are retained from inline_unsafe_access though to make - // the correspondances clearer. - dl + // the correspondences clearer. - dl if (callee()->is_static()) return false; // caller must have the capability! @@ -2166,7 +2166,7 @@ bool LibraryCallKit::inline_unsafe_CAS(BasicType type) { int alias_idx = C->get_alias_index(adr_type); // Memory-model-wise, a CAS acts like a little synchronized block, - // so needs barriers on each side. These don't't translate into + // so needs barriers on each side. These don't translate into // actual barriers on most machines, but we still need rest of // compiler to respect ordering. @@ -3208,7 +3208,7 @@ bool LibraryCallKit::inline_native_hashcode(bool is_virtual, bool is_static) { Node *hash_shift = _gvn.intcon(markOopDesc::hash_shift); Node *hshifted_header= _gvn.transform( new (C, 3) URShiftXNode(header, hash_shift) ); // This hack lets the hash bits live anywhere in the mark object now, as long - // as the shift drops the relevent bits into the low 32 bits. Note that + // as the shift drops the relevant bits into the low 32 bits. Note that // Java spec says that HashCode is an int so there's no point in capturing // an 'X'-sized hashcode (32 in 32-bit build or 64 in 64-bit build). hshifted_header = ConvX2I(hshifted_header); @@ -3255,7 +3255,7 @@ bool LibraryCallKit::inline_native_hashcode(bool is_virtual, bool is_static) { } //---------------------------inline_native_getClass---------------------------- -// Build special case code for calls to hashCode on an object. +// Build special case code for calls to getClass on an object. bool LibraryCallKit::inline_native_getClass() { Node* obj = null_check_receiver(callee()); if (stopped()) return true; @@ -4594,7 +4594,7 @@ LibraryCallKit::generate_arraycopy(const TypePtr* adr_type, } // The memory edges above are precise in order to model effects around - // array copyies accurately to allow value numbering of field loads around + // array copies accurately to allow value numbering of field loads around // arraycopy. Such field loads, both before and after, are common in Java // collections and similar classes involving header/array data structures. // diff --git a/hotspot/src/share/vm/opto/live.cpp b/hotspot/src/share/vm/opto/live.cpp index d2ff515058c..e9aa3815c13 100644 --- a/hotspot/src/share/vm/opto/live.cpp +++ b/hotspot/src/share/vm/opto/live.cpp @@ -39,7 +39,7 @@ // Leftover bits become the new live-in for the predecessor block, and the pred // block is put on the worklist. // The locally live-in stuff is computed once and added to predecessor -// live-out sets. This seperate compilation is done in the outer loop below. +// live-out sets. This separate compilation is done in the outer loop below. PhaseLive::PhaseLive( const PhaseCFG &cfg, LRG_List &names, Arena *arena ) : Phase(LIVE), _cfg(cfg), _names(names), _arena(arena), _live(0) { } diff --git a/hotspot/src/share/vm/opto/locknode.cpp b/hotspot/src/share/vm/opto/locknode.cpp index 0099284a701..f6a01222117 100644 --- a/hotspot/src/share/vm/opto/locknode.cpp +++ b/hotspot/src/share/vm/opto/locknode.cpp @@ -121,7 +121,7 @@ void Parse::do_monitor_exit() { kill_dead_locals(); pop(); // Pop oop to unlock - // Because monitors are guarenteed paired (else we bail out), we know + // Because monitors are guaranteed paired (else we bail out), we know // the matching Lock for this Unlock. Hence we know there is no need // for a null check on Unlock. shared_unlock(map()->peek_monitor_box(), map()->peek_monitor_obj()); diff --git a/hotspot/src/share/vm/opto/loopTransform.cpp b/hotspot/src/share/vm/opto/loopTransform.cpp index caa676f6ffd..4ff59d9d46e 100644 --- a/hotspot/src/share/vm/opto/loopTransform.cpp +++ b/hotspot/src/share/vm/opto/loopTransform.cpp @@ -119,7 +119,7 @@ void IdealLoopTree::compute_profile_trip_cnt( PhaseIdealLoop *phase ) { //---------------------is_invariant_addition----------------------------- // Return nonzero index of invariant operand for an Add or Sub -// of (nonconstant) invariant and variant values. Helper for reassoicate_invariants. +// of (nonconstant) invariant and variant values. Helper for reassociate_invariants. int IdealLoopTree::is_invariant_addition(Node* n, PhaseIdealLoop *phase) { int op = n->Opcode(); if (op == Op_AddI || op == Op_SubI) { @@ -520,7 +520,7 @@ bool IdealLoopTree::policy_unroll( PhaseIdealLoop *phase ) const { //------------------------------policy_align----------------------------------- // Return TRUE or FALSE if the loop should be cache-line aligned. Gather the // expression that does the alignment. Note that only one array base can be -// aligned in a loop (unless the VM guarentees mutual alignment). Note that +// aligned in a loop (unless the VM guarantees mutual alignment). Note that // if we vectorize short memory ops into longer memory ops, we may want to // increase alignment. bool IdealLoopTree::policy_align( PhaseIdealLoop *phase ) const { diff --git a/hotspot/src/share/vm/opto/loopUnswitch.cpp b/hotspot/src/share/vm/opto/loopUnswitch.cpp index 2a385e76846..4bb67ad0f8a 100644 --- a/hotspot/src/share/vm/opto/loopUnswitch.cpp +++ b/hotspot/src/share/vm/opto/loopUnswitch.cpp @@ -131,7 +131,7 @@ void PhaseIdealLoop::do_unswitching (IdealLoopTree *loop, Node_List &old_new) { ProjNode* proj_false = invar_iff->proj_out(0)->as_Proj(); - // Hoist invariant casts out of each loop to the appropiate + // Hoist invariant casts out of each loop to the appropriate // control projection. Node_List worklist; diff --git a/hotspot/src/share/vm/opto/loopnode.cpp b/hotspot/src/share/vm/opto/loopnode.cpp index fba4a350bbb..7f939a197a3 100644 --- a/hotspot/src/share/vm/opto/loopnode.cpp +++ b/hotspot/src/share/vm/opto/loopnode.cpp @@ -274,7 +274,7 @@ Node *PhaseIdealLoop::is_counted_loop( Node *x, IdealLoopTree *loop ) { // // Canonicalize the condition on the test. If we can exactly determine // the trip-counter exit value, then set limit to that value and use - // a '!=' test. Otherwise use conditon '<' for count-up loops and + // a '!=' test. Otherwise use condition '<' for count-up loops and // '>' for count-down loops. If the condition is inverted and we will // be rolling through MININT to MAXINT, then bail out. @@ -290,7 +290,7 @@ Node *PhaseIdealLoop::is_counted_loop( Node *x, IdealLoopTree *loop ) { // If compare points to incr, we are ok. Otherwise the compare // can directly point to the phi; in this case adjust the compare so that - // it points to the incr by adusting the limit. + // it points to the incr by adjusting the limit. if( cmp->in(1) == phi || cmp->in(2) == phi ) limit = gvn->transform(new (C, 3) AddINode(limit,stride)); @@ -471,7 +471,7 @@ Node *PhaseIdealLoop::is_counted_loop( Node *x, IdealLoopTree *loop ) { lazy_replace( x, l ); set_idom(l, init_control, dom_depth(x)); - // Check for immediately preceeding SafePoint and remove + // Check for immediately preceding SafePoint and remove Node *sfpt2 = le->in(0); if( sfpt2->Opcode() == Op_SafePoint && is_deleteable_safept(sfpt2)) lazy_replace( sfpt2, sfpt2->in(TypeFunc::Control)); @@ -1506,7 +1506,7 @@ PhaseIdealLoop::PhaseIdealLoop( PhaseIterGVN &igvn, const PhaseIdealLoop *verify // Build Dominators for elision of NULL checks & loop finding. // Since nodes do not have a slot for immediate dominator, make - // a persistant side array for that info indexed on node->_idx. + // a persistent side array for that info indexed on node->_idx. _idom_size = C->unique(); _idom = NEW_RESOURCE_ARRAY( Node*, _idom_size ); _dom_depth = NEW_RESOURCE_ARRAY( uint, _idom_size ); @@ -1529,7 +1529,7 @@ PhaseIdealLoop::PhaseIdealLoop( PhaseIterGVN &igvn, const PhaseIdealLoop *verify // Given dominators, try to find inner loops with calls that must // always be executed (call dominates loop tail). These loops do - // not need a seperate safepoint. + // not need a separate safepoint. Node_List cisstack(a); _ltree_root->check_safepts(visited, cisstack); @@ -2332,7 +2332,7 @@ void PhaseIdealLoop::build_loop_early( VectorSet &visited, Node_List &worklist, if (done) { // All of n's inputs have been processed, complete post-processing. - // Compute earilest point this Node can go. + // Compute earliest point this Node can go. // CFG, Phi, pinned nodes already know their controlling input. if (!has_node(n)) { // Record earliest legal location @@ -2672,9 +2672,9 @@ void PhaseIdealLoop::build_loop_late_post( Node *n, const PhaseIdealLoop *verify pinned = false; } if( pinned ) { - IdealLoopTree *choosen_loop = get_loop(n->is_CFG() ? n : get_ctrl(n)); - if( !choosen_loop->_child ) // Inner loop? - choosen_loop->_body.push(n); // Collect inner loops + IdealLoopTree *chosen_loop = get_loop(n->is_CFG() ? n : get_ctrl(n)); + if( !chosen_loop->_child ) // Inner loop? + chosen_loop->_body.push(n); // Collect inner loops return; } } else { // No slot zero @@ -2746,9 +2746,9 @@ void PhaseIdealLoop::build_loop_late_post( Node *n, const PhaseIdealLoop *verify set_ctrl(n, least); // Collect inner loop bodies - IdealLoopTree *choosen_loop = get_loop(least); - if( !choosen_loop->_child ) // Inner loop? - choosen_loop->_body.push(n);// Collect inner loops + IdealLoopTree *chosen_loop = get_loop(least); + if( !chosen_loop->_child ) // Inner loop? + chosen_loop->_body.push(n);// Collect inner loops } #ifndef PRODUCT diff --git a/hotspot/src/share/vm/opto/loopnode.hpp b/hotspot/src/share/vm/opto/loopnode.hpp index 53775646696..ab172a3eb43 100644 --- a/hotspot/src/share/vm/opto/loopnode.hpp +++ b/hotspot/src/share/vm/opto/loopnode.hpp @@ -390,7 +390,7 @@ public: // Return TRUE or FALSE if the loop should be cache-line aligned. // Gather the expression that does the alignment. Note that only - // one array base can be aligned in a loop (unless the VM guarentees + // one array base can be aligned in a loop (unless the VM guarantees // mutual alignment). Note that if we vectorize short memory ops // into longer memory ops, we may want to increase alignment. bool policy_align( PhaseIdealLoop *phase ) const; @@ -403,7 +403,7 @@ public: // Reassociate invariant add and subtract expressions. Node* reassociate_add_sub(Node* n1, PhaseIdealLoop *phase); // Return nonzero index of invariant operand if invariant and variant - // are combined with an Add or Sub. Helper for reassoicate_invariants. + // are combined with an Add or Sub. Helper for reassociate_invariants. int is_invariant_addition(Node* n, PhaseIdealLoop *phase); // Return true if n is invariant diff --git a/hotspot/src/share/vm/opto/loopopts.cpp b/hotspot/src/share/vm/opto/loopopts.cpp index 41048cbcbe9..454c207fd81 100644 --- a/hotspot/src/share/vm/opto/loopopts.cpp +++ b/hotspot/src/share/vm/opto/loopopts.cpp @@ -97,7 +97,7 @@ Node *PhaseIdealLoop::split_thru_phi( Node *n, Node *region, int policy ) { // (Note: This tweaking with igvn only works because x is a new node.) _igvn.set_type(x, t); // If x is a TypeNode, capture any more-precise type permanently into Node - // othewise it will be not updated during igvn->transform since + // otherwise it will be not updated during igvn->transform since // igvn->type(x) is set to x->Value() already. x->raise_bottom_type(t); Node *y = x->Identity(&_igvn); @@ -879,7 +879,7 @@ void PhaseIdealLoop::split_if_with_blocks_post( Node *n ) { Node *x_ctrl = NULL; if( u->is_Phi() ) { // Replace all uses of normal nodes. Replace Phi uses - // individually, so the seperate Nodes can sink down + // individually, so the separate Nodes can sink down // different paths. uint k = 1; while( u->in(k) != n ) k++; diff --git a/hotspot/src/share/vm/opto/machnode.cpp b/hotspot/src/share/vm/opto/machnode.cpp index eadd0da5fff..adb7ecb98ba 100644 --- a/hotspot/src/share/vm/opto/machnode.cpp +++ b/hotspot/src/share/vm/opto/machnode.cpp @@ -136,7 +136,7 @@ void MachNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const { // Size of instruction in bytes uint MachNode::size(PhaseRegAlloc *ra_) const { // If a virtual was not defined for this specific instruction, - // Call the helper which finds the size by emiting the bits. + // Call the helper which finds the size by emitting the bits. return MachNode::emit_size(ra_); } diff --git a/hotspot/src/share/vm/opto/macro.cpp b/hotspot/src/share/vm/opto/macro.cpp index aa8bc492116..5b67f078c06 100644 --- a/hotspot/src/share/vm/opto/macro.cpp +++ b/hotspot/src/share/vm/opto/macro.cpp @@ -216,7 +216,7 @@ static Node *scan_mem_chain(Node *mem, int alias_idx, int offset, Node *start_me const TypeOopPtr *tinst = phase->C->get_adr_type(alias_idx)->isa_oopptr(); while (true) { if (mem == alloc_mem || mem == start_mem ) { - return mem; // hit one of our sentinals + return mem; // hit one of our sentinels } else if (mem->is_MergeMem()) { mem = mem->as_MergeMem()->memory_at(alias_idx); } else if (mem->is_Proj() && mem->as_Proj()->_con == TypeFunc::Memory) { @@ -1668,7 +1668,7 @@ void PhaseMacroExpand::expand_lock_node(LockNode *lock) { if (UseOptoBiasInlining) { /* - * See the full descrition in MacroAssembler::biased_locking_enter(). + * See the full description in MacroAssembler::biased_locking_enter(). * * if( (mark_word & biased_lock_mask) == biased_lock_pattern ) { * // The object is biased. @@ -1904,7 +1904,7 @@ void PhaseMacroExpand::expand_unlock_node(UnlockNode *unlock) { if (UseOptoBiasInlining) { // Check for biased locking unlock case, which is a no-op. - // See the full descrition in MacroAssembler::biased_locking_exit(). + // See the full description in MacroAssembler::biased_locking_exit(). region = new (C, 4) RegionNode(4); // create a Phi for the memory state mem_phi = new (C, 4) PhiNode( region, Type::MEMORY, TypeRawPtr::BOTTOM); diff --git a/hotspot/src/share/vm/opto/matcher.cpp b/hotspot/src/share/vm/opto/matcher.cpp index 9f424c0e46d..74c7a70878e 100644 --- a/hotspot/src/share/vm/opto/matcher.cpp +++ b/hotspot/src/share/vm/opto/matcher.cpp @@ -897,7 +897,7 @@ Node *Matcher::xform( Node *n, int max_stack ) { #ifdef ASSERT _new2old_map.map(m->_idx, n); #endif - mstack.push(m, Post_Visit, n, i); // Don't neet to visit + mstack.push(m, Post_Visit, n, i); // Don't need to visit mstack.push(m->in(0), Visit, m, 0); } else { mstack.push(m, Visit, n, i); @@ -1267,7 +1267,7 @@ static bool match_into_reg( const Node *n, Node *m, Node *control, int i, bool s } } - // Not forceably cloning. If shared, put it into a register. + // Not forceable cloning. If shared, put it into a register. return shared; } @@ -1542,7 +1542,7 @@ void Matcher::ReduceInst_Chain_Rule( State *s, int rule, Node *&mem, MachNode *m // This is what my child will give me. int opnd_class_instance = s->_rule[op]; // Choose between operand class or not. - // This is what I will recieve. + // This is what I will receive. int catch_op = (FIRST_OPERAND_CLASS <= op && op < NUM_OPERANDS) ? opnd_class_instance : op; // New rule for child. Chase operand classes to get the actual rule. int newrule = s->_rule[catch_op]; @@ -1966,7 +1966,7 @@ void Matcher::find_shared( Node *n ) { // BoolNode::match_edge always returns a zero. // We reorder the Op_If in a pre-order manner, so we can visit without - // accidently sharing the Cmp (the Bool and the If make 2 users). + // accidentally sharing the Cmp (the Bool and the If make 2 users). n->add_req( n->in(1)->in(1) ); // Add the Cmp next to the Bool } else if (nstate == Post_Visit) { diff --git a/hotspot/src/share/vm/opto/memnode.cpp b/hotspot/src/share/vm/opto/memnode.cpp index 95e41e0d592..3d096b248f3 100644 --- a/hotspot/src/share/vm/opto/memnode.cpp +++ b/hotspot/src/share/vm/opto/memnode.cpp @@ -100,12 +100,12 @@ Node *MemNode::optimize_simple_memory_chain(Node *mchain, const TypePtr *t_adr, while (prev != result) { prev = result; if (result == start_mem) - break; // hit one of our sentinals + break; // hit one of our sentinels // skip over a call which does not affect this memory slice if (result->is_Proj() && result->as_Proj()->_con == TypeFunc::Memory) { Node *proj_in = result->in(0); if (proj_in->is_Allocate() && proj_in->_idx == instance_id) { - break; // hit one of our sentinals + break; // hit one of our sentinels } else if (proj_in->is_Call()) { CallNode *call = proj_in->as_Call(); if (!call->may_modify(t_adr, phase)) { @@ -198,7 +198,7 @@ static Node *step_through_mergemem(PhaseGVN *phase, MergeMemNode *mmem, const T // If not, we can update the input infinitely along a MergeMem cycle // Equivalent code in PhiNode::Ideal Node* m = phase->transform(mmem); - // If tranformed to a MergeMem, get the desired slice + // If transformed to a MergeMem, get the desired slice // Otherwise the returned node represents memory for every slice mem = (m->is_MergeMem())? m->as_MergeMem()->memory_at(alias_idx) : m; // Update input if it is progress over what we have now @@ -970,7 +970,7 @@ Node *LoadNode::Identity( PhaseTransform *phase ) { } // Search for an existing data phi which was generated before for the same - // instance's field to avoid infinite genertion of phis in a loop. + // instance's field to avoid infinite generation of phis in a loop. Node *region = mem->in(0); if (is_instance_field_load_with_local_phi(region)) { const TypePtr *addr_t = in(MemNode::Address)->bottom_type()->isa_ptr(); @@ -1254,7 +1254,7 @@ Node *LoadNode::split_through_phi(PhaseGVN *phase) { // (This tweaking with igvn only works because x is a new node.) igvn->set_type(x, t); // If x is a TypeNode, capture any more-precise type permanently into Node - // othewise it will be not updated during igvn->transform since + // otherwise it will be not updated during igvn->transform since // igvn->type(x) is set to x->Value() already. x->raise_bottom_type(t); Node *y = x->Identity(igvn); @@ -2591,7 +2591,7 @@ Node *MemBarNode::match( const ProjNode *proj, const Matcher *m ) { // capturing of nearby memory operations. // // During macro-expansion, all captured initializations which store -// constant values of 32 bits or smaller are coalesced (if advantagous) +// constant values of 32 bits or smaller are coalesced (if advantageous) // into larger 'tiles' 32 or 64 bits. This allows an object to be // initialized in fewer memory operations. Memory words which are // covered by neither tiles nor non-constant stores are pre-zeroed @@ -3678,7 +3678,7 @@ Node *MergeMemNode::Ideal(PhaseGVN *phase, bool can_reshape) { else if (old_mmem != NULL) { new_mem = old_mmem->memory_at(i); } - // else preceeding memory was not a MergeMem + // else preceding memory was not a MergeMem // replace equivalent phis (unfortunately, they do not GVN together) if (new_mem != NULL && new_mem != new_base && diff --git a/hotspot/src/share/vm/opto/memnode.hpp b/hotspot/src/share/vm/opto/memnode.hpp index 63cb0d653f7..3da000dff92 100644 --- a/hotspot/src/share/vm/opto/memnode.hpp +++ b/hotspot/src/share/vm/opto/memnode.hpp @@ -757,10 +757,10 @@ public: // Model. Monitor-enter and volatile-load act as Aquires: no following ref // can be moved to before them. We insert a MemBar-Acquire after a FastLock or // volatile-load. Monitor-exit and volatile-store act as Release: no -// preceeding ref can be moved to after them. We insert a MemBar-Release +// preceding ref can be moved to after them. We insert a MemBar-Release // before a FastUnlock or volatile-store. All volatiles need to be // serialized, so we follow all volatile-stores with a MemBar-Volatile to -// seperate it from any following volatile-load. +// separate it from any following volatile-load. class MemBarNode: public MultiNode { virtual uint hash() const ; // { return NO_HASH; } virtual uint cmp( const Node &n ) const ; // Always fail, except on self diff --git a/hotspot/src/share/vm/opto/node.cpp b/hotspot/src/share/vm/opto/node.cpp index 9130403ed9d..f7d71d17234 100644 --- a/hotspot/src/share/vm/opto/node.cpp +++ b/hotspot/src/share/vm/opto/node.cpp @@ -968,22 +968,23 @@ const Type *Node::Value( PhaseTransform * ) const { // Example: when reshape "(X+3)+4" into "X+7" you must leave the Node for // "X+3" unchanged in case it is shared. // -// If you modify the 'this' pointer's inputs, you must use 'set_req' with -// def-use info. If you are making a new Node (either as the new root or -// some new internal piece) you must NOT use set_req with def-use info. -// You can make a new Node with either 'new' or 'clone'. In either case, -// def-use info is (correctly) not generated. +// If you modify the 'this' pointer's inputs, you should use +// 'set_req'. If you are making a new Node (either as the new root or +// some new internal piece) you may use 'init_req' to set the initial +// value. You can make a new Node with either 'new' or 'clone'. In +// either case, def-use info is correctly maintained. +// // Example: reshape "(X+3)+4" into "X+7": -// set_req(1,in(1)->in(1) /* grab X */, du /* must use DU on 'this' */); -// set_req(2,phase->intcon(7),du); +// set_req(1, in(1)->in(1)); +// set_req(2, phase->intcon(7)); // return this; -// Example: reshape "X*4" into "X<<1" -// return new (C,3) LShiftINode( in(1), phase->intcon(1) ); +// Example: reshape "X*4" into "X<<2" +// return new (C,3) LShiftINode(in(1), phase->intcon(2)); // // You must call 'phase->transform(X)' on any new Nodes X you make, except -// for the returned root node. Example: reshape "X*31" with "(X<<5)-1". +// for the returned root node. Example: reshape "X*31" with "(X<<5)-X". // Node *shift=phase->transform(new(C,3)LShiftINode(in(1),phase->intcon(5))); -// return new (C,3) AddINode(shift, phase->intcon(-1)); +// return new (C,3) AddINode(shift, in(1)); // // When making a Node for a constant use 'phase->makecon' or 'phase->intcon'. // These forms are faster than 'phase->transform(new (C,1) ConNode())' and Do @@ -1679,7 +1680,7 @@ void Node::verify_edges(Unique_Node_List &visited) { if (visited.member(this)) return; visited.push(this); - // Walk over all input edges, checking for correspondance + // Walk over all input edges, checking for correspondence for( i = 0; i < len(); i++ ) { n = in(i); if (n != NULL && !n->is_top()) { @@ -1723,7 +1724,7 @@ void Node::verify_recur(const Node *n, int verify_depth, // Contained in new_space or old_space? VectorSet *v = C->node_arena()->contains(n) ? &new_space : &old_space; // Check for visited in the proper space. Numberings are not unique - // across spaces so we need a seperate VectorSet for each space. + // across spaces so we need a separate VectorSet for each space. if( v->test_set(n->_idx) ) return; if (n->is_Con() && n->bottom_type() == Type::TOP) { diff --git a/hotspot/src/share/vm/opto/node.hpp b/hotspot/src/share/vm/opto/node.hpp index f55a403099a..bad1607058e 100644 --- a/hotspot/src/share/vm/opto/node.hpp +++ b/hotspot/src/share/vm/opto/node.hpp @@ -257,7 +257,7 @@ protected: Node **_in; // Array of use-def references to Nodes Node **_out; // Array of def-use references to Nodes - // Input edges are split into two catagories. Required edges are required + // Input edges are split into two categories. Required edges are required // for semantic correctness; order is important and NULLs are allowed. // Precedence edges are used to help determine execution order and are // added, e.g., for scheduling purposes. They are unordered and not @@ -854,7 +854,7 @@ public: // If the hash function returns the special sentinel value NO_HASH, // the node is guaranteed never to compare equal to any other node. - // If we accidently generate a hash with value NO_HASH the node + // If we accidentally generate a hash with value NO_HASH the node // won't go into the table and we'll lose a little optimization. enum { NO_HASH = 0 }; virtual uint hash() const; diff --git a/hotspot/src/share/vm/opto/output.cpp b/hotspot/src/share/vm/opto/output.cpp index 7d6482ccd3c..c29274174e0 100644 --- a/hotspot/src/share/vm/opto/output.cpp +++ b/hotspot/src/share/vm/opto/output.cpp @@ -1171,7 +1171,7 @@ void Compile::Fill_buffer() { cb->flush_bundle(false); // The following logic is duplicated in the code ifdeffed for - // ENABLE_ZAP_DEAD_LOCALS which apppears above in this file. It + // ENABLE_ZAP_DEAD_LOCALS which appears above in this file. It // should be factored out. Or maybe dispersed to the nodes? // Special handling for SafePoint/Call Nodes @@ -1275,7 +1275,7 @@ void Compile::Fill_buffer() { } #ifdef ASSERT - // Check that oop-store preceeds the card-mark + // Check that oop-store precedes the card-mark else if( mach->ideal_Opcode() == Op_StoreCM ) { uint storeCM_idx = j; Node *oop_store = mach->in(mach->_cnt); // First precedence edge @@ -1291,7 +1291,7 @@ void Compile::Fill_buffer() { #endif else if( !n->is_Proj() ) { - // Remember the begining of the previous instruction, in case + // Remember the beginning of the previous instruction, in case // it's followed by a flag-kill and a null-check. Happens on // Intel all the time, with add-to-memory kind of opcodes. previous_offset = current_offset; @@ -1567,7 +1567,7 @@ Scheduling::Scheduling(Arena *arena, Compile &compile) compile.set_node_bundling_limit(_node_bundling_limit); - // This one is persistant within the Compile class + // This one is persistent within the Compile class _node_bundling_base = NEW_ARENA_ARRAY(compile.comp_arena(), Bundle, node_max); // Allocate space for fixed-size arrays @@ -1666,7 +1666,7 @@ void Compile::ScheduleAndBundle() { // Compute the latency of all the instructions. This is fairly simple, // because we already have a legal ordering. Walk over the instructions // from first to last, and compute the latency of the instruction based -// on the latency of the preceeding instruction(s). +// on the latency of the preceding instruction(s). void Scheduling::ComputeLocalLatenciesForward(const Block *bb) { #ifndef PRODUCT if (_cfg->C->trace_opto_output()) @@ -1931,7 +1931,7 @@ void Scheduling::AddNodeToBundle(Node *n, const Block *bb) { uint siz = _available.size(); // Conditional branches can support an instruction that - // is unconditionally executed and not dependant by the + // is unconditionally executed and not dependent by the // branch, OR a conditionally executed instruction if // the branch is taken. In practice, this means that // the first instruction at the branch target is @@ -1947,7 +1947,7 @@ void Scheduling::AddNodeToBundle(Node *n, const Block *bb) { #endif // At least 1 instruction is on the available list - // that is not dependant on the branch + // that is not dependent on the branch for (uint i = 0; i < siz; i++) { Node *d = _available[i]; const Pipeline *avail_pipeline = d->pipeline(); diff --git a/hotspot/src/share/vm/opto/parse.hpp b/hotspot/src/share/vm/opto/parse.hpp index d33acba3e7a..e00dfca6a7a 100644 --- a/hotspot/src/share/vm/opto/parse.hpp +++ b/hotspot/src/share/vm/opto/parse.hpp @@ -78,7 +78,7 @@ public: }; // See if it is OK to inline. - // The reciever is the inline tree for the caller. + // The receiver is the inline tree for the caller. // // The result is a temperature indication. If it is hot or cold, // inlining is immediate or undesirable. Otherwise, the info block diff --git a/hotspot/src/share/vm/opto/parse1.cpp b/hotspot/src/share/vm/opto/parse1.cpp index b896faca492..12b75fb327f 100644 --- a/hotspot/src/share/vm/opto/parse1.cpp +++ b/hotspot/src/share/vm/opto/parse1.cpp @@ -607,7 +607,7 @@ void Parse::do_all_blocks() { if (control()->is_Region() && !block->is_loop_head() && !has_irreducible && !block->is_handler()) { // In the absence of irreducible loops, the Region and Phis // associated with a merge that doesn't involve a backedge can - // be simplfied now since the RPO parsing order guarantees + // be simplified now since the RPO parsing order guarantees // that any path which was supposed to reach here has already // been parsed or must be dead. Node* c = control(); diff --git a/hotspot/src/share/vm/opto/parse2.cpp b/hotspot/src/share/vm/opto/parse2.cpp index 0f40fdd962e..201ffad99c0 100644 --- a/hotspot/src/share/vm/opto/parse2.cpp +++ b/hotspot/src/share/vm/opto/parse2.cpp @@ -32,7 +32,7 @@ extern int explicit_null_checks_inserted, void Parse::array_load(BasicType elem_type) { const Type* elem = Type::TOP; Node* adr = array_addressing(elem_type, 0, &elem); - if (stopped()) return; // guarenteed null or range check + if (stopped()) return; // guaranteed null or range check _sp -= 2; // Pop array and index const TypeAryPtr* adr_type = TypeAryPtr::get_array_body_type(elem_type); Node* ld = make_load(control(), adr, elem, elem_type, adr_type); @@ -43,7 +43,7 @@ void Parse::array_load(BasicType elem_type) { //--------------------------------array_store---------------------------------- void Parse::array_store(BasicType elem_type) { Node* adr = array_addressing(elem_type, 1); - if (stopped()) return; // guarenteed null or range check + if (stopped()) return; // guaranteed null or range check Node* val = pop(); _sp -= 2; // Pop array and index const TypeAryPtr* adr_type = TypeAryPtr::get_array_body_type(elem_type); @@ -1541,14 +1541,14 @@ void Parse::do_one_bytecode() { case Bytecodes::_aaload: array_load(T_OBJECT); break; case Bytecodes::_laload: { a = array_addressing(T_LONG, 0); - if (stopped()) return; // guarenteed null or range check + if (stopped()) return; // guaranteed null or range check _sp -= 2; // Pop array and index push_pair( make_load(control(), a, TypeLong::LONG, T_LONG, TypeAryPtr::LONGS)); break; } case Bytecodes::_daload: { a = array_addressing(T_DOUBLE, 0); - if (stopped()) return; // guarenteed null or range check + if (stopped()) return; // guaranteed null or range check _sp -= 2; // Pop array and index push_pair( make_load(control(), a, Type::DOUBLE, T_DOUBLE, TypeAryPtr::DOUBLES)); break; @@ -1560,7 +1560,7 @@ void Parse::do_one_bytecode() { case Bytecodes::_fastore: array_store(T_FLOAT); break; case Bytecodes::_aastore: { d = array_addressing(T_OBJECT, 1); - if (stopped()) return; // guarenteed null or range check + if (stopped()) return; // guaranteed null or range check array_store_check(); c = pop(); // Oop to store b = pop(); // index (already used) @@ -1572,7 +1572,7 @@ void Parse::do_one_bytecode() { } case Bytecodes::_lastore: { a = array_addressing(T_LONG, 2); - if (stopped()) return; // guarenteed null or range check + if (stopped()) return; // guaranteed null or range check c = pop_pair(); _sp -= 2; // Pop array and index store_to_memory(control(), a, c, T_LONG, TypeAryPtr::LONGS); @@ -1580,7 +1580,7 @@ void Parse::do_one_bytecode() { } case Bytecodes::_dastore: { a = array_addressing(T_DOUBLE, 2); - if (stopped()) return; // guarenteed null or range check + if (stopped()) return; // guaranteed null or range check c = pop_pair(); _sp -= 2; // Pop array and index c = dstore_rounding(c); diff --git a/hotspot/src/share/vm/opto/phase.cpp b/hotspot/src/share/vm/opto/phase.cpp index 904214a330f..b0ea80a8242 100644 --- a/hotspot/src/share/vm/opto/phase.cpp +++ b/hotspot/src/share/vm/opto/phase.cpp @@ -73,7 +73,7 @@ elapsedTimer Phase::_t_buildOopMaps; //------------------------------Phase------------------------------------------ Phase::Phase( PhaseNumber pnum ) : _pnum(pnum), C( pnum == Compiler ? NULL : Compile::current()) { - // Poll for requests from shutdown mechanism to quiesce comiler (4448539, 4448544). + // Poll for requests from shutdown mechanism to quiesce compiler (4448539, 4448544). // This is an effective place to poll, since the compiler is full of phases. // In particular, every inlining site uses a recursively created Parse phase. CompileBroker::maybe_block(); diff --git a/hotspot/src/share/vm/opto/phaseX.cpp b/hotspot/src/share/vm/opto/phaseX.cpp index 484629a90ce..78c48452244 100644 --- a/hotspot/src/share/vm/opto/phaseX.cpp +++ b/hotspot/src/share/vm/opto/phaseX.cpp @@ -196,7 +196,7 @@ void NodeHash::hash_insert( Node *n ) { } //------------------------------hash_delete------------------------------------ -// Replace in hash table with sentinal +// Replace in hash table with sentinel bool NodeHash::hash_delete( const Node *n ) { Node *k; uint hash = n->hash(); @@ -207,7 +207,7 @@ bool NodeHash::hash_delete( const Node *n ) { uint key = hash & (_max-1); uint stride = key | 0x01; debug_only( uint counter = 0; ); - for( ; /* (k != NULL) && (k != _sentinal) */; ) { + for( ; /* (k != NULL) && (k != _sentinel) */; ) { debug_only( counter++ ); debug_only( _delete_probes++ ); k = _table[key]; // Get hashed value @@ -715,7 +715,7 @@ Node *PhaseGVN::transform_no_reclaim( Node *n ) { #ifdef ASSERT //------------------------------dead_loop_check-------------------------------- -// Check for a simple dead loop when a data node references itself direcly +// Check for a simple dead loop when a data node references itself directly // or through an other data node excluding cons and phis. void PhaseGVN::dead_loop_check( Node *n ) { // Phi may reference itself in a loop @@ -1359,7 +1359,7 @@ void PhaseCCP::analyze() { worklist.push(p); // Propagate change to user } } - // If we changed the reciever type to a call, we need to revisit + // If we changed the receiver type to a call, we need to revisit // the Catch following the call. It's looking for a non-NULL // receiver to know when to enable the regular fall-through path // in addition to the NullPtrException path diff --git a/hotspot/src/share/vm/opto/postaloc.cpp b/hotspot/src/share/vm/opto/postaloc.cpp index cd881065f32..fa28c6aa1cc 100644 --- a/hotspot/src/share/vm/opto/postaloc.cpp +++ b/hotspot/src/share/vm/opto/postaloc.cpp @@ -46,7 +46,7 @@ bool PhaseChaitin::may_be_copy_of_callee( Node *def ) const { // be splitting live ranges for callee save registers to such // an extent that in large methods the chains can be very long // (50+). The conservative answer is to return true if we don't - // know as this prevents optimizations from occuring. + // know as this prevents optimizations from occurring. const int limit = 60; int i; @@ -286,7 +286,7 @@ bool PhaseChaitin::eliminate_copy_of_constant(Node* val, Node* n, // // n will be replaced with the old value but n might have // kills projections associated with it so remove them now so that - // yank_if_dead will be able to elminate the copy once the uses + // yank_if_dead will be able to eliminate the copy once the uses // have been transferred to the old[value]. for (DUIterator_Fast imax, i = n->fast_outs(imax); i < imax; i++) { Node* use = n->fast_out(i); diff --git a/hotspot/src/share/vm/opto/reg_split.cpp b/hotspot/src/share/vm/opto/reg_split.cpp index 003df4c48b7..f3254dc2abd 100644 --- a/hotspot/src/share/vm/opto/reg_split.cpp +++ b/hotspot/src/share/vm/opto/reg_split.cpp @@ -26,8 +26,8 @@ #include "incls/_reg_split.cpp.incl" //------------------------------Split-------------------------------------- -// Walk the graph in RPO and for each lrg which spills, propogate reaching -// definitions. During propogation, split the live range around regions of +// Walk the graph in RPO and for each lrg which spills, propagate reaching +// definitions. During propagation, split the live range around regions of // High Register Pressure (HRP). If a Def is in a region of Low Register // Pressure (LRP), it will not get spilled until we encounter a region of // HRP between it and one of its uses. We will spill at the transition @@ -88,7 +88,7 @@ Node *PhaseChaitin::get_spillcopy_wide( Node *def, Node *use, uint uidx ) { } //------------------------------insert_proj------------------------------------ -// Insert the spill at chosen location. Skip over any interveneing Proj's or +// Insert the spill at chosen location. Skip over any intervening Proj's or // Phis. Skip over a CatchNode and projs, inserting in the fall-through block // instead. Update high-pressure indices. Create a new live range. void PhaseChaitin::insert_proj( Block *b, uint i, Node *spill, uint maxlrg ) { @@ -125,7 +125,7 @@ void PhaseChaitin::insert_proj( Block *b, uint i, Node *spill, uint maxlrg ) { } //------------------------------split_DEF-------------------------------------- -// There are four catagories of Split; UP/DOWN x DEF/USE +// There are four categories of Split; UP/DOWN x DEF/USE // Only three of these really occur as DOWN/USE will always color // Any Split with a DEF cannot CISC-Spill now. Thus we need // two helper routines, one for Split DEFS (insert after instruction), @@ -726,7 +726,7 @@ uint PhaseChaitin::Split( uint maxlrg ) { // ********** Handle Crossing HRP Boundry ********** if( (insidx == b->_ihrp_index) || (insidx == b->_fhrp_index) ) { for( slidx = 0; slidx < spill_cnt; slidx++ ) { - // Check for need to split at HRP boundry - split if UP + // Check for need to split at HRP boundary - split if UP n1 = Reachblock[slidx]; // bail out if no reaching DEF if( n1 == NULL ) continue; diff --git a/hotspot/src/share/vm/opto/runtime.cpp b/hotspot/src/share/vm/opto/runtime.cpp index 7b5effc8182..cbbbfacfcb5 100644 --- a/hotspot/src/share/vm/opto/runtime.cpp +++ b/hotspot/src/share/vm/opto/runtime.cpp @@ -1196,7 +1196,7 @@ JRT_END // The following does not work because for one thing, the // thread state is wrong; it expects java, but it is native. -// Also, the invarients in a native stub are different and +// Also, the invariants in a native stub are different and // I'm not sure it is safe to have a MachCalRuntimeDirectNode // in there. // So for now, we do not zap in native stubs. diff --git a/hotspot/src/share/vm/opto/split_if.cpp b/hotspot/src/share/vm/opto/split_if.cpp index 130b2667513..a7a6baaa925 100644 --- a/hotspot/src/share/vm/opto/split_if.cpp +++ b/hotspot/src/share/vm/opto/split_if.cpp @@ -318,7 +318,7 @@ Node *PhaseIdealLoop::find_use_block( Node *use, Node *def, Node *old_false, Nod if( use->is_Phi() ) { // Phi uses in prior block // Grab the first Phi use; there may be many. - // Each will be handled as a seperate iteration of + // Each will be handled as a separate iteration of // the "while( phi->outcnt() )" loop. uint j; for( j = 1; j < use->req(); j++ ) diff --git a/hotspot/src/share/vm/opto/superword.cpp b/hotspot/src/share/vm/opto/superword.cpp index 4551162bff3..e0ca68f3187 100644 --- a/hotspot/src/share/vm/opto/superword.cpp +++ b/hotspot/src/share/vm/opto/superword.cpp @@ -470,7 +470,7 @@ void SuperWord::mem_slice_preds(Node* start, Node* stop, GrowableArray &p } //------------------------------stmts_can_pack--------------------------- -// Can s1 and s2 be in a pack with s1 immediately preceeding s2 and +// Can s1 and s2 be in a pack with s1 immediately preceding s2 and // s1 aligned at "align" bool SuperWord::stmts_can_pack(Node* s1, Node* s2, int align) { if (isomorphic(s1, s2)) { @@ -869,7 +869,7 @@ bool SuperWord::profitable(Node_List* p) { for (uint i = start; i < end; i++) { if (!is_vector_use(p0, i)) { // For now, return false if not scalar promotion case (inputs are the same.) - // Later, implement PackNode and allow differring, non-vector inputs + // Later, implement PackNode and allow differing, non-vector inputs // (maybe just the ones from outside the block.) Node* p0_def = p0->in(i); for (uint j = 1; j < p->size(); j++) { diff --git a/hotspot/src/share/vm/opto/superword.hpp b/hotspot/src/share/vm/opto/superword.hpp index b60cc83c1f0..1c09607ed7d 100644 --- a/hotspot/src/share/vm/opto/superword.hpp +++ b/hotspot/src/share/vm/opto/superword.hpp @@ -308,7 +308,7 @@ class SuperWord : public ResourceObj { void dependence_graph(); // Return a memory slice (node list) in predecessor order starting at "start" void mem_slice_preds(Node* start, Node* stop, GrowableArray &preds); - // Can s1 and s2 be in a pack with s1 immediately preceeding s2 and s1 aligned at "align" + // Can s1 and s2 be in a pack with s1 immediately preceding s2 and s1 aligned at "align" bool stmts_can_pack(Node* s1, Node* s2, int align); // Does s exist in a pack at position pos? bool exists_at(Node* s, uint pos); diff --git a/hotspot/src/share/vm/opto/type.cpp b/hotspot/src/share/vm/opto/type.cpp index 6830277ea3f..3f250be521b 100644 --- a/hotspot/src/share/vm/opto/type.cpp +++ b/hotspot/src/share/vm/opto/type.cpp @@ -2455,7 +2455,7 @@ intptr_t TypeOopPtr::get_con() const { // code and dereferenced at the time the nmethod is made. Until that time, // it is not reasonable to do arithmetic with the addresses of oops (we don't // have access to the addresses!). This does not seem to currently happen, - // but this assertion here is to help prevent its occurrance. + // but this assertion here is to help prevent its occurence. tty->print_cr("Found oop constant with non-zero offset"); ShouldNotReachHere(); } @@ -2761,7 +2761,7 @@ const Type *TypeInstPtr::xmeet( const Type *t ) const { // LCA is object_klass, but if we subclass from the top we can do better if( above_centerline(_ptr) ) { // if( _ptr == TopPTR || _ptr == AnyNull ) // If 'this' (InstPtr) is above the centerline and it is Object class - // then we can subclass in the Java class heirarchy. + // then we can subclass in the Java class hierarchy. if (klass()->equals(ciEnv::current()->Object_klass())) { // that is, tp's array type is a subtype of my klass return TypeAryPtr::make(ptr, tp->ary(), tp->klass(), tp->klass_is_exact(), offset, instance_id); @@ -3022,7 +3022,7 @@ ciType* TypeInstPtr::java_mirror_type() const { //------------------------------xdual------------------------------------------ // Dual: do NOT dual on klasses. This means I do NOT understand the Java -// inheritence mechanism. +// inheritance mechanism. const Type *TypeInstPtr::xdual() const { return new TypeInstPtr( dual_ptr(), klass(), klass_is_exact(), const_oop(), dual_offset(), dual_instance_id() ); } @@ -3176,7 +3176,7 @@ const TypeInt* TypeAryPtr::narrow_size_type(const TypeInt* size) const { bool chg = false; if (lo < min_lo) { lo = min_lo; chg = true; } if (hi > max_hi) { hi = max_hi; chg = true; } - // Negative length arrays will produce weird intermediate dead fath-path code + // Negative length arrays will produce weird intermediate dead fast-path code if (lo > hi) return TypeInt::ZERO; if (!chg) @@ -3358,7 +3358,7 @@ const Type *TypeAryPtr::xmeet( const Type *t ) const { // LCA is object_klass, but if we subclass from the top we can do better if (above_centerline(tp->ptr())) { // If 'tp' is above the centerline and it is Object class - // then we can subclass in the Java class heirarchy. + // then we can subclass in the Java class hierarchy. if( tp->klass()->equals(ciEnv::current()->Object_klass()) ) { // that is, my array type is a subtype of 'tp' klass return make( ptr, _ary, _klass, _klass_is_exact, offset, instance_id ); diff --git a/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp b/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp index 4cc6b577b47..154ab65077f 100644 --- a/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp +++ b/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp @@ -1349,39 +1349,39 @@ bool VM_RedefineClasses::rewrite_cp_refs(instanceKlassHandle scratch_class, // rewrite constant pool references in the methods: if (!rewrite_cp_refs_in_methods(scratch_class, THREAD)) { - // propogate failure back to caller + // propagate failure back to caller return false; } // rewrite constant pool references in the class_annotations: if (!rewrite_cp_refs_in_class_annotations(scratch_class, THREAD)) { - // propogate failure back to caller + // propagate failure back to caller return false; } // rewrite constant pool references in the fields_annotations: if (!rewrite_cp_refs_in_fields_annotations(scratch_class, THREAD)) { - // propogate failure back to caller + // propagate failure back to caller return false; } // rewrite constant pool references in the methods_annotations: if (!rewrite_cp_refs_in_methods_annotations(scratch_class, THREAD)) { - // propogate failure back to caller + // propagate failure back to caller return false; } // rewrite constant pool references in the methods_parameter_annotations: if (!rewrite_cp_refs_in_methods_parameter_annotations(scratch_class, THREAD)) { - // propogate failure back to caller + // propagate failure back to caller return false; } // rewrite constant pool references in the methods_default_annotations: if (!rewrite_cp_refs_in_methods_default_annotations(scratch_class, THREAD)) { - // propogate failure back to caller + // propagate failure back to caller return false; } @@ -1600,7 +1600,7 @@ bool VM_RedefineClasses::rewrite_cp_refs_in_annotations_typeArray( byte_i_ref, THREAD)) { RC_TRACE_WITH_THREAD(0x02000000, THREAD, ("bad annotation_struct at %d", calc_num_annotations)); - // propogate failure back to caller + // propagate failure back to caller return false; } } @@ -1666,7 +1666,7 @@ bool VM_RedefineClasses::rewrite_cp_refs_in_annotation_struct( byte_i_ref, THREAD)) { RC_TRACE_WITH_THREAD(0x02000000, THREAD, ("bad element_value at %d", calc_num_element_value_pairs)); - // propogate failure back to caller + // propagate failure back to caller return false; } } // end for each component @@ -1815,7 +1815,7 @@ bool VM_RedefineClasses::rewrite_cp_refs_in_element_value( // field. This is a nested annotation. if (!rewrite_cp_refs_in_annotation_struct(annotations_typeArray, byte_i_ref, THREAD)) { - // propogate failure back to caller + // propagate failure back to caller return false; } break; @@ -1842,7 +1842,7 @@ bool VM_RedefineClasses::rewrite_cp_refs_in_element_value( annotations_typeArray, byte_i_ref, THREAD)) { RC_TRACE_WITH_THREAD(0x02000000, THREAD, ("bad nested element_value at %d", calc_num_values)); - // propogate failure back to caller + // propagate failure back to caller return false; } } @@ -1886,7 +1886,7 @@ bool VM_RedefineClasses::rewrite_cp_refs_in_fields_annotations( THREAD)) { RC_TRACE_WITH_THREAD(0x02000000, THREAD, ("bad field_annotations at %d", i)); - // propogate failure back to caller + // propagate failure back to caller return false; } } @@ -1923,7 +1923,7 @@ bool VM_RedefineClasses::rewrite_cp_refs_in_methods_annotations( THREAD)) { RC_TRACE_WITH_THREAD(0x02000000, THREAD, ("bad method_annotations at %d", i)); - // propogate failure back to caller + // propagate failure back to caller return false; } } @@ -1991,7 +1991,7 @@ bool VM_RedefineClasses::rewrite_cp_refs_in_methods_parameter_annotations( method_parameter_annotations, byte_i, THREAD)) { RC_TRACE_WITH_THREAD(0x02000000, THREAD, ("bad method_parameter_annotations at %d", calc_num_parameters)); - // propogate failure back to caller + // propagate failure back to caller return false; } } @@ -2041,7 +2041,7 @@ bool VM_RedefineClasses::rewrite_cp_refs_in_methods_default_annotations( method_default_annotations, byte_i, THREAD)) { RC_TRACE_WITH_THREAD(0x02000000, THREAD, ("bad default element_value at %d", i)); - // propogate failure back to caller + // propagate failure back to caller return false; } } diff --git a/hotspot/src/share/vm/runtime/extendedPC.hpp b/hotspot/src/share/vm/runtime/extendedPC.hpp index a2680851adc..19ce2a51447 100644 --- a/hotspot/src/share/vm/runtime/extendedPC.hpp +++ b/hotspot/src/share/vm/runtime/extendedPC.hpp @@ -23,7 +23,7 @@ */ // An ExtendedPC contains the _pc from a signal handler in a platform -// independant way. +// independent way. class ExtendedPC VALUE_OBJ_CLASS_SPEC { private: diff --git a/hotspot/src/share/vm/runtime/fprofiler.cpp b/hotspot/src/share/vm/runtime/fprofiler.cpp index adecc642de4..87554e371f2 100644 --- a/hotspot/src/share/vm/runtime/fprofiler.cpp +++ b/hotspot/src/share/vm/runtime/fprofiler.cpp @@ -988,7 +988,7 @@ extern "C" void find(int x); void ThreadProfiler::record_tick_for_running_frame(JavaThread* thread, frame fr) { - // The tick happend in real code -> non VM code + // The tick happened in real code -> non VM code if (fr.is_interpreted_frame()) { interval_data_ref()->inc_interpreted(); record_interpreted_tick(thread, fr, tp_code, FlatProfiler::bytecode_ticks); @@ -1019,7 +1019,7 @@ void ThreadProfiler::record_tick_for_running_frame(JavaThread* thread, frame fr) } void ThreadProfiler::record_tick_for_calling_frame(JavaThread* thread, frame fr) { - // The tick happend in VM code + // The tick happened in VM code interval_data_ref()->inc_native(); if (fr.is_interpreted_frame()) { record_interpreted_tick(thread, fr, tp_native, FlatProfiler::bytecode_ticks_stub); diff --git a/hotspot/src/share/vm/runtime/frame.cpp b/hotspot/src/share/vm/runtime/frame.cpp index e84d6d3ad8b..8d53406e41b 100644 --- a/hotspot/src/share/vm/runtime/frame.cpp +++ b/hotspot/src/share/vm/runtime/frame.cpp @@ -930,7 +930,7 @@ void frame::oops_interpreted_do(OopClosure* f, const RegisterMap* map, bool quer // => process callee's arguments // // Note: The expression stack can be empty if an exception - // occured during method resolution/execution. In all + // occurred during method resolution/execution. In all // cases we empty the expression stack completely be- // fore handling the exception (the exception handling // code in the interpreter calls a blocking runtime diff --git a/hotspot/src/share/vm/runtime/frame.inline.hpp b/hotspot/src/share/vm/runtime/frame.inline.hpp index 3449ead761a..95acb8dbbda 100644 --- a/hotspot/src/share/vm/runtime/frame.inline.hpp +++ b/hotspot/src/share/vm/runtime/frame.inline.hpp @@ -22,7 +22,7 @@ * */ -// This file holds platform-independant bodies of inline functions for frames. +// This file holds platform-independent bodies of inline functions for frames. // Note: The bcx usually contains the bcp; however during GC it contains the bci // (changed by gc_prologue() and gc_epilogue()) to be methodOop position diff --git a/hotspot/src/share/vm/runtime/mutex.hpp b/hotspot/src/share/vm/runtime/mutex.hpp index edebb8800ae..f0b9e8bd79d 100644 --- a/hotspot/src/share/vm/runtime/mutex.hpp +++ b/hotspot/src/share/vm/runtime/mutex.hpp @@ -82,7 +82,7 @@ class ParkEvent ; // *in that order*. If their implementations change such that these // assumptions are violated, a whole lot of code will break. -// The default length of monitor name is choosen to be 64 to avoid false sharing. +// The default length of monitor name is chosen to be 64 to avoid false sharing. static const int MONITOR_NAME_LEN = 64; class Monitor : public CHeapObj { diff --git a/hotspot/src/share/vm/runtime/orderAccess.hpp b/hotspot/src/share/vm/runtime/orderAccess.hpp index a2040ed8488..c51a9229735 100644 --- a/hotspot/src/share/vm/runtime/orderAccess.hpp +++ b/hotspot/src/share/vm/runtime/orderAccess.hpp @@ -31,7 +31,7 @@ // at runtime. // // In the following, the terms 'previous', 'subsequent', 'before', -// 'after', 'preceeding' and 'succeeding' refer to program order. The +// 'after', 'preceding' and 'succeeding' refer to program order. The // terms 'down' and 'below' refer to forward load or store motion // relative to program order, while 'up' and 'above' refer to backward // motion. diff --git a/hotspot/src/share/vm/runtime/os.cpp b/hotspot/src/share/vm/runtime/os.cpp index 8c81d42734a..de8f12a2ca9 100644 --- a/hotspot/src/share/vm/runtime/os.cpp +++ b/hotspot/src/share/vm/runtime/os.cpp @@ -943,7 +943,7 @@ bool os::stack_shadow_pages_available(Thread *thread, methodHandle method) { assert(StackRedPages > 0 && StackYellowPages > 0,"Sanity check"); address sp = current_stack_pointer(); // Check if we have StackShadowPages above the yellow zone. This parameter - // is dependant on the depth of the maximum VM call stack possible from + // is dependent on the depth of the maximum VM call stack possible from // the handler for stack overflow. 'instanceof' in the stack overflow // handler or a println uses at least 8k stack of VM and native code // respectively. diff --git a/hotspot/src/share/vm/runtime/safepoint.cpp b/hotspot/src/share/vm/runtime/safepoint.cpp index c13af643a85..32af64a23e7 100644 --- a/hotspot/src/share/vm/runtime/safepoint.cpp +++ b/hotspot/src/share/vm/runtime/safepoint.cpp @@ -369,7 +369,7 @@ void SafepointSynchronize::end() { // Start suspended threads for(JavaThread *current = Threads::first(); current; current = current->next()) { - // A problem occuring on Solaris is when attempting to restart threads + // A problem occurring on Solaris is when attempting to restart threads // the first #cpus - 1 go well, but then the VMThread is preempted when we get // to the next one (since it has been running the longest). We then have // to wait for a cpu to become available before we can continue restarting diff --git a/hotspot/src/share/vm/runtime/signature.hpp b/hotspot/src/share/vm/runtime/signature.hpp index 51b45a0a063..9b506d32902 100644 --- a/hotspot/src/share/vm/runtime/signature.hpp +++ b/hotspot/src/share/vm/runtime/signature.hpp @@ -266,7 +266,7 @@ class Fingerprinter: public SignatureIterator { class NativeSignatureIterator: public SignatureIterator { private: methodHandle _method; -// We need seperate JNI and Java offset values because in 64 bit mode, +// We need separate JNI and Java offset values because in 64 bit mode, // the argument offsets are not in sync with the Java stack. // For example a long takes up 1 "C" stack entry but 2 Java stack entries. int _offset; // The java stack offset diff --git a/hotspot/src/share/vm/runtime/threadCritical.hpp b/hotspot/src/share/vm/runtime/threadCritical.hpp index 6f8529512e2..42b43379b5d 100644 --- a/hotspot/src/share/vm/runtime/threadCritical.hpp +++ b/hotspot/src/share/vm/runtime/threadCritical.hpp @@ -29,7 +29,7 @@ // // Due to race conditions during vm exit, some of the os level // synchronization primitives may not be deallocated at exit. It -// is a good plan to implement the platform dependant sections of +// is a good plan to implement the platform dependent sections of // code with resources that are recoverable during process // cleanup by the os. Calling the initialize method before use // is also problematic, it is best to use preinitialized primitives diff --git a/hotspot/src/share/vm/utilities/globalDefinitions.hpp b/hotspot/src/share/vm/utilities/globalDefinitions.hpp index 0a9b8f2a2f3..757910c17b6 100644 --- a/hotspot/src/share/vm/utilities/globalDefinitions.hpp +++ b/hotspot/src/share/vm/utilities/globalDefinitions.hpp @@ -881,7 +881,7 @@ inline int log2_intptr(intptr_t x) { i++; p *= 2; } // p = 2^(i+1) && x < p (i.e., 2^i <= x < 2^(i+1)) - // (if p = 0 then overflow occured and i = 31) + // (if p = 0 then overflow occurred and i = 31) return i; } @@ -895,7 +895,7 @@ inline int log2_long(jlong x) { i++; p *= 2; } // p = 2^(i+1) && x < p (i.e., 2^i <= x < 2^(i+1)) - // (if p = 0 then overflow occured and i = 63) + // (if p = 0 then overflow occurred and i = 63) return i; } From 50208648879aa897d02648e9e642d5be7ab6f115 Mon Sep 17 00:00:00 2001 From: Bhavesh Patel Date: Fri, 27 Feb 2009 18:57:17 -0800 Subject: [PATCH 070/292] 6786690: Javadoc HTML WCAG 2.0 accessibility issues in standard doclet - DL tag and nesting issue Reviewed-by: jjg --- .../formats/html/AbstractIndexWriter.java | 36 +- .../formats/html/AbstractMemberWriter.java | 33 +- ...nnotationTypeOptionalMemberWriterImpl.java | 28 +- ...nnotationTypeRequiredMemberWriterImpl.java | 20 +- .../html/AnnotationTypeWriterImpl.java | 6 +- .../doclets/formats/html/ClassWriterImpl.java | 26 +- .../formats/html/ConstructorWriterImpl.java | 24 +- .../formats/html/EnumConstantWriterImpl.java | 22 +- .../doclets/formats/html/FieldWriterImpl.java | 20 +- .../formats/html/HtmlDocletWriter.java | 63 ++- .../formats/html/HtmlSerialFieldWriter.java | 84 ++-- .../formats/html/HtmlSerialMethodWriter.java | 24 +- .../formats/html/MethodWriterImpl.java | 25 +- .../formats/html/NestedClassWriterImpl.java | 7 +- .../formats/html/PackageTreeWriter.java | 7 +- .../formats/html/TagletWriterImpl.java | 35 +- .../doclets/formats/html/TreeWriter.java | 8 +- .../formats/html/markup/HtmlDocWriter.java | 25 ++ .../formats/html/markup/HtmlWriter.java | 18 +- .../toolkit/SerializedFormWriter.java | 32 +- .../builders/SerializedFormBuilder.java | 25 +- .../internal/toolkit/resources/doclet.xml | 410 +++++++++--------- .../com/sun/javadoc/AuthorDD/AuthorDD.java | 2 +- .../TestClassCrossReferences.java | 2 +- .../TestConstructorIndent.java | 7 +- .../TestDeprecatedDocs.java | 5 +- .../TestExternalOverridenMethod.java | 4 +- .../com/sun/javadoc/testHref/TestHref.java | 2 +- .../TestHtmlDefinitionListTag.java | 370 ++++++++++++++++ .../testHtmlDefinitionListTag/pkg1/C1.java | 108 +++++ .../testHtmlDefinitionListTag/pkg1/C2.java | 86 ++++ .../testHtmlDefinitionListTag/pkg1/C3.java | 42 ++ .../testHtmlDefinitionListTag/pkg1/C4.java | 39 ++ .../testHtmlDefinitionListTag/pkg1/C5.java | 65 +++ .../com/sun/javadoc/testIndex/TestIndex.java | 4 +- .../javadoc/testInterface/TestInterface.java | 12 +- .../testLinkOption/TestLinkOption.java | 3 +- .../testLinkTaglet/TestLinkTaglet.java | 2 +- .../TestMemberInheritence.java | 2 +- .../TestNewLanguageFeatures.java | 30 +- .../TestOverridenPrivateMethods.java | 12 +- ...verridenPrivateMethodsWithPackageFlag.java | 12 +- ...verridenPrivateMethodsWithPrivateFlag.java | 12 +- .../testParamTaglet/TestParamTaglet.java | 4 +- .../TestPrivateClasses.java | 18 +- .../TestSerializedFormDeprecationInfo.java | 52 +-- .../javadoc/testThrowsTag/TestThrowsTag.java | 16 +- 47 files changed, 1360 insertions(+), 529 deletions(-) create mode 100644 langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/TestHtmlDefinitionListTag.java create mode 100644 langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/pkg1/C1.java create mode 100644 langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/pkg1/C2.java create mode 100644 langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/pkg1/C3.java create mode 100644 langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/pkg1/C4.java create mode 100644 langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/pkg1/C5.java diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractIndexWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractIndexWriter.java index a7cad980bbc..0809e184705 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractIndexWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractIndexWriter.java @@ -25,12 +25,12 @@ package com.sun.tools.doclets.formats.html; -import com.sun.tools.doclets.internal.toolkit.util.*; - -import com.sun.javadoc.*; import java.io.*; import java.util.*; +import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.util.*; + /** * Generate Index for all the Member Names with Indexing in * Unicode Order. This class is a base class for {@link SingleIndexWriter} and @@ -100,18 +100,22 @@ public class AbstractIndexWriter extends HtmlDocletWriter { h2(); strong(unicode.toString()); h2End(); - dl(); - for (int i = 0; i < memberlist.size(); i++) { - Doc element = memberlist.get(i); - if (element instanceof MemberDoc) { - printDescription((MemberDoc)element); - } else if (element instanceof ClassDoc) { - printDescription((ClassDoc)element); - } else if (element instanceof PackageDoc) { - printDescription((PackageDoc)element); + int memberListSize = memberlist.size(); + // Display the list only if there are elements to be displayed. + if (memberListSize > 0) { + dl(); + for (int i = 0; i < memberListSize; i++) { + Doc element = memberlist.get(i); + if (element instanceof MemberDoc) { + printDescription((MemberDoc)element); + } else if (element instanceof ClassDoc) { + printDescription((ClassDoc)element); + } else if (element instanceof PackageDoc) { + printDescription((PackageDoc)element); + } } + dlEnd(); } - dlEnd(); hr(); } @@ -126,8 +130,10 @@ public class AbstractIndexWriter extends HtmlDocletWriter { printPackageLink(pkg, Util.getPackageName(pkg), true); print(" - "); print(configuration.getText("doclet.package") + " " + pkg.name()); + dtEnd(); dd(); printSummaryComment(pkg); + ddEnd(); } /** @@ -140,8 +146,10 @@ public class AbstractIndexWriter extends HtmlDocletWriter { printLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_INDEX, cd, true)); print(" - "); printClassInfo(cd); + dtEnd(); dd(); printComment(cd); + ddEnd(); } /** @@ -178,8 +186,10 @@ public class AbstractIndexWriter extends HtmlDocletWriter { println(" - "); printMemberDesc(member); println(); + dtEnd(); dd(); printComment(member); + ddEnd(); println(); } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractMemberWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractMemberWriter.java index 268dbe009fb..d6c298f13da 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractMemberWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractMemberWriter.java @@ -25,12 +25,12 @@ package com.sun.tools.doclets.formats.html; -import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.internal.toolkit.taglets.*; +import java.lang.reflect.Modifier; +import java.util.*; import com.sun.javadoc.*; -import java.util.*; -import java.lang.reflect.Modifier; +import com.sun.tools.doclets.internal.toolkit.util.*; +import com.sun.tools.doclets.internal.toolkit.taglets.*; /** * The base class for member writers. @@ -38,6 +38,7 @@ import java.lang.reflect.Modifier; * @author Robert Field * @author Atul M Dambalkar * @author Jamie Ho (Re-write) + * @author Bhavesh Patel (Modified) */ public abstract class AbstractMemberWriter { @@ -232,10 +233,26 @@ public abstract class AbstractMemberWriter { } } + /** + * Print the deprecated output for the given member. + * + * @param member the member being documented. + */ + protected void printDeprecated(ProgramElementDoc member) { + String output = (new DeprecatedTaglet()).getTagletOutput(member, + writer.getTagletWriterInstance(false)).toString().trim(); + if (!output.isEmpty()) { + writer.printMemberDetailsListStartTag(); + writer.print(output); + } + } + protected void printComment(ProgramElementDoc member) { if (member.inlineTags().length > 0) { + writer.printMemberDetailsListStartTag(); writer.dd(); writer.printInlineComment(member); + writer.ddEnd(); } } @@ -266,6 +283,14 @@ public abstract class AbstractMemberWriter { writer.printTags(member); } + /** + * Write the member footer. + */ + protected void printMemberFooter() { + writer.printMemberDetailsListEndTag(); + assert !writer.getMemberDetailsListPrinted(); + } + /** * Forward to containing writer */ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeOptionalMemberWriterImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeOptionalMemberWriterImpl.java index 570f27542dd..1442e3ccf0c 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeOptionalMemberWriterImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeOptionalMemberWriterImpl.java @@ -25,11 +25,11 @@ package com.sun.tools.doclets.formats.html; -import com.sun.tools.doclets.internal.toolkit.*; -import com.sun.javadoc.*; - import java.io.*; +import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.*; + /** * Writes annotation type optional member documentation in HTML format. * @@ -63,14 +63,20 @@ public class AnnotationTypeOptionalMemberWriterImpl extends * {@inheritDoc} */ public void writeDefaultValueInfo(MemberDoc member) { - writer.dl(); - writer.dt(); - writer.strong(ConfigurationImpl.getInstance(). - getText("doclet.Default")); - writer.dd(); - writer.print(((AnnotationTypeElementDoc) member).defaultValue()); - writer.ddEnd(); - writer.dlEnd(); + if (((AnnotationTypeElementDoc) member).defaultValue() != null) { + writer.printMemberDetailsListStartTag(); + writer.dd(); + writer.dl(); + writer.dt(); + writer.strong(ConfigurationImpl.getInstance(). + getText("doclet.Default")); + writer.dtEnd(); + writer.dd(); + writer.print(((AnnotationTypeElementDoc) member).defaultValue()); + writer.ddEnd(); + writer.dlEnd(); + writer.ddEnd(); + } } /** diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java index 801ec8a241d..01e517ce426 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java @@ -25,12 +25,11 @@ package com.sun.tools.doclets.formats.html; -import com.sun.tools.doclets.internal.toolkit.*; -import com.sun.tools.doclets.internal.toolkit.taglets.*; -import com.sun.javadoc.*; - import java.io.*; +import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.*; + /** * Writes annotation type required member documentation in HTML format. * @@ -134,17 +133,14 @@ public class AnnotationTypeRequiredMemberWriterImpl extends AbstractMemberWriter strong(member.name()); } writer.preEnd(); - writer.dl(); + assert !writer.getMemberDetailsListPrinted(); } /** * {@inheritDoc} */ public void writeComments(MemberDoc member) { - if (member.inlineTags().length > 0) { - writer.dd(); - writer.printInlineComment(member); - } + printComment(member); } /** @@ -160,7 +156,7 @@ public class AnnotationTypeRequiredMemberWriterImpl extends AbstractMemberWriter * Write the annotation type member footer. */ public void writeMemberFooter() { - writer.dlEnd(); + printMemberFooter(); } /** @@ -267,9 +263,7 @@ public class AnnotationTypeRequiredMemberWriterImpl extends AbstractMemberWriter * {@inheritDoc} */ public void writeDeprecated(MemberDoc member) { - print(((TagletOutputImpl) - (new DeprecatedTaglet()).getTagletOutput(member, - writer.getTagletWriterInstance(false))).toString()); + printDeprecated(member); } private Type getType(MemberDoc member) { diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeWriterImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeWriterImpl.java index fc2527db89b..594ce856a05 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeWriterImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeWriterImpl.java @@ -25,10 +25,10 @@ package com.sun.tools.doclets.formats.html; +import com.sun.javadoc.*; import com.sun.tools.doclets.internal.toolkit.*; import com.sun.tools.doclets.internal.toolkit.util.*; import com.sun.tools.doclets.internal.toolkit.builders.*; -import com.sun.javadoc.*; /** * Generate the Class Information Page. @@ -165,8 +165,6 @@ public class AnnotationTypeWriterImpl extends SubWriterHolderWriter * {@inheritDoc} */ public void writeAnnotationTypeSignature(String modifiers) { - dl(); - dt(); preNoNewLine(); writeAnnotationInfo(annotationType); print(modifiers); @@ -178,7 +176,6 @@ public class AnnotationTypeWriterImpl extends SubWriterHolderWriter } else { strong(name); } - dlEnd(); preEnd(); p(); } @@ -334,6 +331,7 @@ public class AnnotationTypeWriterImpl extends SubWriterHolderWriter } else { strongText("doclet.Enclosing_Class"); } + dtEnd(); dd(); printLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_CLASS, outerClass, false)); diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassWriterImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassWriterImpl.java index c15f76367dc..8044b42dcbf 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassWriterImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassWriterImpl.java @@ -25,12 +25,12 @@ package com.sun.tools.doclets.formats.html; +import java.util.*; + +import com.sun.javadoc.*; import com.sun.tools.doclets.internal.toolkit.*; import com.sun.tools.doclets.internal.toolkit.util.*; import com.sun.tools.doclets.internal.toolkit.builders.*; -import com.sun.javadoc.*; - -import java.util.*; import com.sun.tools.doclets.internal.toolkit.taglets.*; /** @@ -171,8 +171,6 @@ public class ClassWriterImpl extends SubWriterHolderWriter */ public void writeClassSignature(String modifiers) { boolean isInterface = classDoc.isInterface(); - dl(); - dt(); preNoNewLine(); writeAnnotationInfo(classDoc); print(modifiers); @@ -191,7 +189,7 @@ public class ClassWriterImpl extends SubWriterHolderWriter Type superclass = Util.getFirstVisibleSuperClass(classDoc, configuration()); if (superclass != null) { - dt(); + println(); print("extends "); printLink(new LinkInfoImpl( LinkInfoImpl.CONTEXT_CLASS_SIGNATURE_PARENT_NAME, @@ -208,7 +206,7 @@ public class ClassWriterImpl extends SubWriterHolderWriter continue; } if (counter == 0) { - dt(); + println(); print(isInterface? "extends " : "implements "); } else { print(", "); @@ -219,7 +217,6 @@ public class ClassWriterImpl extends SubWriterHolderWriter counter++; } } - dlEnd(); preEnd(); p(); } @@ -342,6 +339,7 @@ public class ClassWriterImpl extends SubWriterHolderWriter TagletOutput output = (new ParamTaglet()).getTagletOutput(classDoc, getTagletWriterInstance(false)); print(output.toString()); + dtEnd(); dlEnd(); } } @@ -360,8 +358,10 @@ public class ClassWriterImpl extends SubWriterHolderWriter dl(); dt(); strongText("doclet.Subclasses"); + dtEnd(); writeClassLinks(LinkInfoImpl.CONTEXT_SUBCLASSES, subclasses); + dlEnd(); } } } @@ -376,8 +376,10 @@ public class ClassWriterImpl extends SubWriterHolderWriter dl(); dt(); strongText("doclet.Subinterfaces"); + dtEnd(); writeClassLinks(LinkInfoImpl.CONTEXT_SUBINTERFACES, subInterfaces); + dlEnd(); } } } @@ -398,8 +400,10 @@ public class ClassWriterImpl extends SubWriterHolderWriter dl(); dt(); strongText("doclet.Implementing_Classes"); + dtEnd(); writeClassLinks(LinkInfoImpl.CONTEXT_IMPLEMENTED_CLASSES, implcl); + dlEnd(); } } @@ -414,8 +418,10 @@ public class ClassWriterImpl extends SubWriterHolderWriter dl(); dt(); strongText("doclet.All_Implemented_Interfaces"); + dtEnd(); writeClassLinks(LinkInfoImpl.CONTEXT_IMPLEMENTED_INTERFACES, interfaceArray); + dlEnd(); } } @@ -430,8 +436,10 @@ public class ClassWriterImpl extends SubWriterHolderWriter dl(); dt(); strongText("doclet.All_Superinterfaces"); + dtEnd(); writeClassLinks(LinkInfoImpl.CONTEXT_SUPER_INTERFACES, interfaceArray); + dlEnd(); } } @@ -455,7 +463,6 @@ public class ClassWriterImpl extends SubWriterHolderWriter } } ddEnd(); - dlEnd(); } protected void navLinkTree() { @@ -574,6 +581,7 @@ public class ClassWriterImpl extends SubWriterHolderWriter } else { strongText("doclet.Enclosing_Class"); } + dtEnd(); dd(); printLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_CLASS, outerClass, false)); diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstructorWriterImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstructorWriterImpl.java index 72d2e7ca4c5..cb5adbdeeaf 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstructorWriterImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstructorWriterImpl.java @@ -25,12 +25,12 @@ package com.sun.tools.doclets.formats.html; +import java.io.*; +import java.util.*; + +import com.sun.javadoc.*; import com.sun.tools.doclets.internal.toolkit.*; import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.internal.toolkit.taglets.*; -import com.sun.javadoc.*; -import java.util.*; -import java.io.*; /** * Writes constructor documentation. @@ -149,7 +149,7 @@ public class ConstructorWriterImpl extends AbstractExecutableMemberWriter writeParameters(constructor); writeExceptions(constructor); writer.preEnd(); - writer.dl(); + assert !writer.getMemberDetailsListPrinted(); } /** @@ -158,12 +158,7 @@ public class ConstructorWriterImpl extends AbstractExecutableMemberWriter * @param constructor the constructor being documented. */ public void writeDeprecated(ConstructorDoc constructor) { - String output = ((TagletOutputImpl) - (new DeprecatedTaglet()).getTagletOutput(constructor, - writer.getTagletWriterInstance(false))).toString(); - if (output != null && output.trim().length() > 0) { - writer.print(output); - } + printDeprecated(constructor); } /** @@ -172,10 +167,7 @@ public class ConstructorWriterImpl extends AbstractExecutableMemberWriter * @param constructor the constructor being documented. */ public void writeComments(ConstructorDoc constructor) { - if (constructor.inlineTags().length > 0) { - writer.dd(); - writer.printInlineComment(constructor); - } + printComment(constructor); } /** @@ -191,7 +183,7 @@ public class ConstructorWriterImpl extends AbstractExecutableMemberWriter * Write the constructor footer. */ public void writeConstructorFooter() { - writer.dlEnd(); + printMemberFooter(); } /** diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/EnumConstantWriterImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/EnumConstantWriterImpl.java index 226d9086eeb..1d5b4ffbd29 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/EnumConstantWriterImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/EnumConstantWriterImpl.java @@ -25,13 +25,12 @@ package com.sun.tools.doclets.formats.html; -import com.sun.tools.doclets.internal.toolkit.*; -import com.sun.tools.doclets.internal.toolkit.taglets.*; -import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.javadoc.*; - import java.io.*; +import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; + /** * Writes enum constant documentation in HTML format. * @@ -146,26 +145,21 @@ public class EnumConstantWriterImpl extends AbstractMemberWriter strong(enumConstant.name()); } writer.preEnd(); - writer.dl(); + assert !writer.getMemberDetailsListPrinted(); } /** * {@inheritDoc} */ public void writeDeprecated(FieldDoc enumConstant) { - print(((TagletOutputImpl) - (new DeprecatedTaglet()).getTagletOutput(enumConstant, - writer.getTagletWriterInstance(false))).toString()); + printDeprecated(enumConstant); } /** * {@inheritDoc} */ public void writeComments(FieldDoc enumConstant) { - if (enumConstant.inlineTags().length > 0) { - writer.dd(); - writer.printInlineComment(enumConstant); - } + printComment(enumConstant); } /** @@ -179,7 +173,7 @@ public class EnumConstantWriterImpl extends AbstractMemberWriter * {@inheritDoc} */ public void writeEnumConstantFooter() { - writer.dlEnd(); + printMemberFooter(); } /** diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/FieldWriterImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/FieldWriterImpl.java index cf37e9ad958..bd97166b8ab 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/FieldWriterImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/FieldWriterImpl.java @@ -25,13 +25,12 @@ package com.sun.tools.doclets.formats.html; -import com.sun.tools.doclets.internal.toolkit.*; -import com.sun.tools.doclets.internal.toolkit.taglets.*; -import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.javadoc.*; - import java.io.*; +import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; + /** * Writes field documentation in HTML format. * @@ -156,7 +155,7 @@ public class FieldWriterImpl extends AbstractMemberWriter strong(field.name()); } writer.preEnd(); - writer.dl(); + assert !writer.getMemberDetailsListPrinted(); } /** @@ -165,9 +164,7 @@ public class FieldWriterImpl extends AbstractMemberWriter * @param field the field being documented. */ public void writeDeprecated(FieldDoc field) { - print(((TagletOutputImpl) - (new DeprecatedTaglet()).getTagletOutput(field, - writer.getTagletWriterInstance(false))).toString()); + printDeprecated(field); } /** @@ -178,10 +175,12 @@ public class FieldWriterImpl extends AbstractMemberWriter public void writeComments(FieldDoc field) { ClassDoc holder = field.containingClass(); if (field.inlineTags().length > 0) { + writer.printMemberDetailsListStartTag(); if (holder.equals(classdoc) || (! (holder.isPublic() || Util.isLinkable(holder, configuration())))) { writer.dd(); writer.printInlineComment(field); + writer.ddEnd(); } else { String classlink = writer.codeText( writer.getDocLink(LinkInfoImpl.CONTEXT_FIELD_DOC_COPY, @@ -196,6 +195,7 @@ public class FieldWriterImpl extends AbstractMemberWriter writer.ddEnd(); writer.dd(); writer.printInlineComment(field); + writer.ddEnd(); } } } @@ -213,7 +213,7 @@ public class FieldWriterImpl extends AbstractMemberWriter * Write the field footer. */ public void writeFieldFooter() { - writer.dlEnd(); + printMemberFooter(); } /** diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDocletWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDocletWriter.java index 352eeb7010b..8f15eee3ab6 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDocletWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDocletWriter.java @@ -24,17 +24,16 @@ */ package com.sun.tools.doclets.formats.html; -import com.sun.tools.doclets.formats.html.markup.*; -import com.sun.tools.doclets.internal.toolkit.*; -import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.internal.toolkit.taglets.*; - -import com.sun.javadoc.*; import java.io.*; import java.text.SimpleDateFormat; import java.util.*; +import com.sun.javadoc.*; +import com.sun.tools.doclets.formats.html.markup.*; +import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; +import com.sun.tools.doclets.internal.toolkit.taglets.*; /** * Class for the Html Format Code Generation specific to JavaDoc. @@ -44,6 +43,7 @@ import java.util.*; * @since 1.2 * @author Atul M Dambalkar * @author Robert Field + * @author Bhavesh Patel (Modified) */ public class HtmlDocletWriter extends HtmlDocWriter { @@ -205,7 +205,13 @@ public class HtmlDocletWriter extends HtmlDocWriter { private void printMethodInfo(MethodDoc method) { ClassDoc[] intfacs = method.containingClass().interfaces(); MethodDoc overriddenMethod = method.overriddenMethod(); - if (intfacs.length > 0 || overriddenMethod != null) { + // Check whether there is any implementation or overridden info to be + // printed. If no overridden or implementation info needs to be + // printed, do not print this section. + if ((intfacs.length > 0 && + new ImplementedMethods(method, this.configuration).build().length > 0) || + overriddenMethod != null) { + printMemberDetailsListStartTag(); dd(); printTagsInfoHeader(); MethodWriterImpl.printImplementsInfo(this, method); @@ -216,7 +222,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { printTagsInfoFooter(); ddEnd(); } - dd(); } protected void printTags(Doc doc) { @@ -230,41 +235,35 @@ public class HtmlDocletWriter extends HtmlDocWriter { TagletWriter.genTagOuput(configuration.tagletManager, doc, configuration.tagletManager.getCustomTags(doc), getTagletWriterInstance(false), output); - if (output.toString().trim().length() > 0) { - printTagsInfoHeader(); - print(output.toString()); - printTagsInfoFooter(); - } else if (! (doc instanceof ConstructorDoc || - doc instanceof RootDoc || doc instanceof ClassDoc)) { - //To be consistent with 1.4.2 output. - //I hate to do this but we have to pass the diff test to prove - //nothing has broken. + String outputString = output.toString().trim(); + // For RootDoc and ClassDoc, this section is not the definition description + // but the start of definition list. + if (!outputString.isEmpty()) { + if (!(doc instanceof RootDoc || doc instanceof ClassDoc)) { + printMemberDetailsListStartTag(); + dd(); + } printTagsInfoHeader(); + print(outputString); printTagsInfoFooter(); + if (!(doc instanceof RootDoc || doc instanceof ClassDoc)) + ddEnd(); } } /** - * Check whether there are any tags to be printed. + * Check whether there are any tags for Serialization Overview + * section to be printed. * - * @param doc the Doc object to check for tags. + * @param field the FieldDoc object to check for tags. * @return true if there are tags to be printed else return false. */ - protected boolean hasTagsToPrint(Doc doc) { - if (doc instanceof MethodDoc) { - ClassDoc[] intfacs = ((MethodDoc)doc).containingClass().interfaces(); - MethodDoc overriddenMethod = ((MethodDoc)doc).overriddenMethod(); - if ((intfacs.length > 0 && - new ImplementedMethods((MethodDoc)doc, this.configuration).build().length > 0) || - overriddenMethod != null) { - return true; - } - } + protected boolean hasSerializationOverviewTags(FieldDoc field) { TagletOutputImpl output = new TagletOutputImpl(""); - TagletWriter.genTagOuput(configuration.tagletManager, doc, - configuration.tagletManager.getCustomTags(doc), + TagletWriter.genTagOuput(configuration.tagletManager, field, + configuration.tagletManager.getCustomTags(field), getTagletWriterInstance(false), output); - return (output.toString().trim().isEmpty()); + return (!output.toString().trim().isEmpty()); } /** diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlSerialFieldWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlSerialFieldWriter.java index 3e84b00dbb6..15508ed643b 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlSerialFieldWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlSerialFieldWriter.java @@ -25,11 +25,12 @@ package com.sun.tools.doclets.formats.html; +import java.util.*; + +import com.sun.javadoc.*; import com.sun.tools.doclets.internal.toolkit.*; import com.sun.tools.doclets.internal.toolkit.taglets.*; import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.javadoc.*; -import java.util.*; /** * Generate serialized form for serializable fields. @@ -37,6 +38,7 @@ import java.util.*; * serialField is processed. * * @author Joe Fialli + * @author Bhavesh Patel (Modified) */ public class HtmlSerialFieldWriter extends FieldWriterImpl implements SerializedFormWriter.SerialFieldWriter { @@ -75,7 +77,7 @@ public class HtmlSerialFieldWriter extends FieldWriterImpl writer.println(); if (heading.equals( configuration().getText("doclet.Serialized_Form_class"))) { - writer.dl(); + assert !writer.getMemberDetailsListPrinted(); } } else { writer.printTableHeadingBackground(heading); @@ -102,7 +104,7 @@ public class HtmlSerialFieldWriter extends FieldWriterImpl print(fieldDimensions + ' '); strong(fieldName); writer.preEnd(); - writer.dl(); + assert !writer.getMemberDetailsListPrinted(); } /** @@ -111,9 +113,7 @@ public class HtmlSerialFieldWriter extends FieldWriterImpl * @param field the field to document. */ public void writeMemberDeprecatedInfo(FieldDoc field) { - print(((TagletOutputImpl) - (new DeprecatedTaglet()).getTagletOutput(field, - writer.getTagletWriterInstance(false))).toString()); + printDeprecated(field); } /** @@ -123,14 +123,17 @@ public class HtmlSerialFieldWriter extends FieldWriterImpl */ public void writeMemberDescription(FieldDoc field) { if (field.inlineTags().length > 0) { + writer.printMemberDetailsListStartTag(); writer.dd(); writer.printInlineComment(field); + writer.ddEnd(); } Tag[] tags = field.tags("serial"); if (tags.length > 0) { - writer.dt(); + writer.printMemberDetailsListStartTag(); writer.dd(); writer.printInlineComment(field, tags[0]); + writer.ddEnd(); } } @@ -140,9 +143,14 @@ public class HtmlSerialFieldWriter extends FieldWriterImpl * @param serialFieldTag the field to document (represented by tag). */ public void writeMemberDescription(SerialFieldTag serialFieldTag) { - writer.dd(); - writer.print(serialFieldTag.description()); - writer.dlEnd(); + String serialFieldTagDesc = serialFieldTag.description().trim(); + if (!serialFieldTagDesc.isEmpty()) { + writer.dl(); + writer.dd(); + writer.print(serialFieldTagDesc); + writer.ddEnd(); + writer.dlEnd(); + } } /** @@ -151,33 +159,57 @@ public class HtmlSerialFieldWriter extends FieldWriterImpl * @param field the field to document. */ public void writeMemberTags(FieldDoc field) { - writer.dl(); TagletOutputImpl output = new TagletOutputImpl(""); TagletWriter.genTagOuput(configuration().tagletManager, field, configuration().tagletManager.getCustomTags(field), writer.getTagletWriterInstance(false), output); - if (output.toString().length() > 0) { - print(output.toString()); + String outputString = output.toString().trim(); + if (!outputString.isEmpty()) { + writer.printMemberDetailsListStartTag(); + writer.dd(); + writer.dl(); + print(outputString); + writer.dlEnd(); + writer.ddEnd(); } - writer.dlEnd(); - } - public void writeMemberFooter(FieldDoc member) { - writer.dlEnd(); } /** - * Check to see if member details should be printed. If + * Check to see if overview details should be printed. If * nocomment option set or if there is no text to be printed - * for deprecation info, inline comment, no serial tag or inline tags, - * do not print member details. + * for deprecation info, comment or tags, do not print overview details. + * + * @param field the field to check overview details for. + * @return true if overview details need to be printed */ - public boolean shouldPrintMemberDetails(FieldDoc field) { - if (!configuration().nocomment) - if((field.inlineTags().length > 0) || - (field.tags("serial").length > 0) || (writer.hasTagsToPrint(field))) + public boolean shouldPrintOverview(FieldDoc field) { + if (!configuration().nocomment) { + if(!field.commentText().isEmpty() || + writer.hasSerializationOverviewTags(field)) return true; - if (!Util.isDeprecated(field)) + } + if (field.tags("deprecated").length > 0) return true; return false; } + + public void writeMemberFooter() { + printMemberFooter(); + } + + /** + * Write the footer information. If the serilization overview section was + * printed, check for definition list and close list tag. + * + * @param heading the heading that was written. + */ + public void writeFooter(String heading) { + if (printedOverallAnchor) { + if (heading.equals( + configuration().getText("doclet.Serialized_Form_class"))) { + writer.printMemberDetailsListEndTag(); + assert !writer.getMemberDetailsListPrinted(); + } + } + } } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlSerialMethodWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlSerialMethodWriter.java index 9c0daf8e8cf..083ee7f25cd 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlSerialMethodWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlSerialMethodWriter.java @@ -25,9 +25,9 @@ package com.sun.tools.doclets.formats.html; +import com.sun.javadoc.*; import com.sun.tools.doclets.internal.toolkit.*; import com.sun.tools.doclets.internal.toolkit.taglets.*; -import com.sun.javadoc.*; /** * Generate serialized form for Serializable/Externalizable methods. @@ -66,14 +66,12 @@ public class HtmlSerialMethodWriter extends MethodWriterImpl implements writeSignature(member); } - public void writeMemberFooter(MethodDoc member) { - writer.dlEnd(); + public void writeMemberFooter() { + printMemberFooter(); } public void writeDeprecatedMemberInfo(MethodDoc member) { - print(((TagletOutputImpl) - (new DeprecatedTaglet()).getTagletOutput(member, - writer.getTagletWriterInstance(false))).toString()); + printDeprecated(member); } public void writeMemberDescription(MethodDoc member) { @@ -81,23 +79,27 @@ public class HtmlSerialMethodWriter extends MethodWriterImpl implements } public void writeMemberTags(MethodDoc member) { - writer.dd(); - writer.dl(); TagletOutputImpl output = new TagletOutputImpl(""); TagletManager tagletManager = ConfigurationImpl.getInstance().tagletManager; TagletWriter.genTagOuput(tagletManager, member, tagletManager.getSerializedFormTags(), writer.getTagletWriterInstance(false), output); - print(output.toString()); + String outputString = output.toString().trim(); + if (!outputString.isEmpty()) { + writer.printMemberDetailsListStartTag(); + writer.dd(); + writer.dl(); + print(outputString); + writer.dlEnd(); + writer.ddEnd(); + } MethodDoc method = member; if (method.name().compareTo("writeExternal") == 0 && method.tags("serialData").length == 0) { serialWarning(member.position(), "doclet.MissingSerialDataTag", method.containingClass().qualifiedName(), method.name()); } - writer.ddEnd(); - writer.dlEnd(); } protected void printTypeLinkNoDimension(Type type) { diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/MethodWriterImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/MethodWriterImpl.java index 7a4da14b0d6..a74283179b3 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/MethodWriterImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/MethodWriterImpl.java @@ -25,13 +25,13 @@ package com.sun.tools.doclets.formats.html; +import java.io.*; + +import com.sun.javadoc.*; import com.sun.tools.doclets.internal.toolkit.*; import com.sun.tools.doclets.internal.toolkit.util.*; import com.sun.tools.doclets.internal.toolkit.taglets.*; -import java.io.*; -import com.sun.javadoc.*; - /** * Writes method documentation in HTML format. * @@ -172,7 +172,7 @@ public class MethodWriterImpl extends AbstractExecutableMemberWriter writeParameters(method); writeExceptions(method); writer.preEnd(); - writer.dl(); + assert !writer.getMemberDetailsListPrinted(); } /** @@ -181,12 +181,7 @@ public class MethodWriterImpl extends AbstractExecutableMemberWriter * @param method the method being documented. */ public void writeDeprecated(MethodDoc method) { - String output = ((TagletOutputImpl) - (new DeprecatedTaglet()).getTagletOutput(method, - writer.getTagletWriterInstance(false))).toString(); - if (output != null && output.trim().length() > 0) { - writer.print(output); - } + printDeprecated(method); } /** @@ -197,11 +192,13 @@ public class MethodWriterImpl extends AbstractExecutableMemberWriter public void writeComments(Type holder, MethodDoc method) { ClassDoc holderClassDoc = holder.asClassDoc(); if (method.inlineTags().length > 0) { + writer.printMemberDetailsListStartTag(); if (holder.asClassDoc().equals(classdoc) || (! (holderClassDoc.isPublic() || Util.isLinkable(holderClassDoc, configuration())))) { writer.dd(); writer.printInlineComment(method); + writer.ddEnd(); } else { String classlink = writer.codeText( writer.getDocLink(LinkInfoImpl.CONTEXT_METHOD_DOC_COPY, @@ -217,6 +214,7 @@ public class MethodWriterImpl extends AbstractExecutableMemberWriter writer.ddEnd(); writer.dd(); writer.printInlineComment(method); + writer.ddEnd(); } } } @@ -234,8 +232,7 @@ public class MethodWriterImpl extends AbstractExecutableMemberWriter * Write the method footer. */ public void writeMethodFooter() { - writer.ddEnd(); - writer.dlEnd(); + printMemberFooter(); } /** @@ -318,6 +315,7 @@ public class MethodWriterImpl extends AbstractExecutableMemberWriter String name = method.name(); writer.dt(); writer.strongText(label); + writer.dtEnd(); writer.dd(); String methLink = writer.codeText( writer.getLink( @@ -326,6 +324,7 @@ public class MethodWriterImpl extends AbstractExecutableMemberWriter writer.getAnchor(method), name, false) )); writer.printText("doclet.in_class", methLink, overriddenTypeLink); + writer.ddEnd(); } } @@ -364,11 +363,13 @@ public class MethodWriterImpl extends AbstractExecutableMemberWriter LinkInfoImpl.CONTEXT_METHOD_SPECIFIED_BY, intfac))); writer.dt(); writer.strongText("doclet.Specified_By"); + writer.dtEnd(); writer.dd(); methlink = writer.codeText(writer.getDocLink( LinkInfoImpl.CONTEXT_MEMBER, implementedMeth, implementedMeth.name(), false)); writer.printText("doclet.in_interface", methlink, intfaclink); + writer.ddEnd(); } } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/NestedClassWriterImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/NestedClassWriterImpl.java index 2b3d2ea3709..23803455ad1 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/NestedClassWriterImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/NestedClassWriterImpl.java @@ -25,11 +25,11 @@ package com.sun.tools.doclets.formats.html; +import java.io.*; + +import com.sun.javadoc.*; import com.sun.tools.doclets.internal.toolkit.*; import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.javadoc.*; - -import java.io.*; /** * Writes nested class documentation in HTML format. @@ -129,7 +129,6 @@ public class NestedClassWriterImpl extends AbstractMemberWriter writer.println(""); } writer.anchor(nestedClass.name()); - writer.dl(); writer.h3(); writer.print(nestedClass.name()); writer.h3End(); diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageTreeWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageTreeWriter.java index 638c6d4d75f..12f6d4e0466 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageTreeWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageTreeWriter.java @@ -25,10 +25,11 @@ package com.sun.tools.doclets.formats.html; -import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.javadoc.*; import java.io.*; +import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.util.*; + /** * Class to generate Tree page for a package. The name of the file generated is * "package-tree.html" and it is generated in the respective package directory. @@ -145,8 +146,10 @@ public class PackageTreeWriter extends AbstractTreeWriter { dl(); dt(); strongText("doclet.Package_Hierarchies"); + dtEnd(); dd(); navLinkMainTree(configuration.getText("doclet.All_Packages")); + ddEnd(); dlEnd(); hr(); } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/TagletWriterImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/TagletWriterImpl.java index 353937f630a..e83e6f9bdfe 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/TagletWriterImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/TagletWriterImpl.java @@ -25,17 +25,18 @@ package com.sun.tools.doclets.formats.html; +import com.sun.javadoc.*; import com.sun.tools.doclets.internal.toolkit.*; import com.sun.tools.doclets.internal.toolkit.builders.SerializedFormBuilder; import com.sun.tools.doclets.internal.toolkit.taglets.*; import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.javadoc.*; /** * The taglet writer that writes HTML. * * @since 1.5 * @author Jamie Ho + * @author Bhavesh Patel (Modified) */ public class TagletWriterImpl extends TagletWriter { @@ -99,11 +100,12 @@ public class TagletWriterImpl extends TagletWriter { output.append(DocletConstants.NL + "

" + DocletConstants.NL); } + output.append(""); } else { if (Util.isDeprecated(member.containingClass())) { output.append("

" + ConfigurationImpl.getInstance(). - getText("doclet.Deprecated") + " "); + getText("doclet.Deprecated") + " 
"); } } } @@ -123,7 +125,7 @@ public class TagletWriterImpl extends TagletWriter { public TagletOutput getParamHeader(String header) { StringBuffer result = new StringBuffer(); result.append("
"); - result.append("" + header + ""); + result.append("" + header + "
"); return new TagletOutputImpl(result.toString()); } @@ -132,7 +134,7 @@ public class TagletWriterImpl extends TagletWriter { */ public TagletOutput paramTagOutput(ParamTag paramTag, String paramName) { TagletOutput result = new TagletOutputImpl("
" + paramName + "" - + " - " + htmlWriter.commentTagsToString(paramTag, null, paramTag.inlineTags(), false)); + + " - " + htmlWriter.commentTagsToString(paramTag, null, paramTag.inlineTags(), false) + "
"); return result; } @@ -142,9 +144,9 @@ public class TagletWriterImpl extends TagletWriter { public TagletOutput returnTagOutput(Tag returnTag) { TagletOutput result = new TagletOutputImpl(DocletConstants.NL + "
" + "" + htmlWriter.configuration.getText("doclet.Returns") + - "" + "
" + + "" + "" + "
" + htmlWriter.commentTagsToString(returnTag, null, returnTag.inlineTags(), - false)); + false) + "
"); return result; } @@ -174,22 +176,21 @@ public class TagletWriterImpl extends TagletWriter { } if (holder.isClass() && ((ClassDoc)holder).isSerializable()) { //Automatically add link to serialized form page for serializable classes. - if (!(SerializedFormBuilder.serialInclude(holder) && + if ((SerializedFormBuilder.serialInclude(holder) && SerializedFormBuilder.serialInclude(((ClassDoc)holder).containingPackage()))) { - return result.equals("") ? null : new TagletOutputImpl(result); + result = addSeeHeader(result); + result += htmlWriter.getHyperLink(htmlWriter.relativePath + "serialized-form.html", + ((ClassDoc)holder).qualifiedName(), htmlWriter.configuration.getText("doclet.Serialized_Form"), false); } - result = addSeeHeader(result); - result += htmlWriter.getHyperLink(htmlWriter.relativePath + "serialized-form.html", - ((ClassDoc)holder).qualifiedName(), htmlWriter.configuration.getText("doclet.Serialized_Form"), false); } - return result.equals("") ? null : new TagletOutputImpl(result); + return result.equals("") ? null : new TagletOutputImpl(result + ""); } private String addSeeHeader(String result) { if (result != null && result.length() > 0) { return result + ", " + DocletConstants.NL; } else { - return "
" + htmlWriter.configuration().getText("doclet.See_Also") + "
"; + return "
" + htmlWriter.configuration().getText("doclet.See_Also") + "
"; } } @@ -205,7 +206,8 @@ public class TagletWriterImpl extends TagletWriter { } result += htmlWriter.commentTagsToString(simpleTags[i], null, simpleTags[i].inlineTags(), false); } - return new TagletOutputImpl(result + "
" + DocletConstants.NL); + result += "" + DocletConstants.NL; + return new TagletOutputImpl(result); } /** @@ -222,7 +224,7 @@ public class TagletWriterImpl extends TagletWriter { */ public TagletOutput getThrowsHeader() { return new TagletOutputImpl(DocletConstants.NL + "
" + "" + - htmlWriter.configuration().getText("doclet.Throws") + ""); + htmlWriter.configuration().getText("doclet.Throws") + "
"); } /** @@ -241,6 +243,7 @@ public class TagletWriterImpl extends TagletWriter { if (text != null && text.toString().length() > 0) { result += " - " + text; } + result += ""; return new TagletOutputImpl(result); } @@ -250,7 +253,7 @@ public class TagletWriterImpl extends TagletWriter { public TagletOutput throwsTagOutput(Type throwsType) { return new TagletOutputImpl(DocletConstants.NL + "
" + htmlWriter.codeText(htmlWriter.getLink( - new LinkInfoImpl(LinkInfoImpl.CONTEXT_MEMBER, throwsType)))); + new LinkInfoImpl(LinkInfoImpl.CONTEXT_MEMBER, throwsType))) + "
"); } /** diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/TreeWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/TreeWriter.java index 669cd1c86a1..7760df955d9 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/TreeWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/TreeWriter.java @@ -25,9 +25,11 @@ package com.sun.tools.doclets.formats.html; -import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.javadoc.*; import java.io.*; + +import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.util.*; + /** * Generate Class Hierarchy page for all the Classes in this run. Use * ClassTree for building the Tree. The name of @@ -120,6 +122,7 @@ public class TreeWriter extends AbstractTreeWriter { dl(); dt(); strongText("doclet.Package_Hierarchies"); + dtEnd(); dd(); for (int i = 0; i < packages.length; i++) { if (packages[i].name().length() == 0) { @@ -131,6 +134,7 @@ public class TreeWriter extends AbstractTreeWriter { print(", "); } } + ddEnd(); dlEnd(); hr(); } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocWriter.java index d4cdd39b1ce..64cfd6aba92 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocWriter.java @@ -244,6 +244,31 @@ public abstract class HtmlDocWriter extends HtmlWriter { return ""; } + /** + * Keep track of member details list. Print the definition list start tag + * if it is not printed yet. + */ + public void printMemberDetailsListStartTag () { + if (!getMemberDetailsListPrinted()) { + dl(); + memberDetailsListPrinted = true; + } + } + + /** + * Print the definition list end tag if the list start tag was printed. + */ + public void printMemberDetailsListEndTag () { + if (getMemberDetailsListPrinted()) { + dlEnd(); + memberDetailsListPrinted = false; + } + } + + public boolean getMemberDetailsListPrinted() { + return memberDetailsListPrinted; + } + /** * Print the frameset version of the Html file header. * Called only when generating an HTML frameset file. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlWriter.java index cdafe1be907..60e4c2fb0ac 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlWriter.java @@ -25,9 +25,10 @@ package com.sun.tools.doclets.formats.html.markup; +import java.io.*; + import com.sun.tools.doclets.internal.toolkit.*; import com.sun.tools.doclets.internal.toolkit.util.*; -import java.io.*; /** * Class for the Html format code generation. @@ -60,6 +61,11 @@ public class HtmlWriter extends PrintWriter { */ protected Configuration configuration; + /** + * The flag to indicate whether a member details list is printed or not. + */ + protected boolean memberDetailsListPrinted; + /** * Constructor. * @@ -79,6 +85,7 @@ public class HtmlWriter extends PrintWriter { super(Util.genWriter(configuration, path, filename, docencoding)); this.configuration = configuration; htmlFilename = filename; + this.memberDetailsListPrinted = false; } /** @@ -529,7 +536,14 @@ public class HtmlWriter extends PrintWriter { } /** - * Print <DT> tag. + * Print </DT> tag. + */ + public void dtEnd() { + print(""); + } + + /** + * Print <DD> tag. */ public void dd() { print("
"); diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/SerializedFormWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/SerializedFormWriter.java index d1de4df22dd..9104a5e4b8f 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/SerializedFormWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/SerializedFormWriter.java @@ -25,9 +25,10 @@ package com.sun.tools.doclets.internal.toolkit; -import com.sun.javadoc.*; import java.io.*; +import com.sun.javadoc.*; + /** * The interface for writing serialized form output. * @@ -147,22 +148,27 @@ public interface SerializedFormWriter { String fieldDimensions, String fieldName); /** - * Write the footer. - * - * @param member the member to write the header for. + * Write the member footer. */ - public void writeMemberFooter(FieldDoc member); + public void writeMemberFooter(); /** - * Check to see if member details should be printed. If + * Check to see if overview details should be printed. If * nocomment option set or if there is no text to be printed - * for deprecation info, inline comment, no serial tag or inline tags, - * do not print member details. + * for deprecation info, inline comment or tags, + * do not print overview details. * - * @param member the member to check details for. - * @return true if details need to be printed + * @param field the field to check overview details for. + * @return true if overview details need to be printed */ - public boolean shouldPrintMemberDetails(FieldDoc member); + public boolean shouldPrintOverview(FieldDoc field); + + /** + * Write the footer. + * + * @param heading the heading that was written. + */ + public void writeFooter (String heading); } /** @@ -193,10 +199,8 @@ public interface SerializedFormWriter { /** * Write the footer. - * - * @param member the member to write the header for. */ - public void writeMemberFooter(MethodDoc member); + public void writeMemberFooter(); /** * Write the deprecated information for this member. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/SerializedFormBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/SerializedFormBuilder.java index 1434bc0cd0a..8275da40dfa 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/SerializedFormBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/SerializedFormBuilder.java @@ -25,13 +25,14 @@ package com.sun.tools.doclets.internal.toolkit.builders; -import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.internal.toolkit.*; -import com.sun.javadoc.*; import java.io.*; import java.lang.reflect.*; import java.util.*; +import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.util.*; +import com.sun.tools.doclets.internal.toolkit.*; + /** * Builds the serialized form. * @@ -40,6 +41,7 @@ import java.util.*; * Do not use it as an API * * @author Jamie Ho + * @author Bhavesh Patel (Modified) * @since 1.5 */ public class SerializedFormBuilder extends AbstractBuilder { @@ -379,7 +381,7 @@ public class SerializedFormBuilder extends AbstractBuilder { * Build the method footer. */ public void buildMethodFooter() { - methodWriter.writeMemberFooter((MethodDoc) currentMember); + methodWriter.writeMemberFooter(); } /** @@ -405,15 +407,18 @@ public class SerializedFormBuilder extends AbstractBuilder { Util.asList(classDoc.serializableFields()).get(0); // Check to see if there are inline comments, tags or deprecation // information to be printed. - if (fieldWriter.shouldPrintMemberDetails(serialPersistentField)) { + if (fieldWriter.shouldPrintOverview(serialPersistentField)) { fieldWriter.writeHeader( - configuration.getText("doclet.Serialized_Form_class")); + configuration.getText("doclet.Serialized_Form_class")); fieldWriter.writeMemberDeprecatedInfo(serialPersistentField); if (!configuration.nocomment) { fieldWriter.writeMemberDescription(serialPersistentField); fieldWriter.writeMemberTags(serialPersistentField); } - fieldWriter.writeMemberFooter(serialPersistentField); + // Footer required to close the definition list tag + // for serialization overview. + fieldWriter.writeFooter( + configuration.getText("doclet.Serialized_Form_class")); } } } @@ -476,11 +481,11 @@ public class SerializedFormBuilder extends AbstractBuilder { } /** - * Build the field footer. + * Build the field sub footer. */ - public void buildFieldFooter() { + public void buildFieldSubFooter() { if (! currentClass.definesSerializableFields()) { - fieldWriter.writeMemberFooter((FieldDoc) currentMember); + fieldWriter.writeMemberFooter(); } } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclet.xml b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclet.xml index 8eaa2d77abc..9c4d93a1761 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclet.xml +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclet.xml @@ -1,205 +1,205 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - -
- - -
- - - - - - - - -
- - -
- - - - - - - - -
- - -
- - - - - - - - -
- - - - - -
- - - - - - - - - - - -
- - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
- - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + +
+ + +
+ + + + + + + + +
+ + +
+ + + + + + + + +
+ + +
+ + + + + + + + +
+ + + + + +
+ + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/langtools/test/com/sun/javadoc/AuthorDD/AuthorDD.java b/langtools/test/com/sun/javadoc/AuthorDD/AuthorDD.java index 68d4f9ce596..0c5d56e811f 100644 --- a/langtools/test/com/sun/javadoc/AuthorDD/AuthorDD.java +++ b/langtools/test/com/sun/javadoc/AuthorDD/AuthorDD.java @@ -91,7 +91,7 @@ public class AuthorDD // Test multiple @author tags: - { "
Author:
"+NL+"
Doug Kramer, Jamie, Neal
"+NL, + { "
Author:
"+NL+"
Doug Kramer, Jamie, Neal
", BUGID + FS + "p1" + FS + "C1.html" }, }; diff --git a/langtools/test/com/sun/javadoc/testClassCrossReferences/TestClassCrossReferences.java b/langtools/test/com/sun/javadoc/testClassCrossReferences/TestClassCrossReferences.java index ced91ed79c1..51a488322a2 100644 --- a/langtools/test/com/sun/javadoc/testClassCrossReferences/TestClassCrossReferences.java +++ b/langtools/test/com/sun/javadoc/testClassCrossReferences/TestClassCrossReferences.java @@ -48,7 +48,7 @@ public class TestClassCrossReferences extends JavadocTester { "Link to external member gcd"}, {BUG_ID + FS + "C.html", - "Overrides:
toString in class java.lang.Object"} + "Overrides:
toString in class java.lang.Object"} }; private static final String[][] NEGATED_TEST = NO_TEST; private static final String[] ARGS = diff --git a/langtools/test/com/sun/javadoc/testConstructorIndent/TestConstructorIndent.java b/langtools/test/com/sun/javadoc/testConstructorIndent/TestConstructorIndent.java index cd892a4e31d..ed27a7b4bac 100644 --- a/langtools/test/com/sun/javadoc/testConstructorIndent/TestConstructorIndent.java +++ b/langtools/test/com/sun/javadoc/testConstructorIndent/TestConstructorIndent.java @@ -45,9 +45,10 @@ public class TestConstructorIndent extends JavadocTester { //Input for string search tests. private static final String[][] TEST = { - {BUG_ID + FS + "C.html", "
"+NL+"
This is just a simple constructor."+ NL + - "

"+NL+"

"+NL+"
Parameters:
i - a param.
"+NL + - "
" + {BUG_ID + FS + "C.html", "
" + NL + "
This is just a simple constructor." + NL + + "

" + NL + "

" + NL + "
" + NL + "
Parameters:" + + "
i - a param.
" + NL + + "
" + NL + "
" } }; private static final String[][] NEGATED_TEST = NO_TEST; diff --git a/langtools/test/com/sun/javadoc/testDeprecatedDocs/TestDeprecatedDocs.java b/langtools/test/com/sun/javadoc/testDeprecatedDocs/TestDeprecatedDocs.java index ab11813e95e..ef36c8c03bf 100644 --- a/langtools/test/com/sun/javadoc/testDeprecatedDocs/TestDeprecatedDocs.java +++ b/langtools/test/com/sun/javadoc/testDeprecatedDocs/TestDeprecatedDocs.java @@ -78,13 +78,12 @@ public class TestDeprecatedDocs extends JavadocTester { {TARGET_FILE2, "Deprecated." + NL + "

" + NL + - "

" + NL + - "
@Deprecated" + NL +
+            "
@Deprecated" + NL +
             "public class DeprecatedClassByAnnotation"},
 
         {TARGET_FILE2, "public int field
" + NL + "
" + NL + - "
Deprecated. 
"}, + "
Deprecated. 
"}, {TARGET_FILE2, "@Deprecated" + NL + "public DeprecatedClassByAnnotation()
" + NL + diff --git a/langtools/test/com/sun/javadoc/testExternalOverridenMethod/TestExternalOverridenMethod.java b/langtools/test/com/sun/javadoc/testExternalOverridenMethod/TestExternalOverridenMethod.java index 4308ccfe27f..204b1a9772e 100644 --- a/langtools/test/com/sun/javadoc/testExternalOverridenMethod/TestExternalOverridenMethod.java +++ b/langtools/test/com/sun/javadoc/testExternalOverridenMethod/TestExternalOverridenMethod.java @@ -39,13 +39,13 @@ public class TestExternalOverridenMethod extends JavadocTester { private static final String BUG_ID = "4857717"; private static final String[][] TEST = { {BUG_ID + FS + "pkg" + FS + "XReader.html", - "Overrides:
Overrides:
read in class " + "FilterReader"}, {BUG_ID + FS + "pkg" + FS + "XReader.html", - "Specified by:
Specified by:
readInt in interface " + "
" + "See Also:
" }, //Header does not link to the page itself. diff --git a/langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/TestHtmlDefinitionListTag.java b/langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/TestHtmlDefinitionListTag.java new file mode 100644 index 00000000000..5fa8db63ca5 --- /dev/null +++ b/langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/TestHtmlDefinitionListTag.java @@ -0,0 +1,370 @@ +/* + * Copyright 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. 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 6786690 + * @summary This test verifies the nesting of definition list tags. + * @author Bhavesh Patel + * @library ../lib/ + * @build JavadocTester + * @build TestHtmlDefinitionListTag + * @run main TestHtmlDefinitionListTag + */ + +public class TestHtmlDefinitionListTag extends JavadocTester { + + private static final String BUG_ID = "6786690"; + + // Test common to all runs of javadoc. The class signature should print + // properly enclosed definition list tags and the Annotation Type + // Optional Element should print properly nested definition list tags + // for default value. + private static final String[][] TEST_ALL = { + {BUG_ID + FS + "pkg1" + FS + "C1.html", "
public class " +
+                 "C1" + NL + "extends " +
+                 "java.lang.Object" + NL + "implements " +
+                 "java.io.Serializable
"}, + {BUG_ID + FS + "pkg1" + FS + "C4.html", "
" + NL + "
" + NL + + "
Default:
true
" + NL + + "
" + NL + "
" + NL + "
"}}; + + // Test for normal run of javadoc in which various ClassDocs and + // serialized form should have properly nested definition list tags + // enclosing comments, tags and deprecated information. + private static final String[][] TEST_CMNT_DEPR = { + {BUG_ID + FS + "pkg1" + FS + "C1.html", "
" + NL + + "
Since:
" + NL + + "
JDK1.0
" + NL + "
See Also:
" + + "" + + "C2, " + NL + + "" + + "Serialized Form
"}, + {BUG_ID + FS + "pkg1" + FS + "C1.html", "
" + NL + + "
Deprecated. As of JDK version" + + " 1.5, replaced by" + NL + + " " + + "setUndecorated(boolean).
" + + "
This field indicates whether the C1 is undecorated." + NL + + "

" + NL + "

" + NL + "
" + NL + "
" + + "Since:
" + NL + "
1.4
" + NL + "
" + + "See Also:
" + + "" + + "setUndecorated(boolean)
" + NL +"
" + NL + + "
"}, + {BUG_ID + FS + "pkg1" + FS + "C1.html", "
" + NL + + "
Constructor." + NL + "

" + NL + "

" + NL + + "
" + NL + "
Parameters:
" + + "title - the title
test" + + " - boolean value
" + NL + "
Throws:
" + NL + + "
java.lang.IllegalArgumentException" + + " - if the owner's" + NL + " GraphicsConfiguration" + + " is not from a screen device
" + NL +"
" + + "HeadlessException
" + NL + "
" + NL + + "
"}, + {BUG_ID + FS + "pkg1" + FS + "C1.html", "
" + NL + + "
Method comments." + NL + "

" + NL + + "

" + NL + "
" + NL + "
Parameters:" + + "
undecorated - true" + + " if no decorations are" + NL + " to be enabled;" + NL + + " false if decorations are to be enabled." + + "
Since:
" + NL + + "
1.4
" + NL + "
See Also:
" + + "
" + + "readObject()
" + NL + "
" + NL + + "
"}, + {BUG_ID + FS + "pkg1" + FS + "C1.html", "
" + NL + "
" + NL + + "
Throws:
" + NL + "
" + + "java.io.IOException
See Also:" + + "
" + + "" + + "setUndecorated(boolean)
" + NL + + "
" + NL + "
"}, + {BUG_ID + FS + "pkg1" + FS + "C1.ModalExclusionType.html", "
" + NL + + "
No modal exclusion." + NL + "

" + NL +"

" + NL + + "
"}, + {BUG_ID + FS + "pkg1" + FS + "C2.html", "
" + NL + "
Constructor." + NL + + "

" + NL +"

" + NL + "
"}, + {BUG_ID + FS + "pkg1" + FS + "C2.html", "
" + NL + "
" + + "Deprecated. As of JDK version 1.5, replaced " + + "by" + NL + " " + + "setUndecorated(boolean)." + NL + "

" + NL + + "

Set visible." + NL + "

" + NL + "

" +NL + + "
" + NL + "
Parameters:
" + + "set - boolean
Since:
" + NL + + "
1.4
" + NL + "
" + NL + "
"}, + {BUG_ID + FS + "pkg1" + FS + "C3.html", "
" + NL + "
Comment." + NL + + "

" + NL + "

" + NL + "
"}, + {BUG_ID + FS + "serialized-form.html", "
" + NL + "
" + NL + + "
Throws:
" + NL + "
" + + "java.io.IOException
See Also:" + + "
" + + "C1.setUndecorated(boolean)
" + NL + + "
" + NL + "
"}, + {BUG_ID + FS + "serialized-form.html", "
" + NL + + "
Deprecated. As of JDK version " + + "1.5, replaced by" + NL + + " " + + "setUndecorated(boolean).
" + + "
This field indicates whether the C1 is undecorated." + NL + + "

" + NL + "

" + NL + "
 
" + NL + + "
" + NL + "
Since:
" + NL + + "
1.4
" + NL + "
See Also:" + + "
" + + "C1.setUndecorated(boolean)
" + NL + + "
" + NL + "
"}, + {BUG_ID + FS + "serialized-form.html", "
" + NL + + "
Deprecated. As of JDK version" + + " 1.5, replaced by" + NL + + " " + + "setUndecorated(boolean)." + NL + "

" + NL + + "

Reads the object stream." + NL + "

" + NL + + "

" + NL + "
" + NL + "
Throws:" + + "
" + NL + "
" + + "IOException
" + NL + + "
java.io.IOException
" + NL + + "
" + NL + "
"}, + {BUG_ID + FS + "serialized-form.html", "
" + NL + + "
Deprecated. 
" + + "The name for this class." + NL + "

" + NL + "

" + NL + + "
 
" + NL + "
"}}; + + // Test with -nocomment option. The ClassDocs and serialized form should + // have properly nested definition list tags enclosing deprecated + // information and should not display definition lists for comments + // and tags. + private static final String[][] TEST_NOCMNT = { + {BUG_ID + FS + "pkg1" + FS + "C1.html", "
" + NL + "
" + + "Deprecated. As of JDK version 1.5, replaced by" + NL + + " " + + "setUndecorated(boolean).
"}, + {BUG_ID + FS + "pkg1" + FS + "C2.html", "
" + NL + + "
Deprecated. As of JDK version" + + " 1.5, replaced by" + NL + + " " + + "setUndecorated(boolean)." + NL + "

" + NL + + "

"}, + {BUG_ID + FS + "pkg1" + FS + "C5.html", "
" + NL +
+                 "protected C5()
" + NL + "
" + NL + + "
Deprecated. 
"}, + {BUG_ID + FS + "pkg1" + FS + "C5.html", "
" + NL +
+                 "public void printInfo()
" + NL + "
" + NL + + "
Deprecated. 
"}, + {BUG_ID + FS + "serialized-form.html", "
" + NL + "boolean " +
+                 "undecorated
" + NL + "
" + NL + "
" + + "Deprecated. As of JDK version 1.5, replaced by" + NL + + " " + + "setUndecorated(boolean).
"}, + {BUG_ID + FS + "serialized-form.html", "
" + NL + "
" + + "Deprecated. As of JDK version" + + " 1.5, replaced by" + NL + + " " + + "setUndecorated(boolean)." + NL + "

" + NL + + "

"}, + {BUG_ID + FS + "serialized-form.html", "
" + NL + "int " +
+                 "publicKey
" + NL + "
" + NL + "
" + + "Deprecated. 
"}}; + + // Test with -nodeprecated option. The ClassDocs should have properly nested + // definition list tags enclosing comments and tags. The ClassDocs should not + // display definition list for deprecated information. The serialized form + // should display properly nested definition list tags for comments, tags + // and deprecated information. + private static final String[][] TEST_NODEPR = { + {BUG_ID + FS + "pkg1" + FS + "C1.html", "
" + NL + + "
Since:
" + NL + + "
JDK1.0
" + NL + "
See Also:
" + + "" + + "C2, " + NL + + "" + + "Serialized Form
"}, + {BUG_ID + FS + "pkg1" + FS + "C1.html", "
" + NL + + "
Constructor." + NL + "

" + NL + "

" + NL + + "
" + NL + "
Parameters:
" + + "title - the title
test" + + " - boolean value
" + NL + "
Throws:
" + NL + + "
java.lang.IllegalArgumentException" + + " - if the owner's" + NL + " GraphicsConfiguration" + + " is not from a screen device
" + NL +"
" + + "HeadlessException
" + NL + "
" + NL + + "
"}, + {BUG_ID + FS + "pkg1" + FS + "C1.html", "
" + NL + + "
Method comments." + NL + "

" + NL + + "

" + NL + "
" + NL + "
Parameters:" + + "
undecorated - true" + + " if no decorations are" + NL + " to be enabled;" + NL + + " false if decorations are to be enabled." + + "
Since:
" + NL + + "
1.4
" + NL + "
See Also:
" + + "
" + + "readObject()
" + NL + "
" + NL + + "
"}, + {BUG_ID + FS + "pkg1" + FS + "C1.html", "
" + NL + "
" + NL + + "
Throws:
" + NL + "
" + + "java.io.IOException
See Also:" + + "
" + + "" + + "setUndecorated(boolean)
" + NL + + "
" + NL + "
"}, + {BUG_ID + FS + "pkg1" + FS + "C1.ModalExclusionType.html", "
" + NL + + "
No modal exclusion." + NL + "

" + NL +"

" + NL + + "
"}, + {BUG_ID + FS + "pkg1" + FS + "C2.html", "
" + NL + "
Constructor." + NL + + "

" + NL +"

" + NL + "
"}, + {BUG_ID + FS + "pkg1" + FS + "C3.html", "
" + NL + "
Comment." + NL + + "

" + NL + "

" + NL + "
"}, + {BUG_ID + FS + "serialized-form.html", "
" + NL + "
" + NL + + "
Throws:
" + NL + "
" + + "java.io.IOException
See Also:" + + "
" + + "C1.setUndecorated(boolean)
" + NL + + "
" + NL + "
"}, + {BUG_ID + FS + "serialized-form.html", "
" + NL + + "
Deprecated. As of JDK version " + + "1.5, replaced by" + NL + + " " + + "setUndecorated(boolean).
" + + "
This field indicates whether the C1 is undecorated." + NL + + "

" + NL + "

" + NL + "
 
" + NL + + "
" + NL + "
Since:
" + NL + + "
1.4
" + NL + "
See Also:" + + "
" + + "C1.setUndecorated(boolean)
" + NL + + "
" + NL + "
"}, + {BUG_ID + FS + "serialized-form.html", "
" + NL + + "
Deprecated. As of JDK version" + + " 1.5, replaced by" + NL + + " " + + "setUndecorated(boolean)." + NL + "

" + NL + + "

Reads the object stream." + NL + "

" + NL + + "

" + NL + "
" + NL + "
Throws:" + + "
" + NL + "
" + + "IOException
" + NL + + "
java.io.IOException
" + NL + + "
" + NL + "
"}, + {BUG_ID + FS + "serialized-form.html", "
" + NL + + "
Deprecated. 
" + + "The name for this class." + NL + "

" + NL + "

" + NL + + "
 
" + NL + "
"}}; + + // Test with -nocomment and -nodeprecated options. The ClassDocs whould + // not display definition lists for any member details. The serialized + // form should display properly nested definition list tags for + // deprecated information only. + private static final String[][] TEST_NOCMNT_NODEPR = { + {BUG_ID + FS + "pkg1" + FS + "C1.html", "
" + NL + "public void " +
+                 "readObject()" + NL + "                throws" +
+                 " java.io.IOException
" + NL + "
"}, + {BUG_ID + FS + "pkg1" + FS + "C2.html", "
" +NL + "public " +
+                 "C2()
" + NL + "
"}, + {BUG_ID + FS + "pkg1" + FS + "C1.ModalExclusionType.html", "
" + NL +
+                 "public static final " +
+                 "C1.ModalExclusionType " +
+                 "APPLICATION_EXCLUDE
" + NL + "
"}, + {BUG_ID + FS + "serialized-form.html", "
" + NL + "boolean " +
+                 "undecorated
" + NL + "
" + NL + "
" + + "Deprecated. As of JDK version 1.5, replaced by" + NL + + " " + + "setUndecorated(boolean).
"}, + {BUG_ID + FS + "serialized-form.html", "
" + NL + "
" + + "Deprecated. As of JDK version" + + " 1.5, replaced by" + NL + + " " + + "setUndecorated(boolean)." + NL + "

" + NL + + "

"}, + {BUG_ID + FS + "serialized-form.html", "
" + NL + "int " +
+                 "publicKey
" + NL + "
" + NL + "
" + + "Deprecated. 
"}}; + + // Test for valid HTML generation which should not comprise of empty + // definition list tags. + private static final String[][] NEGATED_TEST = { + {BUG_ID + FS + "pkg1" + FS + "C1.html", "
"}, + {BUG_ID + FS + "pkg1" + FS + "C1.html", "
" + NL + "
"}, + {BUG_ID + FS + "pkg1" + FS + "C1.ModalExclusionType.html", "
"}, + {BUG_ID + FS + "pkg1" + FS + "C1.ModalExclusionType.html", "
" + NL + "
"}, + {BUG_ID + FS + "pkg1" + FS + "C2.html", "
"}, + {BUG_ID + FS + "pkg1" + FS + "C2.html", "
" + NL + "
"}, + {BUG_ID + FS + "pkg1" + FS + "C2.ModalType.html", "
"}, + {BUG_ID + FS + "pkg1" + FS + "C2.ModalType.html", "
" + NL + "
"}, + {BUG_ID + FS + "pkg1" + FS + "C3.html", "
"}, + {BUG_ID + FS + "pkg1" + FS + "C3.html", "
" + NL + "
"}, + {BUG_ID + FS + "pkg1" + FS + "C4.html", "
"}, + {BUG_ID + FS + "pkg1" + FS + "C4.html", "
" + NL + "
"}, + {BUG_ID + FS + "pkg1" + FS + "C5.html", "
"}, + {BUG_ID + FS + "pkg1" + FS + "C5.html", "
" + NL + "
"}, + {BUG_ID + FS + "overview-tree.html", "
"}, + {BUG_ID + FS + "overview-tree.html", "
" + NL + "
"}, + {BUG_ID + FS + "serialized-form.html", "
"}, + {BUG_ID + FS + "serialized-form.html", "
" + NL + "
"}}; + + private static final String[] ARGS1 = + new String[] { + "-d", BUG_ID, "-sourcepath", SRC_DIR, "pkg1"}; + + private static final String[] ARGS2 = + new String[] { + "-d", BUG_ID, "-nocomment", "-sourcepath", SRC_DIR, "pkg1"}; + + private static final String[] ARGS3 = + new String[] { + "-d", BUG_ID, "-nodeprecated", "-sourcepath", SRC_DIR, "pkg1"}; + + private static final String[] ARGS4 = + new String[] { + "-d", BUG_ID, "-nocomment", "-nodeprecated", "-sourcepath", SRC_DIR, "pkg1"}; + + /** + * The entry point of the test. + * @param args the array of command line arguments. + */ + public static void main(String[] args) { + TestHtmlDefinitionListTag tester = new TestHtmlDefinitionListTag(); + run(tester, ARGS1, TEST_ALL, NEGATED_TEST); + run(tester, ARGS1, TEST_CMNT_DEPR, NEGATED_TEST); + run(tester, ARGS2, TEST_ALL, NEGATED_TEST); + run(tester, ARGS2, TEST_NOCMNT, TEST_CMNT_DEPR); + run(tester, ARGS3, TEST_ALL, NEGATED_TEST); + run(tester, ARGS3, TEST_NODEPR, TEST_NOCMNT_NODEPR); + run(tester, ARGS4, TEST_ALL, NEGATED_TEST); + run(tester, ARGS4, TEST_NOCMNT_NODEPR, TEST_CMNT_DEPR); + tester.printSummary(); + } + + /** + * {@inheritDoc} + */ + public String getBugId() { + return BUG_ID; + } + + /** + * {@inheritDoc} + */ + public String getBugName() { + return getClass().getName(); + } +} diff --git a/langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/pkg1/C1.java b/langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/pkg1/C1.java new file mode 100644 index 00000000000..a3dbc13e629 --- /dev/null +++ b/langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/pkg1/C1.java @@ -0,0 +1,108 @@ +/* + * Copyright 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. 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. + */ + +package pkg1; + +import java.io.IOException; +import java.io.Serializable; + +/** + * A class comment for testing. + * + * @author Bhavesh Patel + * @see C2 + * @since JDK1.0 + */ + +public class C1 implements Serializable { + + /** + * This field indicates whether the C1 is undecorated. + * + * @see #setUndecorated(boolean) + * @since 1.4 + * @serial + * @deprecated As of JDK version 1.5, replaced by + * {@link C1#setUndecorated(boolean) setUndecorated(boolean)}. + */ + @Deprecated + public boolean undecorated = false; + + private String title; + + /** + * This enum specifies the possible modal exclusion types. + * + * @since 1.6 + */ + public static enum ModalExclusionType { + /** + * No modal exclusion. + */ + NO_EXCLUDE, + /** + * APPLICATION_EXCLUDE indicates that a top-level window + * won't be blocked by any application-modal dialogs. Also, it isn't + * blocked by document-modal dialogs from outside of its child hierarchy. + */ + APPLICATION_EXCLUDE + }; + + /** + * Constructor. + * + * @param title the title + * @param test boolean value + * @exception IllegalArgumentException if the owner's + * GraphicsConfiguration is not from a screen device + * @exception HeadlessException + */ + public C1(String title, boolean test) { + + } + + public C1(String title) { + + } + + /** + * Method comments. + * @param undecorated true if no decorations are + * to be enabled; + * false if decorations are to be enabled. + * @see #readObject() + * @since 1.4 + */ + public void setUndecorated(boolean undecorated) { + /* Make sure we don't run in the middle of peer creation.*/ + } + + /** + * @see #setUndecorated(boolean) + */ + public void readObject() throws IOException { + + } +} diff --git a/langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/pkg1/C2.java b/langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/pkg1/C2.java new file mode 100644 index 00000000000..b0e098d1e63 --- /dev/null +++ b/langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/pkg1/C2.java @@ -0,0 +1,86 @@ +/* + * Copyright 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. 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. + */ + +package pkg1; + +import java.io.ObjectInputStream; +import java.io.IOException; +import java.io.Serializable; + +/** + * A class comment for testing. + * + * @author Bhavesh Patel + * @see C1 + * @since JDK1.0 + */ + +public class C2 implements Serializable { + + /** + * This field indicates title. + */ + String title; + + public static enum ModalType { + NO_EXCLUDE + }; + + /** + * Constructor. + * + */ + public C2() { + + } + + public C2(String title) { + + } + + /** + * Set visible. + * + * @param set boolean + * @since 1.4 + * @deprecated As of JDK version 1.5, replaced by + * {@link C1#setUndecorated(boolean) setUndecorated(boolean)}. + */ + @Deprecated + public void setVisible(boolean set) { + } + + /** + * Reads the object stream. + * + * @param s ObjectInputStream + * @throws IOException + * @deprecated As of JDK version 1.5, replaced by + * {@link C1#setUndecorated(boolean) setUndecorated(boolean)}. + */ + @Deprecated + public void readObject(ObjectInputStream s) throws IOException { + } +} diff --git a/langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/pkg1/C3.java b/langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/pkg1/C3.java new file mode 100644 index 00000000000..cf48cf1cb98 --- /dev/null +++ b/langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/pkg1/C3.java @@ -0,0 +1,42 @@ +/* + * Copyright 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. 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. + */ + +package pkg1; + +import java.lang.annotation.*; + +/** + * Test Annotation class. + * + * @author Bhavesh Patel + * @since 1.5 + */ +@Retention(RetentionPolicy.SOURCE) +public @interface C3 { + /** + * Comment. + */ + String[] value(); +} diff --git a/langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/pkg1/C4.java b/langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/pkg1/C4.java new file mode 100644 index 00000000000..0a1fb611c28 --- /dev/null +++ b/langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/pkg1/C4.java @@ -0,0 +1,39 @@ +/* + * Copyright 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. 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. + */ + +package pkg1; + +import java.lang.annotation.*; + +/* + * The @Inherited annotation has no effect when applied to an interface. + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +@Inherited +public @interface C4 { + boolean value() default true; +} diff --git a/langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/pkg1/C5.java b/langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/pkg1/C5.java new file mode 100644 index 00000000000..00ccb7383af --- /dev/null +++ b/langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/pkg1/C5.java @@ -0,0 +1,65 @@ +/* + * Copyright 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. 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. + */ + +package pkg1; + +import java.io.Serializable; + +/** + * Test for Serializable + * + * @author Bhavesh Patel + * @deprecated This class is no longer used. + */ +@Deprecated +public abstract class C5 implements Serializable { + + /** + * The name for this class. + * + * @serial + */ + private String name; + + /** + * @serial + */ + private int publicKey; + + /** + * Constructor for serialization only. + */ + protected C5() { + + } + + /** + * Prints general information. + * + */ + public void printInfo() { + + } +} diff --git a/langtools/test/com/sun/javadoc/testIndex/TestIndex.java b/langtools/test/com/sun/javadoc/testIndex/TestIndex.java index 0594d3d9371..52b61a06278 100644 --- a/langtools/test/com/sun/javadoc/testIndex/TestIndex.java +++ b/langtools/test/com/sun/javadoc/testIndex/TestIndex.java @@ -73,10 +73,10 @@ public class TestIndex extends JavadocTester { {BUG_ID + FS + "index-all.html", "
Java - " + NL + "Static variable in class pkg.C" + NL + - "
 " + NL + + "
 
" + NL + NL + "
JDK - " + NL + "Static variable in class pkg.C" + NL + - "
 "}, + "
 
"}, }; private static final String[][] NEGATED_TEST = NO_TEST; diff --git a/langtools/test/com/sun/javadoc/testInterface/TestInterface.java b/langtools/test/com/sun/javadoc/testInterface/TestInterface.java index 0dd3ebb9003..d5e33d72073 100644 --- a/langtools/test/com/sun/javadoc/testInterface/TestInterface.java +++ b/langtools/test/com/sun/javadoc/testInterface/TestInterface.java @@ -55,7 +55,7 @@ public class TestInterface extends JavadocTester { // Make sure known implementing class list is correct and omits type parameters. {BUG_ID + FS + "pkg" + FS + "Interface.html", - "
All Known Implementing Classes: " + + "
All Known Implementing Classes:
" + "
Child, " + "" + @@ -63,7 +63,9 @@ public class TestInterface extends JavadocTester { // Make sure "All Implemented Interfaces": has substituted type parameters {BUG_ID + FS + "pkg" + FS + "Child.html", - "All Implemented Interfaces:
Interface<T>" + "All Implemented Interfaces:
" + + "" + + "Interface<T>" }, //Make sure Class Tree has substituted type parameters. {BUG_ID + FS + "pkg" + FS + "Child.html", @@ -75,15 +77,15 @@ public class TestInterface extends JavadocTester { }, //Make sure "Direct Know Subclasses" omits type parameters {BUG_ID + FS + "pkg" + FS + "Parent.html", - "Direct Known Subclasses:
Child" + "Direct Known Subclasses:
Child" }, //Make sure "Specified By" has substituted type parameters. {BUG_ID + FS + "pkg" + FS + "Child.html", - "Specified by:
method in interface Interface<T>" + "Specified by:
method in interface Interface<T>" }, //Make sure "Overrides" has substituted type parameters. {BUG_ID + FS + "pkg" + FS + "Child.html", - "Overrides:
method in class Parent<T>" + "Overrides:
method in class Parent<T>" }, }; private static final String[][] NEGATED_TEST = { diff --git a/langtools/test/com/sun/javadoc/testLinkOption/TestLinkOption.java b/langtools/test/com/sun/javadoc/testLinkOption/TestLinkOption.java index 1a2156ee03c..37b4949a513 100644 --- a/langtools/test/com/sun/javadoc/testLinkOption/TestLinkOption.java +++ b/langtools/test/com/sun/javadoc/testLinkOption/TestLinkOption.java @@ -63,7 +63,8 @@ public class TestLinkOption extends JavadocTester { "title=\"class or interface in java.lang\">Object p3)" }, {BUG_ID + "-1" + FS + "java" + FS + "lang" + FS + "StringBuilderChild.html", - "public abstract class StringBuilderChild
extends Object" + "public abstract class StringBuilderChild" + NL + + "extends Object" }, }; diff --git a/langtools/test/com/sun/javadoc/testLinkTaglet/TestLinkTaglet.java b/langtools/test/com/sun/javadoc/testLinkTaglet/TestLinkTaglet.java index 1eb2c998639..6983423f832 100644 --- a/langtools/test/com/sun/javadoc/testLinkTaglet/TestLinkTaglet.java +++ b/langtools/test/com/sun/javadoc/testLinkTaglet/TestLinkTaglet.java @@ -59,7 +59,7 @@ public class TestLinkTaglet extends JavadocTester { " Link to another inner class: C.InnerC2" }, {BUG_ID + FS + "pkg" + FS + "C.InnerC2.html", - "Enclosing class:
C" + "Enclosing class:
C" }, }; private static final String[][] NEGATED_TEST = { diff --git a/langtools/test/com/sun/javadoc/testMemberInheritence/TestMemberInheritence.java b/langtools/test/com/sun/javadoc/testMemberInheritence/TestMemberInheritence.java index 15b9e343267..12da5956f0e 100644 --- a/langtools/test/com/sun/javadoc/testMemberInheritence/TestMemberInheritence.java +++ b/langtools/test/com/sun/javadoc/testMemberInheritence/TestMemberInheritence.java @@ -74,7 +74,7 @@ public class TestMemberInheritence extends JavadocTester { // Test overriding/implementing methods with generic parameters. {BUG_ID + FS + "pkg" + FS + "BaseClass.html", - "
Specified by:
getAnnotation in interface BaseInterface
"}, + "
Specified by:
getAnnotation in interface BaseInterface
"+NL+""}, // Test diamond inheritence member summary (6256068) {BUG_ID + FS + "diamond" + FS + "Z.html", diff --git a/langtools/test/com/sun/javadoc/testNewLanguageFeatures/TestNewLanguageFeatures.java b/langtools/test/com/sun/javadoc/testNewLanguageFeatures/TestNewLanguageFeatures.java index 1bc573d3950..17eac18887a 100644 --- a/langtools/test/com/sun/javadoc/testNewLanguageFeatures/TestNewLanguageFeatures.java +++ b/langtools/test/com/sun/javadoc/testNewLanguageFeatures/TestNewLanguageFeatures.java @@ -54,7 +54,7 @@ public class TestNewLanguageFeatures extends JavadocTester { {BUG_ID + FS + "pkg" + FS + "Coin.html", "Enum Coin"}, //Make sure enum signature is correct. {BUG_ID + FS + "pkg" + FS + "Coin.html", "public enum "+ - "Coin
extends java.lang.Enum<" + + "Coin" + NL + "extends java.lang.Enum<" + "Coin>" }, //Check for enum constant section @@ -79,20 +79,20 @@ public class TestNewLanguageFeatures extends JavadocTester { "Class TypeParameters<E>"}, //Check class type parameters section. {BUG_ID + FS + "pkg" + FS + "TypeParameters.html", - "
Type Parameters:
E - " + + "
Type Parameters:
E - " + "the type parameter for this class."}, //Type parameters in @see/@link {BUG_ID + FS + "pkg" + FS + "TypeParameters.html", - "
See Also:
TypeParameters"}, + "
See Also:
TypeParameters
"}, //Method that uses class type parameter. {BUG_ID + FS + "pkg" + FS + "TypeParameters.html", "(E param)"}, //Method type parameter section. {BUG_ID + FS + "pkg" + FS + "TypeParameters.html", - "Type Parameters:
T - This is the first " + - "type parameter.
V - This is the second type " + + "Type Parameters:
T - This is the first " + + "type parameter.
V - This is the second type " + "parameter."}, //Signature of method with type parameters {BUG_ID + FS + "pkg" + FS + "TypeParameters.html", @@ -117,17 +117,17 @@ public class TestNewLanguageFeatures extends JavadocTester { //Signature of subclass that has type parameters. {BUG_ID + FS + "pkg" + FS + "TypeParameterSubClass.html", "public class TypeParameterSubClass<T extends java.lang.String>" + - "
extends " + NL + "extends TypeParameterSuperClass<T>"}, //Interface generic parameter substitution //Signature of subclass that has type parameters. {BUG_ID + FS + "pkg" + FS + "TypeParameters.html", - "All Implemented Interfaces:
SubInterface<E>, SuperInterface<E>
"}, + "All Implemented Interfaces:
SubInterface<E>, SuperInterface<E>
"}, {BUG_ID + FS + "pkg" + FS + "SuperInterface.html", - "All Known Subinterfaces:
SubInterface<V>
"}, + "All Known Subinterfaces:
SubInterface<V>
"}, {BUG_ID + FS + "pkg" + FS + "SubInterface.html", - "All Superinterfaces:
SuperInterface<V>
"}, + "All Superinterfaces:
SuperInterface<V>
"}, //================================= // VAR ARG TESTING @@ -166,7 +166,7 @@ public class TestNewLanguageFeatures extends JavadocTester { "Element Detail"}, //Make sure default annotation type value is printed when necessary. {BUG_ID + FS + "pkg" + FS + "AnnotationType.html", - "Default:
\"unknown\"
"}, + "Default:
\"unknown\"
"}, //================================= // ANNOTATION TYPE USAGE TESTING @@ -182,7 +182,8 @@ public class TestNewLanguageFeatures extends JavadocTester { "" + "@AnnotationType(optional=\"Class Annotation\","+NL + " required=1994)"+NL + - "public class AnnotationTypeUsage
extends java.lang.Object"}, + "public class AnnotationTypeUsage" + NL + + "extends java.lang.Object"}, //FIELD {BUG_ID + FS + "pkg" + FS + "AnnotationTypeUsage.html", @@ -270,8 +271,7 @@ public class TestNewLanguageFeatures extends JavadocTester { {BUG_ID + FS + "pkg1" + FS + "B.html", "
@A"},
             {BUG_ID + FS + "pkg1" + FS + "B.html",
-                "public interface B" + NL +
-                    "
"}, + "public interface B"}, //============================================================== @@ -525,7 +525,7 @@ public class TestNewLanguageFeatures extends JavadocTester { "" + NL + "@AnnotationTypeUndocumented(optional=\"Class Annotation\"," + NL + " required=1994)" + NL + - "public class AnnotationTypeUsage
extends java.lang.Object"}, + "public class AnnotationTypeUsage
extends java.lang.Object
"}, //FIELD {BUG_ID + FS + "pkg" + FS + "AnnotationTypeUsage.html", diff --git a/langtools/test/com/sun/javadoc/testOverridenMethods/TestOverridenPrivateMethods.java b/langtools/test/com/sun/javadoc/testOverridenMethods/TestOverridenPrivateMethods.java index 7c11f4bd70b..fa4e717eff8 100644 --- a/langtools/test/com/sun/javadoc/testOverridenMethods/TestOverridenPrivateMethods.java +++ b/langtools/test/com/sun/javadoc/testOverridenMethods/TestOverridenPrivateMethods.java @@ -40,11 +40,11 @@ public class TestOverridenPrivateMethods extends JavadocTester { private static final String[][] TEST = { //The public method should be overriden {BUG_ID + FS + "pkg1" + FS + "SubClass.html", - "Overrides:
Parameters:
param1 - testing 1 2 3." + + "Parameters:
param1 - testing 1 2 3.
" + "
param2 - testing 1 2 3." }, //Param tags that don't match with any real parameters. {BUG_ID + FS + "pkg" + FS + "C.html", - "Parameters:
p1 - testing 1 2 3." + + "Parameters:
p1 - testing 1 2 3.
" + "
p2 - testing 1 2 3." }, //{@inherit} doc misuse does not cause doclet to throw exception. diff --git a/langtools/test/com/sun/javadoc/testPrivateClasses/TestPrivateClasses.java b/langtools/test/com/sun/javadoc/testPrivateClasses/TestPrivateClasses.java index f7f5bda38a9..69ba4a11ce3 100644 --- a/langtools/test/com/sun/javadoc/testPrivateClasses/TestPrivateClasses.java +++ b/langtools/test/com/sun/javadoc/testPrivateClasses/TestPrivateClasses.java @@ -96,11 +96,11 @@ public class TestPrivateClasses extends JavadocTester { //Make sure implemented interfaces from private superclass are inherited {BUG_ID + "-1" + FS + "pkg" + FS + "PublicInterface.html", - "All Known Implementing Classes:
All Known Implementing Classes:
PublicChild"}, {BUG_ID + "-1" + FS + "pkg" + FS + "PublicChild.html", - "All Implemented Interfaces:
All Implemented Interfaces:
PublicInterface"}, //Generic interface method test. @@ -174,18 +174,18 @@ public class TestPrivateClasses extends JavadocTester { }, // Should document that a method overrides method from private class. {BUG_ID + "-2" + FS + "pkg" + FS + "PublicChild.html", - "Overrides:
" + + "Overrides:
" + "" + "methodOverridenFromParent in class " + "" + - "PrivateParent"}, + "PrivateParent
" + NL + ""}, // Should document that a method is specified by private interface. {BUG_ID + "-2" + FS + "pkg" + FS + "PublicChild.html", - "Specified by:
" + + "Specified by:
" + "" + "methodInterface in interface " + "" + - "PrivateInterface" + NL + "
"}, + "PrivateInterface
" + NL + "" + NL + ""}, // Method inheritence from non-public superinterface. {BUG_ID + "-2" + FS + "pkg" + FS + "PublicInterface.html", "Methods inherited from interface " + @@ -209,12 +209,12 @@ public class TestPrivateClasses extends JavadocTester { //Make sure implemented interfaces from private superclass are inherited {BUG_ID + "-2" + FS + "pkg" + FS + "PublicInterface.html", - "All Known Implementing Classes:
All Known Implementing Classes:
PrivateParent, " + "PublicChild"}, {BUG_ID + "-2" + FS + "pkg" + FS + "PublicChild.html", - "All Implemented Interfaces:
All Implemented Interfaces:
PrivateInterface, " + "" + "PublicInterface"}, @@ -226,7 +226,7 @@ public class TestPrivateClasses extends JavadocTester { "I"}, {BUG_ID + "-2" + FS + "pkg2" + FS + "C.html", - "Specified by:
" + + "Specified by:
" + "hello in interface I"}, }; diff --git a/langtools/test/com/sun/javadoc/testSerializedFormDeprecationInfo/TestSerializedFormDeprecationInfo.java b/langtools/test/com/sun/javadoc/testSerializedFormDeprecationInfo/TestSerializedFormDeprecationInfo.java index d4f5294ba44..4c5d39bba1e 100644 --- a/langtools/test/com/sun/javadoc/testSerializedFormDeprecationInfo/TestSerializedFormDeprecationInfo.java +++ b/langtools/test/com/sun/javadoc/testSerializedFormDeprecationInfo/TestSerializedFormDeprecationInfo.java @@ -41,39 +41,39 @@ public class TestSerializedFormDeprecationInfo extends JavadocTester { // Test for normal run of javadoc. The serialized-form.html should // display the inline comments, tags and deprecation information if any. private static final String[][] TEST_CMNT_DEPR = { - {BUG_ID + FS + "serialized-form.html", "
" + NL + "
" + NL + NL + - "
Throws:" + NL + "
" + - "java.io.IOException
See Also:" + - "
" + - "C1.setUndecorated(boolean)
" + NL + - "
" + NL + "
"}, + {BUG_ID + FS + "serialized-form.html", "
" + NL + "
" + NL + + "
Throws:
" + NL + "
" + + "java.io.IOException
See Also:" + + "
" + + "C1.setUndecorated(boolean)
" + NL + + "
" + NL + "
"}, {BUG_ID + FS + "serialized-form.html", "
" + NL + - "
Deprecated. As of JDK version" + - " 1.5, replaced by" + NL + + "
Deprecated. As of JDK version " + + "1.5, replaced by" + NL + " " + - "setUndecorated(boolean)." + + "setUndecorated(boolean).
" + "
This field indicates whether the C1 is undecorated." + NL + - "

" + NL + "

 
" + NL + - "
Since:
" + NL + + "

" + NL + "

" + NL + "
 
" + NL + + "
" + NL + "
Since:
" + NL + "
1.4
" + NL + "
See Also:" + - "
" + - "C1.setUndecorated(boolean)
" + NL + - "
"}, + "
" + + "C1.setUndecorated(boolean)
" + NL + + "" + NL + ""}, {BUG_ID + FS + "serialized-form.html", "
" + NL + "
Deprecated. As of JDK version" + " 1.5, replaced by" + NL + " " + "setUndecorated(boolean)." + NL + "

" + NL + - "

Reads the object stream." + NL + "

" + NL + - "

" + NL + NL + "
Throws:" + - "" + NL + "
" + - "IOException" + NL + - "
java.io.IOException
" + NL + - "
" + NL + "
"}, + "
Reads the object stream." + NL + "

" + NL + + "

" + NL + "
" + NL + "
Throws:" + + "
" + NL + "
" + + "IOException
" + NL + + "
java.io.IOException
" + NL + + "
" + NL + ""}, {BUG_ID + FS + "serialized-form.html", "
" + NL + - "
Deprecated. 
" + - "The name for this class." + NL + "

" + NL + - "

 
" + NL + "
" + NL + "
"}}; + "
Deprecated. 
" + + "The name for this class." + NL + "

" + NL + "

" + NL + + "
 
" + NL + ""}}; // Test with -nocomment option. The serialized-form.html should // not display the inline comments and tags but should display deprecation @@ -83,16 +83,16 @@ public class TestSerializedFormDeprecationInfo extends JavadocTester { "undecorated" + NL + "
" + NL + "
" + "Deprecated. As of JDK version 1.5, replaced by" + NL + " " + - "setUndecorated(boolean).
"}, + "setUndecorated(boolean)
."}, {BUG_ID + FS + "serialized-form.html", "
" + NL + "
" + "Deprecated. As of JDK version" + " 1.5, replaced by" + NL + " " + "setUndecorated(boolean)." + NL + "

" + NL + - "

"}, + ""}, {BUG_ID + FS + "serialized-form.html", "
" + NL + "int " +
                  "publicKey
" + NL + "
" + NL + "
" + - "Deprecated. 
"}}; + "Deprecated. "}}; // Test with -nodeprecated option. The serialized-form.html should // ignore the -nodeprecated tag and display the deprecation info. This diff --git a/langtools/test/com/sun/javadoc/testThrowsTag/TestThrowsTag.java b/langtools/test/com/sun/javadoc/testThrowsTag/TestThrowsTag.java index bfae9a0e918..c8e99da5198 100644 --- a/langtools/test/com/sun/javadoc/testThrowsTag/TestThrowsTag.java +++ b/langtools/test/com/sun/javadoc/testThrowsTag/TestThrowsTag.java @@ -46,14 +46,14 @@ public class TestThrowsTag extends JavadocTester { //Input for string search tests. private static final String[][] TEST = { {BUG_ID + FS + "pkg" + FS + "C.html", - "
T1 - the first throws tag." + NL + - "
T2 - the second throws tag." + NL + - "
T3 - the third throws tag." + NL + - "
T4 - the fourth throws tag." + NL + - "
T5 - the first inherited throws tag." + NL + - "
T6 - the second inherited throws tag." + NL + - "
T7 - the third inherited throws tag." + NL + - "
T8 - the fourth inherited throws tag." + "
T1 - the first throws tag.
" + NL + + "
T2 - the second throws tag.
" + NL + + "
T3 - the third throws tag.
" + NL + + "
T4 - the fourth throws tag.
" + NL + + "
T5 - the first inherited throws tag.
" + NL + + "
T6 - the second inherited throws tag.
" + NL + + "
T7 - the third inherited throws tag.
" + NL + + "
T8 - the fourth inherited throws tag.
" }, }; private static final String[][] NEGATED_TEST = NO_TEST; From 48d4a43c2ade3685090c9f876a26e5259f595424 Mon Sep 17 00:00:00 2001 From: Tom Rodriguez Date: Sun, 1 Mar 2009 20:49:46 -0800 Subject: [PATCH 071/292] 6811384: MacroAssembler::serialize_memory may touch next page on amd64 Reviewed-by: kvn, phh, twisti --- hotspot/src/cpu/x86/vm/assembler_x86.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hotspot/src/cpu/x86/vm/assembler_x86.cpp b/hotspot/src/cpu/x86/vm/assembler_x86.cpp index d6433f0e176..e36823ccd2a 100644 --- a/hotspot/src/cpu/x86/vm/assembler_x86.cpp +++ b/hotspot/src/cpu/x86/vm/assembler_x86.cpp @@ -6463,7 +6463,8 @@ void MacroAssembler::serialize_memory(Register thread, Register tmp) { Address index(noreg, tmp, Address::times_1); ExternalAddress page(os::get_memory_serialize_page()); - movptr(ArrayAddress(page, index), tmp); + // Size of store must match masking code above + movl(as_Address(ArrayAddress(page, index)), tmp); } // Calls to C land From 74a99e1e82cac6b167dd7b629243527f6a98abb5 Mon Sep 17 00:00:00 2001 From: "Daniel D. Daugherty" Date: Mon, 2 Mar 2009 13:57:17 -0700 Subject: [PATCH 072/292] 6700114: 3/4 Assertion (_thread->get_interp_only_mode() == 1,"leaving interp only when mode not one") Don't create JvmtiThreadState for an exiting JavaThread. Reviewed-by: coleenp, swamyv --- hotspot/src/share/vm/prims/jvmtiThreadState.hpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/hotspot/src/share/vm/prims/jvmtiThreadState.hpp b/hotspot/src/share/vm/prims/jvmtiThreadState.hpp index 703d873397f..5472a620bce 100644 --- a/hotspot/src/share/vm/prims/jvmtiThreadState.hpp +++ b/hotspot/src/share/vm/prims/jvmtiThreadState.hpp @@ -319,6 +319,11 @@ class JvmtiThreadState : public CHeapObj { JvmtiThreadState *state = thread->jvmti_thread_state(); if (state == NULL) { + if (thread->is_exiting()) { + // don't add a JvmtiThreadState to a thread that is exiting + return NULL; + } + state = new JvmtiThreadState(thread); } return state; From 56fe18e3756a08f3067025024d3e4df1dac75bb7 Mon Sep 17 00:00:00 2001 From: "Daniel D. Daugherty" Date: Mon, 2 Mar 2009 14:00:23 -0700 Subject: [PATCH 073/292] 6800721: 3/4 JavaThread::jvmti_thread_state() and JvmtiThreadState::state_for() robustness Check for NULL return values from jvmti_thread_state() and state_for() and return a JVM TI error code as appropriate. Reviewed-by: coleenp, swamyv --- hotspot/src/share/vm/prims/jvmtiEnv.cpp | 21 +++++++++++++++---- hotspot/src/share/vm/prims/jvmtiEnvBase.cpp | 9 +++++--- .../share/vm/prims/jvmtiEventController.cpp | 6 ++++++ hotspot/src/share/vm/prims/jvmtiExport.cpp | 6 ++++++ .../share/vm/prims/jvmtiRedefineClasses.cpp | 3 +++ .../src/share/vm/prims/jvmtiThreadState.hpp | 2 ++ hotspot/src/share/vm/runtime/thread.hpp | 7 +++++++ 7 files changed, 47 insertions(+), 7 deletions(-) diff --git a/hotspot/src/share/vm/prims/jvmtiEnv.cpp b/hotspot/src/share/vm/prims/jvmtiEnv.cpp index a19c48972c8..95977f0092e 100644 --- a/hotspot/src/share/vm/prims/jvmtiEnv.cpp +++ b/hotspot/src/share/vm/prims/jvmtiEnv.cpp @@ -99,6 +99,9 @@ JvmtiEnv::SetThreadLocalStorage(JavaThread* java_thread, const void* data) { } // otherwise, create the state state = JvmtiThreadState::state_for(java_thread); + if (state == NULL) { + return JVMTI_ERROR_THREAD_NOT_ALIVE; + } } state->env_thread_state(this)->set_agent_thread_local_storage_data((void*)data); return JVMTI_ERROR_NONE; @@ -1308,6 +1311,9 @@ JvmtiEnv::GetFrameCount(JavaThread* java_thread, jint* count_ptr) { // retrieve or create JvmtiThreadState. JvmtiThreadState* state = JvmtiThreadState::state_for(java_thread); + if (state == NULL) { + return JVMTI_ERROR_THREAD_NOT_ALIVE; + } uint32_t debug_bits = 0; if (is_thread_fully_suspended(java_thread, true, &debug_bits)) { err = get_frame_count(state, count_ptr); @@ -1329,6 +1335,12 @@ JvmtiEnv::PopFrame(JavaThread* java_thread) { HandleMark hm(current_thread); uint32_t debug_bits = 0; + // retrieve or create the state + JvmtiThreadState* state = JvmtiThreadState::state_for(java_thread); + if (state == NULL) { + return JVMTI_ERROR_THREAD_NOT_ALIVE; + } + // Check if java_thread is fully suspended if (!is_thread_fully_suspended(java_thread, true /* wait for suspend completion */, &debug_bits)) { return JVMTI_ERROR_THREAD_NOT_SUSPENDED; @@ -1399,9 +1411,6 @@ JvmtiEnv::PopFrame(JavaThread* java_thread) { // It's fine to update the thread state here because no JVMTI events // shall be posted for this PopFrame. - // retreive or create the state - JvmtiThreadState* state = JvmtiThreadState::state_for(java_thread); - state->update_for_pop_top_frame(); java_thread->set_popframe_condition(JavaThread::popframe_pending_bit); // Set pending step flag for this popframe and it is cleared when next @@ -1445,6 +1454,11 @@ JvmtiEnv::NotifyFramePop(JavaThread* java_thread, jint depth) { ResourceMark rm; uint32_t debug_bits = 0; + JvmtiThreadState *state = JvmtiThreadState::state_for(java_thread); + if (state == NULL) { + return JVMTI_ERROR_THREAD_NOT_ALIVE; + } + if (!JvmtiEnv::is_thread_fully_suspended(java_thread, true, &debug_bits)) { return JVMTI_ERROR_THREAD_NOT_SUSPENDED; } @@ -1464,7 +1478,6 @@ JvmtiEnv::NotifyFramePop(JavaThread* java_thread, jint depth) { assert(vf->frame_pointer() != NULL, "frame pointer mustn't be NULL"); - JvmtiThreadState *state = JvmtiThreadState::state_for(java_thread); int frame_number = state->count_frames() - depth; state->env_thread_state(this)->set_frame_pop(frame_number); diff --git a/hotspot/src/share/vm/prims/jvmtiEnvBase.cpp b/hotspot/src/share/vm/prims/jvmtiEnvBase.cpp index 3152e91c3a5..99f75142652 100644 --- a/hotspot/src/share/vm/prims/jvmtiEnvBase.cpp +++ b/hotspot/src/share/vm/prims/jvmtiEnvBase.cpp @@ -1322,6 +1322,12 @@ JvmtiEnvBase::force_early_return(JavaThread* java_thread, jvalue value, TosState HandleMark hm(current_thread); uint32_t debug_bits = 0; + // retrieve or create the state + JvmtiThreadState* state = JvmtiThreadState::state_for(java_thread); + if (state == NULL) { + return JVMTI_ERROR_THREAD_NOT_ALIVE; + } + // Check if java_thread is fully suspended if (!is_thread_fully_suspended(java_thread, true /* wait for suspend completion */, @@ -1329,9 +1335,6 @@ JvmtiEnvBase::force_early_return(JavaThread* java_thread, jvalue value, TosState return JVMTI_ERROR_THREAD_NOT_SUSPENDED; } - // retreive or create the state - JvmtiThreadState* state = JvmtiThreadState::state_for(java_thread); - // Check to see if a ForceEarlyReturn was already in progress if (state->is_earlyret_pending()) { // Probably possible for JVMTI clients to trigger this, but the diff --git a/hotspot/src/share/vm/prims/jvmtiEventController.cpp b/hotspot/src/share/vm/prims/jvmtiEventController.cpp index ebadd45e2c2..4e07d6f84c2 100644 --- a/hotspot/src/share/vm/prims/jvmtiEventController.cpp +++ b/hotspot/src/share/vm/prims/jvmtiEventController.cpp @@ -478,6 +478,11 @@ JvmtiEventControllerPrivate::recompute_env_thread_enabled(JvmtiEnvThreadState* e // set external state accordingly. Only thread-filtered events are included. jlong JvmtiEventControllerPrivate::recompute_thread_enabled(JvmtiThreadState *state) { + if (state == NULL) { + // associated JavaThread is exiting + return (jlong)0; + } + jlong was_any_env_enabled = state->thread_event_enable()->_event_enabled.get_bits(); jlong any_env_enabled = 0; @@ -553,6 +558,7 @@ JvmtiEventControllerPrivate::recompute_enabled() { { MutexLocker mu(Threads_lock); //hold the Threads_lock for the iteration for (JavaThread *tp = Threads::first(); tp != NULL; tp = tp->next()) { + // state_for_while_locked() makes tp->is_exiting() check JvmtiThreadState::state_for_while_locked(tp); // create the thread state if missing } }// release Threads_lock diff --git a/hotspot/src/share/vm/prims/jvmtiExport.cpp b/hotspot/src/share/vm/prims/jvmtiExport.cpp index a3894b3d66e..50ecb4b9559 100644 --- a/hotspot/src/share/vm/prims/jvmtiExport.cpp +++ b/hotspot/src/share/vm/prims/jvmtiExport.cpp @@ -1872,6 +1872,9 @@ void JvmtiExport::post_dynamic_code_generated_while_holding_locks(const char* na { // register the stub with the current dynamic code event collector JvmtiThreadState* state = JvmtiThreadState::state_for(JavaThread::current()); + // state can only be NULL if the current thread is exiting which + // should not happen since we're trying to post an event + guarantee(state != NULL, "attempt to register stub via an exiting thread"); JvmtiDynamicCodeEventCollector* collector = state->get_dynamic_code_event_collector(); guarantee(collector != NULL, "attempt to register stub without event collector"); collector->register_stub(name, code_begin, code_end); @@ -2253,6 +2256,9 @@ void JvmtiExport::cms_ref_processing_epilogue() { void JvmtiEventCollector::setup_jvmti_thread_state() { // set this event collector to be the current one. JvmtiThreadState* state = JvmtiThreadState::state_for(JavaThread::current()); + // state can only be NULL if the current thread is exiting which + // should not happen since we're trying to configure for event collection + guarantee(state != NULL, "exiting thread called setup_jvmti_thread_state"); if (is_vm_object_alloc_event()) { _prev = state->get_vm_object_alloc_event_collector(); state->set_vm_object_alloc_event_collector((JvmtiVMObjectAllocEventCollector *)this); diff --git a/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp b/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp index bd8fe2b356b..22ef7e9741c 100644 --- a/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp +++ b/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp @@ -831,6 +831,9 @@ jvmtiError VM_RedefineClasses::load_new_class_versions(TRAPS) { ResourceMark rm(THREAD); JvmtiThreadState *state = JvmtiThreadState::state_for(JavaThread::current()); + // state can only be NULL if the current thread is exiting which + // should not happen since we're trying to do a RedefineClasses + guarantee(state != NULL, "exiting thread calling load_new_class_versions"); for (int i = 0; i < _class_count; i++) { oop mirror = JNIHandles::resolve_non_null(_class_defs[i].klass); // classes for primitives cannot be redefined diff --git a/hotspot/src/share/vm/prims/jvmtiThreadState.hpp b/hotspot/src/share/vm/prims/jvmtiThreadState.hpp index 5472a620bce..d77d2a8a428 100644 --- a/hotspot/src/share/vm/prims/jvmtiThreadState.hpp +++ b/hotspot/src/share/vm/prims/jvmtiThreadState.hpp @@ -314,6 +314,7 @@ class JvmtiThreadState : public CHeapObj { void update_for_pop_top_frame(); // already holding JvmtiThreadState_lock - retrieve or create JvmtiThreadState + // Can return NULL if JavaThread is exiting. inline static JvmtiThreadState *state_for_while_locked(JavaThread *thread) { assert(JvmtiThreadState_lock->is_locked(), "sanity check"); @@ -330,6 +331,7 @@ class JvmtiThreadState : public CHeapObj { } // retrieve or create JvmtiThreadState + // Can return NULL if JavaThread is exiting. inline static JvmtiThreadState *state_for(JavaThread *thread) { JvmtiThreadState *state = thread->jvmti_thread_state(); if (state == NULL) { diff --git a/hotspot/src/share/vm/runtime/thread.hpp b/hotspot/src/share/vm/runtime/thread.hpp index 6e6e88fe318..59aea77b930 100644 --- a/hotspot/src/share/vm/runtime/thread.hpp +++ b/hotspot/src/share/vm/runtime/thread.hpp @@ -1345,6 +1345,13 @@ public: public: // Thread local information maintained by JVMTI. void set_jvmti_thread_state(JvmtiThreadState *value) { _jvmti_thread_state = value; } + // A JvmtiThreadState is lazily allocated. This jvmti_thread_state() + // getter is used to get this JavaThread's JvmtiThreadState if it has + // one which means NULL can be returned. JvmtiThreadState::state_for() + // is used to get the specified JavaThread's JvmtiThreadState if it has + // one or it allocates a new JvmtiThreadState for the JavaThread and + // returns it. JvmtiThreadState::state_for() will return NULL only if + // the specified JavaThread is exiting. JvmtiThreadState *jvmti_thread_state() const { return _jvmti_thread_state; } static ByteSize jvmti_thread_state_offset() { return byte_offset_of(JavaThread, _jvmti_thread_state); } void set_jvmti_get_loaded_classes_closure(JvmtiGetLoadedClassesClosure* value) { _jvmti_get_loaded_classes_closure = value; } From da3f81559f578e01c7a51b956bcbdbbe01897559 Mon Sep 17 00:00:00 2001 From: "Daniel D. Daugherty" Date: Mon, 2 Mar 2009 14:03:03 -0700 Subject: [PATCH 074/292] 6805864: 4/3 Problem with jvmti->redefineClasses: some methods don't get redefined Remove incorrect optimization in klassItable::adjust_method_entries(). Add RedefineClasses() tracing support for obsolete method entry. Reviewed-by: acorn, swamyv --- .../src/cpu/sparc/vm/interp_masm_sparc.cpp | 12 ++++++++- .../src/cpu/sparc/vm/sharedRuntime_sparc.cpp | 12 +++++++++ hotspot/src/cpu/x86/vm/interp_masm_x86_32.cpp | 9 +++++++ hotspot/src/cpu/x86/vm/interp_masm_x86_64.cpp | 8 ++++++ .../src/cpu/x86/vm/sharedRuntime_x86_32.cpp | 8 ++++++ .../src/cpu/x86/vm/sharedRuntime_x86_64.cpp | 11 ++++++++ hotspot/src/share/vm/includeDB_core | 3 +++ hotspot/src/share/vm/oops/klassVtable.cpp | 5 +++- .../vm/prims/jvmtiRedefineClassesTrace.hpp | 4 +-- .../src/share/vm/runtime/sharedRuntime.cpp | 26 +++++++++++++++++++ .../src/share/vm/runtime/sharedRuntime.hpp | 3 +++ 11 files changed, 97 insertions(+), 4 deletions(-) diff --git a/hotspot/src/cpu/sparc/vm/interp_masm_sparc.cpp b/hotspot/src/cpu/sparc/vm/interp_masm_sparc.cpp index f134852e4d6..dee9fcc3cd0 100644 --- a/hotspot/src/cpu/sparc/vm/interp_masm_sparc.cpp +++ b/hotspot/src/cpu/sparc/vm/interp_masm_sparc.cpp @@ -2465,7 +2465,10 @@ void InterpreterMacroAssembler::verify_FPU(int stack_depth, TosState state) { // InterpreterRuntime::post_method_entry(); // } // if (DTraceMethodProbes) { -// SharedRuntime::dtrace_method_entry(method, reciever); +// SharedRuntime::dtrace_method_entry(method, receiver); +// } +// if (RC_TRACE_IN_RANGE(0x00001000, 0x00002000)) { +// SharedRuntime::rc_trace_method_entry(method, receiver); // } void InterpreterMacroAssembler::notify_method_entry() { @@ -2497,6 +2500,13 @@ void InterpreterMacroAssembler::notify_method_entry() { CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_entry), G2_thread, Lmethod); } + + // RedefineClasses() tracing support for obsolete method entry + if (RC_TRACE_IN_RANGE(0x00001000, 0x00002000)) { + call_VM_leaf(noreg, + CAST_FROM_FN_PTR(address, SharedRuntime::rc_trace_method_entry), + G2_thread, Lmethod); + } } diff --git a/hotspot/src/cpu/sparc/vm/sharedRuntime_sparc.cpp b/hotspot/src/cpu/sparc/vm/sharedRuntime_sparc.cpp index 6fed65b3ddc..5804fbbfe12 100644 --- a/hotspot/src/cpu/sparc/vm/sharedRuntime_sparc.cpp +++ b/hotspot/src/cpu/sparc/vm/sharedRuntime_sparc.cpp @@ -2161,6 +2161,18 @@ nmethod *SharedRuntime::generate_native_wrapper(MacroAssembler* masm, __ restore(); } + // RedefineClasses() tracing support for obsolete method entry + if (RC_TRACE_IN_RANGE(0x00001000, 0x00002000)) { + // create inner frame + __ save_frame(0); + __ mov(G2_thread, L7_thread_cache); + __ set_oop_constant(JNIHandles::make_local(method()), O1); + __ call_VM_leaf(L7_thread_cache, + CAST_FROM_FN_PTR(address, SharedRuntime::rc_trace_method_entry), + G2_thread, O1); + __ restore(); + } + // We are in the jni frame unless saved_frame is true in which case // we are in one frame deeper (the "inner" frame). If we are in the // "inner" frames the args are in the Iregs and if the jni frame then diff --git a/hotspot/src/cpu/x86/vm/interp_masm_x86_32.cpp b/hotspot/src/cpu/x86/vm/interp_masm_x86_32.cpp index 78f0f123833..f19c363c292 100644 --- a/hotspot/src/cpu/x86/vm/interp_masm_x86_32.cpp +++ b/hotspot/src/cpu/x86/vm/interp_masm_x86_32.cpp @@ -1512,6 +1512,15 @@ void InterpreterMacroAssembler::notify_method_entry() { call_VM_leaf( CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_entry), rcx, rbx); } + + // RedefineClasses() tracing support for obsolete method entry + if (RC_TRACE_IN_RANGE(0x00001000, 0x00002000)) { + get_thread(rcx); + get_method(rbx); + call_VM_leaf( + CAST_FROM_FN_PTR(address, SharedRuntime::rc_trace_method_entry), + rcx, rbx); + } } diff --git a/hotspot/src/cpu/x86/vm/interp_masm_x86_64.cpp b/hotspot/src/cpu/x86/vm/interp_masm_x86_64.cpp index 9809649d37e..de482bd9215 100644 --- a/hotspot/src/cpu/x86/vm/interp_masm_x86_64.cpp +++ b/hotspot/src/cpu/x86/vm/interp_masm_x86_64.cpp @@ -1593,6 +1593,14 @@ void InterpreterMacroAssembler::notify_method_entry() { call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_entry), r15_thread, c_rarg1); } + + // RedefineClasses() tracing support for obsolete method entry + if (RC_TRACE_IN_RANGE(0x00001000, 0x00002000)) { + get_method(c_rarg1); + call_VM_leaf( + CAST_FROM_FN_PTR(address, SharedRuntime::rc_trace_method_entry), + r15_thread, c_rarg1); + } } diff --git a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp index 7c0aa6bf556..2669bf83aec 100644 --- a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp +++ b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp @@ -1532,6 +1532,14 @@ nmethod *SharedRuntime::generate_native_wrapper(MacroAssembler *masm, thread, rax); } + // RedefineClasses() tracing support for obsolete method entry + if (RC_TRACE_IN_RANGE(0x00001000, 0x00002000)) { + __ movoop(rax, JNIHandles::make_local(method())); + __ call_VM_leaf( + CAST_FROM_FN_PTR(address, SharedRuntime::rc_trace_method_entry), + thread, rax); + } + // These are register definitions we need for locking/unlocking const Register swap_reg = rax; // Must use rax, for cmpxchg instruction diff --git a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp index 26e7e148968..cbce72e4cd8 100644 --- a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp +++ b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp @@ -1506,6 +1506,17 @@ nmethod *SharedRuntime::generate_native_wrapper(MacroAssembler *masm, restore_args(masm, total_c_args, c_arg, out_regs); } + // RedefineClasses() tracing support for obsolete method entry + if (RC_TRACE_IN_RANGE(0x00001000, 0x00002000)) { + // protect the args we've loaded + save_args(masm, total_c_args, c_arg, out_regs); + __ movoop(c_rarg1, JNIHandles::make_local(method())); + __ call_VM_leaf( + CAST_FROM_FN_PTR(address, SharedRuntime::rc_trace_method_entry), + r15_thread, c_rarg1); + restore_args(masm, total_c_args, c_arg, out_regs); + } + // Lock a synchronized method // Register definitions used by locking and unlocking diff --git a/hotspot/src/share/vm/includeDB_core b/hotspot/src/share/vm/includeDB_core index 7ca1fcabef5..784cfc4eeee 100644 --- a/hotspot/src/share/vm/includeDB_core +++ b/hotspot/src/share/vm/includeDB_core @@ -2093,6 +2093,7 @@ interp_masm_.cpp interp_masm_.hpp interp_masm_.cpp interpreterRuntime.hpp interp_masm_.cpp interpreter.hpp interp_masm_.cpp jvmtiExport.hpp +interp_masm_.cpp jvmtiRedefineClassesTrace.hpp interp_masm_.cpp jvmtiThreadState.hpp interp_masm_.cpp markOop.hpp interp_masm_.cpp methodDataOop.hpp @@ -3669,6 +3670,7 @@ sharedRuntime.cpp interpreterRuntime.hpp sharedRuntime.cpp interpreter.hpp sharedRuntime.cpp javaCalls.hpp sharedRuntime.cpp jvmtiExport.hpp +sharedRuntime.cpp jvmtiRedefineClassesTrace.hpp sharedRuntime.cpp nativeInst_.hpp sharedRuntime.cpp nativeLookup.hpp sharedRuntime.cpp oop.inline.hpp @@ -3698,6 +3700,7 @@ sharedRuntime_.cpp compiledICHolderOop.hpp sharedRuntime_.cpp debugInfoRec.hpp sharedRuntime_.cpp icBuffer.hpp sharedRuntime_.cpp interpreter.hpp +sharedRuntime_.cpp jvmtiRedefineClassesTrace.hpp sharedRuntime_.cpp sharedRuntime.hpp sharedRuntime_.cpp vframeArray.hpp sharedRuntime_.cpp vmreg_.inline.hpp diff --git a/hotspot/src/share/vm/oops/klassVtable.cpp b/hotspot/src/share/vm/oops/klassVtable.cpp index 27b32d09760..9411e76509b 100644 --- a/hotspot/src/share/vm/oops/klassVtable.cpp +++ b/hotspot/src/share/vm/oops/klassVtable.cpp @@ -992,6 +992,10 @@ void klassItable::adjust_method_entries(methodOop* old_methods, methodOop* new_m methodOop new_method = new_methods[j]; itableMethodEntry* ime = method_entry(0); + // The itable can describe more than one interface and the same + // method signature can be specified by more than one interface. + // This means we have to do an exhaustive search to find all the + // old_method references. for (int i = 0; i < _size_method_table; i++) { if (ime->method() == old_method) { ime->initialize(new_method); @@ -1008,7 +1012,6 @@ void klassItable::adjust_method_entries(methodOop* old_methods, methodOop* new_m new_method->name()->as_C_string(), new_method->signature()->as_C_string())); } - break; } ime++; } diff --git a/hotspot/src/share/vm/prims/jvmtiRedefineClassesTrace.hpp b/hotspot/src/share/vm/prims/jvmtiRedefineClassesTrace.hpp index 83192cf16d7..6762e572baa 100644 --- a/hotspot/src/share/vm/prims/jvmtiRedefineClassesTrace.hpp +++ b/hotspot/src/share/vm/prims/jvmtiRedefineClassesTrace.hpp @@ -49,8 +49,8 @@ // 0x00000400 | 1024 - previous class weak reference mgmt during // add previous ops (GC) // 0x00000800 | 2048 - previous class breakpoint mgmt -// 0x00001000 | 4096 - unused -// 0x00002000 | 8192 - unused +// 0x00001000 | 4096 - detect calls to obsolete methods +// 0x00002000 | 8192 - fail a guarantee() in addition to detection // 0x00004000 | 16384 - unused // 0x00008000 | 32768 - old/new method matching/add/delete // 0x00010000 | 65536 - impl details: CP size info diff --git a/hotspot/src/share/vm/runtime/sharedRuntime.cpp b/hotspot/src/share/vm/runtime/sharedRuntime.cpp index 76067dc8ee1..6a8ed7373ab 100644 --- a/hotspot/src/share/vm/runtime/sharedRuntime.cpp +++ b/hotspot/src/share/vm/runtime/sharedRuntime.cpp @@ -395,6 +395,32 @@ void SharedRuntime::throw_and_post_jvmti_exception(JavaThread *thread, symbolOop throw_and_post_jvmti_exception(thread, h_exception); } +// The interpreter code to call this tracing function is only +// called/generated when TraceRedefineClasses has the right bits +// set. Since obsolete methods are never compiled, we don't have +// to modify the compilers to generate calls to this function. +// +JRT_LEAF(int, SharedRuntime::rc_trace_method_entry( + JavaThread* thread, methodOopDesc* method)) + assert(RC_TRACE_IN_RANGE(0x00001000, 0x00002000), "wrong call"); + + if (method->is_obsolete()) { + // We are calling an obsolete method, but this is not necessarily + // an error. Our method could have been redefined just after we + // fetched the methodOop from the constant pool. + + // RC_TRACE macro has an embedded ResourceMark + RC_TRACE_WITH_THREAD(0x00001000, thread, + ("calling obsolete method '%s'", + method->name_and_sig_as_C_string())); + if (RC_TRACE_ENABLED(0x00002000)) { + // this option is provided to debug calls to obsolete methods + guarantee(false, "faulting at call to an obsolete method."); + } + } + return 0; +JRT_END + // ret_pc points into caller; we are returning caller's exception handler // for given exception address SharedRuntime::compute_compiled_exc_handler(nmethod* nm, address ret_pc, Handle& exception, diff --git a/hotspot/src/share/vm/runtime/sharedRuntime.hpp b/hotspot/src/share/vm/runtime/sharedRuntime.hpp index d040660dcfa..bea176a9dce 100644 --- a/hotspot/src/share/vm/runtime/sharedRuntime.hpp +++ b/hotspot/src/share/vm/runtime/sharedRuntime.hpp @@ -166,6 +166,9 @@ class SharedRuntime: AllStatic { static void throw_and_post_jvmti_exception(JavaThread *thread, Handle h_exception); static void throw_and_post_jvmti_exception(JavaThread *thread, symbolOop name, const char *message = NULL); + // RedefineClasses() tracing support for obsolete method entry + static int rc_trace_method_entry(JavaThread* thread, methodOopDesc* m); + // To be used as the entry point for unresolved native methods. static address native_method_throw_unsatisfied_link_error_entry(); From 8aebf2830182d9046a229b2299f38f92ee82c5f3 Mon Sep 17 00:00:00 2001 From: "Daniel D. Daugherty" Date: Mon, 2 Mar 2009 14:05:07 -0700 Subject: [PATCH 075/292] 6567360: 3/4 SIGBUS in jvmti RawMonitor magic check for unaligned bad monitor pointer Change JvmtiEnvBase::is_valid() and JvmtiRawMonitor::is_valid() to fetch the _magic fields via Bytes::get_native_u[248](). Reviewed-by: coleenp, swamyv --- hotspot/src/share/vm/prims/jvmtiEnvBase.cpp | 29 +++++++++++++++++++++ hotspot/src/share/vm/prims/jvmtiEnvBase.hpp | 2 +- hotspot/src/share/vm/prims/jvmtiImpl.cpp | 29 +++++++++++++++++++++ hotspot/src/share/vm/prims/jvmtiImpl.hpp | 2 +- 4 files changed, 60 insertions(+), 2 deletions(-) diff --git a/hotspot/src/share/vm/prims/jvmtiEnvBase.cpp b/hotspot/src/share/vm/prims/jvmtiEnvBase.cpp index 99f75142652..c0c98f01e53 100644 --- a/hotspot/src/share/vm/prims/jvmtiEnvBase.cpp +++ b/hotspot/src/share/vm/prims/jvmtiEnvBase.cpp @@ -94,6 +94,35 @@ JvmtiEnvBase::initialize() { } +bool +JvmtiEnvBase::is_valid() { + jint value = 0; + + // This object might not be a JvmtiEnvBase so we can't assume + // the _magic field is properly aligned. Get the value in a safe + // way and then check against JVMTI_MAGIC. + + switch (sizeof(_magic)) { + case 2: + value = Bytes::get_native_u2((address)&_magic); + break; + + case 4: + value = Bytes::get_native_u4((address)&_magic); + break; + + case 8: + value = Bytes::get_native_u8((address)&_magic); + break; + + default: + guarantee(false, "_magic field is an unexpected size"); + } + + return value == JVMTI_MAGIC; +} + + JvmtiEnvBase::JvmtiEnvBase() : _env_event_enable() { _env_local_storage = NULL; _tag_map = NULL; diff --git a/hotspot/src/share/vm/prims/jvmtiEnvBase.hpp b/hotspot/src/share/vm/prims/jvmtiEnvBase.hpp index 477725ffec5..e6dd31e5870 100644 --- a/hotspot/src/share/vm/prims/jvmtiEnvBase.hpp +++ b/hotspot/src/share/vm/prims/jvmtiEnvBase.hpp @@ -120,7 +120,7 @@ class JvmtiEnvBase : public CHeapObj { public: - bool is_valid() { return _magic == JVMTI_MAGIC; } + bool is_valid(); bool is_retransformable() { return _is_retransformable; } diff --git a/hotspot/src/share/vm/prims/jvmtiImpl.cpp b/hotspot/src/share/vm/prims/jvmtiImpl.cpp index f9a512c4222..5a174b35bc3 100644 --- a/hotspot/src/share/vm/prims/jvmtiImpl.cpp +++ b/hotspot/src/share/vm/prims/jvmtiImpl.cpp @@ -238,6 +238,35 @@ JvmtiRawMonitor::~JvmtiRawMonitor() { } +bool +JvmtiRawMonitor::is_valid() { + int value = 0; + + // This object might not be a JvmtiRawMonitor so we can't assume + // the _magic field is properly aligned. Get the value in a safe + // way and then check against JVMTI_RM_MAGIC. + + switch (sizeof(_magic)) { + case 2: + value = Bytes::get_native_u2((address)&_magic); + break; + + case 4: + value = Bytes::get_native_u4((address)&_magic); + break; + + case 8: + value = Bytes::get_native_u8((address)&_magic); + break; + + default: + guarantee(false, "_magic field is an unexpected size"); + } + + return value == JVMTI_RM_MAGIC; +} + + // // class JvmtiBreakpoint // diff --git a/hotspot/src/share/vm/prims/jvmtiImpl.hpp b/hotspot/src/share/vm/prims/jvmtiImpl.hpp index d1b8414e61e..2605546c62d 100644 --- a/hotspot/src/share/vm/prims/jvmtiImpl.hpp +++ b/hotspot/src/share/vm/prims/jvmtiImpl.hpp @@ -349,7 +349,7 @@ public: ~JvmtiRawMonitor(); int magic() { return _magic; } const char *get_name() { return _name; } - bool is_valid() { return _magic == JVMTI_RM_MAGIC; } + bool is_valid(); }; // Onload pending raw monitors From 72bfacbd95e3b8341870cf3d34d662993e745881 Mon Sep 17 00:00:00 2001 From: "Y. Srinivas Ramakrishna" Date: Mon, 2 Mar 2009 16:37:04 -0800 Subject: [PATCH 076/292] 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC Call newly created CollectedHeap::dump_{pre,post}_full_gc before and after every stop-world full collection cycle on GenCollectedHeap and ParallelScavengeHeap. (Support for G1CollectedHeap forthcoming under CR 6810861.) Small modifications to existing heap dumping and class histogram implementation, especially to allow multiple on-the-fly histos/dumps by the VM thread during a single safepoint. Reviewed-by: jmasa, alanb, mchung --- .../parallelScavenge/psMarkSweep.cpp | 4 + .../parallelScavenge/psParallelCompact.cpp | 4 + .../shared/vmGCOperations.cpp | 2 +- .../shared/vmGCOperations.hpp | 5 +- .../share/vm/gc_interface/collectedHeap.cpp | 26 +++ .../share/vm/gc_interface/collectedHeap.hpp | 4 + hotspot/src/share/vm/includeDB_gc | 2 + .../src/share/vm/memory/genCollectedHeap.cpp | 7 + .../src/share/vm/memory/heapInspection.cpp | 8 +- .../src/share/vm/memory/heapInspection.hpp | 2 +- hotspot/src/share/vm/runtime/globals.hpp | 12 ++ hotspot/src/share/vm/runtime/os.cpp | 3 +- .../src/share/vm/services/attachListener.cpp | 2 +- hotspot/src/share/vm/services/heapDumper.cpp | 149 +++++++++++------- hotspot/src/share/vm/services/heapDumper.hpp | 2 +- 15 files changed, 170 insertions(+), 62 deletions(-) diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp index 608eedb8fb1..059a3043ff9 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp @@ -125,6 +125,8 @@ void PSMarkSweep::invoke_no_policy(bool clear_all_softrefs) { perm_gen->verify_object_start_array(); } + heap->pre_full_gc_dump(); + // Filled in below to track the state of the young gen after the collection. bool eden_empty; bool survivors_empty; @@ -363,6 +365,8 @@ void PSMarkSweep::invoke_no_policy(bool clear_all_softrefs) { Universe::print_heap_after_gc(); } + heap->post_full_gc_dump(); + #ifdef TRACESPINNING ParallelTaskTerminator::print_termination_counts(); #endif diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp index 686c65b2c53..4a4293c79c2 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp @@ -1982,6 +1982,8 @@ void PSParallelCompact::invoke_no_policy(bool maximum_heap_compaction) { heap->record_gen_tops_before_GC(); } + heap->pre_full_gc_dump(); + _print_phases = PrintGCDetails && PrintParallelOldGCPhaseTimes; // Make sure data structures are sane, make the heap parsable, and do other @@ -2204,6 +2206,8 @@ void PSParallelCompact::invoke_no_policy(bool maximum_heap_compaction) { gc_task_manager()->print_task_time_stamps(); } + heap->post_full_gc_dump(); + #ifdef TRACESPINNING ParallelTaskTerminator::print_termination_counts(); #endif diff --git a/hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.cpp b/hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.cpp index 7b4b76696a0..c230275275a 100644 --- a/hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.cpp +++ b/hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.cpp @@ -121,7 +121,7 @@ void VM_GC_HeapInspection::doit() { // make the heap parsable (no need to retire TLABs) ch->ensure_parsability(false); } - HeapInspection::heap_inspection(_out); + HeapInspection::heap_inspection(_out, _need_prologue /* need_prologue */); } diff --git a/hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.hpp b/hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.hpp index fcce0cc3b51..6ff704fdf18 100644 --- a/hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.hpp +++ b/hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.hpp @@ -112,13 +112,16 @@ class VM_GC_HeapInspection: public VM_GC_Operation { private: outputStream* _out; bool _full_gc; + bool _need_prologue; public: - VM_GC_HeapInspection(outputStream* out, bool request_full_gc) : + VM_GC_HeapInspection(outputStream* out, bool request_full_gc, + bool need_prologue) : VM_GC_Operation(0 /* total collections, dummy, ignored */, 0 /* total full collections, dummy, ignored */, request_full_gc) { _out = out; _full_gc = request_full_gc; + _need_prologue = need_prologue; } ~VM_GC_HeapInspection() {} diff --git a/hotspot/src/share/vm/gc_interface/collectedHeap.cpp b/hotspot/src/share/vm/gc_interface/collectedHeap.cpp index 3e5cf87c1d4..3b7d0ef74da 100644 --- a/hotspot/src/share/vm/gc_interface/collectedHeap.cpp +++ b/hotspot/src/share/vm/gc_interface/collectedHeap.cpp @@ -294,3 +294,29 @@ void CollectedHeap::resize_all_tlabs() { ThreadLocalAllocBuffer::resize_all_tlabs(); } } + +void CollectedHeap::pre_full_gc_dump() { + if (HeapDumpBeforeFullGC) { + TraceTime tt("Heap Dump: ", PrintGCDetails, false, gclog_or_tty); + // We are doing a "major" collection and a heap dump before + // major collection has been requested. + HeapDumper::dump_heap(); + } + if (PrintClassHistogramBeforeFullGC) { + TraceTime tt("Class Histogram: ", PrintGCDetails, true, gclog_or_tty); + VM_GC_HeapInspection inspector(gclog_or_tty, false /* ! full gc */, false /* ! prologue */); + inspector.doit(); + } +} + +void CollectedHeap::post_full_gc_dump() { + if (HeapDumpAfterFullGC) { + TraceTime tt("Heap Dump", PrintGCDetails, false, gclog_or_tty); + HeapDumper::dump_heap(); + } + if (PrintClassHistogramAfterFullGC) { + TraceTime tt("Class Histogram", PrintGCDetails, true, gclog_or_tty); + VM_GC_HeapInspection inspector(gclog_or_tty, false /* ! full gc */, false /* ! prologue */); + inspector.doit(); + } +} diff --git a/hotspot/src/share/vm/gc_interface/collectedHeap.hpp b/hotspot/src/share/vm/gc_interface/collectedHeap.hpp index 210e6b32b90..9b4476f2be1 100644 --- a/hotspot/src/share/vm/gc_interface/collectedHeap.hpp +++ b/hotspot/src/share/vm/gc_interface/collectedHeap.hpp @@ -514,6 +514,10 @@ class CollectedHeap : public CHeapObj { // Perform any cleanup actions necessary before allowing a verification. virtual void prepare_for_verify() = 0; + // Generate any dumps preceding or following a full gc + void pre_full_gc_dump(); + void post_full_gc_dump(); + virtual void print() const = 0; virtual void print_on(outputStream* st) const = 0; diff --git a/hotspot/src/share/vm/includeDB_gc b/hotspot/src/share/vm/includeDB_gc index 336148bf8fa..5e0e7eba30d 100644 --- a/hotspot/src/share/vm/includeDB_gc +++ b/hotspot/src/share/vm/includeDB_gc @@ -26,10 +26,12 @@ collectedHeap.cpp collectedHeap.hpp collectedHeap.cpp collectedHeap.inline.hpp +collectedHeap.cpp heapDumper.hpp collectedHeap.cpp init.hpp collectedHeap.cpp oop.inline.hpp collectedHeap.cpp systemDictionary.hpp collectedHeap.cpp thread_.inline.hpp +collectedHeap.cpp vmGCOperations.hpp collectedHeap.hpp allocation.hpp collectedHeap.hpp barrierSet.hpp diff --git a/hotspot/src/share/vm/memory/genCollectedHeap.cpp b/hotspot/src/share/vm/memory/genCollectedHeap.cpp index 5bb817f0280..77e9a5cd0d3 100644 --- a/hotspot/src/share/vm/memory/genCollectedHeap.cpp +++ b/hotspot/src/share/vm/memory/genCollectedHeap.cpp @@ -456,6 +456,9 @@ void GenCollectedHeap::do_collection(bool full, int max_level_collected = starting_level; for (int i = starting_level; i <= max_level; i++) { if (_gens[i]->should_collect(full, size, is_tlab)) { + if (i == n_gens() - 1) { // a major collection is to happen + pre_full_gc_dump(); // do any pre full gc dumps + } // Timer for individual generations. Last argument is false: no CR TraceTime t1(_gens[i]->short_name(), PrintGCDetails, false, gclog_or_tty); TraceCollectorStats tcs(_gens[i]->counters()); @@ -573,6 +576,10 @@ void GenCollectedHeap::do_collection(bool full, // a whole heap collection. complete = complete || (max_level_collected == n_gens() - 1); + if (complete) { // We did a "major" collection + post_full_gc_dump(); // do any post full gc dumps + } + if (PrintGCDetails) { print_heap_change(gch_prev_used); diff --git a/hotspot/src/share/vm/memory/heapInspection.cpp b/hotspot/src/share/vm/memory/heapInspection.cpp index 3bc17bea600..101ed12e1c9 100644 --- a/hotspot/src/share/vm/memory/heapInspection.cpp +++ b/hotspot/src/share/vm/memory/heapInspection.cpp @@ -233,7 +233,7 @@ class RecordInstanceClosure : public ObjectClosure { size_t missed_count() { return _missed_count; } }; -void HeapInspection::heap_inspection(outputStream* st) { +void HeapInspection::heap_inspection(outputStream* st, bool need_prologue) { ResourceMark rm; HeapWord* ref; @@ -244,7 +244,9 @@ void HeapInspection::heap_inspection(outputStream* st) { case CollectedHeap::GenCollectedHeap: { is_shared_heap = true; SharedHeap* sh = (SharedHeap*)heap; - sh->gc_prologue(false /* !full */); // get any necessary locks, etc. + if (need_prologue) { + sh->gc_prologue(false /* !full */); // get any necessary locks, etc. + } ref = sh->perm_gen()->used_region().start(); break; } @@ -290,7 +292,7 @@ void HeapInspection::heap_inspection(outputStream* st) { } st->flush(); - if (is_shared_heap) { + if (need_prologue && is_shared_heap) { SharedHeap* sh = (SharedHeap*)heap; sh->gc_epilogue(false /* !full */); // release all acquired locks, etc. } diff --git a/hotspot/src/share/vm/memory/heapInspection.hpp b/hotspot/src/share/vm/memory/heapInspection.hpp index ac2c708a532..4364607c3c4 100644 --- a/hotspot/src/share/vm/memory/heapInspection.hpp +++ b/hotspot/src/share/vm/memory/heapInspection.hpp @@ -127,6 +127,6 @@ class KlassInfoHisto : public StackObj { class HeapInspection : public AllStatic { public: - static void heap_inspection(outputStream* st) KERNEL_RETURN; + static void heap_inspection(outputStream* st, bool need_prologue) KERNEL_RETURN; static void find_instances_at_safepoint(klassOop k, GrowableArray* result) KERNEL_RETURN; }; diff --git a/hotspot/src/share/vm/runtime/globals.hpp b/hotspot/src/share/vm/runtime/globals.hpp index c16ae09ec32..0ed9522f39e 100644 --- a/hotspot/src/share/vm/runtime/globals.hpp +++ b/hotspot/src/share/vm/runtime/globals.hpp @@ -662,6 +662,12 @@ class CommandLineFlags { product(ccstrlist, OnOutOfMemoryError, "", \ "Run user-defined commands on first java.lang.OutOfMemoryError") \ \ + manageable(bool, HeapDumpBeforeFullGC, false, \ + "Dump heap to file before any major stop-world GC") \ + \ + manageable(bool, HeapDumpAfterFullGC, false, \ + "Dump heap to file after any major stop-world GC") \ + \ manageable(bool, HeapDumpOnOutOfMemoryError, false, \ "Dump heap to file when java.lang.OutOfMemoryError is thrown") \ \ @@ -1971,6 +1977,12 @@ class CommandLineFlags { product(bool, PrintHeapAtSIGBREAK, true, \ "Print heap layout in response to SIGBREAK") \ \ + manageable(bool, PrintClassHistogramBeforeFullGC, false, \ + "Print a class histogram before any major stop-world GC") \ + \ + manageable(bool, PrintClassHistogramAfterFullGC, false, \ + "Print a class histogram after any major stop-world GC") \ + \ manageable(bool, PrintClassHistogram, false, \ "Print a histogram of class instances") \ \ diff --git a/hotspot/src/share/vm/runtime/os.cpp b/hotspot/src/share/vm/runtime/os.cpp index 8c81d42734a..d9512718858 100644 --- a/hotspot/src/share/vm/runtime/os.cpp +++ b/hotspot/src/share/vm/runtime/os.cpp @@ -207,7 +207,8 @@ static void signal_thread_entry(JavaThread* thread, TRAPS) { VMThread::execute(&op1); Universe::print_heap_at_SIGBREAK(); if (PrintClassHistogram) { - VM_GC_HeapInspection op1(gclog_or_tty, true /* force full GC before heap inspection */); + VM_GC_HeapInspection op1(gclog_or_tty, true /* force full GC before heap inspection */, + true /* need_prologue */); VMThread::execute(&op1); } if (JvmtiExport::should_post_data_dump()) { diff --git a/hotspot/src/share/vm/services/attachListener.cpp b/hotspot/src/share/vm/services/attachListener.cpp index 2361f200a4e..007de28da37 100644 --- a/hotspot/src/share/vm/services/attachListener.cpp +++ b/hotspot/src/share/vm/services/attachListener.cpp @@ -194,7 +194,7 @@ static jint heap_inspection(AttachOperation* op, outputStream* out) { } live_objects_only = strcmp(arg0, "-live") == 0; } - VM_GC_HeapInspection heapop(out, live_objects_only /* request gc */); + VM_GC_HeapInspection heapop(out, live_objects_only /* request full gc */, true /* need_prologue */); VMThread::execute(&heapop); return JNI_OK; } diff --git a/hotspot/src/share/vm/services/heapDumper.cpp b/hotspot/src/share/vm/services/heapDumper.cpp index 18bd9f477d7..b8ef6f67ca5 100644 --- a/hotspot/src/share/vm/services/heapDumper.cpp +++ b/hotspot/src/share/vm/services/heapDumper.cpp @@ -347,7 +347,6 @@ enum { INITIAL_CLASS_COUNT = 200 }; - // Supports I/O operations on a dump file class DumpWriter : public StackObj { @@ -1303,7 +1302,9 @@ void HeapObjectDumper::do_object(oop o) { // The VM operation that performs the heap dump class VM_HeapDumper : public VM_GC_Operation { private: - DumpWriter* _writer; + static VM_HeapDumper* _global_dumper; + static DumpWriter* _global_writer; + DumpWriter* _local_writer; bool _gc_before_heap_dump; bool _is_segmented_dump; jlong _dump_start; @@ -1311,8 +1312,20 @@ class VM_HeapDumper : public VM_GC_Operation { ThreadStackTrace** _stack_traces; int _num_threads; - // accessors - DumpWriter* writer() const { return _writer; } + // accessors and setters + static VM_HeapDumper* dumper() { assert(_global_dumper != NULL, "Error"); return _global_dumper; } + static DumpWriter* writer() { assert(_global_writer != NULL, "Error"); return _global_writer; } + void set_global_dumper() { + assert(_global_dumper == NULL, "Error"); + _global_dumper = this; + } + void set_global_writer() { + assert(_global_writer == NULL, "Error"); + _global_writer = _local_writer; + } + void clear_global_dumper() { _global_dumper = NULL; } + void clear_global_writer() { _global_writer = NULL; } + bool is_segmented_dump() const { return _is_segmented_dump; } void set_segmented_dump() { _is_segmented_dump = true; } jlong dump_start() const { return _dump_start; } @@ -1357,7 +1370,7 @@ class VM_HeapDumper : public VM_GC_Operation { VM_GC_Operation(0 /* total collections, dummy, ignored */, 0 /* total full collections, dummy, ignored */, gc_before_heap_dump) { - _writer = writer; + _local_writer = writer; _gc_before_heap_dump = gc_before_heap_dump; _is_segmented_dump = false; _dump_start = (jlong)-1; @@ -1381,6 +1394,9 @@ class VM_HeapDumper : public VM_GC_Operation { void doit(); }; +VM_HeapDumper* VM_HeapDumper::_global_dumper = NULL; +DumpWriter* VM_HeapDumper::_global_writer = NULL; + bool VM_HeapDumper::skip_operation() const { return false; } @@ -1479,31 +1495,28 @@ void HeapObjectDumper::mark_end_of_record() { void VM_HeapDumper::do_load_class(klassOop k) { static u4 class_serial_num = 0; - VM_HeapDumper* dumper = ((VM_HeapDumper*)VMThread::vm_operation()); - DumpWriter* writer = dumper->writer(); - // len of HPROF_LOAD_CLASS record u4 remaining = 2*oopSize + 2*sizeof(u4); // write a HPROF_LOAD_CLASS for the class and each array class do { - DumperSupport::write_header(writer, HPROF_LOAD_CLASS, remaining); + DumperSupport::write_header(writer(), HPROF_LOAD_CLASS, remaining); // class serial number is just a number - writer->write_u4(++class_serial_num); + writer()->write_u4(++class_serial_num); // class ID Klass* klass = Klass::cast(k); - writer->write_classID(klass); + writer()->write_classID(klass); // add the klassOop and class serial number pair - dumper->add_class_serial_number(klass, class_serial_num); + dumper()->add_class_serial_number(klass, class_serial_num); - writer->write_u4(STACK_TRACE_ID); + writer()->write_u4(STACK_TRACE_ID); // class name ID symbolOop name = klass->name(); - writer->write_objectID(name); + writer()->write_objectID(name); // write a LOAD_CLASS record for the array type (if it exists) k = klass->array_klass_or_null(); @@ -1512,17 +1525,13 @@ void VM_HeapDumper::do_load_class(klassOop k) { // writes a HPROF_GC_CLASS_DUMP record for the given class void VM_HeapDumper::do_class_dump(klassOop k) { - VM_HeapDumper* dumper = ((VM_HeapDumper*)VMThread::vm_operation()); - DumpWriter* writer = dumper->writer(); - DumperSupport::dump_class_and_array_classes(writer, k); + DumperSupport::dump_class_and_array_classes(writer(), k); } // writes a HPROF_GC_CLASS_DUMP records for a given basic type // array (and each multi-dimensional array too) void VM_HeapDumper::do_basic_type_array_class_dump(klassOop k) { - VM_HeapDumper* dumper = ((VM_HeapDumper*)VMThread::vm_operation()); - DumpWriter* writer = dumper->writer(); - DumperSupport::dump_basic_type_array_class(writer, k); + DumperSupport::dump_basic_type_array_class(writer(), k); } // Walk the stack of the given thread. @@ -1658,6 +1667,11 @@ void VM_HeapDumper::doit() { ch->ensure_parsability(false); } + // At this point we should be the only dumper active, so + // the following should be safe. + set_global_dumper(); + set_global_writer(); + // Write the file header - use 1.0.2 for large heaps, otherwise 1.0.1 size_t used = ch->used(); const char* header; @@ -1667,6 +1681,7 @@ void VM_HeapDumper::doit() { } else { header = "JAVA PROFILE 1.0.1"; } + // header is few bytes long - no chance to overflow int writer()->write_raw((void*)header, (int)strlen(header)); writer()->write_u1(0); // terminator @@ -1723,6 +1738,10 @@ void VM_HeapDumper::doit() { // fixes up the length of the dump record. In the case of a segmented // heap then the HPROF_HEAP_DUMP_END record is also written. end_of_dump(); + + // Now we clear the global variables, so that a future dumper might run. + clear_global_dumper(); + clear_global_writer(); } void VM_HeapDumper::dump_stack_traces() { @@ -1790,7 +1809,12 @@ int HeapDumper::dump(const char* path) { // generate the dump VM_HeapDumper dumper(&writer, _gc_before_heap_dump); - VMThread::execute(&dumper); + if (Thread::current()->is_VM_thread()) { + assert(SafepointSynchronize::is_at_safepoint(), "Expected to be called at a safepoint"); + dumper.doit(); + } else { + VMThread::execute(&dumper); + } // close dump file and record any error that the writer may have encountered writer.close(); @@ -1845,49 +1869,68 @@ void HeapDumper::set_error(char* error) { } } - -// Called by error reporting +// Called by error reporting by a single Java thread outside of a JVM safepoint, +// or by heap dumping by the VM thread during a (GC) safepoint. Thus, these various +// callers are strictly serialized and guaranteed not to interfere below. For more +// general use, however, this method will need modification to prevent +// inteference when updating the static variables base_path and dump_file_seq below. void HeapDumper::dump_heap() { - static char path[JVM_MAXPATHLEN]; + static char base_path[JVM_MAXPATHLEN] = {'\0'}; + static uint dump_file_seq = 0; + char my_path[JVM_MAXPATHLEN] = {'\0'}; // The dump file defaults to java_pid.hprof in the current working // directory. HeapDumpPath= can be used to specify an alternative // dump file name or a directory where dump file is created. - bool use_default_filename = true; - if (HeapDumpPath == NULL || HeapDumpPath[0] == '\0') { - path[0] = '\0'; // HeapDumpPath= not specified - } else { - assert(strlen(HeapDumpPath) < sizeof(path), "HeapDumpPath too long"); - strcpy(path, HeapDumpPath); - // check if the path is a directory (must exist) - DIR* dir = os::opendir(path); - if (dir == NULL) { - use_default_filename = false; + if (dump_file_seq == 0) { // first time in, we initialize base_path + bool use_default_filename = true; + if (HeapDumpPath == NULL || HeapDumpPath[0] == '\0') { + // HeapDumpPath= not specified } else { - // HeapDumpPath specified a directory. We append a file separator - // (if needed). - os::closedir(dir); - size_t fs_len = strlen(os::file_separator()); - if (strlen(path) >= fs_len) { - char* end = path; - end += (strlen(path) - fs_len); - if (strcmp(end, os::file_separator()) != 0) { - assert(strlen(path) + strlen(os::file_separator()) < sizeof(path), - "HeapDumpPath too long"); - strcat(path, os::file_separator()); + assert(strlen(HeapDumpPath) < sizeof(base_path), "HeapDumpPath too long"); + strcpy(base_path, HeapDumpPath); + // check if the path is a directory (must exist) + DIR* dir = os::opendir(base_path); + if (dir == NULL) { + use_default_filename = false; + } else { + // HeapDumpPath specified a directory. We append a file separator + // (if needed). + os::closedir(dir); + size_t fs_len = strlen(os::file_separator()); + if (strlen(base_path) >= fs_len) { + char* end = base_path; + end += (strlen(base_path) - fs_len); + if (strcmp(end, os::file_separator()) != 0) { + assert(strlen(base_path) + strlen(os::file_separator()) < sizeof(base_path), + "HeapDumpPath too long"); + strcat(base_path, os::file_separator()); + } } } } + // If HeapDumpPath wasn't a file name then we append the default name + if (use_default_filename) { + char fn[32]; + sprintf(fn, "java_pid%d", os::current_process_id()); + assert(strlen(base_path) + strlen(fn) < sizeof(base_path), "HeapDumpPath too long"); + strcat(base_path, fn); + } + assert(strlen(base_path) < sizeof(my_path), "Buffer too small"); + strcpy(my_path, base_path); + } else { + // Append a sequence number id for dumps following the first + char fn[33]; + sprintf(fn, ".%d", dump_file_seq); + assert(strlen(base_path) + strlen(fn) < sizeof(my_path), "HeapDumpPath too long"); + strcpy(my_path, base_path); + strcat(my_path, fn); } - // If HeapDumpPath wasn't a file name then we append the default name - if (use_default_filename) { - char fn[32]; - sprintf(fn, "java_pid%d.hprof", os::current_process_id()); - assert(strlen(path) + strlen(fn) < sizeof(path), "HeapDumpPath too long"); - strcat(path, fn); - } + dump_file_seq++; // increment seq number for next time we dump + assert(strlen(".hprof") + strlen(my_path) < sizeof(my_path), "HeapDumpPath too long"); + strcat(my_path, ".hprof"); HeapDumper dumper(false /* no GC before heap dump */, true /* send to tty */); - dumper.dump(path); + dumper.dump(my_path); } diff --git a/hotspot/src/share/vm/services/heapDumper.hpp b/hotspot/src/share/vm/services/heapDumper.hpp index 247512e0182..d5f70e40ae8 100644 --- a/hotspot/src/share/vm/services/heapDumper.hpp +++ b/hotspot/src/share/vm/services/heapDumper.hpp @@ -53,7 +53,7 @@ class HeapDumper : public StackObj { public: HeapDumper(bool gc_before_heap_dump) : - _gc_before_heap_dump(gc_before_heap_dump), _error(NULL), _print_to_tty(false) { } + _gc_before_heap_dump(gc_before_heap_dump), _error(NULL), _print_to_tty(false) { } HeapDumper(bool gc_before_heap_dump, bool print_to_tty) : _gc_before_heap_dump(gc_before_heap_dump), _error(NULL), _print_to_tty(print_to_tty) { } From 7a593ea8955194943cab02b9d4ea9d859e0bdb6d Mon Sep 17 00:00:00 2001 From: Anthony Petrov Date: Tue, 3 Mar 2009 13:54:47 +0300 Subject: [PATCH 077/292] 6811674: Container.setComponentZOrder throws NPE Reviewed-by: art, dcherepanov --- jdk/src/share/classes/java/awt/Container.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/jdk/src/share/classes/java/awt/Container.java b/jdk/src/share/classes/java/awt/Container.java index fb520547e1e..2a4050880de 100644 --- a/jdk/src/share/classes/java/awt/Container.java +++ b/jdk/src/share/classes/java/awt/Container.java @@ -506,7 +506,9 @@ public class Container extends Component { adjustDescendants(-(comp.countHierarchyMembers())); comp.parent = null; - comp.setGraphicsConfiguration(null); + if (needRemoveNotify) { + comp.setGraphicsConfiguration(null); + } component.remove(index); invalidateIfValid(); From ce3f3161daf4954cc3ae7008684fcac311e5979d Mon Sep 17 00:00:00 2001 From: "Y. Srinivas Ramakrishna" Date: Thu, 2 Apr 2009 15:57:41 -0700 Subject: [PATCH 078/292] 6824570: ParNew: Fix memory leak introduced in 6819891 Allocate worker-local overflow stacks, introduced in 6819891, along with ParNewGeneration, rather than with the per-scavenge ParScanThreadState. Reviewed-by: jmasa --- .../parNew/parNewGeneration.cpp | 35 +++++++++++++------ .../parNew/parNewGeneration.hpp | 13 ++++--- hotspot/src/share/vm/runtime/arguments.cpp | 12 ++++++- hotspot/src/share/vm/runtime/globals.hpp | 5 ++- 4 files changed, 48 insertions(+), 17 deletions(-) diff --git a/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp b/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp index bec5507ef76..3628875eb3a 100644 --- a/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp +++ b/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp @@ -34,10 +34,12 @@ ParScanThreadState::ParScanThreadState(Space* to_space_, Generation* old_gen_, int thread_num_, ObjToScanQueueSet* work_queue_set_, + GrowableArray** overflow_stack_set_, size_t desired_plab_sz_, ParallelTaskTerminator& term_) : _to_space(to_space_), _old_gen(old_gen_), _young_gen(gen_), _thread_num(thread_num_), _work_queue(work_queue_set_->queue(thread_num_)), _to_space_full(false), + _overflow_stack(overflow_stack_set_[thread_num_]), _ageTable(false), // false ==> not the global age table, no perf data. _to_space_alloc_buffer(desired_plab_sz_), _to_space_closure(gen_, this), _old_gen_closure(gen_, this), @@ -57,11 +59,6 @@ ParScanThreadState::ParScanThreadState(Space* to_space_, _start = os::elapsedTime(); _old_gen_closure.set_generation(old_gen_); _old_gen_root_closure.set_generation(old_gen_); - if (UseCompressedOops) { - _overflow_stack = new (ResourceObj::C_HEAP) GrowableArray(512, true); - } else { - _overflow_stack = NULL; - } } #ifdef _MSC_VER #pragma warning( pop ) @@ -155,7 +152,7 @@ void ParScanThreadState::trim_queues(int max_size) { } bool ParScanThreadState::take_from_overflow_stack() { - assert(UseCompressedOops, "Else should not call"); + assert(ParGCUseLocalOverflow, "Else should not call"); assert(young_gen()->overflow_list() == NULL, "Error"); ObjToScanQueue* queue = work_queue(); GrowableArray* of_stack = overflow_stack(); @@ -183,7 +180,7 @@ bool ParScanThreadState::take_from_overflow_stack() { } void ParScanThreadState::push_on_overflow_stack(oop p) { - assert(UseCompressedOops, "Else should not call"); + assert(ParGCUseLocalOverflow, "Else should not call"); overflow_stack()->push(p); assert(young_gen()->overflow_list() == NULL, "Error"); } @@ -260,6 +257,7 @@ public: ParNewGeneration& gen, Generation& old_gen, ObjToScanQueueSet& queue_set, + GrowableArray** overflow_stacks_, size_t desired_plab_sz, ParallelTaskTerminator& term); inline ParScanThreadState& thread_sate(int i); @@ -282,6 +280,7 @@ private: ParScanThreadStateSet::ParScanThreadStateSet( int num_threads, Space& to_space, ParNewGeneration& gen, Generation& old_gen, ObjToScanQueueSet& queue_set, + GrowableArray** overflow_stack_set_, size_t desired_plab_sz, ParallelTaskTerminator& term) : ResourceArray(sizeof(ParScanThreadState), num_threads), _gen(gen), _next_gen(old_gen), _term(term), @@ -292,7 +291,7 @@ ParScanThreadStateSet::ParScanThreadStateSet( for (int i = 0; i < num_threads; ++i) { new ((ParScanThreadState*)_data + i) ParScanThreadState(&to_space, &gen, &old_gen, i, &queue_set, - desired_plab_sz, term); + overflow_stack_set_, desired_plab_sz, term); } } @@ -519,6 +518,17 @@ ParNewGeneration(ReservedSpace rs, size_t initial_byte_size, int level) for (uint i2 = 0; i2 < ParallelGCThreads; i2++) _task_queues->queue(i2)->initialize(); + _overflow_stacks = NEW_C_HEAP_ARRAY(GrowableArray*, ParallelGCThreads); + guarantee(_overflow_stacks != NULL, "Overflow stack set allocation failure"); + for (uint i = 0; i < ParallelGCThreads; i++) { + if (ParGCUseLocalOverflow) { + _overflow_stacks[i] = new (ResourceObj::C_HEAP) GrowableArray(512, true); + guarantee(_overflow_stacks[i] != NULL, "Overflow Stack allocation failure."); + } else { + _overflow_stacks[i] = NULL; + } + } + if (UsePerfData) { EXCEPTION_MARK; ResourceMark rm; @@ -784,7 +794,7 @@ void ParNewGeneration::collect(bool full, ParallelTaskTerminator _term(workers->total_workers(), task_queues()); ParScanThreadStateSet thread_state_set(workers->total_workers(), *to(), *this, *_next_gen, *task_queues(), - desired_plab_sz(), _term); + _overflow_stacks, desired_plab_sz(), _term); ParNewGenTask tsk(this, _next_gen, reserved().end(), &thread_state_set); int n_workers = workers->total_workers(); @@ -1238,11 +1248,12 @@ bool ParNewGeneration::should_simulate_overflow() { #define BUSY (oop(0x1aff1aff)) void ParNewGeneration::push_on_overflow_list(oop from_space_obj, ParScanThreadState* par_scan_state) { assert(is_in_reserved(from_space_obj), "Should be from this generation"); - if (UseCompressedOops) { + if (ParGCUseLocalOverflow) { // In the case of compressed oops, we use a private, not-shared // overflow stack. par_scan_state->push_on_overflow_stack(from_space_obj); } else { + assert(!UseCompressedOops, "Error"); // if the object has been forwarded to itself, then we cannot // use the klass pointer for the linked list. Instead we have // to allocate an oopDesc in the C-Heap and use that for the linked list. @@ -1275,9 +1286,10 @@ void ParNewGeneration::push_on_overflow_list(oop from_space_obj, ParScanThreadSt bool ParNewGeneration::take_from_overflow_list(ParScanThreadState* par_scan_state) { bool res; - if (UseCompressedOops) { + if (ParGCUseLocalOverflow) { res = par_scan_state->take_from_overflow_stack(); } else { + assert(!UseCompressedOops, "Error"); res = take_from_overflow_list_work(par_scan_state); } return res; @@ -1305,6 +1317,7 @@ bool ParNewGeneration::take_from_overflow_list_work(ParScanThreadState* par_scan (size_t)ParGCDesiredObjsFromOverflowList); assert(par_scan_state->overflow_stack() == NULL, "Error"); + assert(!UseCompressedOops, "Error"); if (_overflow_list == NULL) return false; // Otherwise, there was something there; try claiming the list. diff --git a/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.hpp b/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.hpp index 7f0015bd676..3e2ab80af2e 100644 --- a/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.hpp +++ b/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.hpp @@ -33,8 +33,8 @@ class ParEvacuateFollowersClosure; // but they must be here to allow ParScanClosure::do_oop_work to be defined // in genOopClosures.inline.hpp. -typedef OopTaskQueue ObjToScanQueue; -typedef OopTaskQueueSet ObjToScanQueueSet; +typedef OopTaskQueue ObjToScanQueue; +typedef OopTaskQueueSet ObjToScanQueueSet; // Enable this to get push/pop/steal stats. const int PAR_STATS_ENABLED = 0; @@ -116,7 +116,9 @@ class ParScanThreadState { ParScanThreadState(Space* to_space_, ParNewGeneration* gen_, Generation* old_gen_, int thread_num_, - ObjToScanQueueSet* work_queue_set_, size_t desired_plab_sz_, + ObjToScanQueueSet* work_queue_set_, + GrowableArray** overflow_stack_set_, + size_t desired_plab_sz_, ParallelTaskTerminator& term_); public: @@ -296,9 +298,12 @@ class ParNewGeneration: public DefNewGeneration { char pad[64 - sizeof(ObjToScanQueue)]; // prevent false sharing }; - // The per-thread work queues, available here for stealing. + // The per-worker-thread work queues ObjToScanQueueSet* _task_queues; + // Per-worker-thread local overflow stacks + GrowableArray** _overflow_stacks; + // Desired size of survivor space plab's PLABStats _plab_stats; diff --git a/hotspot/src/share/vm/runtime/arguments.cpp b/hotspot/src/share/vm/runtime/arguments.cpp index 05a84d581e9..04c52121a8c 100644 --- a/hotspot/src/share/vm/runtime/arguments.cpp +++ b/hotspot/src/share/vm/runtime/arguments.cpp @@ -971,7 +971,7 @@ void Arguments::set_parnew_gc_flags() { } else { no_shared_spaces(); - // By default YoungPLABSize and OldPLABSize are set to 4096 and 1024 correspondinly, + // By default YoungPLABSize and OldPLABSize are set to 4096 and 1024 respectively, // these settings are default for Parallel Scavenger. For ParNew+Tenured configuration // we set them to 1024 and 1024. // See CR 6362902. @@ -987,6 +987,16 @@ void Arguments::set_parnew_gc_flags() { if (AlwaysTenure) { FLAG_SET_CMDLINE(intx, MaxTenuringThreshold, 0); } + // When using compressed oops, we use local overflow stacks, + // rather than using a global overflow list chained through + // the klass word of the object's pre-image. + if (UseCompressedOops && !ParGCUseLocalOverflow) { + if (!FLAG_IS_DEFAULT(ParGCUseLocalOverflow)) { + warning("Forcing +ParGCUseLocalOverflow: needed if using compressed references"); + } + FLAG_SET_DEFAULT(ParGCUseLocalOverflow, true); + } + assert(ParGCUseLocalOverflow || !UseCompressedOops, "Error"); } } diff --git a/hotspot/src/share/vm/runtime/globals.hpp b/hotspot/src/share/vm/runtime/globals.hpp index b80ec6fbda2..fcec0480866 100644 --- a/hotspot/src/share/vm/runtime/globals.hpp +++ b/hotspot/src/share/vm/runtime/globals.hpp @@ -1316,8 +1316,11 @@ class CommandLineFlags { product(intx, ParGCArrayScanChunk, 50, \ "Scan a subset and push remainder, if array is bigger than this") \ \ + product(bool, ParGCUseLocalOverflow, false, \ + "Instead of a global overflow list, use local overflow stacks") \ + \ product(bool, ParGCTrimOverflow, true, \ - "Eagerly trim the overflow lists (useful for UseCompressedOops") \ + "Eagerly trim the local overflow lists (when ParGCUseLocalOverflow") \ \ notproduct(bool, ParGCWorkQueueOverflowALot, false, \ "Whether we should simulate work queue overflow in ParNew") \ From bc706440bdcd9f35488e164d28a8a5289c5cedf3 Mon Sep 17 00:00:00 2001 From: John Coomes Date: Tue, 3 Mar 2009 14:23:18 -0800 Subject: [PATCH 079/292] 6810474: par compact - crash in summary_phase with very full heap Reviewed-by: tonyp --- .../parallelScavenge/psParallelCompact.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp index 5dadeb34e71..76577c3c569 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp @@ -508,6 +508,7 @@ ParallelCompactData::summarize_split_space(size_t src_region, assert(destination <= target_end, "sanity"); assert(destination + _region_data[src_region].data_size() > target_end, "region should not fit into target space"); + assert(is_region_aligned(target_end), "sanity"); size_t split_region = src_region; HeapWord* split_destination = destination; @@ -538,14 +539,12 @@ ParallelCompactData::summarize_split_space(size_t src_region, // max(top, max(new_top, clear_top)) // // where clear_top is a new field in SpaceInfo. Would have to set clear_top - // to destination + partial_obj_size, where both have the values passed to - // this routine. + // to target_end. const RegionData* const sr = region(split_region); const size_t beg_idx = addr_to_region_idx(region_align_up(sr->destination() + sr->partial_obj_size())); - const size_t end_idx = - addr_to_region_idx(region_align_up(destination + partial_obj_size)); + const size_t end_idx = addr_to_region_idx(target_end); if (TraceParallelOldGCSummaryPhase) { gclog_or_tty->print_cr("split: clearing source_region field in [" From de4c8e0eb58259a6a8f7261925a508ebc12b8cec Mon Sep 17 00:00:00 2001 From: Phil Race Date: Tue, 3 Mar 2009 16:10:37 -0800 Subject: [PATCH 080/292] 2163516: Font.createFont can be persuaded to leak temporary files Reviewed-by: igor --- .../share/classes/sun/font/FontManager.java | 2 +- .../share/classes/sun/font/TrueTypeFont.java | 13 ++++- jdk/src/share/classes/sun/font/Type1Font.java | 50 ++++++++++++++++++- .../awt/FontClass/CreateFont/DeleteFont.java | 14 ++++-- 4 files changed, 70 insertions(+), 9 deletions(-) diff --git a/jdk/src/share/classes/sun/font/FontManager.java b/jdk/src/share/classes/sun/font/FontManager.java index 29d14047fbd..aad8c5116c0 100644 --- a/jdk/src/share/classes/sun/font/FontManager.java +++ b/jdk/src/share/classes/sun/font/FontManager.java @@ -2361,7 +2361,7 @@ public final class FontManager { font2D = new TrueTypeFont(fontFilePath, null, 0, true); break; case Font.TYPE1_FONT: - font2D = new Type1Font(fontFilePath, null); + font2D = new Type1Font(fontFilePath, null, isCopy); break; default: throw new FontFormatException("Unrecognised Font Format"); diff --git a/jdk/src/share/classes/sun/font/TrueTypeFont.java b/jdk/src/share/classes/sun/font/TrueTypeFont.java index 8a8309efab4..e4784eec86b 100644 --- a/jdk/src/share/classes/sun/font/TrueTypeFont.java +++ b/jdk/src/share/classes/sun/font/TrueTypeFont.java @@ -174,8 +174,17 @@ public class TrueTypeFont extends FileFont { super(platname, nativeNames); useJavaRasterizer = javaRasterizer; fontRank = Font2D.TTF_RANK; - verify(); - init(fIndex); + try { + verify(); + init(fIndex); + } catch (Throwable t) { + close(); + if (t instanceof FontFormatException) { + throw (FontFormatException)t; + } else { + throw new FontFormatException("Unexpected runtime exception."); + } + } Disposer.addObjectRecord(this, disposerRecord); } diff --git a/jdk/src/share/classes/sun/font/Type1Font.java b/jdk/src/share/classes/sun/font/Type1Font.java index 90236ff64c1..e63303fbdbc 100644 --- a/jdk/src/share/classes/sun/font/Type1Font.java +++ b/jdk/src/share/classes/sun/font/Type1Font.java @@ -39,6 +39,7 @@ import java.nio.BufferUnderflowException; import java.nio.channels.ClosedChannelException; import java.nio.channels.FileChannel; import sun.java2d.Disposer; +import sun.java2d.DisposerRecord; import java.util.HashSet; import java.util.HashMap; import java.awt.Font; @@ -76,6 +77,27 @@ import java.awt.Font; */ public class Type1Font extends FileFont { + private static class T1DisposerRecord implements DisposerRecord { + String fileName = null; + + T1DisposerRecord(String name) { + fileName = name; + } + + public synchronized void dispose() { + java.security.AccessController.doPrivileged( + new java.security.PrivilegedAction() { + public Object run() { + + if (fileName != null) { + (new java.io.File(fileName)).delete(); + } + return null; + } + }); + } + } + WeakReference bufferRef = new WeakReference(null); private String psName = null; @@ -124,6 +146,17 @@ public class Type1Font extends FileFont { } + /** + * Constructs a Type1 Font. + * @param platname - Platform identifier of the font. Typically file name. + * @param nativeNames - Native names - typically XLFDs on Unix. + */ + public Type1Font(String platname, Object nativeNames) + throws FontFormatException { + + this(platname, nativeNames, false); + } + /** * - does basic verification of the file * - reads the names (full, family). @@ -131,12 +164,25 @@ public class Type1Font extends FileFont { * @throws FontFormatException - if the font can't be opened * or fails verification, or there's no usable cmap */ - public Type1Font(String platname, Object nativeNames) + public Type1Font(String platname, Object nativeNames, boolean createdCopy) throws FontFormatException { super(platname, nativeNames); fontRank = Font2D.TYPE1_RANK; checkedNatives = true; - verify(); + try { + verify(); + } catch (Throwable t) { + if (createdCopy) { + T1DisposerRecord ref = new T1DisposerRecord(platname); + Disposer.addObjectRecord(bufferRef, ref); + bufferRef = null; + } + if (t instanceof FontFormatException) { + throw (FontFormatException)t; + } else { + throw new FontFormatException("Unexpected runtime exception."); + } + } } private synchronized ByteBuffer getBuffer() throws FontFormatException { diff --git a/jdk/test/java/awt/FontClass/CreateFont/DeleteFont.java b/jdk/test/java/awt/FontClass/CreateFont/DeleteFont.java index eba9462f842..361b0b436ac 100644 --- a/jdk/test/java/awt/FontClass/CreateFont/DeleteFont.java +++ b/jdk/test/java/awt/FontClass/CreateFont/DeleteFont.java @@ -55,17 +55,23 @@ public class DeleteFont { if (!gotException) { throw new RuntimeException("No expected IOException"); } - badRead(-2); - badRead(8193); + badRead(-2, Font.TRUETYPE_FONT); + badRead(8193, Font.TRUETYPE_FONT); + + badRead(-2, Font.TYPE1_FONT); + badRead(8193, Font.TYPE1_FONT); + + // Make sure GC has a chance to clean up before we exit. + System.gc(); System.gc(); } - static void badRead(final int retval) { + static void badRead(final int retval, int fontType) { int num = 2; byte[] buff = new byte[16*8192]; // Multiple of 8192 is important. for (int ct=0; ct Date: Tue, 3 Mar 2009 18:25:57 -0800 Subject: [PATCH 081/292] 6812721: Block's frequency should not be NaN Set MIN_BLOCK_FREQUENCY block's frequency when calculated block's frequency is NaN Reviewed-by: never --- hotspot/src/share/vm/opto/gcm.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hotspot/src/share/vm/opto/gcm.cpp b/hotspot/src/share/vm/opto/gcm.cpp index 27ccc8126df..93572023030 100644 --- a/hotspot/src/share/vm/opto/gcm.cpp +++ b/hotspot/src/share/vm/opto/gcm.cpp @@ -1901,7 +1901,8 @@ void CFGLoop::scale_freq() { for (int i = 0; i < _members.length(); i++) { CFGElement* s = _members.at(i); float block_freq = s->_freq * loop_freq; - if (block_freq < MIN_BLOCK_FREQUENCY) block_freq = MIN_BLOCK_FREQUENCY; + if (g_isnan(block_freq) || block_freq < MIN_BLOCK_FREQUENCY) + block_freq = MIN_BLOCK_FREQUENCY; s->_freq = block_freq; } CFGLoop* ch = _child; From 8a7cd86a288a89723188e53a5468f28623ec5d69 Mon Sep 17 00:00:00 2001 From: Dmitry Cherepanov Date: Wed, 4 Mar 2009 13:05:56 +0300 Subject: [PATCH 082/292] 6809227: poor performance on Panel.Add() method in jdk6 Reviewed-by: art, anthony --- jdk/make/sun/xawt/mapfile-vers | 1 + jdk/src/share/classes/java/awt/Component.java | 39 ++++++---- jdk/src/share/classes/java/awt/Container.java | 26 +------ .../classes/java/awt/peer/ComponentPeer.java | 6 ++ .../classes/java/awt/peer/ContainerPeer.java | 17 ---- .../classes/sun/awt/NullComponentPeer.java | 20 ++--- .../classes/sun/awt/X11/XComponentPeer.java | 60 +++----------- .../sun/awt/X11/XEmbedChildProxyPeer.java | 3 + .../classes/sun/awt/X11/XlibWrapper.java | 1 + jdk/src/solaris/native/sun/xawt/XlibWrapper.c | 28 +++++++ .../sun/awt/windows/WComponentPeer.java | 11 +++ .../sun/awt/windows/WFileDialogPeer.java | 14 ---- .../sun/awt/windows/WPrintDialogPeer.java | 14 ---- .../sun/awt/windows/WScrollPanePeer.java | 6 -- .../native/sun/windows/awt_Component.cpp | 47 +++++++++++ .../native/sun/windows/awt_Component.h | 1 + .../windows/native/sun/windows/awt_Panel.cpp | 78 ------------------- .../windows/native/sun/windows/awt_Panel.h | 3 - 18 files changed, 141 insertions(+), 234 deletions(-) diff --git a/jdk/make/sun/xawt/mapfile-vers b/jdk/make/sun/xawt/mapfile-vers index 15342fbb404..dcea098e5e7 100644 --- a/jdk/make/sun/xawt/mapfile-vers +++ b/jdk/make/sun/xawt/mapfile-vers @@ -93,6 +93,7 @@ SUNWprivate_1.1 { Java_sun_awt_X11_XlibWrapper_XGetWMHints; Java_sun_awt_X11_XlibWrapper_XShapeQueryExtension; Java_sun_awt_X11_XlibWrapper_SetRectangularShape; + Java_sun_awt_X11_XlibWrapper_SetZOrder; Java_sun_awt_X11_XToolkit_initIDs; Java_sun_awt_X11_XWindow_getNativeColor; Java_sun_awt_X11_XWindow_getWMInsets; diff --git a/jdk/src/share/classes/java/awt/Component.java b/jdk/src/share/classes/java/awt/Component.java index e59d37a5826..26cfc9ef6f2 100644 --- a/jdk/src/share/classes/java/awt/Component.java +++ b/jdk/src/share/classes/java/awt/Component.java @@ -6656,23 +6656,7 @@ public abstract class Component implements ImageObserver, MenuContainer, // Update stacking order - if (parent != null && parent.peer != null) { - ContainerPeer parentContPeer = (ContainerPeer) parent.peer; - // if our parent is lightweight and we are not - // we should call restack on nearest heavyweight - // container. - if (parentContPeer instanceof LightweightPeer - && ! (peer instanceof LightweightPeer)) - { - Container hwParent = getNativeContainer(); - if (hwParent != null && hwParent.peer != null) { - parentContPeer = (ContainerPeer) hwParent.peer; - } - } - if (parentContPeer.isRestackSupported()) { - parentContPeer.restack(); - } - } + peer.setZOrder(getHWPeerAboveMe()); if (!isAddNotifyComplete) { mixOnShowing(); @@ -9546,6 +9530,27 @@ public abstract class Component implements ImageObserver, MenuContainer, return nextAbove < 0 ? -1 : nextAbove; } + final ComponentPeer getHWPeerAboveMe() { + checkTreeLock(); + + Container cont = getContainer(); + int indexAbove = getSiblingIndexAbove(); + + while (cont != null) { + for (int i = indexAbove; i > -1; i--) { + Component comp = cont.getComponent(i); + if (comp != null && comp.isDisplayable() && !comp.isLightweight()) { + return comp.getPeer(); + } + } + + indexAbove = cont.getSiblingIndexAbove(); + cont = cont.getContainer(); + } + + return null; + } + final int getSiblingIndexBelow() { checkTreeLock(); Container parent = getContainer(); diff --git a/jdk/src/share/classes/java/awt/Container.java b/jdk/src/share/classes/java/awt/Container.java index 2a4050880de..dcaa4fdfb16 100644 --- a/jdk/src/share/classes/java/awt/Container.java +++ b/jdk/src/share/classes/java/awt/Container.java @@ -649,10 +649,7 @@ public class Container extends Component { // each HW descendant independently. return !comp.peer.isReparentSupported(); } else { - // if container didn't change we still might need to recreate component's window as - // changes to zorder should be reflected in native window stacking order and it might - // not be supported by the platform. This is important only for heavyweight child - return !((ContainerPeer)(newNativeContainer.peer)).isRestackSupported(); + return false; } } @@ -809,11 +806,6 @@ public class Container extends Component { if (peer != null) { if (comp.peer == null) { // Remove notify was called or it didn't have peer - create new one comp.addNotify(); - // New created peer creates component on top of the stacking order - Container newNativeContainer = getHeavyweightContainer(); - if (((ContainerPeer)newNativeContainer.getPeer()).isRestackSupported()) { - ((ContainerPeer)newNativeContainer.getPeer()).restack(); - } } else { // Both container and child have peers, it means child peer should be reparented. // In both cases we need to reparent native widgets. Container newNativeContainer = getHeavyweightContainer(); @@ -822,13 +814,8 @@ public class Container extends Component { // Native container changed - need to reparent native widgets newNativeContainer.reparentChild(comp); } - // If component still has a peer and it is either container or heavyweight - // and restack is supported we have to restack native windows since order might have changed - if ((!comp.isLightweight() || (comp instanceof Container)) - && ((ContainerPeer)newNativeContainer.getPeer()).isRestackSupported()) - { - ((ContainerPeer)newNativeContainer.getPeer()).restack(); - } + comp.peer.setZOrder(comp.getHWPeerAboveMe()); + if (!comp.isLightweight() && isLightweight()) { // If component is heavyweight and one of the containers is lightweight // the location of the component should be fixed. @@ -2607,13 +2594,6 @@ public class Container extends Component { for (int i = 0; i < component.size(); i++) { component.get(i).addNotify(); } - // Update stacking order if native platform allows - ContainerPeer cpeer = (ContainerPeer)peer; - if (cpeer.isRestackSupported()) { - cpeer.restack(); - } - - } } diff --git a/jdk/src/share/classes/java/awt/peer/ComponentPeer.java b/jdk/src/share/classes/java/awt/peer/ComponentPeer.java index 3a2845f37fa..3c26d5c4fae 100644 --- a/jdk/src/share/classes/java/awt/peer/ComponentPeer.java +++ b/jdk/src/share/classes/java/awt/peer/ComponentPeer.java @@ -539,6 +539,12 @@ public interface ComponentPeer { */ void applyShape(Region shape); + /** + * Lowers this component at the bottom of the above HW peer. If the above parameter + * is null then the method places this component at the top of the Z-order. + */ + void setZOrder(ComponentPeer above); + /** * Updates internal data structures related to the component's GC. * diff --git a/jdk/src/share/classes/java/awt/peer/ContainerPeer.java b/jdk/src/share/classes/java/awt/peer/ContainerPeer.java index 092a54f2a24..8bb3f10c1f1 100644 --- a/jdk/src/share/classes/java/awt/peer/ContainerPeer.java +++ b/jdk/src/share/classes/java/awt/peer/ContainerPeer.java @@ -76,21 +76,4 @@ public interface ContainerPeer extends ComponentPeer { * @see Container#validateTree() */ void endLayout(); - - /** - * Restacks native windows - children of this native window - according to - * Java container order. - * - * @since 1.5 - */ - void restack(); - - /** - * Indicates availability of restacking operation in this container. - * - * @return Returns true if restack is supported, false otherwise - * - * @since 1.5 - */ - boolean isRestackSupported(); } diff --git a/jdk/src/share/classes/sun/awt/NullComponentPeer.java b/jdk/src/share/classes/sun/awt/NullComponentPeer.java index 2feea7b518c..471aa75b51c 100644 --- a/jdk/src/share/classes/sun/awt/NullComponentPeer.java +++ b/jdk/src/share/classes/sun/awt/NullComponentPeer.java @@ -278,19 +278,6 @@ public class NullComponentPeer implements LightweightPeer, throw new UnsupportedOperationException(); } - /** - * @see java.awt.peer.ContainerPeer#restack - */ - public void restack() { - throw new UnsupportedOperationException(); - } - - /** - * @see java.awt.peer.ContainerPeer#isRestackSupported - */ - public boolean isRestackSupported() { - return false; - } public void layout() { } @@ -306,6 +293,13 @@ public class NullComponentPeer implements LightweightPeer, public void applyShape(Region shape) { } + /** + * Lowers this component at the bottom of the above HW peer. If the above parameter + * is null then the method places this component at the top of the Z-order. + */ + public void setZOrder(ComponentPeer above) { + } + public void updateGraphicsData(GraphicsConfiguration gc) {} public GraphicsConfiguration getAppropriateGraphicsConfiguration( diff --git a/jdk/src/solaris/classes/sun/awt/X11/XComponentPeer.java b/jdk/src/solaris/classes/sun/awt/X11/XComponentPeer.java index 4c83ac750c8..75b0b6ca308 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XComponentPeer.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XComponentPeer.java @@ -1415,59 +1415,21 @@ public class XComponentPeer extends XWindow implements ComponentPeer, DropTarget } } - public void restack() { - synchronized(target.getTreeLock()) { - // Build the list of X windows in the window corresponding to this container - // This list is already in correct Java stacking order - Container cont = (Container)target; - Vector order = new Vector(cont.getComponentCount()); - HashSet set = new HashSet(); + /** + * Lowers this component at the bottom of the above HW peer. If the above parameter + * is null then the method places this component at the top of the Z-order. + */ + public void setZOrder(ComponentPeer above) { + long aboveWindow = (above != null) ? ((XComponentPeer)above).getWindow() : 0; - addTree(order, set, cont); - - XToolkit.awtLock(); - try { - // Get the current list of X window in X window. Some of the windows - // might be only native - XQueryTree qt = new XQueryTree(getContentWindow()); - try { - if (qt.execute() != 0) { - if (qt.get_nchildren() != 0) { - long pchildren = qt.get_children(); - int j = 0; // index to insert - for (int i = 0; i < qt.get_nchildren(); i++) { - Long w = Long.valueOf(Native.getLong(pchildren, i)); - if (!set.contains(w)) { - set.add(w); - order.add(j++, w); - } - } - } - } - - if (order.size() != 0) { - // Create native array of the windows - long windows = Native.allocateLongArray(order.size()); - Native.putLong(windows, order); - - // Restack native window according to the new order - XlibWrapper.XRestackWindows(XToolkit.getDisplay(), windows, order.size()); - - XlibWrapper.unsafe.freeMemory(windows); - } - } finally { - qt.dispose(); - } - } finally { - XToolkit.awtUnlock(); - } + XToolkit.awtLock(); + try{ + XlibWrapper.SetZOrder(XToolkit.getDisplay(), getWindow(), aboveWindow); + }finally{ + XToolkit.awtUnlock(); } } - public boolean isRestackSupported() { - return true; - } - private void addTree(Collection order, Set set, Container cont) { for (int i = 0; i < cont.getComponentCount(); i++) { Component comp = cont.getComponent(i); diff --git a/jdk/src/solaris/classes/sun/awt/X11/XEmbedChildProxyPeer.java b/jdk/src/solaris/classes/sun/awt/X11/XEmbedChildProxyPeer.java index eae300aee08..8b44a7293ac 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XEmbedChildProxyPeer.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XEmbedChildProxyPeer.java @@ -380,5 +380,8 @@ public class XEmbedChildProxyPeer implements ComponentPeer, XEventDispatcher{ public void applyShape(Region shape) { } + public void setZOrder(ComponentPeer above) { + } + public void updateGraphicsData(GraphicsConfiguration gc) {} } diff --git a/jdk/src/solaris/classes/sun/awt/X11/XlibWrapper.java b/jdk/src/solaris/classes/sun/awt/X11/XlibWrapper.java index eb6d5e77510..e20dfe731dc 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XlibWrapper.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XlibWrapper.java @@ -533,6 +533,7 @@ static native String XSetLocaleModifiers(String modifier_list); static native void SetRectangularShape(long display, long window, int lox, int loy, int hix, int hiy, sun.java2d.pipe.Region region); + static native void SetZOrder(long display, long window, long above); /* Global memory area used for X lib parameter passing */ diff --git a/jdk/src/solaris/native/sun/xawt/XlibWrapper.c b/jdk/src/solaris/native/sun/xawt/XlibWrapper.c index aee5cf9b080..bcb8a5fbf89 100644 --- a/jdk/src/solaris/native/sun/xawt/XlibWrapper.c +++ b/jdk/src/solaris/native/sun/xawt/XlibWrapper.c @@ -1945,3 +1945,31 @@ Java_sun_awt_X11_XlibWrapper_SetRectangularShape ShapeBounding, 0, 0, None, ShapeSet); } } + +/* + * Class: XlibWrapper + * Method: SetZOrder + */ + +JNIEXPORT void JNICALL +Java_sun_awt_X11_XlibWrapper_SetZOrder +(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong above) +{ + AWT_CHECK_HAVE_LOCK(); + + XWindowChanges wc; + wc.sibling = (Window)jlong_to_ptr(above); + + unsigned int value_mask = CWStackMode; + + if (above == 0) { + wc.stack_mode = Above; + } else { + wc.stack_mode = Below; + value_mask |= CWSibling; + } + + XConfigureWindow((Display *)jlong_to_ptr(display), + (Window)jlong_to_ptr(window), + value_mask, &wc ); +} diff --git a/jdk/src/windows/classes/sun/awt/windows/WComponentPeer.java b/jdk/src/windows/classes/sun/awt/windows/WComponentPeer.java index 56eb45fa3f5..6f2837739f8 100644 --- a/jdk/src/windows/classes/sun/awt/windows/WComponentPeer.java +++ b/jdk/src/windows/classes/sun/awt/windows/WComponentPeer.java @@ -941,4 +941,15 @@ public abstract class WComponentPeer extends WObjectPeer } } + /** + * Lowers this component at the bottom of the above component. If the above parameter + * is null then the method places this component at the top of the Z-order. + */ + public void setZOrder(ComponentPeer above) { + long aboveHWND = (above != null) ? ((WComponentPeer)above).getHWnd() : 0; + + setZOrder(aboveHWND); + } + + private native void setZOrder(long above); } diff --git a/jdk/src/windows/classes/sun/awt/windows/WFileDialogPeer.java b/jdk/src/windows/classes/sun/awt/windows/WFileDialogPeer.java index 2d4dfccf7a1..1c90ae2e566 100644 --- a/jdk/src/windows/classes/sun/awt/windows/WFileDialogPeer.java +++ b/jdk/src/windows/classes/sun/awt/windows/WFileDialogPeer.java @@ -231,20 +231,6 @@ public class WFileDialogPeer extends WWindowPeer implements FileDialogPeer { */ private static native void initIDs(); - /** - * WFileDialogPeer doesn't have native pData so we don't do restack on it - * @see java.awt.peer.ContainerPeer#restack - */ - public void restack() { - } - - /** - * @see java.awt.peer.ContainerPeer#isRestackSupported - */ - public boolean isRestackSupported() { - return false; - } - // The effects are not supported for system dialogs. public void applyShape(sun.java2d.pipe.Region shape) {} public void setOpacity(float opacity) {} diff --git a/jdk/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java b/jdk/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java index 939d54520b6..90ca88279fc 100644 --- a/jdk/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java +++ b/jdk/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java @@ -143,20 +143,6 @@ public class WPrintDialogPeer extends WWindowPeer implements DialogPeer { */ private static native void initIDs(); - /** - * WPrintDialogPeer doesn't have native pData so we don't do restack on it - * @see java.awt.peer.ContainerPeer#restack - */ - public void restack() { - } - - /** - * @see java.awt.peer.ContainerPeer#isRestackSupported - */ - public boolean isRestackSupported() { - return false; - } - // The effects are not supported for system dialogs. public void applyShape(sun.java2d.pipe.Region shape) {} public void setOpacity(float opacity) {} diff --git a/jdk/src/windows/classes/sun/awt/windows/WScrollPanePeer.java b/jdk/src/windows/classes/sun/awt/windows/WScrollPanePeer.java index 70b3725cf80..2e8c5e60bd5 100644 --- a/jdk/src/windows/classes/sun/awt/windows/WScrollPanePeer.java +++ b/jdk/src/windows/classes/sun/awt/windows/WScrollPanePeer.java @@ -269,10 +269,4 @@ class WScrollPanePeer extends WPanelPeer implements ScrollPanePeer { } } - /** - * @see java.awt.peer.ContainerPeer#restack - */ - public void restack() { - // Since ScrollPane can only have one child its restacking does nothing. - } } diff --git a/jdk/src/windows/native/sun/windows/awt_Component.cpp b/jdk/src/windows/native/sun/windows/awt_Component.cpp index a49ae839459..e2eaf995123 100644 --- a/jdk/src/windows/native/sun/windows/awt_Component.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Component.cpp @@ -149,6 +149,11 @@ struct GetInsetsStruct { jobject window; RECT *insets; }; +// Struct for _SetZOrder function +struct SetZOrderStruct { + jobject component; + jlong above; +}; /************************************************************************/ ////////////////////////////////////////////////////////////////////////// @@ -6170,6 +6175,33 @@ ret: delete data; } +void AwtComponent::_SetZOrder(void *param) { + JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); + + SetZOrderStruct *data = (SetZOrderStruct *)param; + jobject self = data->component; + HWND above = HWND_TOP; + if (data->above != 0) { + above = reinterpret_cast(data->above); + } + + AwtComponent *c = NULL; + + PDATA pData; + JNI_CHECK_PEER_GOTO(self, ret); + + c = (AwtComponent *)pData; + if (::IsWindow(c->GetHWnd())) { + ::SetWindowPos(c->GetHWnd(), above, 0, 0, 0, 0, + SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_DEFERERASE | SWP_ASYNCWINDOWPOS); + } + +ret: + env->DeleteGlobalRef(self); + + delete data; +} + void AwtComponent::PostUngrabEvent() { JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); jobject target = GetTarget(env); @@ -6896,6 +6928,21 @@ Java_sun_awt_windows_WComponentPeer_setRectangularShape(JNIEnv* env, jobject sel CATCH_BAD_ALLOC; } +JNIEXPORT void JNICALL +Java_sun_awt_windows_WComponentPeer_setZOrder(JNIEnv* env, jobject self, jlong above) +{ + TRY; + + SetZOrderStruct * data = new SetZOrderStruct; + data->component = env->NewGlobalRef(self); + data->above = above; + + AwtToolkit::GetInstance().SyncCall(AwtComponent::_SetZOrder, data); + // global refs and data are deleted in _SetLower + + CATCH_BAD_ALLOC; +} + } /* extern "C" */ diff --git a/jdk/src/windows/native/sun/windows/awt_Component.h b/jdk/src/windows/native/sun/windows/awt_Component.h index 2c9c0318cad..31e8be2c879 100644 --- a/jdk/src/windows/native/sun/windows/awt_Component.h +++ b/jdk/src/windows/native/sun/windows/awt_Component.h @@ -680,6 +680,7 @@ public: static jintArray _CreatePrintedPixels(void *param); static jboolean _NativeHandlesWheelScrolling(void *param); static void _SetRectangularShape(void *param); + static void _SetZOrder(void *param); static HWND sm_focusOwner; static HWND sm_focusedWindow; diff --git a/jdk/src/windows/native/sun/windows/awt_Panel.cpp b/jdk/src/windows/native/sun/windows/awt_Panel.cpp index 62c90bf5469..5f0e42673b0 100644 --- a/jdk/src/windows/native/sun/windows/awt_Panel.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Panel.cpp @@ -34,70 +34,6 @@ jfieldID AwtPanel::insets_ID; -static char* AWTPANEL_RESTACK_MSG_1 = "Peers array is null"; -static char* AWTPANEL_RESTACK_MSG_2 = "Peer null in JNI"; -static char* AWTPANEL_RESTACK_MSG_3 = "Native resources unavailable"; -static char* AWTPANEL_RESTACK_MSG_4 = "Child peer is null"; - -void* AwtPanel::Restack(void * param) { - TRY; - - JNIEnv* env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jobjectArray peers = (jobjectArray)param; - - int peerCount = env->GetArrayLength(peers); - if (peerCount < 1) { - env->DeleteGlobalRef(peers); - return AWTPANEL_RESTACK_MSG_1; - } - - jobject self = env->GetObjectArrayElement(peers, 0); - // It's entirely possible that our native resources have been destroyed - // before our java peer - if we're dispose()d, for instance. - // Alert caller w/ IllegalComponentStateException. - if (self == NULL) { - env->DeleteGlobalRef(peers); - return AWTPANEL_RESTACK_MSG_2; - } - PDATA pData = JNI_GET_PDATA(self); - if (pData == NULL) { - env->DeleteGlobalRef(peers); - env->DeleteLocalRef(self); - return AWTPANEL_RESTACK_MSG_3; - } - - AwtPanel* panel = (AwtPanel*)pData; - - HWND prevWindow = 0; - - for (int i = 1; i < peerCount; i++) { - jobject peer = env->GetObjectArrayElement(peers, i); - if (peer == NULL) { - // Nonsense - env->DeleteGlobalRef(peers); - env->DeleteLocalRef(self); - return AWTPANEL_RESTACK_MSG_4; - } - PDATA child_pData = JNI_GET_PDATA(peer); - if (child_pData == NULL) { - env->DeleteLocalRef(peer); - env->DeleteGlobalRef(peers); - env->DeleteLocalRef(self); - return AWTPANEL_RESTACK_MSG_3; - } - AwtComponent* child_comp = (AwtComponent*)child_pData; - ::SetWindowPos(child_comp->GetHWnd(), prevWindow, 0, 0, 0, 0, - SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_DEFERERASE | SWP_ASYNCWINDOWPOS); - prevWindow = child_comp->GetHWnd(); - env->DeleteLocalRef(peer); - } - env->DeleteGlobalRef(peers); - env->DeleteLocalRef(self); - - CATCH_BAD_ALLOC_RET("Allocation error"); - return NULL; -} - /************************************************************************ * AwtPanel native methods */ @@ -116,18 +52,4 @@ Java_sun_awt_windows_WPanelPeer_initIDs(JNIEnv *env, jclass cls) { CATCH_BAD_ALLOC; } -JNIEXPORT void JNICALL -Java_sun_awt_windows_WPanelPeer_pRestack(JNIEnv *env, jobject self, jobjectArray peers) { - - TRY; - - const char * error = (const char*)AwtToolkit::GetInstance().InvokeFunction(AwtPanel::Restack, env->NewGlobalRef(peers)); - if (error != NULL) { - JNU_ThrowByName(env, "java/awt/IllegalComponentStateException", error); - } - - CATCH_BAD_ALLOC; -} - - } /* extern "C" */ diff --git a/jdk/src/windows/native/sun/windows/awt_Panel.h b/jdk/src/windows/native/sun/windows/awt_Panel.h index 2e9ed6649c8..93084c71685 100644 --- a/jdk/src/windows/native/sun/windows/awt_Panel.h +++ b/jdk/src/windows/native/sun/windows/awt_Panel.h @@ -35,11 +35,8 @@ class AwtPanel { public: - static void* Restack(void * param); - /* java.awt.Panel field ids */ static jfieldID insets_ID; - }; #endif // AWT_PANEL_H From e63a1bf46057e7879660c2af8bf0d1e81ceebb0a Mon Sep 17 00:00:00 2001 From: Artem Ananiev Date: Wed, 4 Mar 2009 18:10:48 +0300 Subject: [PATCH 083/292] 6784816: Remove AWT tree lock from Container methods: getComponent, getComponents, getComponentCount Reviewed-by: anthony, dav --- jdk/src/share/classes/java/awt/Container.java | 157 ++++++++++-------- 1 file changed, 92 insertions(+), 65 deletions(-) diff --git a/jdk/src/share/classes/java/awt/Container.java b/jdk/src/share/classes/java/awt/Container.java index dcaa4fdfb16..9a184a7a2ea 100644 --- a/jdk/src/share/classes/java/awt/Container.java +++ b/jdk/src/share/classes/java/awt/Container.java @@ -270,9 +270,13 @@ public class Container extends Component { /** * Gets the number of components in this panel. + *

+ * Note: This method should be called under AWT tree lock. + * * @return the number of components in this panel. * @see #getComponent * @since JDK1.1 + * @see Component#getTreeLock() */ public int getComponentCount() { return countComponents(); @@ -284,43 +288,65 @@ public class Container extends Component { */ @Deprecated public int countComponents() { - synchronized (getTreeLock()) { - return component.size(); - } + // This method is not synchronized under AWT tree lock. + // Instead, the calling code is responsible for the + // synchronization. See 6784816 for details. + return component.size(); } /** * Gets the nth component in this container. + *

+ * Note: This method should be called under AWT tree lock. + * * @param n the index of the component to get. * @return the nth component in this container. * @exception ArrayIndexOutOfBoundsException * if the nth value does not exist. + * @see Component#getTreeLock() */ public Component getComponent(int n) { - synchronized (getTreeLock()) { - if ((n < 0) || (n >= component.size())) { - throw new ArrayIndexOutOfBoundsException("No such child: " + n); - } + // This method is not synchronized under AWT tree lock. + // Instead, the calling code is responsible for the + // synchronization. See 6784816 for details. + try { return component.get(n); + } catch (IndexOutOfBoundsException z) { + throw new ArrayIndexOutOfBoundsException("No such child: " + n); } } /** * Gets all the components in this container. + *

+ * Note: This method should be called under AWT tree lock. + * * @return an array of all the components in this container. + * @see Component#getTreeLock() */ public Component[] getComponents() { + // This method is not synchronized under AWT tree lock. + // Instead, the calling code is responsible for the + // synchronization. See 6784816 for details. return getComponents_NoClientCode(); } + // NOTE: This method may be called by privileged threads. // This functionality is implemented in a package-private method // to insure that it cannot be overridden by client subclasses. // DO NOT INVOKE CLIENT CODE ON THIS THREAD! final Component[] getComponents_NoClientCode() { + return component.toArray(EMPTY_ARRAY); + } + + /* + * Wrapper for getComponents() method with a proper synchronization. + */ + Component[] getComponentsSync() { synchronized (getTreeLock()) { - return component.toArray(EMPTY_ARRAY); + return getComponents(); } - } // getComponents_NoClientCode() + } /** * Determines the insets of this container, which indicate the size @@ -1028,9 +1054,9 @@ public class Container extends Component { } checkAddToSelf(comp); checkNotAWindow(comp); - if (thisGC != null) { - comp.checkGD(thisGC.getDevice().getIDstring()); - } + if (thisGC != null) { + comp.checkGD(thisGC.getDevice().getIDstring()); + } /* Reparent the component and tidy up the tree's state. */ if (comp.parent != null) { @@ -1349,7 +1375,7 @@ public class Container extends Component { } private int getListenersCount(int id, boolean enabledOnToolkit) { - assert Thread.holdsLock(getTreeLock()); + checkTreeLock(); if (enabledOnToolkit) { return descendantsCount; } @@ -1367,7 +1393,7 @@ public class Container extends Component { final int createHierarchyEvents(int id, Component changed, Container changedParent, long changeFlags, boolean enabledOnToolkit) { - assert Thread.holdsLock(getTreeLock()); + checkTreeLock(); int listeners = getListenersCount(id, enabledOnToolkit); for (int count = listeners, i = 0; count > 0; i++) { @@ -1382,7 +1408,7 @@ public class Container extends Component { final void createChildHierarchyEvents(int id, long changeFlags, boolean enabledOnToolkit) { - assert Thread.holdsLock(getTreeLock()); + checkTreeLock(); if (component.isEmpty()) { return; } @@ -1517,6 +1543,7 @@ public class Container extends Component { * @see #validate */ protected void validateTree() { + checkTreeLock(); if (!isValid()) { if (peer instanceof ContainerPeer) { ((ContainerPeer)peer).beginLayout(); @@ -1793,7 +1820,7 @@ public class Container extends Component { // super.paint(); -- Don't bother, since it's a NOP. GraphicsCallback.PaintCallback.getInstance(). - runComponents(component.toArray(EMPTY_ARRAY), g, GraphicsCallback.LIGHTWEIGHTS); + runComponents(getComponentsSync(), g, GraphicsCallback.LIGHTWEIGHTS); } } @@ -1848,7 +1875,7 @@ public class Container extends Component { } GraphicsCallback.PrintCallback.getInstance(). - runComponents(component.toArray(EMPTY_ARRAY), g, GraphicsCallback.LIGHTWEIGHTS); + runComponents(getComponentsSync(), g, GraphicsCallback.LIGHTWEIGHTS); } } @@ -1861,7 +1888,7 @@ public class Container extends Component { public void paintComponents(Graphics g) { if (isShowing()) { GraphicsCallback.PaintAllCallback.getInstance(). - runComponents(component.toArray(EMPTY_ARRAY), g, GraphicsCallback.TWO_PASSES); + runComponents(getComponentsSync(), g, GraphicsCallback.TWO_PASSES); } } @@ -1883,8 +1910,8 @@ public class Container extends Component { void paintHeavyweightComponents(Graphics g) { if (isShowing()) { GraphicsCallback.PaintHeavyweightComponentsCallback.getInstance(). - runComponents(component.toArray(EMPTY_ARRAY), g, GraphicsCallback.LIGHTWEIGHTS | - GraphicsCallback.HEAVYWEIGHTS); + runComponents(getComponentsSync(), g, + GraphicsCallback.LIGHTWEIGHTS | GraphicsCallback.HEAVYWEIGHTS); } } @@ -1897,7 +1924,7 @@ public class Container extends Component { public void printComponents(Graphics g) { if (isShowing()) { GraphicsCallback.PrintAllCallback.getInstance(). - runComponents(component.toArray(EMPTY_ARRAY), g, GraphicsCallback.TWO_PASSES); + runComponents(getComponentsSync(), g, GraphicsCallback.TWO_PASSES); } } @@ -1919,8 +1946,8 @@ public class Container extends Component { void printHeavyweightComponents(Graphics g) { if (isShowing()) { GraphicsCallback.PrintHeavyweightComponentsCallback.getInstance(). - runComponents(component.toArray(EMPTY_ARRAY), g, GraphicsCallback.LIGHTWEIGHTS | - GraphicsCallback.HEAVYWEIGHTS); + runComponents(getComponentsSync(), g, + GraphicsCallback.LIGHTWEIGHTS | GraphicsCallback.HEAVYWEIGHTS); } } @@ -2470,9 +2497,7 @@ public class Container extends Component { * @since 1.2 */ public Component findComponentAt(int x, int y) { - synchronized (getTreeLock()) { - return findComponentAt(x, y, true); - } + return findComponentAt(x, y, true); } /** @@ -2485,58 +2510,60 @@ public class Container extends Component { * The addition of this feature is temporary, pending the * adoption of new, public API which exports this feature. */ - final Component findComponentAt(int x, int y, boolean ignoreEnabled) - { - if (isRecursivelyVisible()){ - return findComponentAtImpl(x, y, ignoreEnabled); + final Component findComponentAt(int x, int y, boolean ignoreEnabled) { + synchronized (getTreeLock()) { + if (isRecursivelyVisible()){ + return findComponentAtImpl(x, y, ignoreEnabled); + } } return null; } final Component findComponentAtImpl(int x, int y, boolean ignoreEnabled){ + checkTreeLock(); + if (!(contains(x, y) && visible && (ignoreEnabled || enabled))) { return null; } // Two passes: see comment in sun.awt.SunGraphicsCallback - synchronized (getTreeLock()) { - for (int i = 0; i < component.size(); i++) { - Component comp = component.get(i); - if (comp != null && - !(comp.peer instanceof LightweightPeer)) { - if (comp instanceof Container) { - comp = ((Container)comp).findComponentAtImpl(x - comp.x, - y - comp.y, - ignoreEnabled); - } else { - comp = comp.locate(x - comp.x, y - comp.y); - } - if (comp != null && comp.visible && - (ignoreEnabled || comp.enabled)) - { - return comp; - } + for (int i = 0; i < component.size(); i++) { + Component comp = component.get(i); + if (comp != null && + !(comp.peer instanceof LightweightPeer)) { + if (comp instanceof Container) { + comp = ((Container)comp).findComponentAtImpl(x - comp.x, + y - comp.y, + ignoreEnabled); + } else { + comp = comp.locate(x - comp.x, y - comp.y); } - } - for (int i = 0; i < component.size(); i++) { - Component comp = component.get(i); - if (comp != null && - comp.peer instanceof LightweightPeer) { - if (comp instanceof Container) { - comp = ((Container)comp).findComponentAtImpl(x - comp.x, - y - comp.y, - ignoreEnabled); - } else { - comp = comp.locate(x - comp.x, y - comp.y); - } - if (comp != null && comp.visible && - (ignoreEnabled || comp.enabled)) - { - return comp; - } + if (comp != null && comp.visible && + (ignoreEnabled || comp.enabled)) + { + return comp; } } } + for (int i = 0; i < component.size(); i++) { + Component comp = component.get(i); + if (comp != null && + comp.peer instanceof LightweightPeer) { + if (comp instanceof Container) { + comp = ((Container)comp).findComponentAtImpl(x - comp.x, + y - comp.y, + ignoreEnabled); + } else { + comp = comp.locate(x - comp.x, y - comp.y); + } + if (comp != null && comp.visible && + (ignoreEnabled || comp.enabled)) + { + return comp; + } + } + } + return this; } @@ -3491,7 +3518,7 @@ public class Container extends Component { private void writeObject(ObjectOutputStream s) throws IOException { ObjectOutputStream.PutField f = s.putFields(); f.put("ncomponents", component.size()); - f.put("component", component.toArray(EMPTY_ARRAY)); + f.put("component", getComponentsSync()); f.put("layoutMgr", layoutMgr); f.put("dispatcher", dispatcher); f.put("maxSize", maxSize); From 07321dec653b79cbc73f0099ea32f9f089939bb7 Mon Sep 17 00:00:00 2001 From: John R Rose Date: Wed, 4 Mar 2009 09:58:39 -0800 Subject: [PATCH 084/292] 6812678: macro assembler needs delayed binding of a few constants (for 6655638) Minor assembler enhancements preparing for method handles Reviewed-by: kvn --- hotspot/src/cpu/sparc/vm/assembler_sparc.cpp | 41 ++++++++ hotspot/src/cpu/sparc/vm/assembler_sparc.hpp | 34 +++++++ .../cpu/sparc/vm/assembler_sparc.inline.hpp | 96 +++++++++++++++++++ hotspot/src/cpu/x86/vm/assembler_x86.cpp | 59 +++++++++++- hotspot/src/cpu/x86/vm/assembler_x86.hpp | 58 ++++++++++- .../src/cpu/x86/vm/c1_LIRAssembler_x86.cpp | 8 +- hotspot/src/cpu/x86/vm/cppInterpreter_x86.cpp | 20 ++-- hotspot/src/cpu/x86/vm/interp_masm_x86_32.cpp | 6 +- hotspot/src/cpu/x86/vm/interp_masm_x86_64.cpp | 8 +- .../cpu/x86/vm/templateInterpreter_x86_32.cpp | 14 +-- .../cpu/x86/vm/templateInterpreter_x86_64.cpp | 18 ++-- .../src/cpu/x86/vm/templateTable_x86_32.cpp | 16 ++-- .../src/cpu/x86/vm/templateTable_x86_64.cpp | 34 +++---- hotspot/src/cpu/x86/vm/x86_32.ad | 12 +-- hotspot/src/cpu/x86/vm/x86_64.ad | 12 +-- hotspot/src/share/vm/asm/assembler.cpp | 72 ++++++++++++++ hotspot/src/share/vm/asm/assembler.hpp | 42 ++++++++ 17 files changed, 467 insertions(+), 83 deletions(-) diff --git a/hotspot/src/cpu/sparc/vm/assembler_sparc.cpp b/hotspot/src/cpu/sparc/vm/assembler_sparc.cpp index 07879e32a8b..b9d8f6de537 100644 --- a/hotspot/src/cpu/sparc/vm/assembler_sparc.cpp +++ b/hotspot/src/cpu/sparc/vm/assembler_sparc.cpp @@ -2615,6 +2615,29 @@ void MacroAssembler::cas_under_lock(Register top_ptr_reg, Register top_reg, Regi } } +RegisterConstant MacroAssembler::delayed_value(intptr_t* delayed_value_addr, + Register tmp, + int offset) { + intptr_t value = *delayed_value_addr; + if (value != 0) + return RegisterConstant(value + offset); + + // load indirectly to solve generation ordering problem + Address a(tmp, (address) delayed_value_addr); + load_ptr_contents(a, tmp); + +#ifdef ASSERT + tst(tmp); + breakpoint_trap(zero, xcc); +#endif + + if (offset != 0) + add(tmp, offset, tmp); + + return RegisterConstant(tmp); +} + + void MacroAssembler::biased_locking_enter(Register obj_reg, Register mark_reg, Register temp_reg, Label& done, Label* slow_case, @@ -4057,6 +4080,24 @@ void MacroAssembler::card_write_barrier_post(Register store_addr, Register new_v card_table_write(bs->byte_map_base, tmp, store_addr); } +// Loading values by size and signed-ness +void MacroAssembler::load_sized_value(Register s1, RegisterConstant s2, Register d, + int size_in_bytes, bool is_signed) { + switch (size_in_bytes ^ (is_signed ? -1 : 0)) { + case ~8: // fall through: + case 8: ld_long( s1, s2, d ); break; + case ~4: ldsw( s1, s2, d ); break; + case 4: lduw( s1, s2, d ); break; + case ~2: ldsh( s1, s2, d ); break; + case 2: lduh( s1, s2, d ); break; + case ~1: ldsb( s1, s2, d ); break; + case 1: ldub( s1, s2, d ); break; + default: ShouldNotReachHere(); + } +} + + + void MacroAssembler::load_klass(Register src_oop, Register klass) { // The number of bytes in this code is used by // MachCallDynamicJavaNode::ret_addr_offset() diff --git a/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp b/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp index 1d735ade174..db934b139e4 100644 --- a/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp +++ b/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp @@ -384,6 +384,12 @@ class Address VALUE_OBJ_CLASS_SPEC { inline bool is_simm13(int offset = 0); // check disp+offset for overflow + Address plus_disp(int disp) const { // bump disp by a small amount + Address a = (*this); + a._disp += disp; + return a; + } + Address split_disp() const { // deal with disp overflow Address a = (*this); int hi_disp = _disp & ~0x3ff; @@ -1082,6 +1088,7 @@ public: inline void add( Register s1, Register s2, Register d ); inline void add( Register s1, int simm13a, Register d, relocInfo::relocType rtype = relocInfo::none); inline void add( Register s1, int simm13a, Register d, RelocationHolder const& rspec); + inline void add( Register s1, RegisterConstant s2, Register d, int offset = 0); inline void add( const Address& a, Register d, int offset = 0); void addcc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(add_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); } @@ -1298,6 +1305,16 @@ public: inline void ld( const Address& a, Register d, int offset = 0 ); inline void ldd( const Address& a, Register d, int offset = 0 ); + inline void ldub( Register s1, RegisterConstant s2, Register d ); + inline void ldsb( Register s1, RegisterConstant s2, Register d ); + inline void lduh( Register s1, RegisterConstant s2, Register d ); + inline void ldsh( Register s1, RegisterConstant s2, Register d ); + inline void lduw( Register s1, RegisterConstant s2, Register d ); + inline void ldsw( Register s1, RegisterConstant s2, Register d ); + inline void ldx( Register s1, RegisterConstant s2, Register d ); + inline void ld( Register s1, RegisterConstant s2, Register d ); + inline void ldd( Register s1, RegisterConstant s2, Register d ); + // pp 177 void ldsba( Register s1, Register s2, int ia, Register d ) { emit_long( op(ldst_op) | rd(d) | op3(ldsb_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); } @@ -1518,6 +1535,13 @@ public: inline void st( Register d, const Address& a, int offset = 0 ); inline void std( Register d, const Address& a, int offset = 0 ); + inline void stb( Register d, Register s1, RegisterConstant s2 ); + inline void sth( Register d, Register s1, RegisterConstant s2 ); + inline void stw( Register d, Register s1, RegisterConstant s2 ); + inline void stx( Register d, Register s1, RegisterConstant s2 ); + inline void std( Register d, Register s1, RegisterConstant s2 ); + inline void st( Register d, Register s1, RegisterConstant s2 ); + // pp 177 void stba( Register d, Register s1, Register s2, int ia ) { emit_long( op(ldst_op) | rd(d) | op3(stb_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); } @@ -1940,20 +1964,28 @@ class MacroAssembler: public Assembler { // st_ptr will perform st for 32 bit VM's and stx for 64 bit VM's inline void ld_ptr( Register s1, Register s2, Register d ); inline void ld_ptr( Register s1, int simm13a, Register d); + inline void ld_ptr( Register s1, RegisterConstant s2, Register d ); inline void ld_ptr( const Address& a, Register d, int offset = 0 ); inline void st_ptr( Register d, Register s1, Register s2 ); inline void st_ptr( Register d, Register s1, int simm13a); + inline void st_ptr( Register d, Register s1, RegisterConstant s2 ); inline void st_ptr( Register d, const Address& a, int offset = 0 ); // ld_long will perform ld for 32 bit VM's and ldx for 64 bit VM's // st_long will perform st for 32 bit VM's and stx for 64 bit VM's inline void ld_long( Register s1, Register s2, Register d ); inline void ld_long( Register s1, int simm13a, Register d ); + inline void ld_long( Register s1, RegisterConstant s2, Register d ); inline void ld_long( const Address& a, Register d, int offset = 0 ); inline void st_long( Register d, Register s1, Register s2 ); inline void st_long( Register d, Register s1, int simm13a ); + inline void st_long( Register d, Register s1, RegisterConstant s2 ); inline void st_long( Register d, const Address& a, int offset = 0 ); + // Loading values by size and signed-ness + void load_sized_value(Register s1, RegisterConstant s2, Register d, + int size_in_bytes, bool is_signed); + // -------------------------------------------------- public: @@ -2281,6 +2313,8 @@ class MacroAssembler: public Assembler { // stack overflow + shadow pages. Clobbers tsp and scratch registers. void bang_stack_size(Register Rsize, Register Rtsp, Register Rscratch); + virtual RegisterConstant delayed_value(intptr_t* delayed_value_addr, Register tmp, int offset); + void verify_tlab(); Condition negate_condition(Condition cond); diff --git a/hotspot/src/cpu/sparc/vm/assembler_sparc.inline.hpp b/hotspot/src/cpu/sparc/vm/assembler_sparc.inline.hpp index 0efaa846b1d..23810ed0647 100644 --- a/hotspot/src/cpu/sparc/vm/assembler_sparc.inline.hpp +++ b/hotspot/src/cpu/sparc/vm/assembler_sparc.inline.hpp @@ -143,6 +143,49 @@ inline void Assembler::ld( Register s1, Register s2, Register d) { lduw( s1, s2 inline void Assembler::ld( Register s1, int simm13a, Register d) { lduw( s1, simm13a, d); } #endif +inline void Assembler::ldub( Register s1, RegisterConstant s2, Register d) { + if (s2.is_register()) ldsb(s1, s2.as_register(), d); + else ldsb(s1, s2.as_constant(), d); +} +inline void Assembler::ldsb( Register s1, RegisterConstant s2, Register d) { + if (s2.is_register()) ldsb(s1, s2.as_register(), d); + else ldsb(s1, s2.as_constant(), d); +} +inline void Assembler::lduh( Register s1, RegisterConstant s2, Register d) { + if (s2.is_register()) ldsh(s1, s2.as_register(), d); + else ldsh(s1, s2.as_constant(), d); +} +inline void Assembler::ldsh( Register s1, RegisterConstant s2, Register d) { + if (s2.is_register()) ldsh(s1, s2.as_register(), d); + else ldsh(s1, s2.as_constant(), d); +} +inline void Assembler::lduw( Register s1, RegisterConstant s2, Register d) { + if (s2.is_register()) ldsw(s1, s2.as_register(), d); + else ldsw(s1, s2.as_constant(), d); +} +inline void Assembler::ldsw( Register s1, RegisterConstant s2, Register d) { + if (s2.is_register()) ldsw(s1, s2.as_register(), d); + else ldsw(s1, s2.as_constant(), d); +} +inline void Assembler::ldx( Register s1, RegisterConstant s2, Register d) { + if (s2.is_register()) ldx(s1, s2.as_register(), d); + else ldx(s1, s2.as_constant(), d); +} +inline void Assembler::ld( Register s1, RegisterConstant s2, Register d) { + if (s2.is_register()) ld(s1, s2.as_register(), d); + else ld(s1, s2.as_constant(), d); +} +inline void Assembler::ldd( Register s1, RegisterConstant s2, Register d) { + if (s2.is_register()) ldd(s1, s2.as_register(), d); + else ldd(s1, s2.as_constant(), d); +} + +// form effective addresses this way: +inline void Assembler::add( Register s1, RegisterConstant s2, Register d, int offset) { + if (s2.is_register()) add(s1, s2.as_register(), d); + else { add(s1, s2.as_constant() + offset, d); offset = 0; } + if (offset != 0) add(d, offset, d); +} inline void Assembler::ld( const Address& a, Register d, int offset ) { relocate(a.rspec(offset)); ld( a.base(), a.disp() + offset, d ); } inline void Assembler::ldsb( const Address& a, Register d, int offset ) { relocate(a.rspec(offset)); ldsb( a.base(), a.disp() + offset, d ); } @@ -200,6 +243,27 @@ inline void Assembler::std( Register d, Register s1, int simm13a) { v9_dep(); a inline void Assembler::st( Register d, Register s1, Register s2) { stw(d, s1, s2); } inline void Assembler::st( Register d, Register s1, int simm13a) { stw(d, s1, simm13a); } +inline void Assembler::stb( Register d, Register s1, RegisterConstant s2) { + if (s2.is_register()) stb(d, s1, s2.as_register()); + else stb(d, s1, s2.as_constant()); +} +inline void Assembler::sth( Register d, Register s1, RegisterConstant s2) { + if (s2.is_register()) sth(d, s1, s2.as_register()); + else sth(d, s1, s2.as_constant()); +} +inline void Assembler::stx( Register d, Register s1, RegisterConstant s2) { + if (s2.is_register()) stx(d, s1, s2.as_register()); + else stx(d, s1, s2.as_constant()); +} +inline void Assembler::std( Register d, Register s1, RegisterConstant s2) { + if (s2.is_register()) std(d, s1, s2.as_register()); + else std(d, s1, s2.as_constant()); +} +inline void Assembler::st( Register d, Register s1, RegisterConstant s2) { + if (s2.is_register()) st(d, s1, s2.as_register()); + else st(d, s1, s2.as_constant()); +} + inline void Assembler::stb( Register d, const Address& a, int offset) { relocate(a.rspec(offset)); stb( d, a.base(), a.disp() + offset); } inline void Assembler::sth( Register d, const Address& a, int offset) { relocate(a.rspec(offset)); sth( d, a.base(), a.disp() + offset); } inline void Assembler::stw( Register d, const Address& a, int offset) { relocate(a.rspec(offset)); stw( d, a.base(), a.disp() + offset); } @@ -244,6 +308,14 @@ inline void MacroAssembler::ld_ptr( Register s1, int simm13a, Register d ) { #endif } +inline void MacroAssembler::ld_ptr( Register s1, RegisterConstant s2, Register d ) { +#ifdef _LP64 + Assembler::ldx( s1, s2, d); +#else + Assembler::ld( s1, s2, d); +#endif +} + inline void MacroAssembler::ld_ptr( const Address& a, Register d, int offset ) { #ifdef _LP64 Assembler::ldx( a, d, offset ); @@ -268,6 +340,14 @@ inline void MacroAssembler::st_ptr( Register d, Register s1, int simm13a ) { #endif } +inline void MacroAssembler::st_ptr( Register d, Register s1, RegisterConstant s2 ) { +#ifdef _LP64 + Assembler::stx( d, s1, s2); +#else + Assembler::st( d, s1, s2); +#endif +} + inline void MacroAssembler::st_ptr( Register d, const Address& a, int offset) { #ifdef _LP64 Assembler::stx( d, a, offset); @@ -293,6 +373,14 @@ inline void MacroAssembler::ld_long( Register s1, int simm13a, Register d ) { #endif } +inline void MacroAssembler::ld_long( Register s1, RegisterConstant s2, Register d ) { +#ifdef _LP64 + Assembler::ldx(s1, s2, d); +#else + Assembler::ldd(s1, s2, d); +#endif +} + inline void MacroAssembler::ld_long( const Address& a, Register d, int offset ) { #ifdef _LP64 Assembler::ldx(a, d, offset ); @@ -317,6 +405,14 @@ inline void MacroAssembler::st_long( Register d, Register s1, int simm13a ) { #endif } +inline void MacroAssembler::st_long( Register d, Register s1, RegisterConstant s2 ) { +#ifdef _LP64 + Assembler::stx(d, s1, s2); +#else + Assembler::std(d, s1, s2); +#endif +} + inline void MacroAssembler::st_long( Register d, const Address& a, int offset ) { #ifdef _LP64 Assembler::stx(d, a, offset); diff --git a/hotspot/src/cpu/x86/vm/assembler_x86.cpp b/hotspot/src/cpu/x86/vm/assembler_x86.cpp index e36823ccd2a..c1c49fc7659 100644 --- a/hotspot/src/cpu/x86/vm/assembler_x86.cpp +++ b/hotspot/src/cpu/x86/vm/assembler_x86.cpp @@ -6197,8 +6197,11 @@ int MacroAssembler::load_signed_byte(Register dst, Address src) { return off; } -// word => int32 which seems bad for 64bit -int MacroAssembler::load_signed_word(Register dst, Address src) { +// Note: load_signed_short used to be called load_signed_word. +// Although the 'w' in x86 opcodes refers to the term "word" in the assembler +// manual, which means 16 bits, that usage is found nowhere in HotSpot code. +// The term "word" in HotSpot means a 32- or 64-bit machine word. +int MacroAssembler::load_signed_short(Register dst, Address src) { int off; if (LP64_ONLY(true ||) VM_Version::is_P6()) { // This is dubious to me since it seems safe to do a signed 16 => 64 bit @@ -6207,7 +6210,7 @@ int MacroAssembler::load_signed_word(Register dst, Address src) { off = offset(); movswl(dst, src); // movsxw } else { - off = load_unsigned_word(dst, src); + off = load_unsigned_short(dst, src); shll(dst, 16); sarl(dst, 16); } @@ -6229,7 +6232,8 @@ int MacroAssembler::load_unsigned_byte(Register dst, Address src) { return off; } -int MacroAssembler::load_unsigned_word(Register dst, Address src) { +// Note: load_unsigned_short used to be called load_unsigned_word. +int MacroAssembler::load_unsigned_short(Register dst, Address src) { // According to Intel Doc. AP-526, "Zero-Extension of Short", p.16, // and "3.9 Partial Register Penalties", p. 22). int off; @@ -6244,6 +6248,28 @@ int MacroAssembler::load_unsigned_word(Register dst, Address src) { return off; } +void MacroAssembler::load_sized_value(Register dst, Address src, + int size_in_bytes, bool is_signed) { + switch (size_in_bytes ^ (is_signed ? -1 : 0)) { +#ifndef _LP64 + // For case 8, caller is responsible for manually loading + // the second word into another register. + case ~8: // fall through: + case 8: movl( dst, src ); break; +#else + case ~8: // fall through: + case 8: movq( dst, src ); break; +#endif + case ~4: // fall through: + case 4: movl( dst, src ); break; + case ~2: load_signed_short( dst, src ); break; + case 2: load_unsigned_short( dst, src ); break; + case ~1: load_signed_byte( dst, src ); break; + case 1: load_unsigned_byte( dst, src ); break; + default: ShouldNotReachHere(); + } +} + void MacroAssembler::mov32(AddressLiteral dst, Register src) { if (reachable(dst)) { movl(as_Address(dst), src); @@ -7095,6 +7121,31 @@ void MacroAssembler::verify_oop(Register reg, const char* s) { } +RegisterConstant MacroAssembler::delayed_value(intptr_t* delayed_value_addr, + Register tmp, + int offset) { + intptr_t value = *delayed_value_addr; + if (value != 0) + return RegisterConstant(value + offset); + + // load indirectly to solve generation ordering problem + movptr(tmp, ExternalAddress((address) delayed_value_addr)); + +#ifdef ASSERT + Label L; + testl(tmp, tmp); + jccb(Assembler::notZero, L); + hlt(); + bind(L); +#endif + + if (offset != 0) + addptr(tmp, offset); + + return RegisterConstant(tmp); +} + + void MacroAssembler::verify_oop_addr(Address addr, const char* s) { if (!VerifyOops) return; diff --git a/hotspot/src/cpu/x86/vm/assembler_x86.hpp b/hotspot/src/cpu/x86/vm/assembler_x86.hpp index 32cb356a1a1..78b6dadede7 100644 --- a/hotspot/src/cpu/x86/vm/assembler_x86.hpp +++ b/hotspot/src/cpu/x86/vm/assembler_x86.hpp @@ -153,6 +153,21 @@ class Address VALUE_OBJ_CLASS_SPEC { times_8 = 3, times_ptr = LP64_ONLY(times_8) NOT_LP64(times_4) }; + static ScaleFactor times(int size) { + assert(size >= 1 && size <= 8 && is_power_of_2(size), "bad scale size"); + if (size == 8) return times_8; + if (size == 4) return times_4; + if (size == 2) return times_2; + return times_1; + } + static int scale_size(ScaleFactor scale) { + assert(scale != no_scale, ""); + assert(((1 << (int)times_1) == 1 && + (1 << (int)times_2) == 2 && + (1 << (int)times_4) == 4 && + (1 << (int)times_8) == 8), ""); + return (1 << (int)scale); + } private: Register _base; @@ -197,6 +212,22 @@ class Address VALUE_OBJ_CLASS_SPEC { "inconsistent address"); } + Address(Register base, RegisterConstant index, ScaleFactor scale = times_1, int disp = 0) + : _base (base), + _index(index.register_or_noreg()), + _scale(scale), + _disp (disp + (index.constant_or_zero() * scale_size(scale))) { + if (!index.is_register()) scale = Address::no_scale; + assert(!_index->is_valid() == (scale == Address::no_scale), + "inconsistent address"); + } + + Address plus_disp(int disp) const { + Address a = (*this); + a._disp += disp; + return a; + } + // The following two overloads are used in connection with the // ByteSize type (see sizes.hpp). They simplify the use of // ByteSize'd arguments in assembly code. Note that their equivalent @@ -224,6 +255,17 @@ class Address VALUE_OBJ_CLASS_SPEC { assert(!index->is_valid() == (scale == Address::no_scale), "inconsistent address"); } + + Address(Register base, RegisterConstant index, ScaleFactor scale, ByteSize disp) + : _base (base), + _index(index.register_or_noreg()), + _scale(scale), + _disp (in_bytes(disp) + (index.constant_or_zero() * scale_size(scale))) { + if (!index.is_register()) scale = Address::no_scale; + assert(!_index->is_valid() == (scale == Address::no_scale), + "inconsistent address"); + } + #endif // ASSERT // accessors @@ -240,7 +282,6 @@ class Address VALUE_OBJ_CLASS_SPEC { static Address make_array(ArrayAddress); - private: bool base_needs_rex() const { return _base != noreg && _base->encoding() >= 8; @@ -1393,17 +1434,20 @@ class MacroAssembler: public Assembler { // The following 4 methods return the offset of the appropriate move instruction - // Support for fast byte/word loading with zero extension (depending on particular CPU) + // Support for fast byte/short loading with zero extension (depending on particular CPU) int load_unsigned_byte(Register dst, Address src); - int load_unsigned_word(Register dst, Address src); + int load_unsigned_short(Register dst, Address src); - // Support for fast byte/word loading with sign extension (depending on particular CPU) + // Support for fast byte/short loading with sign extension (depending on particular CPU) int load_signed_byte(Register dst, Address src); - int load_signed_word(Register dst, Address src); + int load_signed_short(Register dst, Address src); // Support for sign-extension (hi:lo = extend_sign(lo)) void extend_sign(Register hi, Register lo); + // Loading values by size and signed-ness + void load_sized_value(Register dst, Address src, int size_in_bytes, bool is_signed); + // Support for inc/dec with optimal instruction selection depending on value void increment(Register reg, int value = 1) { LP64_ONLY(incrementq(reg, value)) NOT_LP64(incrementl(reg, value)) ; } @@ -1763,6 +1807,10 @@ class MacroAssembler: public Assembler { // stack overflow + shadow pages. Also, clobbers tmp void bang_stack_size(Register size, Register tmp); + virtual RegisterConstant delayed_value(intptr_t* delayed_value_addr, + Register tmp, + int offset); + // Support for serializing memory accesses between threads void serialize_memory(Register thread, Register tmp); diff --git a/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp b/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp index cdf508fab01..1e491190e65 100644 --- a/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp +++ b/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp @@ -554,8 +554,8 @@ void LIR_Assembler::emit_string_compare(LIR_Opr arg0, LIR_Opr arg1, LIR_Opr dst, __ jcc (Assembler::zero, noLoop); // compare first characters - __ load_unsigned_word(rcx, Address(rdi, 0)); - __ load_unsigned_word(rbx, Address(rsi, 0)); + __ load_unsigned_short(rcx, Address(rdi, 0)); + __ load_unsigned_short(rbx, Address(rsi, 0)); __ subl(rcx, rbx); __ jcc(Assembler::notZero, haveResult); // starting loop @@ -574,8 +574,8 @@ void LIR_Assembler::emit_string_compare(LIR_Opr arg0, LIR_Opr arg1, LIR_Opr dst, Label loop; __ align(wordSize); __ bind(loop); - __ load_unsigned_word(rcx, Address(rdi, rax, Address::times_2, 0)); - __ load_unsigned_word(rbx, Address(rsi, rax, Address::times_2, 0)); + __ load_unsigned_short(rcx, Address(rdi, rax, Address::times_2, 0)); + __ load_unsigned_short(rbx, Address(rsi, rax, Address::times_2, 0)); __ subl(rcx, rbx); __ jcc(Assembler::notZero, haveResult); __ increment(rax); diff --git a/hotspot/src/cpu/x86/vm/cppInterpreter_x86.cpp b/hotspot/src/cpu/x86/vm/cppInterpreter_x86.cpp index 377d0f2617b..bf73662baeb 100644 --- a/hotspot/src/cpu/x86/vm/cppInterpreter_x86.cpp +++ b/hotspot/src/cpu/x86/vm/cppInterpreter_x86.cpp @@ -513,7 +513,7 @@ void CppInterpreterGenerator::generate_compute_interpreter_state(const Register // compute full expression stack limit const Address size_of_stack (rbx, methodOopDesc::max_stack_offset()); - __ load_unsigned_word(rdx, size_of_stack); // get size of expression stack in words + __ load_unsigned_short(rdx, size_of_stack); // get size of expression stack in words __ negptr(rdx); // so we can subtract in next step // Allocate expression stack __ lea(rsp, Address(rsp, rdx, Address::times_ptr)); @@ -659,7 +659,7 @@ void InterpreterGenerator::generate_stack_overflow_check(void) { // Always give one monitor to allow us to start interp if sync method. // Any additional monitors need a check when moving the expression stack const int one_monitor = frame::interpreter_frame_monitor_size() * wordSize; - __ load_unsigned_word(rax, size_of_stack); // get size of expression stack in words + __ load_unsigned_short(rax, size_of_stack); // get size of expression stack in words __ lea(rax, Address(noreg, rax, Interpreter::stackElementScale(), one_monitor)); __ lea(rax, Address(rax, rdx, Interpreter::stackElementScale(), overhead_size)); @@ -863,13 +863,13 @@ address InterpreterGenerator::generate_accessor_entry(void) { __ bind(notByte); __ cmpl(rdx, stos); __ jcc(Assembler::notEqual, notShort); - __ load_signed_word(rax, field_address); + __ load_signed_short(rax, field_address); __ jmp(xreturn_path); __ bind(notShort); __ cmpl(rdx, ctos); __ jcc(Assembler::notEqual, notChar); - __ load_unsigned_word(rax, field_address); + __ load_unsigned_short(rax, field_address); __ jmp(xreturn_path); __ bind(notChar); @@ -937,7 +937,7 @@ address InterpreterGenerator::generate_native_entry(bool synchronized) { const Register locals = rdi; // get parameter size (always needed) - __ load_unsigned_word(rcx, size_of_parameters); + __ load_unsigned_short(rcx, size_of_parameters); // rbx: methodOop // rcx: size of parameters @@ -1062,7 +1062,7 @@ address InterpreterGenerator::generate_native_entry(bool synchronized) { // allocate space for parameters __ movptr(method, STATE(_method)); __ verify_oop(method); - __ load_unsigned_word(t, Address(method, methodOopDesc::size_of_parameters_offset())); + __ load_unsigned_short(t, Address(method, methodOopDesc::size_of_parameters_offset())); __ shll(t, 2); #ifdef _LP64 __ subptr(rsp, t); @@ -1659,11 +1659,11 @@ address InterpreterGenerator::generate_normal_entry(bool synchronized) { // const Address monitor(rbp, frame::interpreter_frame_initial_sp_offset * wordSize - (int)sizeof(BasicObjectLock)); // get parameter size (always needed) - __ load_unsigned_word(rcx, size_of_parameters); + __ load_unsigned_short(rcx, size_of_parameters); // rbx: methodOop // rcx: size of parameters - __ load_unsigned_word(rdx, size_of_locals); // get size of locals in words + __ load_unsigned_short(rdx, size_of_locals); // get size of locals in words __ subptr(rdx, rcx); // rdx = no. of additional locals @@ -1949,7 +1949,7 @@ address InterpreterGenerator::generate_normal_entry(bool synchronized) { __ movptr(rbx, STATE(_result._to_call._callee)); // callee left args on top of expression stack, remove them - __ load_unsigned_word(rcx, Address(rbx, methodOopDesc::size_of_parameters_offset())); + __ load_unsigned_short(rcx, Address(rbx, methodOopDesc::size_of_parameters_offset())); __ lea(rsp, Address(rsp, rcx, Address::times_ptr)); __ movl(rcx, Address(rbx, methodOopDesc::result_index_offset())); @@ -2119,7 +2119,7 @@ address InterpreterGenerator::generate_normal_entry(bool synchronized) { // Make it look like call_stub calling conventions // Get (potential) receiver - __ load_unsigned_word(rcx, size_of_parameters); // get size of parameters in words + __ load_unsigned_short(rcx, size_of_parameters); // get size of parameters in words ExternalAddress recursive(CAST_FROM_FN_PTR(address, RecursiveInterpreterActivation)); __ pushptr(recursive.addr()); // make it look good in the debugger diff --git a/hotspot/src/cpu/x86/vm/interp_masm_x86_32.cpp b/hotspot/src/cpu/x86/vm/interp_masm_x86_32.cpp index c11c3bc5404..deb4bdf8c4f 100644 --- a/hotspot/src/cpu/x86/vm/interp_masm_x86_32.cpp +++ b/hotspot/src/cpu/x86/vm/interp_masm_x86_32.cpp @@ -192,7 +192,7 @@ void InterpreterMacroAssembler::get_unsigned_2_byte_index_at_bcp(Register reg, i void InterpreterMacroAssembler::get_cache_and_index_at_bcp(Register cache, Register index, int bcp_offset) { assert(bcp_offset > 0, "bcp is still pointing to start of bytecode"); assert(cache != index, "must use different registers"); - load_unsigned_word(index, Address(rsi, bcp_offset)); + load_unsigned_short(index, Address(rsi, bcp_offset)); movptr(cache, Address(rbp, frame::interpreter_frame_cache_offset * wordSize)); assert(sizeof(ConstantPoolCacheEntry) == 4*wordSize, "adjust code below"); shlptr(index, 2); // convert from field index to ConstantPoolCacheEntry index @@ -202,7 +202,7 @@ void InterpreterMacroAssembler::get_cache_and_index_at_bcp(Register cache, Regis void InterpreterMacroAssembler::get_cache_entry_pointer_at_bcp(Register cache, Register tmp, int bcp_offset) { assert(bcp_offset > 0, "bcp is still pointing to start of bytecode"); assert(cache != tmp, "must use different register"); - load_unsigned_word(tmp, Address(rsi, bcp_offset)); + load_unsigned_short(tmp, Address(rsi, bcp_offset)); assert(sizeof(ConstantPoolCacheEntry) == 4*wordSize, "adjust code below"); // convert from field index to ConstantPoolCacheEntry index // and from word offset to byte offset @@ -1031,7 +1031,7 @@ void InterpreterMacroAssembler::verify_method_data_pointer() { // If the mdp is valid, it will point to a DataLayout header which is // consistent with the bcp. The converse is highly probable also. - load_unsigned_word(rdx, Address(rcx, in_bytes(DataLayout::bci_offset()))); + load_unsigned_short(rdx, Address(rcx, in_bytes(DataLayout::bci_offset()))); addptr(rdx, Address(rbx, methodOopDesc::const_offset())); lea(rdx, Address(rdx, constMethodOopDesc::codes_offset())); cmpptr(rdx, rsi); diff --git a/hotspot/src/cpu/x86/vm/interp_masm_x86_64.cpp b/hotspot/src/cpu/x86/vm/interp_masm_x86_64.cpp index ebcac0fddf9..efceab73101 100644 --- a/hotspot/src/cpu/x86/vm/interp_masm_x86_64.cpp +++ b/hotspot/src/cpu/x86/vm/interp_masm_x86_64.cpp @@ -190,7 +190,7 @@ void InterpreterMacroAssembler::get_cache_and_index_at_bcp(Register cache, int bcp_offset) { assert(bcp_offset > 0, "bcp is still pointing to start of bytecode"); assert(cache != index, "must use different registers"); - load_unsigned_word(index, Address(r13, bcp_offset)); + load_unsigned_short(index, Address(r13, bcp_offset)); movptr(cache, Address(rbp, frame::interpreter_frame_cache_offset * wordSize)); assert(sizeof(ConstantPoolCacheEntry) == 4 * wordSize, "adjust code below"); // convert from field index to ConstantPoolCacheEntry index @@ -203,7 +203,7 @@ void InterpreterMacroAssembler::get_cache_entry_pointer_at_bcp(Register cache, int bcp_offset) { assert(bcp_offset > 0, "bcp is still pointing to start of bytecode"); assert(cache != tmp, "must use different register"); - load_unsigned_word(tmp, Address(r13, bcp_offset)); + load_unsigned_short(tmp, Address(r13, bcp_offset)); assert(sizeof(ConstantPoolCacheEntry) == 4 * wordSize, "adjust code below"); // convert from field index to ConstantPoolCacheEntry index // and from word offset to byte offset @@ -1063,8 +1063,8 @@ void InterpreterMacroAssembler::verify_method_data_pointer() { // If the mdp is valid, it will point to a DataLayout header which is // consistent with the bcp. The converse is highly probable also. - load_unsigned_word(c_rarg2, - Address(c_rarg3, in_bytes(DataLayout::bci_offset()))); + load_unsigned_short(c_rarg2, + Address(c_rarg3, in_bytes(DataLayout::bci_offset()))); addptr(c_rarg2, Address(rbx, methodOopDesc::const_offset())); lea(c_rarg2, Address(c_rarg2, constMethodOopDesc::codes_offset())); cmpptr(c_rarg2, r13); diff --git a/hotspot/src/cpu/x86/vm/templateInterpreter_x86_32.cpp b/hotspot/src/cpu/x86/vm/templateInterpreter_x86_32.cpp index ed40fb70124..e0f874ae308 100644 --- a/hotspot/src/cpu/x86/vm/templateInterpreter_x86_32.cpp +++ b/hotspot/src/cpu/x86/vm/templateInterpreter_x86_32.cpp @@ -662,13 +662,13 @@ address InterpreterGenerator::generate_accessor_entry(void) { __ bind(notByte); __ cmpl(rdx, stos); __ jcc(Assembler::notEqual, notShort); - __ load_signed_word(rax, field_address); + __ load_signed_short(rax, field_address); __ jmp(xreturn_path); __ bind(notShort); __ cmpl(rdx, ctos); __ jcc(Assembler::notEqual, notChar); - __ load_unsigned_word(rax, field_address); + __ load_unsigned_short(rax, field_address); __ jmp(xreturn_path); __ bind(notChar); @@ -723,7 +723,7 @@ address InterpreterGenerator::generate_native_entry(bool synchronized) { const Address access_flags (rbx, methodOopDesc::access_flags_offset()); // get parameter size (always needed) - __ load_unsigned_word(rcx, size_of_parameters); + __ load_unsigned_short(rcx, size_of_parameters); // native calls don't need the stack size check since they have no expression stack // and the arguments are already on the stack and we only add a handful of words @@ -838,7 +838,7 @@ address InterpreterGenerator::generate_native_entry(bool synchronized) { // allocate space for parameters __ get_method(method); __ verify_oop(method); - __ load_unsigned_word(t, Address(method, methodOopDesc::size_of_parameters_offset())); + __ load_unsigned_short(t, Address(method, methodOopDesc::size_of_parameters_offset())); __ shlptr(t, Interpreter::logStackElementSize()); __ addptr(t, 2*wordSize); // allocate two more slots for JNIEnv and possible mirror __ subptr(rsp, t); @@ -1155,14 +1155,14 @@ address InterpreterGenerator::generate_normal_entry(bool synchronized) { const Address access_flags (rbx, methodOopDesc::access_flags_offset()); // get parameter size (always needed) - __ load_unsigned_word(rcx, size_of_parameters); + __ load_unsigned_short(rcx, size_of_parameters); // rbx,: methodOop // rcx: size of parameters // rsi: sender_sp (could differ from sp+wordSize if we were called via c2i ) - __ load_unsigned_word(rdx, size_of_locals); // get size of locals in words + __ load_unsigned_short(rdx, size_of_locals); // get size of locals in words __ subl(rdx, rcx); // rdx = no. of additional locals // see if we've got enough room on the stack for locals plus overhead. @@ -1558,7 +1558,7 @@ void TemplateInterpreterGenerator::generate_throw_exception() { // Compute size of arguments for saving when returning to deoptimized caller __ get_method(rax); __ verify_oop(rax); - __ load_unsigned_word(rax, Address(rax, in_bytes(methodOopDesc::size_of_parameters_offset()))); + __ load_unsigned_short(rax, Address(rax, in_bytes(methodOopDesc::size_of_parameters_offset()))); __ shlptr(rax, Interpreter::logStackElementSize()); __ restore_locals(); __ subptr(rdi, rax); diff --git a/hotspot/src/cpu/x86/vm/templateInterpreter_x86_64.cpp b/hotspot/src/cpu/x86/vm/templateInterpreter_x86_64.cpp index b237b7b5fff..330dce0c51b 100644 --- a/hotspot/src/cpu/x86/vm/templateInterpreter_x86_64.cpp +++ b/hotspot/src/cpu/x86/vm/templateInterpreter_x86_64.cpp @@ -650,7 +650,7 @@ address InterpreterGenerator::generate_accessor_entry(void) { __ cmpl(rdx, stos); __ jcc(Assembler::notEqual, notShort); // stos - __ load_signed_word(rax, field_address); + __ load_signed_short(rax, field_address); __ jmp(xreturn_path); __ bind(notShort); @@ -662,7 +662,7 @@ address InterpreterGenerator::generate_accessor_entry(void) { __ bind(okay); #endif // ctos - __ load_unsigned_word(rax, field_address); + __ load_unsigned_short(rax, field_address); __ bind(xreturn_path); @@ -702,7 +702,7 @@ address InterpreterGenerator::generate_native_entry(bool synchronized) { const Address access_flags (rbx, methodOopDesc::access_flags_offset()); // get parameter size (always needed) - __ load_unsigned_word(rcx, size_of_parameters); + __ load_unsigned_short(rcx, size_of_parameters); // native calls don't need the stack size check since they have no // expression stack and the arguments are already on the stack and @@ -819,9 +819,9 @@ address InterpreterGenerator::generate_native_entry(bool synchronized) { // allocate space for parameters __ get_method(method); __ verify_oop(method); - __ load_unsigned_word(t, - Address(method, - methodOopDesc::size_of_parameters_offset())); + __ load_unsigned_short(t, + Address(method, + methodOopDesc::size_of_parameters_offset())); __ shll(t, Interpreter::logStackElementSize()); __ subptr(rsp, t); @@ -1165,13 +1165,13 @@ address InterpreterGenerator::generate_normal_entry(bool synchronized) { const Address access_flags(rbx, methodOopDesc::access_flags_offset()); // get parameter size (always needed) - __ load_unsigned_word(rcx, size_of_parameters); + __ load_unsigned_short(rcx, size_of_parameters); // rbx: methodOop // rcx: size of parameters // r13: sender_sp (could differ from sp+wordSize if we were called via c2i ) - __ load_unsigned_word(rdx, size_of_locals); // get size of locals in words + __ load_unsigned_short(rdx, size_of_locals); // get size of locals in words __ subl(rdx, rcx); // rdx = no. of additional locals // YYY @@ -1583,7 +1583,7 @@ void TemplateInterpreterGenerator::generate_throw_exception() { // Compute size of arguments for saving when returning to // deoptimized caller __ get_method(rax); - __ load_unsigned_word(rax, Address(rax, in_bytes(methodOopDesc:: + __ load_unsigned_short(rax, Address(rax, in_bytes(methodOopDesc:: size_of_parameters_offset()))); __ shll(rax, Interpreter::logStackElementSize()); __ restore_locals(); // XXX do we need this? diff --git a/hotspot/src/cpu/x86/vm/templateTable_x86_32.cpp b/hotspot/src/cpu/x86/vm/templateTable_x86_32.cpp index 6acbc8e2836..598c1a64457 100644 --- a/hotspot/src/cpu/x86/vm/templateTable_x86_32.cpp +++ b/hotspot/src/cpu/x86/vm/templateTable_x86_32.cpp @@ -296,7 +296,7 @@ void TemplateTable::bipush() { void TemplateTable::sipush() { transition(vtos, itos); - __ load_unsigned_word(rax, at_bcp(1)); + __ load_unsigned_short(rax, at_bcp(1)); __ bswapl(rax); __ sarl(rax, 16); } @@ -662,7 +662,7 @@ void TemplateTable::caload() { index_check(rdx, rax); // kills rbx, // rax,: index // can do better code for P5 - may want to improve this at some point - __ load_unsigned_word(rbx, Address(rdx, rax, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR))); + __ load_unsigned_short(rbx, Address(rdx, rax, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR))); __ mov(rax, rbx); } @@ -677,7 +677,7 @@ void TemplateTable::fast_icaload() { // rdx: array index_check(rdx, rax); // rax,: index - __ load_unsigned_word(rbx, Address(rdx, rax, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR))); + __ load_unsigned_short(rbx, Address(rdx, rax, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR))); __ mov(rax, rbx); } @@ -687,7 +687,7 @@ void TemplateTable::saload() { index_check(rdx, rax); // kills rbx, // rax,: index // can do better code for P5 - may want to improve this at some point - __ load_signed_word(rbx, Address(rdx, rax, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_SHORT))); + __ load_signed_short(rbx, Address(rdx, rax, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_SHORT))); __ mov(rax, rbx); } @@ -2310,7 +2310,7 @@ void TemplateTable::getfield_or_static(int byte_no, bool is_static) { __ cmpl(flags, ctos ); __ jcc(Assembler::notEqual, notChar); - __ load_unsigned_word(rax, lo ); + __ load_unsigned_short(rax, lo ); __ push(ctos); if (!is_static) { patch_bytecode(Bytecodes::_fast_cgetfield, rcx, rbx); @@ -2322,7 +2322,7 @@ void TemplateTable::getfield_or_static(int byte_no, bool is_static) { __ cmpl(flags, stos ); __ jcc(Assembler::notEqual, notShort); - __ load_signed_word(rax, lo ); + __ load_signed_short(rax, lo ); __ push(stos); if (!is_static) { patch_bytecode(Bytecodes::_fast_sgetfield, rcx, rbx); @@ -2830,8 +2830,8 @@ void TemplateTable::fast_accessfield(TosState state) { // access field switch (bytecode()) { case Bytecodes::_fast_bgetfield: __ movsbl(rax, lo ); break; - case Bytecodes::_fast_sgetfield: __ load_signed_word(rax, lo ); break; - case Bytecodes::_fast_cgetfield: __ load_unsigned_word(rax, lo ); break; + case Bytecodes::_fast_sgetfield: __ load_signed_short(rax, lo ); break; + case Bytecodes::_fast_cgetfield: __ load_unsigned_short(rax, lo ); break; case Bytecodes::_fast_igetfield: __ movl(rax, lo); break; case Bytecodes::_fast_lgetfield: __ stop("should not be rewritten"); break; case Bytecodes::_fast_fgetfield: __ fld_s(lo); break; diff --git a/hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp b/hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp index 50c23fd458c..24fb31d4b27 100644 --- a/hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp +++ b/hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp @@ -307,7 +307,7 @@ void TemplateTable::bipush() { void TemplateTable::sipush() { transition(vtos, itos); - __ load_unsigned_word(rax, at_bcp(1)); + __ load_unsigned_short(rax, at_bcp(1)); __ bswapl(rax); __ sarl(rax, 16); } @@ -645,10 +645,10 @@ void TemplateTable::caload() { // eax: index // rdx: array index_check(rdx, rax); // kills rbx - __ load_unsigned_word(rax, - Address(rdx, rax, - Address::times_2, - arrayOopDesc::base_offset_in_bytes(T_CHAR))); + __ load_unsigned_short(rax, + Address(rdx, rax, + Address::times_2, + arrayOopDesc::base_offset_in_bytes(T_CHAR))); } // iload followed by caload frequent pair @@ -663,10 +663,10 @@ void TemplateTable::fast_icaload() { // rdx: array __ pop_ptr(rdx); index_check(rdx, rax); // kills rbx - __ load_unsigned_word(rax, - Address(rdx, rax, - Address::times_2, - arrayOopDesc::base_offset_in_bytes(T_CHAR))); + __ load_unsigned_short(rax, + Address(rdx, rax, + Address::times_2, + arrayOopDesc::base_offset_in_bytes(T_CHAR))); } void TemplateTable::saload() { @@ -675,10 +675,10 @@ void TemplateTable::saload() { // eax: index // rdx: array index_check(rdx, rax); // kills rbx - __ load_signed_word(rax, - Address(rdx, rax, - Address::times_2, - arrayOopDesc::base_offset_in_bytes(T_SHORT))); + __ load_signed_short(rax, + Address(rdx, rax, + Address::times_2, + arrayOopDesc::base_offset_in_bytes(T_SHORT))); } void TemplateTable::iload(int n) { @@ -2276,7 +2276,7 @@ void TemplateTable::getfield_or_static(int byte_no, bool is_static) { __ cmpl(flags, ctos); __ jcc(Assembler::notEqual, notChar); // ctos - __ load_unsigned_word(rax, field); + __ load_unsigned_short(rax, field); __ push(ctos); // Rewrite bytecode to be faster if (!is_static) { @@ -2288,7 +2288,7 @@ void TemplateTable::getfield_or_static(int byte_no, bool is_static) { __ cmpl(flags, stos); __ jcc(Assembler::notEqual, notShort); // stos - __ load_signed_word(rax, field); + __ load_signed_short(rax, field); __ push(stos); // Rewrite bytecode to be faster if (!is_static) { @@ -2751,10 +2751,10 @@ void TemplateTable::fast_accessfield(TosState state) { __ movsbl(rax, field); break; case Bytecodes::_fast_sgetfield: - __ load_signed_word(rax, field); + __ load_signed_short(rax, field); break; case Bytecodes::_fast_cgetfield: - __ load_unsigned_word(rax, field); + __ load_unsigned_short(rax, field); break; case Bytecodes::_fast_fgetfield: __ movflt(xmm0, field); diff --git a/hotspot/src/cpu/x86/vm/x86_32.ad b/hotspot/src/cpu/x86/vm/x86_32.ad index 43daf35fc22..0880988ed8b 100644 --- a/hotspot/src/cpu/x86/vm/x86_32.ad +++ b/hotspot/src/cpu/x86/vm/x86_32.ad @@ -3751,8 +3751,8 @@ encode %{ masm.jcc(Assembler::zero, LENGTH_DIFF_LABEL); // Load first characters - masm.load_unsigned_word(rcx, Address(rbx, 0)); - masm.load_unsigned_word(rdi, Address(rax, 0)); + masm.load_unsigned_short(rcx, Address(rbx, 0)); + masm.load_unsigned_short(rdi, Address(rax, 0)); // Compare first characters masm.subl(rcx, rdi); @@ -3782,8 +3782,8 @@ encode %{ // Compare the rest of the characters masm.bind(WHILE_HEAD_LABEL); - masm.load_unsigned_word(rcx, Address(rbx, rsi, Address::times_2, 0)); - masm.load_unsigned_word(rdi, Address(rax, rsi, Address::times_2, 0)); + masm.load_unsigned_short(rcx, Address(rbx, rsi, Address::times_2, 0)); + masm.load_unsigned_short(rdi, Address(rax, rsi, Address::times_2, 0)); masm.subl(rcx, rdi); masm.jcc(Assembler::notZero, POP_LABEL); masm.incrementl(rsi); @@ -3840,8 +3840,8 @@ encode %{ masm.jcc(Assembler::zero, COMPARE_LOOP_HDR); // Compare 2-byte "tail" at end of arrays - masm.load_unsigned_word(tmp1Reg, Address(ary1Reg, resultReg, Address::times_4, base_offset)); - masm.load_unsigned_word(tmp2Reg, Address(ary2Reg, resultReg, Address::times_4, base_offset)); + masm.load_unsigned_short(tmp1Reg, Address(ary1Reg, resultReg, Address::times_4, base_offset)); + masm.load_unsigned_short(tmp2Reg, Address(ary2Reg, resultReg, Address::times_4, base_offset)); masm.cmpl(tmp1Reg, tmp2Reg); masm.jcc(Assembler::notEqual, FALSE_LABEL); masm.testl(resultReg, resultReg); diff --git a/hotspot/src/cpu/x86/vm/x86_64.ad b/hotspot/src/cpu/x86/vm/x86_64.ad index 09157f3a34b..6231c2e6d96 100644 --- a/hotspot/src/cpu/x86/vm/x86_64.ad +++ b/hotspot/src/cpu/x86/vm/x86_64.ad @@ -3765,8 +3765,8 @@ encode %{ masm.jcc(Assembler::zero, LENGTH_DIFF_LABEL); // Load first characters - masm.load_unsigned_word(rcx, Address(rbx, 0)); - masm.load_unsigned_word(rdi, Address(rax, 0)); + masm.load_unsigned_short(rcx, Address(rbx, 0)); + masm.load_unsigned_short(rdi, Address(rax, 0)); // Compare first characters masm.subl(rcx, rdi); @@ -3796,8 +3796,8 @@ encode %{ // Compare the rest of the characters masm.bind(WHILE_HEAD_LABEL); - masm.load_unsigned_word(rcx, Address(rbx, rsi, Address::times_2, 0)); - masm.load_unsigned_word(rdi, Address(rax, rsi, Address::times_2, 0)); + masm.load_unsigned_short(rcx, Address(rbx, rsi, Address::times_2, 0)); + masm.load_unsigned_short(rdi, Address(rax, rsi, Address::times_2, 0)); masm.subl(rcx, rdi); masm.jcc(Assembler::notZero, POP_LABEL); masm.increment(rsi); @@ -3854,8 +3854,8 @@ encode %{ masm.jcc(Assembler::zero, COMPARE_LOOP_HDR); // Compare 2-byte "tail" at end of arrays - masm.load_unsigned_word(tmp1Reg, Address(ary1Reg, resultReg, Address::times_4, base_offset)); - masm.load_unsigned_word(tmp2Reg, Address(ary2Reg, resultReg, Address::times_4, base_offset)); + masm.load_unsigned_short(tmp1Reg, Address(ary1Reg, resultReg, Address::times_4, base_offset)); + masm.load_unsigned_short(tmp2Reg, Address(ary2Reg, resultReg, Address::times_4, base_offset)); masm.cmpl(tmp1Reg, tmp2Reg); masm.jcc(Assembler::notEqual, FALSE_LABEL); masm.testl(resultReg, resultReg); diff --git a/hotspot/src/share/vm/asm/assembler.cpp b/hotspot/src/share/vm/asm/assembler.cpp index 0afc3960422..1cbbad6d435 100644 --- a/hotspot/src/share/vm/asm/assembler.cpp +++ b/hotspot/src/share/vm/asm/assembler.cpp @@ -239,6 +239,78 @@ void Label::patch_instructions(MacroAssembler* masm) { } } +struct DelayedConstant { + typedef void (*value_fn_t)(); + BasicType type; + intptr_t value; + value_fn_t value_fn; + // This limit of 20 is generous for initial uses. + // The limit needs to be large enough to store the field offsets + // into classes which do not have statically fixed layouts. + // (Initial use is for method handle object offsets.) + // Look for uses of "delayed_value" in the source code + // and make sure this number is generous enough to handle all of them. + enum { DC_LIMIT = 20 }; + static DelayedConstant delayed_constants[DC_LIMIT]; + static DelayedConstant* add(BasicType type, value_fn_t value_fn); + bool match(BasicType t, value_fn_t cfn) { + return type == t && value_fn == cfn; + } + static void update_all(); +}; + +DelayedConstant DelayedConstant::delayed_constants[DC_LIMIT]; +// Default C structure initialization rules have the following effect here: +// = { { (BasicType)0, (intptr_t)NULL }, ... }; + +DelayedConstant* DelayedConstant::add(BasicType type, + DelayedConstant::value_fn_t cfn) { + for (int i = 0; i < DC_LIMIT; i++) { + DelayedConstant* dcon = &delayed_constants[i]; + if (dcon->match(type, cfn)) + return dcon; + if (dcon->value_fn == NULL) { + // (cmpxchg not because this is multi-threaded but because I'm paranoid) + if (Atomic::cmpxchg_ptr(CAST_FROM_FN_PTR(void*, cfn), &dcon->value_fn, NULL) == NULL) { + dcon->type = type; + return dcon; + } + } + } + // If this assert is hit (in pre-integration testing!) then re-evaluate + // the comment on the definition of DC_LIMIT. + guarantee(false, "too many delayed constants"); + return NULL; +} + +void DelayedConstant::update_all() { + for (int i = 0; i < DC_LIMIT; i++) { + DelayedConstant* dcon = &delayed_constants[i]; + if (dcon->value_fn != NULL && dcon->value == 0) { + typedef int (*int_fn_t)(); + typedef address (*address_fn_t)(); + switch (dcon->type) { + case T_INT: dcon->value = (intptr_t) ((int_fn_t) dcon->value_fn)(); break; + case T_ADDRESS: dcon->value = (intptr_t) ((address_fn_t)dcon->value_fn)(); break; + } + } + } +} + +intptr_t* AbstractAssembler::delayed_value_addr(int(*value_fn)()) { + DelayedConstant* dcon = DelayedConstant::add(T_INT, (DelayedConstant::value_fn_t) value_fn); + return &dcon->value; +} +intptr_t* AbstractAssembler::delayed_value_addr(address(*value_fn)()) { + DelayedConstant* dcon = DelayedConstant::add(T_ADDRESS, (DelayedConstant::value_fn_t) value_fn); + return &dcon->value; +} +void AbstractAssembler::update_delayed_values() { + DelayedConstant::update_all(); +} + + + void AbstractAssembler::block_comment(const char* comment) { if (sect() == CodeBuffer::SECT_INSTS) { diff --git a/hotspot/src/share/vm/asm/assembler.hpp b/hotspot/src/share/vm/asm/assembler.hpp index b8a29ceadca..13a4c6dfad6 100644 --- a/hotspot/src/share/vm/asm/assembler.hpp +++ b/hotspot/src/share/vm/asm/assembler.hpp @@ -140,6 +140,28 @@ class Label VALUE_OBJ_CLASS_SPEC { } }; +// A union type for code which has to assemble both constant and +// non-constant operands, when the distinction cannot be made +// statically. +class RegisterConstant VALUE_OBJ_CLASS_SPEC { + private: + Register _r; + intptr_t _c; + + public: + RegisterConstant(): _r(noreg), _c(0) {} + RegisterConstant(Register r): _r(r), _c(0) {} + RegisterConstant(intptr_t c): _r(noreg), _c(c) {} + + Register as_register() const { assert(is_register(),""); return _r; } + intptr_t as_constant() const { assert(is_constant(),""); return _c; } + + Register register_or_noreg() const { return _r; } + intptr_t constant_or_zero() const { return _c; } + + bool is_register() const { return _r != noreg; } + bool is_constant() const { return _r == noreg; } +}; // The Abstract Assembler: Pure assembler doing NO optimizations on the // instruction level; i.e., what you write is what you get. @@ -280,6 +302,26 @@ class AbstractAssembler : public ResourceObj { inline address address_constant(Label& L); inline address address_table_constant(GrowableArray label); + // Bootstrapping aid to cope with delayed determination of constants. + // Returns a static address which will eventually contain the constant. + // The value zero (NULL) stands instead of a constant which is still uncomputed. + // Thus, the eventual value of the constant must not be zero. + // This is fine, since this is designed for embedding object field + // offsets in code which must be generated before the object class is loaded. + // Field offsets are never zero, since an object's header (mark word) + // is located at offset zero. + RegisterConstant delayed_value(int(*value_fn)(), Register tmp, int offset = 0) { + return delayed_value(delayed_value_addr(value_fn), tmp, offset); + } + RegisterConstant delayed_value(address(*value_fn)(), Register tmp, int offset = 0) { + return delayed_value(delayed_value_addr(value_fn), tmp, offset); + } + virtual RegisterConstant delayed_value(intptr_t* delayed_value_addr, Register tmp, int offset) = 0; + // Last overloading is platform-dependent; look in assembler_.cpp. + static intptr_t* delayed_value_addr(int(*constant_fn)()); + static intptr_t* delayed_value_addr(address(*constant_fn)()); + static void update_delayed_values(); + // Bang stack to trigger StackOverflowError at a safe location // implementation delegates to machine-specific bang_stack_with_offset void generate_stack_overflow_check( int frame_size_in_bytes ); From d033b16582b431ff568424feec7f7571cc619c3d Mon Sep 17 00:00:00 2001 From: Andrew Brygin Date: Thu, 5 Mar 2009 19:36:51 +0300 Subject: [PATCH 085/292] 6804998: JRE GIF Decoding Heap Corruption [V-y6g5jlm8e1] Reviewed-by: prr --- .../share/classes/sun/awt/image/GifImageDecoder.java | 11 +++++++++-- jdk/src/share/native/sun/awt/image/gif/gifdecoder.c | 5 +++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/jdk/src/share/classes/sun/awt/image/GifImageDecoder.java b/jdk/src/share/classes/sun/awt/image/GifImageDecoder.java index aa87fb82ef7..b0679afc437 100644 --- a/jdk/src/share/classes/sun/awt/image/GifImageDecoder.java +++ b/jdk/src/share/classes/sun/awt/image/GifImageDecoder.java @@ -585,9 +585,16 @@ public class GifImageDecoder extends ImageDecoder { System.out.print("Reading a " + width + " by " + height + " " + (interlace ? "" : "non-") + "interlaced image..."); } - + int initCodeSize = ExtractByte(block, 9); + if (initCodeSize >= 12) { + if (verbose) { + System.out.println("Invalid initial code size: " + + initCodeSize); + } + return false; + } boolean ret = parseImage(x, y, width, height, - interlace, ExtractByte(block, 9), + interlace, initCodeSize, block, rasline, model); if (!ret) { diff --git a/jdk/src/share/native/sun/awt/image/gif/gifdecoder.c b/jdk/src/share/native/sun/awt/image/gif/gifdecoder.c index 1429931f8c6..893007f1366 100644 --- a/jdk/src/share/native/sun/awt/image/gif/gifdecoder.c +++ b/jdk/src/share/native/sun/awt/image/gif/gifdecoder.c @@ -191,6 +191,11 @@ Java_sun_awt_image_GifImageDecoder_parseImage(JNIEnv *env, int passht = passinc; int len; + /* We have verified the initial code size on the java layer. + * Here we just check bounds for particular indexes. */ + if (freeCode >= 4096 || maxCode >= 4096) { + return 0; + } if (blockh == 0 || raslineh == 0 || prefixh == 0 || suffixh == 0 || outCodeh == 0) From 7b461338a04b0aca9bb6e69b311ff11c5fdce312 Mon Sep 17 00:00:00 2001 From: Maurizio Cimadamore Date: Thu, 5 Mar 2009 17:24:08 +0000 Subject: [PATCH 086/292] 6467183: javac fails to raise unchecked warning on cast of parameterized generic subclass Cleanup code for generating unchecked cast warnings Reviewed-by: jjg --- .../com/sun/tools/javac/code/Types.java | 12 +++-- .../tools/javac/cast/6467183/T6467183a.java | 53 +++++++++++++++++++ .../tools/javac/cast/6467183/T6467183a.out | 6 +++ .../tools/javac/cast/6467183/T6467183b.java | 40 ++++++++++++++ 4 files changed, 106 insertions(+), 5 deletions(-) create mode 100644 langtools/test/tools/javac/cast/6467183/T6467183a.java create mode 100644 langtools/test/tools/javac/cast/6467183/T6467183a.out create mode 100644 langtools/test/tools/javac/cast/6467183/T6467183b.java diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Types.java b/langtools/src/share/classes/com/sun/tools/javac/code/Types.java index cc9c8100069..ca0b186ed38 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Types.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Types.java @@ -1010,8 +1010,8 @@ public class Types { && !disjointTypes(aHigh.allparams(), lowSub.allparams()) && !disjointTypes(aLow.allparams(), highSub.allparams()) && !disjointTypes(aLow.allparams(), lowSub.allparams())) { - if (upcast ? giveWarning(a, highSub) || giveWarning(a, lowSub) - : giveWarning(highSub, a) || giveWarning(lowSub, a)) + if (upcast ? giveWarning(a, b) : + giveWarning(b, a)) warnStack.head.warnUnchecked(); return true; } @@ -3224,9 +3224,11 @@ public class Types { } private boolean giveWarning(Type from, Type to) { - // To and from are (possibly different) parameterizations - // of the same class or interface - return to.isParameterized() && !containsType(to.allparams(), from.allparams()); + Type subFrom = asSub(from, to.tsym); + return to.isParameterized() && + (!(isUnbounded(to) || + isSubtype(from, to) || + ((subFrom != null) && isSameType(subFrom, to)))); } private List superClosure(Type t, Type s) { diff --git a/langtools/test/tools/javac/cast/6467183/T6467183a.java b/langtools/test/tools/javac/cast/6467183/T6467183a.java new file mode 100644 index 00000000000..04bc4634ce5 --- /dev/null +++ b/langtools/test/tools/javac/cast/6467183/T6467183a.java @@ -0,0 +1,53 @@ +/* + * Copyright 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 + * @author mcimadamore + * @bug 6467183 + * @summary + * @compile/fail/ref=T6467183a.out -Xlint:unchecked -Werror -XDrawDiagnostics T6467183a.java + */ + +class T6467183a { + + class A {} + class B extends A {} + class C extends A {} + + void cast1(B b) { + Object o = (A)b; + } + + void cast2(B b) { + Object o = (A)b; + } + + void cast3(A a) { + Object o = (C)a; + } + + void cast4(A a) { + Object o = (C)a; + } +} diff --git a/langtools/test/tools/javac/cast/6467183/T6467183a.out b/langtools/test/tools/javac/cast/6467183/T6467183a.out new file mode 100644 index 00000000000..5df842cc72a --- /dev/null +++ b/langtools/test/tools/javac/cast/6467183/T6467183a.out @@ -0,0 +1,6 @@ +T6467183a.java:39:26: compiler.warn.prob.found.req: (compiler.misc.unchecked.cast.to.type), T6467183a.B, T6467183a.A +T6467183a.java:47:41: compiler.warn.prob.found.req: (compiler.misc.unchecked.cast.to.type), T6467183a.A, T6467183a.C +T6467183a.java:51:42: compiler.warn.prob.found.req: (compiler.misc.unchecked.cast.to.type), T6467183a.A, T6467183a.C +- compiler.err.warnings.and.werror +1 error +3 warnings diff --git a/langtools/test/tools/javac/cast/6467183/T6467183b.java b/langtools/test/tools/javac/cast/6467183/T6467183b.java new file mode 100644 index 00000000000..4a90fb2643e --- /dev/null +++ b/langtools/test/tools/javac/cast/6467183/T6467183b.java @@ -0,0 +1,40 @@ +/* + * Copyright 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 + * @author mcimadamore + * @bug 6467183 + * @summary + * @compile/fail -Xlint:unchecked -Werror -XDrawDiagnostics T6467183b.java + */ + +class T6665356b { + + class A {} + class B extends A {} + + void cast(A a) { + Object o = (B)a; + } +} From 5ff31e060f7184794459422cc7c9f38a6875951b Mon Sep 17 00:00:00 2001 From: Maurizio Cimadamore Date: Thu, 5 Mar 2009 17:24:40 +0000 Subject: [PATCH 087/292] 6804733: javac generates spourious diagnostics for ill-formed type-variable bounds Fixed algorithm for checking cycles in typevar declarations Reviewed-by: jjg --- .../com/sun/tools/javac/comp/Check.java | 6 ++-- .../generics/typevars/6804733/T6804733.java | 35 +++++++++++++++++++ .../generics/typevars/6804733/T6804733.out | 2 ++ 3 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 langtools/test/tools/javac/generics/typevars/6804733/T6804733.java create mode 100644 langtools/test/tools/javac/generics/typevars/6804733/T6804733.out diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java index 911b9d7d46e..38e38d23292 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java @@ -1545,10 +1545,10 @@ public class Check { void checkNonCyclic(DiagnosticPosition pos, TypeVar t) { - checkNonCyclic1(pos, t, new HashSet()); + checkNonCyclic1(pos, t, List.nil()); } - private void checkNonCyclic1(DiagnosticPosition pos, Type t, Set seen) { + private void checkNonCyclic1(DiagnosticPosition pos, Type t, List seen) { final TypeVar tv; if (t.tag == TYPEVAR && (t.tsym.flags() & UNATTRIBUTED) != 0) return; @@ -1558,7 +1558,7 @@ public class Check { log.error(pos, "cyclic.inheritance", t); } else if (t.tag == TYPEVAR) { tv = (TypeVar)t; - seen.add(tv); + seen = seen.prepend(tv); for (Type b : types.getBounds(tv)) checkNonCyclic1(pos, b, seen); } diff --git a/langtools/test/tools/javac/generics/typevars/6804733/T6804733.java b/langtools/test/tools/javac/generics/typevars/6804733/T6804733.java new file mode 100644 index 00000000000..1e78e5ee2d0 --- /dev/null +++ b/langtools/test/tools/javac/generics/typevars/6804733/T6804733.java @@ -0,0 +1,35 @@ +/* + * Copyright 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 6804733 + * @summary javac generates spourious diagnostics for ill-formed type-variable bounds + * @author mcimadamore + * @compile/fail/ref=T6804733.out -XDrawDiagnostics T6804733.java + */ + +import java.util.ArrayList; +class T6804733 extends ArrayList { + void m() {} +} diff --git a/langtools/test/tools/javac/generics/typevars/6804733/T6804733.out b/langtools/test/tools/javac/generics/typevars/6804733/T6804733.out new file mode 100644 index 00000000000..c40724a71ea --- /dev/null +++ b/langtools/test/tools/javac/generics/typevars/6804733/T6804733.out @@ -0,0 +1,2 @@ +T6804733.java:34:20: compiler.err.type.var.may.not.be.followed.by.other.bounds +1 error From 938af6ca9fc9d4893b85e9c7a1f26da531ed1264 Mon Sep 17 00:00:00 2001 From: Maurizio Cimadamore Date: Thu, 5 Mar 2009 17:25:13 +0000 Subject: [PATCH 088/292] 6807255: LineNumberTable wrong if enhanced-for-loops are used End position of iterable for-each loop was not set properly Reviewed-by: jjg --- langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java | 1 + 1 file changed, 1 insertion(+) diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java index b2f4981be6a..3f513209caf 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java @@ -3012,6 +3012,7 @@ public class Lower extends TreeTranslator { vardefinit).setType(tree.var.type); indexDef.sym = tree.var.sym; JCBlock body = make.Block(0, List.of(indexDef, tree.body)); + body.endpos = TreeInfo.endPos(tree.body); result = translate(make. ForLoop(List.of(init), cond, From a46fd793cc6767229e7e1da20de5ee78b0274a5f Mon Sep 17 00:00:00 2001 From: Maurizio Cimadamore Date: Thu, 5 Mar 2009 17:25:37 +0000 Subject: [PATCH 089/292] 6799605: Basic/Raw formatters should use type/symbol printer instead of toString() Create new combo type/symbol visitor printer used by all diagnostic formatters Reviewed-by: jjg --- .../com/sun/tools/javac/code/Printer.java | 324 ++++++++++++++++++ .../com/sun/tools/javac/code/Types.java | 220 +----------- .../tools/javac/resources/compiler.properties | 3 + .../util/AbstractDiagnosticFormatter.java | 83 ++++- .../javac/util/BasicDiagnosticFormatter.java | 2 +- .../javac/util/RawDiagnosticFormatter.java | 25 +- .../javac/Diagnostics/6799605/T6799605.java | 43 +++ .../javac/Diagnostics/6799605/T6799605.out | 4 + .../tools/javac/NestedInnerClassNames.out | 8 +- langtools/test/tools/javac/T6241723.out | 4 +- .../depDocComment/SuppressDeprecation.out | 2 +- .../mandatoryWarnings/deprecated/Test3.out | 4 +- .../mandatoryWarnings/deprecated/Test3b.out | 2 +- .../mandatoryWarnings/deprecated/Test4.out | 12 +- .../mandatoryWarnings/deprecated/Test4b.out | 2 +- .../mandatoryWarnings/deprecated/Test4c.out | 4 +- .../mandatoryWarnings/deprecated/Test4d.out | 6 +- .../test/tools/javac/positions/T6253161.out | 2 +- .../test/tools/javac/positions/T6253161a.out | 2 +- .../javac/warnings/Deprecation.lintAll.out | 4 +- .../warnings/Deprecation.lintDeprecation.out | 4 +- 21 files changed, 507 insertions(+), 253 deletions(-) create mode 100644 langtools/src/share/classes/com/sun/tools/javac/code/Printer.java create mode 100644 langtools/test/tools/javac/Diagnostics/6799605/T6799605.java create mode 100644 langtools/test/tools/javac/Diagnostics/6799605/T6799605.out diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Printer.java b/langtools/src/share/classes/com/sun/tools/javac/code/Printer.java new file mode 100644 index 00000000000..27e7823fe1b --- /dev/null +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Printer.java @@ -0,0 +1,324 @@ +/* + * Copyright 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. 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. + */ + +package com.sun.tools.javac.code; + +import java.util.Locale; + +import com.sun.tools.javac.api.Messages; +import com.sun.tools.javac.code.Type.*; +import com.sun.tools.javac.code.Symbol.*; +import com.sun.tools.javac.util.List; +import com.sun.tools.javac.util.ListBuffer; + +import static com.sun.tools.javac.code.TypeTags.*; +import static com.sun.tools.javac.code.BoundKind.*; +import static com.sun.tools.javac.code.Flags.*; + +/** + * A combined type/symbol visitor for generating non-trivial localized string + * representation of types and symbols. + */ +public abstract class Printer implements Type.Visitor, Symbol.Visitor { + + /** + * This method should be overriden in order to provide proper i18n support. + * + * @param locale the locale in which the string is to be rendered + * @param key the key corresponding to the message to be displayed + * @param args a list of optional arguments + * @return localized string representation + */ + protected abstract String localize(Locale locale, String key, Object... args); + + /** + * Create a printer with default i18n support provided my Messages. + * @param messages Messages class to be used for i18n + * @return printer visitor instance + */ + public static Printer createStandardPrinter(final Messages messages) { + return new Printer() { + @Override + protected String localize(Locale locale, String key, Object... args) { + return messages.getLocalizedString(locale, key, args); + }}; + } + + /** + * Get a localized string representation for all the types in the input list. + * + * @param ts types to be displayed + * @param locale the locale in which the string is to be rendered + * @return localized string representation + */ + public String visitTypes(List ts, Locale locale) { + ListBuffer sbuf = ListBuffer.lb(); + for (Type t : ts) { + sbuf.append(visit(t, locale)); + } + return sbuf.toList().toString(); + } + + /** + * * Get a localized string represenation for all the symbols in the input list. + * + * @param ts symbols to be displayed + * @param locale the locale in which the string is to be rendered + * @return localized string representation + */ + public String visitSymbols(List ts, Locale locale) { + ListBuffer sbuf = ListBuffer.lb(); + for (Symbol t : ts) { + sbuf.append(visit(t, locale)); + } + return sbuf.toList().toString(); + } + + /** + * Get a localized string represenation for a given type. + * + * @param ts type to be displayed + * @param locale the locale in which the string is to be rendered + * @return localized string representation + */ + public String visit(Type t, Locale locale) { + return t.accept(this, locale); + } + + /** + * Get a localized string represenation for a given symbol. + * + * @param ts symbol to be displayed + * @param locale the locale in which the string is to be rendered + * @return localized string representation + */ + public String visit(Symbol s, Locale locale) { + return s.accept(this, locale); + } + + @Override + public String visitCapturedType(CapturedType t, Locale locale) { + return localize(locale, "compiler.misc.type.captureof", + (t.hashCode() & 0xFFFFFFFFL) % Type.CapturedType.PRIME, + visit(t.wildcard, locale)); + } + + @Override + public String visitForAll(ForAll t, Locale locale) { + return "<" + visitTypes(t.tvars, locale) + ">" + visit(t.qtype, locale); + } + + @Override + public String visitUndetVar(UndetVar t, Locale locale) { + if (t.inst != null) { + return visit(t.inst, locale); + } else { + return visit(t.qtype, locale) + "?"; + } + } + + @Override + public String visitArrayType(ArrayType t, Locale locale) { + return visit(t.elemtype, locale) + "[]"; + } + + @Override + public String visitClassType(ClassType t, Locale locale) { + StringBuffer buf = new StringBuffer(); + if (t.getEnclosingType().tag == CLASS && t.tsym.owner.kind == Kinds.TYP) { + buf.append(visit(t.getEnclosingType(), locale)); + buf.append("."); + buf.append(className(t, false, locale)); + } else { + buf.append(className(t, true, locale)); + } + if (t.getTypeArguments().nonEmpty()) { + buf.append('<'); + buf.append(visitTypes(t.getTypeArguments(), locale)); + buf.append(">"); + } + return buf.toString(); + } + + @Override + public String visitMethodType(MethodType t, Locale locale) { + return "(" + printMethodArgs(t.argtypes, false, locale) + ")" + visit(t.restype, locale); + } + + @Override + public String visitPackageType(PackageType t, Locale locale) { + return t.tsym.getQualifiedName().toString(); + } + + @Override + public String visitWildcardType(WildcardType t, Locale locale) { + StringBuffer s = new StringBuffer(); + s.append(t.kind); + if (t.kind != UNBOUND) { + s.append(visit(t.type, locale)); + } + return s.toString(); + } + + @Override + public String visitErrorType(ErrorType t, Locale locale) { + return visitType(t, locale); + } + + @Override + public String visitTypeVar(TypeVar t, Locale locale) { + return visitType(t, locale); + } + + public String visitType(Type t, Locale locale) { + String s = (t.tsym == null || t.tsym.name == null) + ? localize(locale, "compiler.misc.type.none") + : t.tsym.name.toString(); + return s; + } + + /** + * Converts a class name into a (possibly localized) string. Anonymous + * inner classes gets converted into a localized string. + * + * @param t the type of the class whose name is to be rendered + * @param longform if set, the class' fullname is displayed - if unset the + * short name is chosen (w/o package) + * @param locale the locale in which the string is to be rendered + * @return localized string representation + */ + protected String className(ClassType t, boolean longform, Locale locale) { + Symbol sym = t.tsym; + if (sym.name.length() == 0 && (sym.flags() & COMPOUND) != 0) { + StringBuffer s = new StringBuffer(visit(t.supertype_field, locale)); + for (List is = t.interfaces_field; is.nonEmpty(); is = is.tail) { + s.append("&"); + s.append(visit(is.head, locale)); + } + return s.toString(); + } else if (sym.name.length() == 0) { + String s; + ClassType norm = (ClassType) t.tsym.type; + if (norm == null) { + s = localize(locale, "compiler.misc.anonymous.class", (Object) null); + } else if (norm.interfaces_field.nonEmpty()) { + s = localize(locale, "compiler.misc.anonymous.class", + visit(norm.interfaces_field.head, locale)); + } else { + s = localize(locale, "compiler.misc.anonymous.class", + visit(norm.supertype_field, locale)); + } + return s; + } else if (longform) { + return sym.getQualifiedName().toString(); + } else { + return sym.name.toString(); + } + } + + /** + * Converts a set of method argument types into their corresponding + * localized string representation. + * + * @param args arguments to be rendered + * @param varArgs if true, the last method argument is regarded as a vararg + * @param locale the locale in which the string is to be rendered + * @return localized string representation + */ + protected String printMethodArgs(List args, boolean varArgs, Locale locale) { + if (!varArgs) { + return visitTypes(args, locale); + } else { + StringBuffer buf = new StringBuffer(); + while (args.tail.nonEmpty()) { + buf.append(visit(args.head, locale)); + args = args.tail; + buf.append(','); + } + if (args.head.tag == ARRAY) { + buf.append(visit(((ArrayType) args.head).elemtype, locale)); + buf.append("..."); + } else { + buf.append(visit(args.head, locale)); + } + return buf.toString(); + } + } + + @Override + public String visitClassSymbol(ClassSymbol sym, Locale locale) { + return sym.name.isEmpty() + ? localize(locale, "compiler.misc.anonymous.class", sym.flatname) + : sym.fullname.toString(); + } + + @Override + public String visitMethodSymbol(MethodSymbol s, Locale locale) { + if ((s.flags() & BLOCK) != 0) { + return s.owner.name.toString(); + } else { + String ms = (s.name == s.name.table.names.init) + ? s.owner.name.toString() + : s.name.toString(); + if (s.type != null) { + if (s.type.tag == FORALL) { + ms = "<" + visitTypes(s.type.getTypeArguments(), locale) + ">" + ms; + } + ms += "(" + printMethodArgs( + s.type.getParameterTypes(), + (s.flags() & VARARGS) != 0, + locale) + ")"; + } + return ms; + } + } + + @Override + public String visitOperatorSymbol(OperatorSymbol s, Locale locale) { + return visitMethodSymbol(s, locale); + } + + @Override + public String visitPackageSymbol(PackageSymbol s, Locale locale) { + return s.isUnnamed() + ? localize(locale, "compiler.misc.unnamed.package") + : s.fullname.toString(); + } + + @Override + public String visitTypeSymbol(TypeSymbol s, Locale locale) { + return visitSymbol(s, locale); + } + + @Override + public String visitVarSymbol(VarSymbol s, Locale locale) { + return visitSymbol(s, locale); + } + + @Override + public String visitSymbol(Symbol s, Locale locale) { + return s.name.toString(); + } +} diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Types.java b/langtools/src/share/classes/com/sun/tools/javac/code/Types.java index ca0b186ed38..b8ae943c7dd 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Types.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Types.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-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 @@ -27,6 +27,8 @@ package com.sun.tools.javac.code; import java.util.*; +import com.sun.tools.javac.api.Messages; + import com.sun.tools.javac.util.*; import com.sun.tools.javac.util.List; @@ -2019,7 +2021,7 @@ public class Types { return t; else return visit(t); - } + } List subst(List ts) { if (from.tail == null) @@ -2279,225 +2281,21 @@ public class Types { } // - // /** - * Visitor for generating a string representation of a given type + * Helper method for generating a string representation of a given type * accordingly to a given locale */ public String toString(Type t, Locale locale) { - return typePrinter.visit(t, locale); + return Printer.createStandardPrinter(messages).visit(t, locale); } - // where - private TypePrinter typePrinter = new TypePrinter(); - public class TypePrinter extends DefaultTypeVisitor { - - public String visit(List ts, Locale locale) { - ListBuffer sbuf = lb(); - for (Type t : ts) { - sbuf.append(visit(t, locale)); - } - return sbuf.toList().toString(); - } - - @Override - public String visitCapturedType(CapturedType t, Locale locale) { - return messages.getLocalizedString("compiler.misc.type.captureof", - (t.hashCode() & 0xFFFFFFFFL) % Type.CapturedType.PRIME, - visit(t.wildcard, locale)); - } - - @Override - public String visitForAll(ForAll t, Locale locale) { - return "<" + visit(t.tvars, locale) + ">" + visit(t.qtype, locale); - } - - @Override - public String visitUndetVar(UndetVar t, Locale locale) { - if (t.inst != null) { - return visit(t.inst, locale); - } else { - return visit(t.qtype, locale) + "?"; - } - } - - @Override - public String visitArrayType(ArrayType t, Locale locale) { - return visit(t.elemtype, locale) + "[]"; - } - - @Override - public String visitClassType(ClassType t, Locale locale) { - StringBuffer buf = new StringBuffer(); - if (t.getEnclosingType().tag == CLASS && t.tsym.owner.kind == Kinds.TYP) { - buf.append(visit(t.getEnclosingType(), locale)); - buf.append("."); - buf.append(className(t, false, locale)); - } else { - buf.append(className(t, true, locale)); - } - if (t.getTypeArguments().nonEmpty()) { - buf.append('<'); - buf.append(visit(t.getTypeArguments(), locale)); - buf.append(">"); - } - return buf.toString(); - } - - @Override - public String visitMethodType(MethodType t, Locale locale) { - return "(" + printMethodArgs(t.argtypes, false, locale) + ")" + visit(t.restype, locale); - } - - @Override - public String visitPackageType(PackageType t, Locale locale) { - return t.tsym.getQualifiedName().toString(); - } - - @Override - public String visitWildcardType(WildcardType t, Locale locale) { - StringBuffer s = new StringBuffer(); - s.append(t.kind); - if (t.kind != UNBOUND) { - s.append(visit(t.type, locale)); - } - return s.toString(); - } - - - public String visitType(Type t, Locale locale) { - String s = (t.tsym == null || t.tsym.name == null) - ? messages.getLocalizedString("compiler.misc.type.none") - : t.tsym.name.toString(); - return s; - } - - protected String className(ClassType t, boolean longform, Locale locale) { - Symbol sym = t.tsym; - if (sym.name.length() == 0 && (sym.flags() & COMPOUND) != 0) { - StringBuffer s = new StringBuffer(visit(supertype(t), locale)); - for (List is = interfaces(t); is.nonEmpty(); is = is.tail) { - s.append("&"); - s.append(visit(is.head, locale)); - } - return s.toString(); - } else if (sym.name.length() == 0) { - String s; - ClassType norm = (ClassType) t.tsym.type; - if (norm == null) { - s = getLocalizedString(locale, "compiler.misc.anonymous.class", (Object) null); - } else if (interfaces(norm).nonEmpty()) { - s = getLocalizedString(locale, "compiler.misc.anonymous.class", - visit(interfaces(norm).head, locale)); - } else { - s = getLocalizedString(locale, "compiler.misc.anonymous.class", - visit(supertype(norm), locale)); - } - return s; - } else if (longform) { - return sym.getQualifiedName().toString(); - } else { - return sym.name.toString(); - } - } - - protected String printMethodArgs(List args, boolean varArgs, Locale locale) { - if (!varArgs) { - return visit(args, locale); - } else { - StringBuffer buf = new StringBuffer(); - while (args.tail.nonEmpty()) { - buf.append(visit(args.head, locale)); - args = args.tail; - buf.append(','); - } - if (args.head.tag == ARRAY) { - buf.append(visit(((ArrayType) args.head).elemtype, locale)); - buf.append("..."); - } else { - buf.append(visit(args.head, locale)); - } - return buf.toString(); - } - } - - protected String getLocalizedString(Locale locale, String key, Object... args) { - return messages.getLocalizedString(key, args); - } - }; - // - - // /** - * Visitor for generating a string representation of a given symbol + * Helper method for generating a string representation of a given type * accordingly to a given locale */ public String toString(Symbol t, Locale locale) { - return symbolPrinter.visit(t, locale); + return Printer.createStandardPrinter(messages).visit(t, locale); } - // where - private SymbolPrinter symbolPrinter = new SymbolPrinter(); - - public class SymbolPrinter extends DefaultSymbolVisitor { - - @Override - public String visitClassSymbol(ClassSymbol sym, Locale locale) { - return sym.name.isEmpty() - ? getLocalizedString(locale, "compiler.misc.anonymous.class", sym.flatname) - : sym.fullname.toString(); - } - - @Override - public String visitMethodSymbol(MethodSymbol s, Locale locale) { - if ((s.flags() & BLOCK) != 0) { - return s.owner.name.toString(); - } else { - String ms = (s.name == names.init) - ? s.owner.name.toString() - : s.name.toString(); - if (s.type != null) { - if (s.type.tag == FORALL) { - ms = "<" + typePrinter.visit(s.type.getTypeArguments(), locale) + ">" + ms; - } - ms += "(" + typePrinter.printMethodArgs( - s.type.getParameterTypes(), - (s.flags() & VARARGS) != 0, - locale) + ")"; - } - return ms; - } - } - - @Override - public String visitOperatorSymbol(OperatorSymbol s, Locale locale) { - return visitMethodSymbol(s, locale); - } - - @Override - public String visitPackageSymbol(PackageSymbol s, Locale locale) { - return s.name.isEmpty() - ? getLocalizedString(locale, "compiler.misc.unnamed.package") - : s.fullname.toString(); - } - - @Override - public String visitSymbol(Symbol s, Locale locale) { - return s.name.toString(); - } - - public String visit(List ts, Locale locale) { - ListBuffer sbuf = lb(); - for (Symbol t : ts) { - sbuf.append(visit(t, locale)); - } - return sbuf.toList().toString(); - } - - protected String getLocalizedString(Locale locale, String key, Object... args) { - return messages.getLocalizedString(key, args); - } - }; - // // /** @@ -3128,7 +2926,7 @@ public class Types { return t; } // where - private List freshTypeVariables(List types) { + public List freshTypeVariables(List types) { ListBuffer result = lb(); for (Type t : types) { if (t.tag == WILDCARD) { diff --git a/langtools/src/share/classes/com/sun/tools/javac/resources/compiler.properties b/langtools/src/share/classes/com/sun/tools/javac/resources/compiler.properties index d892db06077..ee483233fce 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/resources/compiler.properties +++ b/langtools/src/share/classes/com/sun/tools/javac/resources/compiler.properties @@ -836,6 +836,9 @@ compiler.misc.anonymous.class=\ compiler.misc.type.captureof=\ capture#{0} of {1} +compiler.misc.type.captureof.1=\ + capture#{0} + compiler.misc.type.none=\ diff --git a/langtools/src/share/classes/com/sun/tools/javac/util/AbstractDiagnosticFormatter.java b/langtools/src/share/classes/com/sun/tools/javac/util/AbstractDiagnosticFormatter.java index 179e284a22c..49459fc5f19 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/util/AbstractDiagnosticFormatter.java +++ b/langtools/src/share/classes/com/sun/tools/javac/util/AbstractDiagnosticFormatter.java @@ -1,5 +1,5 @@ /* - * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2008-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 @@ -38,6 +38,10 @@ import com.sun.tools.javac.api.DiagnosticFormatter.Configuration.DiagnosticPart; import com.sun.tools.javac.api.DiagnosticFormatter.Configuration.MultilineLimit; import com.sun.tools.javac.api.DiagnosticFormatter.PositionKind; import com.sun.tools.javac.api.Formattable; +import com.sun.tools.javac.code.Printer; +import com.sun.tools.javac.code.Symbol; +import com.sun.tools.javac.code.Type; +import com.sun.tools.javac.code.Type.CapturedType; import com.sun.tools.javac.file.JavacFileManager; import static com.sun.tools.javac.util.JCDiagnostic.DiagnosticType.*; @@ -60,9 +64,23 @@ public abstract class AbstractDiagnosticFormatter implements DiagnosticFormatter * JavacMessages object used by this formatter for i18n. */ protected JavacMessages messages; + + /** + * Configuration object used by this formatter + */ private SimpleConfiguration config; + + /** + * Current depth level of the disgnostic being formatted + * (!= 0 for subdiagnostics) + */ protected int depth = 0; + /** + * Printer instance to be used for formatting types/symbol + */ + protected Printer printer; + /** * Initialize an AbstractDiagnosticFormatter by setting its JavacMessages object. * @param messages @@ -70,6 +88,7 @@ public abstract class AbstractDiagnosticFormatter implements DiagnosticFormatter protected AbstractDiagnosticFormatter(JavacMessages messages, SimpleConfiguration config) { this.messages = messages; this.config = config; + this.printer = new FormatterPrinter(); } public String formatKind(JCDiagnostic d, Locale l) { @@ -83,6 +102,14 @@ public abstract class AbstractDiagnosticFormatter implements DiagnosticFormatter } } + @Override + public String format(JCDiagnostic d, Locale locale) { + printer = new FormatterPrinter(); + return formatDiagnostic(d, locale); + } + + abstract String formatDiagnostic(JCDiagnostic d, Locale locale); + public String formatPosition(JCDiagnostic d, PositionKind pk,Locale l) { assert (d.getPosition() != Position.NOPOS); return String.valueOf(getPosition(d, pk)); @@ -143,12 +170,21 @@ public abstract class AbstractDiagnosticFormatter implements DiagnosticFormatter else if (arg instanceof Iterable) { return formatIterable(d, (Iterable)arg, l); } - else if (arg instanceof JavaFileObject) + else if (arg instanceof Type) { + return printer.visit((Type)arg, l); + } + else if (arg instanceof Symbol) { + return printer.visit((Symbol)arg, l); + } + else if (arg instanceof JavaFileObject) { return JavacFileManager.getJavacBaseFileName((JavaFileObject)arg); - else if (arg instanceof Formattable) + } + else if (arg instanceof Formattable) { return ((Formattable)arg).toString(l, messages); - else + } + else { return String.valueOf(arg); + } } /** @@ -404,4 +440,43 @@ public abstract class AbstractDiagnosticFormatter implements DiagnosticFormatter return caretEnabled; } } + + /** + * An enhanced printer for formatting types/symbols used by + * AbstractDiagnosticFormatter. Provides alternate numbering of captured + * types (they are numbered starting from 1 on each new diagnostic, instead + * of relying on the underlying hashcode() method which generates unstable + * output). Also detects cycles in wildcard messages (e.g. if the wildcard + * type referred by a given captured type C contains C itself) which might + * lead to infinite loops. + */ + protected class FormatterPrinter extends Printer { + + List allCaptured = List.nil(); + List seenCaptured = List.nil(); + + @Override + protected String localize(Locale locale, String key, Object... args) { + return AbstractDiagnosticFormatter.this.localize(locale, key, args); + } + + @Override + public String visitCapturedType(CapturedType t, Locale locale) { + if (seenCaptured.contains(t)) + return localize(locale, "compiler.misc.type.captureof.1", + allCaptured.indexOf(t) + 1); + else { + try { + seenCaptured = seenCaptured.prepend(t); + allCaptured = allCaptured.append(t); + return localize(locale, "compiler.misc.type.captureof", + allCaptured.indexOf(t) + 1, + visit(t.wildcard, locale)); + } + finally { + seenCaptured = seenCaptured.tail; + } + } + } + } } diff --git a/langtools/src/share/classes/com/sun/tools/javac/util/BasicDiagnosticFormatter.java b/langtools/src/share/classes/com/sun/tools/javac/util/BasicDiagnosticFormatter.java index e3cc45c06e4..e72f39e9d05 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/util/BasicDiagnosticFormatter.java +++ b/langtools/src/share/classes/com/sun/tools/javac/util/BasicDiagnosticFormatter.java @@ -82,7 +82,7 @@ public class BasicDiagnosticFormatter extends AbstractDiagnosticFormatter { super(msgs, new BasicConfiguration()); } - public String format(JCDiagnostic d, Locale l) { + public String formatDiagnostic(JCDiagnostic d, Locale l) { if (l == null) l = messages.getCurrentLocale(); String format = selectFormat(d); diff --git a/langtools/src/share/classes/com/sun/tools/javac/util/RawDiagnosticFormatter.java b/langtools/src/share/classes/com/sun/tools/javac/util/RawDiagnosticFormatter.java index db05a732dfe..e9b2bbcdfa0 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/util/RawDiagnosticFormatter.java +++ b/langtools/src/share/classes/com/sun/tools/javac/util/RawDiagnosticFormatter.java @@ -54,7 +54,7 @@ public final class RawDiagnosticFormatter extends AbstractDiagnosticFormatter { } //provide common default formats - public String format(JCDiagnostic d, Locale l) { + public String formatDiagnostic(JCDiagnostic d, Locale l) { try { StringBuffer buf = new StringBuffer(); if (d.getPosition() != Position.NOPOS) { @@ -82,17 +82,11 @@ public final class RawDiagnosticFormatter extends AbstractDiagnosticFormatter { public String formatMessage(JCDiagnostic d, Locale l) { StringBuilder buf = new StringBuilder(); Collection args = formatArguments(d, l); - buf.append(d.getCode()); - String sep = ": "; - for (Object o : args) { - buf.append(sep); - buf.append(o); - sep = ", "; - } + buf.append(localize(null, d.getCode(), args.toArray())); if (d.isMultiline() && getConfiguration().getVisible().contains(DiagnosticPart.SUBDIAGNOSTICS)) { List subDiags = formatSubdiagnostics(d, null); if (subDiags.nonEmpty()) { - sep = ""; + String sep = ""; buf.append(",{"); for (String sub : formatSubdiagnostics(d, null)) { buf.append(sep); @@ -117,4 +111,17 @@ public final class RawDiagnosticFormatter extends AbstractDiagnosticFormatter { else return s; } + + @Override + protected String localize(Locale l, String key, Object... args) { + StringBuilder buf = new StringBuilder(); + buf.append(key); + String sep = ": "; + for (Object o : args) { + buf.append(sep); + buf.append(o); + sep = ", "; + } + return buf.toString(); + } } diff --git a/langtools/test/tools/javac/Diagnostics/6799605/T6799605.java b/langtools/test/tools/javac/Diagnostics/6799605/T6799605.java new file mode 100644 index 00000000000..bcd7e842865 --- /dev/null +++ b/langtools/test/tools/javac/Diagnostics/6799605/T6799605.java @@ -0,0 +1,43 @@ +/* + * Copyright 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 6799605 + * @summary Basic/Raw formatters should use type/symbol printer instead of toString() + * @author mcimadamore + * @compile/fail/ref=T6799605.out -XDrawDiagnostics T6799605.java + */ + +class T6799605 { + + > void m(T6799605 x1) {} + void m(T6799605 x1, T6799605 x2) {} + void m(T6799605 x1, T6799605 x2, T6799605 x3) {} + + void test(T6799605 t) { + m(t); + m(t, t); + m(t, t, t); + } +} diff --git a/langtools/test/tools/javac/Diagnostics/6799605/T6799605.out b/langtools/test/tools/javac/Diagnostics/6799605/T6799605.out new file mode 100644 index 00000000000..9179e6a8d97 --- /dev/null +++ b/langtools/test/tools/javac/Diagnostics/6799605/T6799605.out @@ -0,0 +1,4 @@ +T6799605.java:39:9: compiler.err.cant.resolve.location.args: kindname.method, m, , T6799605, kindname.class, T6799605 +T6799605.java:40:9: compiler.err.cant.resolve.location.args: kindname.method, m, , T6799605,T6799605, kindname.class, T6799605 +T6799605.java:41:9: compiler.err.cant.resolve.location.args: kindname.method, m, , T6799605,T6799605,T6799605, kindname.class, T6799605 +3 errors diff --git a/langtools/test/tools/javac/NestedInnerClassNames.out b/langtools/test/tools/javac/NestedInnerClassNames.out index bee489e56ce..b4f171b834c 100644 --- a/langtools/test/tools/javac/NestedInnerClassNames.out +++ b/langtools/test/tools/javac/NestedInnerClassNames.out @@ -1,15 +1,15 @@ -NestedInnerClassNames.java:16:5: compiler.err.already.defined: NestedInnerClassNames, unnamed package +NestedInnerClassNames.java:16:5: compiler.err.already.defined: NestedInnerClassNames, compiler.misc.unnamed.package NestedInnerClassNames.java:23:9: compiler.err.already.defined: NestedInnerClassNames.foo, NestedInnerClassNames -NestedInnerClassNames.java:34:9: compiler.err.already.defined: NestedInnerClassNames, unnamed package +NestedInnerClassNames.java:34:9: compiler.err.already.defined: NestedInnerClassNames, compiler.misc.unnamed.package NestedInnerClassNames.java:45:9: compiler.err.already.defined: NestedInnerClassNames.baz, NestedInnerClassNames NestedInnerClassNames.java:46:13: compiler.err.already.defined: NestedInnerClassNames.baz.baz, NestedInnerClassNames.baz NestedInnerClassNames.java:59:9: compiler.err.already.defined: NestedInnerClassNames.foo$bar, NestedInnerClassNames NestedInnerClassNames.java:76:13: compiler.err.already.defined: NestedInnerClassNames.$bar, NestedInnerClassNames NestedInnerClassNames.java:90:13: compiler.err.already.defined: NestedInnerClassNames.bar$bar.bar, NestedInnerClassNames.bar$bar NestedInnerClassNames.java:109:5: compiler.err.duplicate.class: NestedInnerClassNames.foo.foo -NestedInnerClassNames.java:19:9: compiler.err.already.defined: NestedInnerClassNames, unnamed package +NestedInnerClassNames.java:19:9: compiler.err.already.defined: NestedInnerClassNames, compiler.misc.unnamed.package NestedInnerClassNames.java:28:13: compiler.err.already.defined: foo, m2() -NestedInnerClassNames.java:40:13: compiler.err.already.defined: NestedInnerClassNames, unnamed package +NestedInnerClassNames.java:40:13: compiler.err.already.defined: NestedInnerClassNames, compiler.misc.unnamed.package NestedInnerClassNames.java:52:13: compiler.err.already.defined: baz, m4() NestedInnerClassNames.java:53:17: compiler.err.already.defined: baz.baz, baz NestedInnerClassNames.java:67:13: compiler.err.already.defined: foo$bar, m5() diff --git a/langtools/test/tools/javac/T6241723.out b/langtools/test/tools/javac/T6241723.out index 2391e4394b8..086a0d18717 100644 --- a/langtools/test/tools/javac/T6241723.out +++ b/langtools/test/tools/javac/T6241723.out @@ -1,6 +1,6 @@ -T6241723.java:21:5: compiler.warn.has.been.deprecated: A1, unnamed package +T6241723.java:21:5: compiler.warn.has.been.deprecated: A1, compiler.misc.unnamed.package T6241723.java:23:7: compiler.warn.has.been.deprecated: A2.A21, A2 -T6241723.java:26:5: compiler.warn.has.been.deprecated: Z1, unnamed package +T6241723.java:26:5: compiler.warn.has.been.deprecated: Z1, compiler.misc.unnamed.package T6241723.java:28:7: compiler.warn.has.been.deprecated: Z2.Z21, Z2 - compiler.err.warnings.and.werror 1 error diff --git a/langtools/test/tools/javac/depDocComment/SuppressDeprecation.out b/langtools/test/tools/javac/depDocComment/SuppressDeprecation.out index af1f47062ca..eb0c0ff686b 100644 --- a/langtools/test/tools/javac/depDocComment/SuppressDeprecation.out +++ b/langtools/test/tools/javac/depDocComment/SuppressDeprecation.out @@ -1,4 +1,4 @@ -SuppressDeprecation.java:130:17: compiler.warn.has.been.deprecated: X, unnamed package +SuppressDeprecation.java:130:17: compiler.warn.has.been.deprecated: X, compiler.misc.unnamed.package SuppressDeprecation.java:82:10: compiler.warn.has.been.deprecated: g(), T SuppressDeprecation.java:83:14: compiler.warn.has.been.deprecated: g(), T SuppressDeprecation.java:84:9: compiler.warn.has.been.deprecated: var, T diff --git a/langtools/test/tools/javac/mandatoryWarnings/deprecated/Test3.out b/langtools/test/tools/javac/mandatoryWarnings/deprecated/Test3.out index e850113bd97..070f1fabd02 100644 --- a/langtools/test/tools/javac/mandatoryWarnings/deprecated/Test3.out +++ b/langtools/test/tools/javac/mandatoryWarnings/deprecated/Test3.out @@ -1,3 +1,3 @@ -A.java:10:9: compiler.warn.has.been.deprecated: A1, unnamed package -A.java:10:21: compiler.warn.has.been.deprecated: A1, unnamed package +A.java:10:9: compiler.warn.has.been.deprecated: A1, compiler.misc.unnamed.package +A.java:10:21: compiler.warn.has.been.deprecated: A1, compiler.misc.unnamed.package 2 warnings diff --git a/langtools/test/tools/javac/mandatoryWarnings/deprecated/Test3b.out b/langtools/test/tools/javac/mandatoryWarnings/deprecated/Test3b.out index a3f8ec73164..4098fdaa654 100644 --- a/langtools/test/tools/javac/mandatoryWarnings/deprecated/Test3b.out +++ b/langtools/test/tools/javac/mandatoryWarnings/deprecated/Test3b.out @@ -1,3 +1,3 @@ -A.java:10:9: compiler.warn.has.been.deprecated: A1, unnamed package +A.java:10:9: compiler.warn.has.been.deprecated: A1, compiler.misc.unnamed.package - compiler.note.deprecated.filename.additional: A.java 1 warning diff --git a/langtools/test/tools/javac/mandatoryWarnings/deprecated/Test4.out b/langtools/test/tools/javac/mandatoryWarnings/deprecated/Test4.out index cbfe3808a6d..bdb88774241 100644 --- a/langtools/test/tools/javac/mandatoryWarnings/deprecated/Test4.out +++ b/langtools/test/tools/javac/mandatoryWarnings/deprecated/Test4.out @@ -1,7 +1,7 @@ -A.java:10:9: compiler.warn.has.been.deprecated: A1, unnamed package -A.java:10:21: compiler.warn.has.been.deprecated: A1, unnamed package -B.java:11:9: compiler.warn.has.been.deprecated: B1, unnamed package -B.java:11:21: compiler.warn.has.been.deprecated: B1, unnamed package -B.java:12:9: compiler.warn.has.been.deprecated: B1, unnamed package -B.java:12:22: compiler.warn.has.been.deprecated: B1, unnamed package +A.java:10:9: compiler.warn.has.been.deprecated: A1, compiler.misc.unnamed.package +A.java:10:21: compiler.warn.has.been.deprecated: A1, compiler.misc.unnamed.package +B.java:11:9: compiler.warn.has.been.deprecated: B1, compiler.misc.unnamed.package +B.java:11:21: compiler.warn.has.been.deprecated: B1, compiler.misc.unnamed.package +B.java:12:9: compiler.warn.has.been.deprecated: B1, compiler.misc.unnamed.package +B.java:12:22: compiler.warn.has.been.deprecated: B1, compiler.misc.unnamed.package 6 warnings diff --git a/langtools/test/tools/javac/mandatoryWarnings/deprecated/Test4b.out b/langtools/test/tools/javac/mandatoryWarnings/deprecated/Test4b.out index 4a382e0a30d..146a84bfb1a 100644 --- a/langtools/test/tools/javac/mandatoryWarnings/deprecated/Test4b.out +++ b/langtools/test/tools/javac/mandatoryWarnings/deprecated/Test4b.out @@ -1,3 +1,3 @@ -A.java:10:9: compiler.warn.has.been.deprecated: A1, unnamed package +A.java:10:9: compiler.warn.has.been.deprecated: A1, compiler.misc.unnamed.package - compiler.note.deprecated.plural.additional 1 warning diff --git a/langtools/test/tools/javac/mandatoryWarnings/deprecated/Test4c.out b/langtools/test/tools/javac/mandatoryWarnings/deprecated/Test4c.out index dcf68d576b9..fdb55573a13 100644 --- a/langtools/test/tools/javac/mandatoryWarnings/deprecated/Test4c.out +++ b/langtools/test/tools/javac/mandatoryWarnings/deprecated/Test4c.out @@ -1,4 +1,4 @@ -A.java:10:9: compiler.warn.has.been.deprecated: A1, unnamed package -A.java:10:21: compiler.warn.has.been.deprecated: A1, unnamed package +A.java:10:9: compiler.warn.has.been.deprecated: A1, compiler.misc.unnamed.package +A.java:10:21: compiler.warn.has.been.deprecated: A1, compiler.misc.unnamed.package - compiler.note.deprecated.filename: B.java 2 warnings diff --git a/langtools/test/tools/javac/mandatoryWarnings/deprecated/Test4d.out b/langtools/test/tools/javac/mandatoryWarnings/deprecated/Test4d.out index bd34b7fc7b6..41a71090a1a 100644 --- a/langtools/test/tools/javac/mandatoryWarnings/deprecated/Test4d.out +++ b/langtools/test/tools/javac/mandatoryWarnings/deprecated/Test4d.out @@ -1,5 +1,5 @@ -A.java:10:9: compiler.warn.has.been.deprecated: A1, unnamed package -A.java:10:21: compiler.warn.has.been.deprecated: A1, unnamed package -B.java:11:9: compiler.warn.has.been.deprecated: B1, unnamed package +A.java:10:9: compiler.warn.has.been.deprecated: A1, compiler.misc.unnamed.package +A.java:10:21: compiler.warn.has.been.deprecated: A1, compiler.misc.unnamed.package +B.java:11:9: compiler.warn.has.been.deprecated: B1, compiler.misc.unnamed.package - compiler.note.deprecated.filename.additional: B.java 3 warnings diff --git a/langtools/test/tools/javac/positions/T6253161.out b/langtools/test/tools/javac/positions/T6253161.out index 0bf08100aa4..d5d2e5162e8 100644 --- a/langtools/test/tools/javac/positions/T6253161.out +++ b/langtools/test/tools/javac/positions/T6253161.out @@ -1,2 +1,2 @@ -T6253161.java:19:62: compiler.warn.missing.SVUID: +T6253161.java:19:62: compiler.warn.missing.SVUID: compiler.misc.anonymous.class: T6253161$1$1 1 warning diff --git a/langtools/test/tools/javac/positions/T6253161a.out b/langtools/test/tools/javac/positions/T6253161a.out index ac281acdab3..e5ba714cb51 100644 --- a/langtools/test/tools/javac/positions/T6253161a.out +++ b/langtools/test/tools/javac/positions/T6253161a.out @@ -1,2 +1,2 @@ -T6253161a.java:19:62: compiler.warn.missing.SVUID: +T6253161a.java:19:62: compiler.warn.missing.SVUID: compiler.misc.anonymous.class: T6253161a$1$1 1 warning diff --git a/langtools/test/tools/javac/warnings/Deprecation.lintAll.out b/langtools/test/tools/javac/warnings/Deprecation.lintAll.out index ea7148d1268..e778c0cba23 100644 --- a/langtools/test/tools/javac/warnings/Deprecation.lintAll.out +++ b/langtools/test/tools/javac/warnings/Deprecation.lintAll.out @@ -1,3 +1,3 @@ -Deprecation.java:18:24: compiler.warn.has.been.deprecated: Deprecation, unnamed package -Deprecation.java:55:24: compiler.warn.has.been.deprecated: Deprecation, unnamed package +Deprecation.java:18:24: compiler.warn.has.been.deprecated: Deprecation, compiler.misc.unnamed.package +Deprecation.java:55:24: compiler.warn.has.been.deprecated: Deprecation, compiler.misc.unnamed.package 2 warnings diff --git a/langtools/test/tools/javac/warnings/Deprecation.lintDeprecation.out b/langtools/test/tools/javac/warnings/Deprecation.lintDeprecation.out index ea7148d1268..e778c0cba23 100644 --- a/langtools/test/tools/javac/warnings/Deprecation.lintDeprecation.out +++ b/langtools/test/tools/javac/warnings/Deprecation.lintDeprecation.out @@ -1,3 +1,3 @@ -Deprecation.java:18:24: compiler.warn.has.been.deprecated: Deprecation, unnamed package -Deprecation.java:55:24: compiler.warn.has.been.deprecated: Deprecation, unnamed package +Deprecation.java:18:24: compiler.warn.has.been.deprecated: Deprecation, compiler.misc.unnamed.package +Deprecation.java:55:24: compiler.warn.has.been.deprecated: Deprecation, compiler.misc.unnamed.package 2 warnings From aef18fc5a7946a268fc278c22a23ab8b22c27d04 Mon Sep 17 00:00:00 2001 From: Xiomara Jayasena Date: Thu, 5 Mar 2009 09:48:58 -0800 Subject: [PATCH 090/292] Added tag jdk7-b50 for changeset c7a5f07b79b2 --- .hgtags-top-repo | 1 + 1 file changed, 1 insertion(+) diff --git a/.hgtags-top-repo b/.hgtags-top-repo index 241e1cd4090..aab99ef20c3 100644 --- a/.hgtags-top-repo +++ b/.hgtags-top-repo @@ -24,3 +24,4 @@ e8a2a4d187773a62f3309b0fa265c13425bc2258 jdk7-b46 d7744e86dedc21a8ecf6bdb73eb191b8eaf5b0da jdk7-b47 4ae9f4bfdb98f65bd957e3fe72471b320150b38e jdk7-b48 aee93a8992d2389121eb610c00a86196f3e2b9b0 jdk7-b49 +5111e13e44e542fe945b47ab154546daec36737d jdk7-b50 From d05dcd3c10c109bf6a9e56a83475c0affbbad62a Mon Sep 17 00:00:00 2001 From: Xiomara Jayasena Date: Thu, 5 Mar 2009 09:49:00 -0800 Subject: [PATCH 091/292] Added tag jdk7-b50 for changeset 4f3bb7d32ea0 --- corba/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/corba/.hgtags b/corba/.hgtags index 434fb013994..310a62c7fdd 100644 --- a/corba/.hgtags +++ b/corba/.hgtags @@ -24,3 +24,4 @@ ccd6a16502e0650d91d85c4b86be05cbcd461a87 jdk7-b42 167ad0164301f318b069a947e1c9c07ed667748a jdk7-b47 0be222241fd405e48915647facfaa176621b39b9 jdk7-b48 d70978bc64bc7a04be7797ab0dcd9b7b1b3a6bff jdk7-b49 +0edbd0074b02b42b2b83cc47cb391d4869b7a8ec jdk7-b50 From 4e52be63fe62182dceae7ce512c93e44c8da2cce Mon Sep 17 00:00:00 2001 From: Xiomara Jayasena Date: Thu, 5 Mar 2009 09:49:03 -0800 Subject: [PATCH 092/292] Added tag jdk7-b50 for changeset 90cbd9088155 --- hotspot/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/hotspot/.hgtags b/hotspot/.hgtags index c1cb5d2f77a..51166b95273 100644 --- a/hotspot/.hgtags +++ b/hotspot/.hgtags @@ -24,3 +24,4 @@ fc6a5ae3fef5ebacfa896dbb3ae37715e388e282 jdk7-b43 fcb923bad68e2b10380a030ea83a723f4dc3d4d6 jdk7-b47 bcb33806d186561c781992e5f4d8a90bb033f9f0 jdk7-b48 8b22ccb5aba2c6c11bddf6488a7bb7ef5b4bf2be jdk7-b49 +dae503d9f04c1a11e182dbf7f770509c28dc0609 jdk7-b50 From cc6fbb6a7fc614edff142cd7b28ea4bfea33755f Mon Sep 17 00:00:00 2001 From: Xiomara Jayasena Date: Thu, 5 Mar 2009 09:49:08 -0800 Subject: [PATCH 093/292] Added tag jdk7-b50 for changeset 9c9bf2f9d3f3 --- jaxp/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/jaxp/.hgtags b/jaxp/.hgtags index d760b86ea59..e92ed4385eb 100644 --- a/jaxp/.hgtags +++ b/jaxp/.hgtags @@ -24,3 +24,4 @@ b2271877894af809b7703767fe8d4e38591a02a2 jdk7-b46 d711ad1954b294957737ea386cfd4d3c05028a36 jdk7-b47 39de90eb4822cafaacc69edd67ab5547e55ae920 jdk7-b48 5c1f24531903573c1830775432276da567243f9c jdk7-b49 +e8514e2be76d90889ebdb90d627aca2db5c150c6 jdk7-b50 From 421eed2e07123a5fb482abe888ab958cf1d98f6a Mon Sep 17 00:00:00 2001 From: Xiomara Jayasena Date: Thu, 5 Mar 2009 09:49:09 -0800 Subject: [PATCH 094/292] Added tag jdk7-b50 for changeset 4dd69fd1b1f9 --- jaxws/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/jaxws/.hgtags b/jaxws/.hgtags index 0912b5f8ec4..0221bd157bf 100644 --- a/jaxws/.hgtags +++ b/jaxws/.hgtags @@ -24,3 +24,4 @@ af4a3eeb7812a5d09a241c50b51b3c648a9d45c1 jdk7-b46 223011570edbd49bb0fe51cdeb2089f95d305267 jdk7-b47 01e5dd31d0c10a2db3d50db346905d2d3db45e88 jdk7-b48 18ca864890f3d4ed942ecbffb78c936a57759921 jdk7-b49 +5be52db581f1ea91ab6e0eb34ba7f439125bfb16 jdk7-b50 From 4ae52d7dc1ef8d648b95702f772012b41fb9f309 Mon Sep 17 00:00:00 2001 From: Xiomara Jayasena Date: Thu, 5 Mar 2009 09:49:26 -0800 Subject: [PATCH 095/292] Added tag jdk7-b50 for changeset 7faffd237305 --- langtools/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/langtools/.hgtags b/langtools/.hgtags index 6e74f307ed3..48a2dfca98f 100644 --- a/langtools/.hgtags +++ b/langtools/.hgtags @@ -24,3 +24,4 @@ be546a6c08e3c31fba2edcae1de43ae3515d2e59 jdk7-b46 2b8f6bab23926aa32b9cf7e4c540b9d1ce74b7d5 jdk7-b47 c53007f34195f69223bdd4125ec6c0740f7d6736 jdk7-b48 d17d927ad9bdfafae32451645d182acb7bed7be6 jdk7-b49 +46f2f6ed96f13fc49fec3d1b6aa616686128cb57 jdk7-b50 From c9de141417c937a3f73c651d459c270df16dff05 Mon Sep 17 00:00:00 2001 From: Jennifer Godinez Date: Thu, 5 Mar 2009 10:56:06 -0800 Subject: [PATCH 096/292] 6735296: Regression: Common print dialog does not show the correct page orientation Reviewed-by: tdv, prr --- .../classes/sun/print/ServiceDialog.java | 76 +++++++++---------- 1 file changed, 36 insertions(+), 40 deletions(-) diff --git a/jdk/src/share/classes/sun/print/ServiceDialog.java b/jdk/src/share/classes/sun/print/ServiceDialog.java index 8b5bd478900..062e6163a6f 100644 --- a/jdk/src/share/classes/sun/print/ServiceDialog.java +++ b/jdk/src/share/classes/sun/print/ServiceDialog.java @@ -2149,55 +2149,51 @@ public class ServiceDialog extends JDialog implements ActionListener { } } } + } - rbPortrait.setEnabled(pSupported); - rbLandscape.setEnabled(lSupported); - rbRevPortrait.setEnabled(rpSupported); - rbRevLandscape.setEnabled(rlSupported); - OrientationRequested or = (OrientationRequested)asCurrent.get(orCategory); - if (or == null || - !psCurrent.isAttributeValueSupported(or, docFlavor, asCurrent)) { + rbPortrait.setEnabled(pSupported); + rbLandscape.setEnabled(lSupported); + rbRevPortrait.setEnabled(rpSupported); + rbRevLandscape.setEnabled(rlSupported); - or = (OrientationRequested)psCurrent.getDefaultAttributeValue(orCategory); - // need to validate if default is not supported - if (!psCurrent.isAttributeValueSupported(or, docFlavor, asCurrent)) { - or = null; - values = - psCurrent.getSupportedAttributeValues(orCategory, - docFlavor, - asCurrent); - if (values instanceof OrientationRequested[]) { - OrientationRequested[] orValues = - (OrientationRequested[])values; - if (orValues.length > 1) { - // get the first in the list - or = orValues[0]; - } + OrientationRequested or = (OrientationRequested)asCurrent.get(orCategory); + if (or == null || + !psCurrent.isAttributeValueSupported(or, docFlavor, asCurrent)) { + + or = (OrientationRequested)psCurrent.getDefaultAttributeValue(orCategory); + // need to validate if default is not supported + if ((or != null) && + !psCurrent.isAttributeValueSupported(or, docFlavor, asCurrent)) { + or = null; + Object values = + psCurrent.getSupportedAttributeValues(orCategory, + docFlavor, + asCurrent); + if (values instanceof OrientationRequested[]) { + OrientationRequested[] orValues = + (OrientationRequested[])values; + if (orValues.length > 1) { + // get the first in the list + or = orValues[0]; } } - - if (or == null) { - or = OrientationRequested.PORTRAIT; - } - asCurrent.add(or); } - if (or == OrientationRequested.PORTRAIT) { - rbPortrait.setSelected(true); - } else if (or == OrientationRequested.LANDSCAPE) { - rbLandscape.setSelected(true); - } else if (or == OrientationRequested.REVERSE_PORTRAIT) { - rbRevPortrait.setSelected(true); - } else { // if (or == OrientationRequested.REVERSE_LANDSCAPE) - rbRevLandscape.setSelected(true); + if (or == null) { + or = OrientationRequested.PORTRAIT; } - } else { - rbPortrait.setEnabled(pSupported); - rbLandscape.setEnabled(lSupported); - rbRevPortrait.setEnabled(rpSupported); - rbRevLandscape.setEnabled(rlSupported); + asCurrent.add(or); + } + if (or == OrientationRequested.PORTRAIT) { + rbPortrait.setSelected(true); + } else if (or == OrientationRequested.LANDSCAPE) { + rbLandscape.setSelected(true); + } else if (or == OrientationRequested.REVERSE_PORTRAIT) { + rbRevPortrait.setSelected(true); + } else { // if (or == OrientationRequested.REVERSE_LANDSCAPE) + rbRevLandscape.setSelected(true); } } } From 6c11535cddb56103822a86c878bedf6932791008 Mon Sep 17 00:00:00 2001 From: Andrew Brygin Date: Fri, 6 Mar 2009 12:40:38 +0300 Subject: [PATCH 097/292] 6804997: JWS GIF Decoding Heap Corruption [V-r687oxuocp] Reviewed-by: prr --- jdk/src/share/native/sun/awt/giflib/dgif_lib.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/jdk/src/share/native/sun/awt/giflib/dgif_lib.c b/jdk/src/share/native/sun/awt/giflib/dgif_lib.c index be91d3e7811..f20372fe925 100644 --- a/jdk/src/share/native/sun/awt/giflib/dgif_lib.c +++ b/jdk/src/share/native/sun/awt/giflib/dgif_lib.c @@ -722,6 +722,10 @@ DGifSetupDecompress(GifFileType * GifFile) { GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; READ(GifFile, &CodeSize, 1); /* Read Code size from file. */ + if (CodeSize >= 12) { + /* Invalid initial code size: report failure */ + return GIF_ERROR; + } BitsPerPixel = CodeSize; Private->Buf[0] = 0; /* Input Buffer empty. */ @@ -964,10 +968,13 @@ DGifDecompressInput(GifFileType * GifFile, /* If code cannot fit into RunningBits bits, must raise its size. Note * however that codes above 4095 are used for special signaling. */ - if (++Private->RunningCode > Private->MaxCode1 && - Private->RunningBits < LZ_BITS) { - Private->MaxCode1 <<= 1; - Private->RunningBits++; + if (++Private->RunningCode > Private->MaxCode1) { + if (Private->RunningBits < LZ_BITS) { + Private->MaxCode1 <<= 1; + Private->RunningBits++; + } else { + Private->RunningCode = Private->MaxCode1; + } } return GIF_OK; } From 416d70bf918989cdf455c6cbd84a01975e61c9a3 Mon Sep 17 00:00:00 2001 From: Igor Veresov Date: Fri, 6 Mar 2009 13:50:14 -0800 Subject: [PATCH 098/292] 6720309: G1: don't synchronously update RSet during evacuation pauses 6720334: G1: don't update RSets of collection set regions during an evacuation pause Introduced a deferred update mechanism for delaying the rset updates during the collection pause Reviewed-by: apetrusenko, tonyp --- .../g1/concurrentG1RefineThread.cpp | 4 +- .../gc_implementation/g1/dirtyCardQueue.cpp | 4 +- .../gc_implementation/g1/dirtyCardQueue.hpp | 2 +- .../gc_implementation/g1/g1CollectedHeap.cpp | 136 ++++++++++++++---- .../gc_implementation/g1/g1CollectedHeap.hpp | 7 + .../vm/gc_implementation/g1/g1RemSet.cpp | 115 +++++++++++---- .../vm/gc_implementation/g1/g1RemSet.hpp | 1 + .../gc_implementation/g1/g1RemSet.inline.hpp | 42 +++--- .../vm/gc_implementation/g1/g1_globals.hpp | 3 + .../vm/gc_implementation/g1/ptrQueue.cpp | 77 ++++++++-- .../vm/gc_implementation/g1/ptrQueue.hpp | 13 +- .../src/share/vm/memory/cardTableModRefBS.cpp | 52 ++++++- .../src/share/vm/memory/cardTableModRefBS.hpp | 26 +++- 13 files changed, 380 insertions(+), 102 deletions(-) diff --git a/hotspot/src/share/vm/gc_implementation/g1/concurrentG1RefineThread.cpp b/hotspot/src/share/vm/gc_implementation/g1/concurrentG1RefineThread.cpp index 110c08327c3..b099908a7a7 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/concurrentG1RefineThread.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentG1RefineThread.cpp @@ -133,14 +133,12 @@ void ConcurrentG1RefineThread::queueBasedRefinement() { _co_tracker.update(false); if (G1SmoothConcRefine) { - start_vtime_sec = os::elapsedVTime(); prev_buffer_num = curr_buffer_num; - _sts.leave(); os::sleep(Thread::current(), (jlong) _interval_ms, false); _sts.join(); + start_vtime_sec = os::elapsedVTime(); } - n_logs++; } // Make sure we harvest the PYA, if any. diff --git a/hotspot/src/share/vm/gc_implementation/g1/dirtyCardQueue.cpp b/hotspot/src/share/vm/gc_implementation/g1/dirtyCardQueue.cpp index f3934812dd1..ec26c6a46ef 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/dirtyCardQueue.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/dirtyCardQueue.cpp @@ -78,8 +78,8 @@ size_t DirtyCardQueueSet::num_par_ids() { void DirtyCardQueueSet::initialize(Monitor* cbl_mon, Mutex* fl_lock, int max_completed_queue, - Mutex* lock) { - PtrQueueSet::initialize(cbl_mon, fl_lock, max_completed_queue); + Mutex* lock, PtrQueueSet* fl_owner) { + PtrQueueSet::initialize(cbl_mon, fl_lock, max_completed_queue, fl_owner); set_buffer_size(DCQBarrierQueueBufferSize); set_process_completed_threshold(DCQBarrierProcessCompletedThreshold); diff --git a/hotspot/src/share/vm/gc_implementation/g1/dirtyCardQueue.hpp b/hotspot/src/share/vm/gc_implementation/g1/dirtyCardQueue.hpp index 86876fd949d..7a6f3f27bbd 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/dirtyCardQueue.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/dirtyCardQueue.hpp @@ -88,7 +88,7 @@ public: void initialize(Monitor* cbl_mon, Mutex* fl_lock, int max_completed_queue = 0, - Mutex* lock = NULL); + Mutex* lock = NULL, PtrQueueSet* fl_owner = NULL); // The number of parallel ids that can be claimed to allow collector or // mutator threads to do card-processing work. diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp index 8d7b5e18862..efc42b440a1 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp @@ -136,6 +136,14 @@ public: int calls() { return _calls; } }; +class RedirtyLoggedCardTableEntryFastClosure : public CardTableEntryClosure { +public: + bool do_card_ptr(jbyte* card_ptr, int worker_i) { + *card_ptr = CardTableModRefBS::dirty_card_val(); + return true; + } +}; + YoungList::YoungList(G1CollectedHeap* g1h) : _g1h(g1h), _head(NULL), _scan_only_head(NULL), _scan_only_tail(NULL), _curr_scan_only(NULL), @@ -961,7 +969,8 @@ void G1CollectedHeap::do_collection(bool full, bool clear_all_soft_refs, // dirtied, so this should abandon those logs, and set "do_traversal" // to true. concurrent_g1_refine()->set_pya_restart(); - + assert(!G1DeferredRSUpdate + || (G1DeferredRSUpdate && (dirty_card_queue_set().completed_buffers_num() == 0)), "Should not be any"); assert(regions_accounted_for(), "Region leakage!"); } @@ -1466,6 +1475,13 @@ jint G1CollectedHeap::initialize() { G1DirtyCardQueueMax, Shared_DirtyCardQ_lock); } + if (G1DeferredRSUpdate) { + dirty_card_queue_set().initialize(DirtyCardQ_CBL_mon, + DirtyCardQ_FL_lock, + 0, + Shared_DirtyCardQ_lock, + &JavaThread::dirty_card_queue_set()); + } // In case we're keeping closure specialization stats, initialize those // counts and that mechanism. SpecializationStats::clear(); @@ -2918,27 +2934,51 @@ public: } }; -class RecreateRSetEntriesClosure: public OopClosure { +class UpdateRSetImmediate : public OopsInHeapRegionClosure { private: G1CollectedHeap* _g1; G1RemSet* _g1_rem_set; - HeapRegion* _from; public: - RecreateRSetEntriesClosure(G1CollectedHeap* g1, HeapRegion* from) : - _g1(g1), _g1_rem_set(g1->g1_rem_set()), _from(from) - {} + UpdateRSetImmediate(G1CollectedHeap* g1) : + _g1(g1), _g1_rem_set(g1->g1_rem_set()) {} void do_oop(narrowOop* p) { guarantee(false, "NYI"); } void do_oop(oop* p) { assert(_from->is_in_reserved(p), "paranoia"); - if (*p != NULL) { - _g1_rem_set->write_ref(_from, p); + if (*p != NULL && !_from->is_survivor()) { + _g1_rem_set->par_write_ref(_from, p, 0); } } }; +class UpdateRSetDeferred : public OopsInHeapRegionClosure { +private: + G1CollectedHeap* _g1; + DirtyCardQueue *_dcq; + CardTableModRefBS* _ct_bs; + +public: + UpdateRSetDeferred(G1CollectedHeap* g1, DirtyCardQueue* dcq) : + _g1(g1), _ct_bs((CardTableModRefBS*)_g1->barrier_set()), _dcq(dcq) {} + + void do_oop(narrowOop* p) { + guarantee(false, "NYI"); + } + void do_oop(oop* p) { + assert(_from->is_in_reserved(p), "paranoia"); + if (!_from->is_in_reserved(*p) && !_from->is_survivor()) { + size_t card_index = _ct_bs->index_for(p); + if (_ct_bs->mark_card_deferred(card_index)) { + _dcq->enqueue((jbyte*)_ct_bs->byte_for_index(card_index)); + } + } + } +}; + + + class RemoveSelfPointerClosure: public ObjectClosure { private: G1CollectedHeap* _g1; @@ -2946,11 +2986,11 @@ private: HeapRegion* _hr; size_t _prev_marked_bytes; size_t _next_marked_bytes; + OopsInHeapRegionClosure *_cl; public: - RemoveSelfPointerClosure(G1CollectedHeap* g1, HeapRegion* hr) : - _g1(g1), _cm(_g1->concurrent_mark()), _hr(hr), - _prev_marked_bytes(0), _next_marked_bytes(0) - {} + RemoveSelfPointerClosure(G1CollectedHeap* g1, OopsInHeapRegionClosure* cl) : + _g1(g1), _cm(_g1->concurrent_mark()), _prev_marked_bytes(0), + _next_marked_bytes(0), _cl(cl) {} size_t prev_marked_bytes() { return _prev_marked_bytes; } size_t next_marked_bytes() { return _next_marked_bytes; } @@ -2988,8 +3028,7 @@ public: // that, if evacuation fails, we might have remembered set // entries missing given that we skipped cards on the // collection set. So, we'll recreate such entries now. - RecreateRSetEntriesClosure cl(_g1, _hr); - obj->oop_iterate(&cl); + obj->oop_iterate(_cl); assert(_cm->isPrevMarked(obj), "Should be marked!"); } else { // The object has been either evacuated or is dead. Fill it with a @@ -3002,14 +3041,23 @@ public: }; void G1CollectedHeap::remove_self_forwarding_pointers() { + UpdateRSetImmediate immediate_update(_g1h); + DirtyCardQueue dcq(&_g1h->dirty_card_queue_set()); + UpdateRSetDeferred deferred_update(_g1h, &dcq); + OopsInHeapRegionClosure *cl; + if (G1DeferredRSUpdate) { + cl = &deferred_update; + } else { + cl = &immediate_update; + } HeapRegion* cur = g1_policy()->collection_set(); - while (cur != NULL) { assert(g1_policy()->assertMarkedBytesDataOK(), "Should be!"); + RemoveSelfPointerClosure rspc(_g1h, cl); if (cur->evacuation_failed()) { - RemoveSelfPointerClosure rspc(_g1h, cur); assert(cur->in_collection_set(), "bad CS"); + cl->set_region(cur); cur->object_iterate(&rspc); // A number of manipulations to make the TAMS be the current top, @@ -3518,6 +3566,9 @@ class G1ParScanThreadState : public StackObj { protected: G1CollectedHeap* _g1h; RefToScanQueue* _refs; + DirtyCardQueue _dcq; + CardTableModRefBS* _ct_bs; + G1RemSet* _g1_rem; typedef GrowableArray OverflowQueue; OverflowQueue* _overflowed_refs; @@ -3559,10 +3610,32 @@ protected: void add_to_undo_waste(size_t waste) { _undo_waste += waste; } + DirtyCardQueue& dirty_card_queue() { return _dcq; } + CardTableModRefBS* ctbs() { return _ct_bs; } + + void immediate_rs_update(HeapRegion* from, oop* p, int tid) { + _g1_rem->par_write_ref(from, p, tid); + } + + void deferred_rs_update(HeapRegion* from, oop* p, int tid) { + // If the new value of the field points to the same region or + // is the to-space, we don't need to include it in the Rset updates. + if (!from->is_in_reserved(*p) && !from->is_survivor()) { + size_t card_index = ctbs()->index_for(p); + // If the card hasn't been added to the buffer, do it. + if (ctbs()->mark_card_deferred(card_index)) { + dirty_card_queue().enqueue((jbyte*)ctbs()->byte_for_index(card_index)); + } + } + } + public: G1ParScanThreadState(G1CollectedHeap* g1h, int queue_num) : _g1h(g1h), _refs(g1h->task_queue(queue_num)), + _dcq(&g1h->dirty_card_queue_set()), + _ct_bs((CardTableModRefBS*)_g1h->barrier_set()), + _g1_rem(g1h->g1_rem_set()), _hash_seed(17), _queue_num(queue_num), _term_attempts(0), _age_table(false), @@ -3640,6 +3713,14 @@ public: int refs_to_scan() { return refs()->size(); } int overflowed_refs_to_scan() { return overflowed_refs()->length(); } + void update_rs(HeapRegion* from, oop* p, int tid) { + if (G1DeferredRSUpdate) { + deferred_rs_update(from, p, tid); + } else { + immediate_rs_update(from, p, tid); + } + } + HeapWord* allocate_slow(GCAllocPurpose purpose, size_t word_sz) { HeapWord* obj = NULL; @@ -3808,7 +3889,6 @@ public: } }; - G1ParClosureSuper::G1ParClosureSuper(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state) : _g1(g1), _g1_rem(_g1->g1_rem_set()), _cm(_g1->concurrent_mark()), _par_scan_state(par_scan_state) { } @@ -3834,7 +3914,7 @@ void G1ParScanClosure::do_oop_nv(oop* p) { assert(obj == *p, "the value of *p should not have changed"); _par_scan_state->push_on_queue(p); } else { - _g1_rem->par_write_ref(_from, p, _par_scan_state->queue_num()); + _par_scan_state->update_rs(_from, p, _par_scan_state->queue_num()); } } } @@ -3972,13 +4052,13 @@ void G1ParCopyClosurepar_write_ref(_from, p, _par_scan_state->queue_num()); + _par_scan_state->update_rs(_from, p, _par_scan_state->queue_num()); } } // When scanning moved objs, must look at all oops. if (barrier == G1BarrierEvac && obj != NULL) { - _g1_rem->par_write_ref(_from, p, _par_scan_state->queue_num()); + _par_scan_state->update_rs(_from, p, _par_scan_state->queue_num()); } if (do_gen_barrier && obj != NULL) { @@ -4127,6 +4207,7 @@ public: G1ParScanExtRootClosure only_scan_root_cl(_g1h, &pss); G1ParScanPermClosure only_scan_perm_cl(_g1h, &pss); G1ParScanHeapRSClosure only_scan_heap_rs_cl(_g1h, &pss); + G1ParScanAndMarkExtRootClosure scan_mark_root_cl(_g1h, &pss); G1ParScanAndMarkPermClosure scan_mark_perm_cl(_g1h, &pss); G1ParScanAndMarkHeapRSClosure scan_mark_heap_rs_cl(_g1h, &pss); @@ -4382,7 +4463,6 @@ void G1CollectedHeap::evacuate_collection_set() { g1_rem_set()->prepare_for_oops_into_collection_set_do(); concurrent_g1_refine()->set_use_cache(false); int n_workers = (ParallelGCThreads > 0 ? workers()->total_workers() : 1); - set_par_threads(n_workers); G1ParTask g1_par_task(this, n_workers, _task_queues); @@ -4390,8 +4470,9 @@ void G1CollectedHeap::evacuate_collection_set() { change_strong_roots_parity(); // In preparation for parallel strong roots. rem_set()->prepare_for_younger_refs_iterate(true); - double start_par = os::elapsedTime(); + assert(dirty_card_queue_set().completed_buffers_num() == 0, "Should be empty"); + double start_par = os::elapsedTime(); if (ParallelGCThreads > 0) { // The individual threads will set their evac-failure closures. workers()->run_task(&g1_par_task); @@ -4411,8 +4492,8 @@ void G1CollectedHeap::evacuate_collection_set() { G1KeepAliveClosure keep_alive(this); JNIHandles::weak_oops_do(&is_alive, &keep_alive); } - g1_rem_set()->cleanup_after_oops_into_collection_set_do(); + concurrent_g1_refine()->set_use_cache(true); finalize_for_evac_failure(); @@ -4423,7 +4504,6 @@ void G1CollectedHeap::evacuate_collection_set() { if (evacuation_failed()) { remove_self_forwarding_pointers(); - if (PrintGCDetails) { gclog_or_tty->print(" (evacuation failed)"); } else if (PrintGC) { @@ -4431,6 +4511,14 @@ void G1CollectedHeap::evacuate_collection_set() { } } + if (G1DeferredRSUpdate) { + RedirtyLoggedCardTableEntryFastClosure redirty; + dirty_card_queue_set().set_closure(&redirty); + dirty_card_queue_set().apply_closure_to_all_completed_buffers(); + JavaThread::dirty_card_queue_set().merge_bufferlists(&dirty_card_queue_set()); + assert(dirty_card_queue_set().completed_buffers_num() == 0, "All should be consumed"); + } + COMPILER2_PRESENT(DerivedPointerTable::update_pointers()); } diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp index 2e139b7f2d2..d5637ee5836 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp @@ -457,6 +457,10 @@ protected: // And it's mod ref barrier set, used to track updates for the above. ModRefBarrierSet* _mr_bs; + // A set of cards that cover the objects for which the Rsets should be updated + // concurrently after the collection. + DirtyCardQueueSet _dirty_card_queue_set; + // The Heap Region Rem Set Iterator. HeapRegionRemSetIterator** _rem_set_iterator; @@ -666,6 +670,9 @@ public: RefToScanQueue *task_queue(int i); + // A set of cards where updates happened during the GC + DirtyCardQueueSet& dirty_card_queue_set() { return _dirty_card_queue_set; } + // Create a G1CollectedHeap with the specified policy. // Must call the initialize method afterwards. // May not return if something goes wrong. diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.cpp index 7946c41ff79..bb2dfd7a6f9 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.cpp @@ -177,11 +177,19 @@ HRInto_G1RemSet::HRInto_G1RemSet(G1CollectedHeap* g1, CardTableModRefBS* ct_bs) _cards_scanned(NULL), _total_cards_scanned(0) { _seq_task = new SubTasksDone(NumSeqTasks); - _new_refs = NEW_C_HEAP_ARRAY(GrowableArray*, ParallelGCThreads); + guarantee(n_workers() > 0, "There should be some workers"); + _new_refs = NEW_C_HEAP_ARRAY(GrowableArray*, n_workers()); + for (uint i = 0; i < n_workers(); i++) { + _new_refs[i] = new (ResourceObj::C_HEAP) GrowableArray(8192,true); + } } HRInto_G1RemSet::~HRInto_G1RemSet() { delete _seq_task; + for (uint i = 0; i < n_workers(); i++) { + delete _new_refs[i]; + } + FREE_C_HEAP_ARRAY(GrowableArray*, _new_refs); } void CountNonCleanMemRegionClosure::do_MemRegion(MemRegion mr) { @@ -281,8 +289,9 @@ public: if (!_ct_bs->is_card_claimed(card_index) && !_ct_bs->is_card_dirty(card_index)) { assert(_ct_bs->is_card_clean(card_index) || - _ct_bs->is_card_claimed(card_index), - "Card is either dirty, clean, or claimed"); + _ct_bs->is_card_claimed(card_index) || + _ct_bs->is_card_deferred(card_index), + "Card is either clean, claimed or deferred"); if (_ct_bs->claim_card(card_index)) scanCard(card_index, card_region); } @@ -338,14 +347,12 @@ void HRInto_G1RemSet::scanRS(OopsInHeapRegionClosure* oc, int worker_i) { _g1p->record_scan_rs_start_time(worker_i, rs_time_start * 1000.0); _g1p->record_scan_rs_time(worker_i, scan_rs_time_sec * 1000.0); - if (ParallelGCThreads > 0) { - // In this case, we called scanNewRefsRS and recorded the corresponding - // time. - double scan_new_refs_time_ms = _g1p->get_scan_new_refs_time(worker_i); - if (scan_new_refs_time_ms > 0.0) { - closure_app_time_ms += scan_new_refs_time_ms; - } + + double scan_new_refs_time_ms = _g1p->get_scan_new_refs_time(worker_i); + if (scan_new_refs_time_ms > 0.0) { + closure_app_time_ms += scan_new_refs_time_ms; } + _g1p->record_obj_copy_time(worker_i, closure_app_time_ms); } @@ -469,8 +476,8 @@ HRInto_G1RemSet::scanNewRefsRS(OopsInHeapRegionClosure* oc, double scan_new_refs_start_sec = os::elapsedTime(); G1CollectedHeap* g1h = G1CollectedHeap::heap(); CardTableModRefBS* ct_bs = (CardTableModRefBS*) (g1h->barrier_set()); - while (_new_refs[worker_i]->is_nonempty()) { - oop* p = _new_refs[worker_i]->pop(); + for (int i = 0; i < _new_refs[worker_i]->length(); i++) { + oop* p = _new_refs[worker_i]->at(i); oop obj = *p; // *p was in the collection set when p was pushed on "_new_refs", but // another thread may have processed this location from an RS, so it @@ -480,10 +487,6 @@ HRInto_G1RemSet::scanNewRefsRS(OopsInHeapRegionClosure* oc, HeapRegion* r = g1h->heap_region_containing(p); DEBUG_ONLY(HeapRegion* to = g1h->heap_region_containing(obj)); - assert(ParallelGCThreads > 1 - || to->rem_set()->contains_reference(p), - "Invariant: pushed after being added." - "(Not reliable in parallel code.)"); oc->set_region(r); // If "p" has already been processed concurrently, this is // idempotent. @@ -538,8 +541,8 @@ HRInto_G1RemSet::oops_into_collection_set_do(OopsInHeapRegionClosure* oc, } } else { assert(worker_i == 0, "invariant"); - updateRS(0); + scanNewRefsRS(oc, 0); scanRS(oc, 0); } } @@ -559,11 +562,7 @@ prepare_for_oops_into_collection_set_do() { assert(!_par_traversal_in_progress, "Invariant between iterations."); if (ParallelGCThreads > 0) { set_par_traversal(true); - int n_workers = _g1->workers()->total_workers(); - _seq_task->set_par_threads(n_workers); - for (uint i = 0; i < ParallelGCThreads; i++) - _new_refs[i] = new (ResourceObj::C_HEAP) GrowableArray(8192,true); - + _seq_task->set_par_threads((int)n_workers()); if (cg1r->do_traversal()) { updateRS(0); // Have to do this again after updaters @@ -587,6 +586,53 @@ class cleanUpIteratorsClosure : public HeapRegionClosure { } }; +class UpdateRSetOopsIntoCSImmediate : public OopClosure { + G1CollectedHeap* _g1; +public: + UpdateRSetOopsIntoCSImmediate(G1CollectedHeap* g1) : _g1(g1) { } + virtual void do_oop(narrowOop* p) { + guarantee(false, "NYI"); + } + virtual void do_oop(oop* p) { + HeapRegion* to = _g1->heap_region_containing(*p); + if (to->in_collection_set()) { + if (to->rem_set()->add_reference(p, 0)) { + _g1->schedule_popular_region_evac(to); + } + } + } +}; + +class UpdateRSetOopsIntoCSDeferred : public OopClosure { + G1CollectedHeap* _g1; + CardTableModRefBS* _ct_bs; + DirtyCardQueue* _dcq; +public: + UpdateRSetOopsIntoCSDeferred(G1CollectedHeap* g1, DirtyCardQueue* dcq) : + _g1(g1), _ct_bs((CardTableModRefBS*)_g1->barrier_set()), _dcq(dcq) { } + virtual void do_oop(narrowOop* p) { + guarantee(false, "NYI"); + } + virtual void do_oop(oop* p) { + oop obj = *p; + if (_g1->obj_in_cs(obj)) { + size_t card_index = _ct_bs->index_for(p); + if (_ct_bs->mark_card_deferred(card_index)) { + _dcq->enqueue((jbyte*)_ct_bs->byte_for_index(card_index)); + } + } + } +}; + +void HRInto_G1RemSet::new_refs_iterate(OopClosure* cl) { + for (size_t i = 0; i < n_workers(); i++) { + for (int j = 0; j < _new_refs[i]->length(); j++) { + oop* p = _new_refs[i]->at(j); + cl->do_oop(p); + } + } +} + void HRInto_G1RemSet::cleanup_after_oops_into_collection_set_do() { guarantee( _cards_scanned != NULL, "invariant" ); _total_cards_scanned = 0; @@ -609,11 +655,25 @@ void HRInto_G1RemSet::cleanup_after_oops_into_collection_set_do() { if (cg1r->do_traversal()) { cg1r->cg1rThread()->set_do_traversal(false); } - for (uint i = 0; i < ParallelGCThreads; i++) { - delete _new_refs[i]; - } set_par_traversal(false); } + + if (_g1->evacuation_failed()) { + // Restore remembered sets for the regions pointing into + // the collection set. + if (G1DeferredRSUpdate) { + DirtyCardQueue dcq(&_g1->dirty_card_queue_set()); + UpdateRSetOopsIntoCSDeferred deferred_update(_g1, &dcq); + new_refs_iterate(&deferred_update); + } else { + UpdateRSetOopsIntoCSImmediate immediate_update(_g1); + new_refs_iterate(&immediate_update); + } + } + for (uint i = 0; i < n_workers(); i++) { + _new_refs[i]->clear(); + } + assert(!_par_traversal_in_progress, "Invariant between iterations."); } @@ -683,7 +743,8 @@ public: bool doHeapRegion(HeapRegion* r) { if (!r->in_collection_set() && !r->continuesHumongous() && - !r->is_young()) { + !r->is_young() && + !r->is_survivor()) { _update_rs_oop_cl.set_from(r); UpdateRSObjectClosure update_rs_obj_cl(&_update_rs_oop_cl); @@ -820,7 +881,7 @@ void HRInto_G1RemSet::concurrentRefineOneCard(jbyte* card_ptr, int worker_i) { // before all the cards on the region are dirtied. This is unlikely, // and it doesn't happen often, but it can happen. So, the extra // check below filters out those cards. - if (r->is_young()) { + if (r->is_young() || r->is_survivor()) { return; } // While we are processing RSet buffers during the collection, we diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.hpp index 9f03d394db2..e080d3771cb 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.hpp @@ -155,6 +155,7 @@ protected: bool _par_traversal_in_progress; void set_par_traversal(bool b); GrowableArray** _new_refs; + void new_refs_iterate(OopClosure* cl); public: // This is called to reset dual hash tables after the gc pause diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.inline.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.inline.hpp index e3f1b5cc81d..3807b9ae408 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.inline.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.inline.hpp @@ -31,24 +31,7 @@ inline size_t G1RemSet::n_workers() { } inline void HRInto_G1RemSet::write_ref_nv(HeapRegion* from, oop* p) { - oop obj = *p; - assert(from != NULL && from->is_in_reserved(p), - "p is not in a from"); - HeapRegion* to = _g1->heap_region_containing(obj); - if (from != to && to != NULL) { - if (!to->popular() && !from->is_survivor()) { -#if G1_REM_SET_LOGGING - gclog_or_tty->print_cr("Adding " PTR_FORMAT " (" PTR_FORMAT ") to RS" - " for region [" PTR_FORMAT ", " PTR_FORMAT ")", - p, obj, - to->bottom(), to->end()); -#endif - assert(to->rem_set() != NULL, "Need per-region 'into' remsets."); - if (to->rem_set()->add_reference(p)) { - _g1->schedule_popular_region_evac(to); - } - } - } + par_write_ref(from, p, 0); } inline void HRInto_G1RemSet::write_ref(HeapRegion* from, oop* p) { @@ -82,7 +65,22 @@ inline void HRInto_G1RemSet::par_write_ref(HeapRegion* from, oop* p, int tid) { HeapRegion* to = _g1->heap_region_containing(obj); // The test below could be optimized by applying a bit op to to and from. if (to != NULL && from != NULL && from != to) { - if (!to->popular() && !from->is_survivor()) { + bool update_delayed = false; + // There is a tricky infinite loop if we keep pushing + // self forwarding pointers onto our _new_refs list. + // The _par_traversal_in_progress flag is true during the collection pause, + // false during the evacuation failure handing. + if (_par_traversal_in_progress && + to->in_collection_set() && !self_forwarded(obj)) { + _new_refs[tid]->push(p); + // Deferred updates to the Cset are either discarded (in the normal case), + // or processed (if an evacuation failure occurs) at the end + // of the collection. + // See HRInto_G1RemSet::cleanup_after_oops_into_collection_set_do(). + update_delayed = true; + } + + if (!to->popular() && !update_delayed) { #if G1_REM_SET_LOGGING gclog_or_tty->print_cr("Adding " PTR_FORMAT " (" PTR_FORMAT ") to RS" " for region [" PTR_FORMAT ", " PTR_FORMAT ")", @@ -94,11 +92,5 @@ inline void HRInto_G1RemSet::par_write_ref(HeapRegion* from, oop* p, int tid) { _g1->schedule_popular_region_evac(to); } } - // There is a tricky infinite loop if we keep pushing - // self forwarding pointers onto our _new_refs list. - if (_par_traversal_in_progress && - to->in_collection_set() && !self_forwarded(obj)) { - _new_refs[tid]->push(p); - } } } diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1_globals.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1_globals.hpp index 43b1d59c852..fd23f65d15a 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1_globals.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1_globals.hpp @@ -172,6 +172,9 @@ develop(bool, G1RSBarrierUseQueue, true, \ "If true, use queueing RS barrier") \ \ + develop(bool, G1DeferredRSUpdate, true, \ + "If true, use deferred RS updates") \ + \ develop(bool, G1RSLogCheckCardTable, false, \ "If true, verify that no dirty cards remain after RS log " \ "processing.") \ diff --git a/hotspot/src/share/vm/gc_implementation/g1/ptrQueue.cpp b/hotspot/src/share/vm/gc_implementation/g1/ptrQueue.cpp index c6a4faad931..1da8d520637 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/ptrQueue.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/ptrQueue.cpp @@ -91,15 +91,17 @@ PtrQueueSet::PtrQueueSet(bool notify_when_complete) : _n_completed_buffers(0), _process_completed_threshold(0), _process_completed(false), _buf_free_list(NULL), _buf_free_list_sz(0) -{} +{ + _fl_owner = this; +} void** PtrQueueSet::allocate_buffer() { assert(_sz > 0, "Didn't set a buffer size."); - MutexLockerEx x(_fl_lock, Mutex::_no_safepoint_check_flag); - if (_buf_free_list != NULL) { - void** res = _buf_free_list; - _buf_free_list = (void**)_buf_free_list[0]; - _buf_free_list_sz--; + MutexLockerEx x(_fl_owner->_fl_lock, Mutex::_no_safepoint_check_flag); + if (_fl_owner->_buf_free_list != NULL) { + void** res = _fl_owner->_buf_free_list; + _fl_owner->_buf_free_list = (void**)_fl_owner->_buf_free_list[0]; + _fl_owner->_buf_free_list_sz--; // Just override the next pointer with NULL, just in case we scan this part // of the buffer. res[0] = NULL; @@ -111,10 +113,10 @@ void** PtrQueueSet::allocate_buffer() { void PtrQueueSet::deallocate_buffer(void** buf) { assert(_sz > 0, "Didn't set a buffer size."); - MutexLockerEx x(_fl_lock, Mutex::_no_safepoint_check_flag); - buf[0] = (void*)_buf_free_list; - _buf_free_list = buf; - _buf_free_list_sz++; + MutexLockerEx x(_fl_owner->_fl_lock, Mutex::_no_safepoint_check_flag); + buf[0] = (void*)_fl_owner->_buf_free_list; + _fl_owner->_buf_free_list = buf; + _fl_owner->_buf_free_list_sz++; } void PtrQueueSet::reduce_free_list() { @@ -207,3 +209,58 @@ void PtrQueueSet::set_buffer_size(size_t sz) { void PtrQueueSet::set_process_completed_threshold(size_t sz) { _process_completed_threshold = sz; } + +// Merge lists of buffers. Notify waiting threads if the length of the list +// exceeds threshold. The source queue is emptied as a result. The queues +// must share the monitor. +void PtrQueueSet::merge_bufferlists(PtrQueueSet *src) { + assert(_cbl_mon == src->_cbl_mon, "Should share the same lock"); + MutexLockerEx x(_cbl_mon, Mutex::_no_safepoint_check_flag); + if (_completed_buffers_tail == NULL) { + assert(_completed_buffers_head == NULL, "Well-formedness"); + _completed_buffers_head = src->_completed_buffers_head; + _completed_buffers_tail = src->_completed_buffers_tail; + } else { + assert(_completed_buffers_head != NULL, "Well formedness"); + if (src->_completed_buffers_head != NULL) { + _completed_buffers_tail->next = src->_completed_buffers_head; + _completed_buffers_tail = src->_completed_buffers_tail; + } + } + _n_completed_buffers += src->_n_completed_buffers; + + src->_n_completed_buffers = 0; + src->_completed_buffers_head = NULL; + src->_completed_buffers_tail = NULL; + + assert(_completed_buffers_head == NULL && _completed_buffers_tail == NULL || + _completed_buffers_head != NULL && _completed_buffers_tail != NULL, + "Sanity"); + + if (!_process_completed && + _n_completed_buffers >= _process_completed_threshold) { + _process_completed = true; + if (_notify_when_complete) + _cbl_mon->notify_all(); + } +} + +// Merge free lists of the two queues. The free list of the source +// queue is emptied as a result. The queues must share the same +// mutex that guards free lists. +void PtrQueueSet::merge_freelists(PtrQueueSet* src) { + assert(_fl_lock == src->_fl_lock, "Should share the same lock"); + MutexLockerEx x(_fl_lock, Mutex::_no_safepoint_check_flag); + if (_buf_free_list != NULL) { + void **p = _buf_free_list; + while (*p != NULL) { + p = (void**)*p; + } + *p = src->_buf_free_list; + } else { + _buf_free_list = src->_buf_free_list; + } + _buf_free_list_sz += src->_buf_free_list_sz; + src->_buf_free_list = NULL; + src->_buf_free_list_sz = 0; +} diff --git a/hotspot/src/share/vm/gc_implementation/g1/ptrQueue.hpp b/hotspot/src/share/vm/gc_implementation/g1/ptrQueue.hpp index df5557c29a6..032ee3371f8 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/ptrQueue.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/ptrQueue.hpp @@ -155,6 +155,9 @@ protected: Mutex* _fl_lock; void** _buf_free_list; size_t _buf_free_list_sz; + // Queue set can share a freelist. The _fl_owner variable + // specifies the owner. It is set to "this" by default. + PtrQueueSet* _fl_owner; // The size of all buffers in the set. size_t _sz; @@ -188,10 +191,13 @@ public: // Because of init-order concerns, we can't pass these as constructor // arguments. void initialize(Monitor* cbl_mon, Mutex* fl_lock, - int max_completed_queue = 0) { + int max_completed_queue = 0, + PtrQueueSet *fl_owner = NULL) { _max_completed_queue = max_completed_queue; assert(cbl_mon != NULL && fl_lock != NULL, "Init order issue?"); - _cbl_mon = cbl_mon; _fl_lock = fl_lock; + _cbl_mon = cbl_mon; + _fl_lock = fl_lock; + _fl_owner = (fl_owner != NULL) ? fl_owner : this; } // Return an empty oop array of size _sz (required to be non-zero). @@ -228,4 +234,7 @@ public: void reduce_free_list(); size_t completed_buffers_num() { return _n_completed_buffers; } + + void merge_bufferlists(PtrQueueSet* src); + void merge_freelists(PtrQueueSet* src); }; diff --git a/hotspot/src/share/vm/memory/cardTableModRefBS.cpp b/hotspot/src/share/vm/memory/cardTableModRefBS.cpp index a47d62b7f1a..7ff64eae1c3 100644 --- a/hotspot/src/share/vm/memory/cardTableModRefBS.cpp +++ b/hotspot/src/share/vm/memory/cardTableModRefBS.cpp @@ -356,18 +356,62 @@ void CardTableModRefBS::write_ref_field_work(void* field, oop newVal) { inline_write_ref_field(field, newVal); } +/* + Claimed and deferred bits are used together in G1 during the evacuation + pause. These bits can have the following state transitions: + 1. The claimed bit can be put over any other card state. Except that + the "dirty -> dirty and claimed" transition is checked for in + G1 code and is not used. + 2. Deferred bit can be set only if the previous state of the card + was either clean or claimed. mark_card_deferred() is wait-free. + We do not care if the operation is be successful because if + it does not it will only result in duplicate entry in the update + buffer because of the "cache-miss". So it's not worth spinning. + */ + bool CardTableModRefBS::claim_card(size_t card_index) { jbyte val = _byte_map[card_index]; - if (val != claimed_card_val()) { - jbyte res = Atomic::cmpxchg((jbyte) claimed_card_val(), &_byte_map[card_index], val); - if (res == val) + assert(val != dirty_card_val(), "Shouldn't claim a dirty card"); + while (val == clean_card_val() || + (val & (clean_card_mask_val() | claimed_card_val())) != claimed_card_val()) { + jbyte new_val = val; + if (val == clean_card_val()) { + new_val = (jbyte)claimed_card_val(); + } else { + new_val = val | (jbyte)claimed_card_val(); + } + jbyte res = Atomic::cmpxchg(new_val, &_byte_map[card_index], val); + if (res == val) { return true; - else return false; + } + val = res; } return false; } +bool CardTableModRefBS::mark_card_deferred(size_t card_index) { + jbyte val = _byte_map[card_index]; + // It's already processed + if ((val & (clean_card_mask_val() | deferred_card_val())) == deferred_card_val()) { + return false; + } + // Cached bit can be installed either on a clean card or on a claimed card. + jbyte new_val = val; + if (val == clean_card_val()) { + new_val = (jbyte)deferred_card_val(); + } else { + if (val & claimed_card_val()) { + new_val = val | (jbyte)deferred_card_val(); + } + } + if (new_val != val) { + Atomic::cmpxchg(new_val, &_byte_map[card_index], val); + } + return true; +} + + void CardTableModRefBS::non_clean_card_iterate(Space* sp, MemRegion mr, DirtyCardToOopClosure* dcto_cl, diff --git a/hotspot/src/share/vm/memory/cardTableModRefBS.hpp b/hotspot/src/share/vm/memory/cardTableModRefBS.hpp index 9a48ab5497d..986230f8328 100644 --- a/hotspot/src/share/vm/memory/cardTableModRefBS.hpp +++ b/hotspot/src/share/vm/memory/cardTableModRefBS.hpp @@ -52,11 +52,15 @@ class CardTableModRefBS: public ModRefBarrierSet { enum CardValues { clean_card = -1, + // The mask contains zeros in places for all other values. + clean_card_mask = clean_card - 31, + dirty_card = 0, precleaned_card = 1, - claimed_card = 3, - last_card = 4, - CT_MR_BS_last_reserved = 10 + claimed_card = 2, + deferred_card = 4, + last_card = 8, + CT_MR_BS_last_reserved = 16 }; // dirty and precleaned are equivalent wrt younger_refs_iter. @@ -254,9 +258,11 @@ public: }; static int clean_card_val() { return clean_card; } + static int clean_card_mask_val() { return clean_card_mask; } static int dirty_card_val() { return dirty_card; } static int claimed_card_val() { return claimed_card; } static int precleaned_card_val() { return precleaned_card; } + static int deferred_card_val() { return deferred_card; } // For RTTI simulation. bool is_a(BarrierSet::Name bsn) { @@ -329,7 +335,8 @@ public: } bool is_card_claimed(size_t card_index) { - return _byte_map[card_index] == claimed_card_val(); + jbyte val = _byte_map[card_index]; + return (val & (clean_card_mask_val() | claimed_card_val())) == claimed_card_val(); } bool claim_card(size_t card_index); @@ -338,6 +345,13 @@ public: return _byte_map[card_index] == clean_card_val(); } + bool is_card_deferred(size_t card_index) { + jbyte val = _byte_map[card_index]; + return (val & (clean_card_mask_val() | deferred_card_val())) == deferred_card_val(); + } + + bool mark_card_deferred(size_t card_index); + // Card marking array base (adjusted for heap low boundary) // This would be the 0th element of _byte_map, if the heap started at 0x0. // But since the heap starts at some higher address, this points to somewhere @@ -434,6 +448,10 @@ public: return byte_for(p) - _byte_map; } + const jbyte* byte_for_index(const size_t card_index) const { + return _byte_map + card_index; + } + void verify(); void verify_guard(); From 26d192003fd702e3366beedcda7efb45d208acc6 Mon Sep 17 00:00:00 2001 From: John R Rose Date: Fri, 6 Mar 2009 21:36:50 -0800 Subject: [PATCH 099/292] 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638) Code in vtableStubs and templateTable moved into MacroAssembler. Reviewed-by: kvn --- hotspot/src/cpu/sparc/vm/assembler_sparc.cpp | 129 ++++++++++++++++++ hotspot/src/cpu/sparc/vm/assembler_sparc.hpp | 28 ++++ .../cpu/sparc/vm/assembler_sparc.inline.hpp | 5 + .../src/cpu/sparc/vm/vtableStubs_sparc.cpp | 75 ++++------ hotspot/src/cpu/x86/vm/assembler_x86.cpp | 75 ++++++++++ hotspot/src/cpu/x86/vm/assembler_x86.hpp | 8 ++ .../src/cpu/x86/vm/templateTable_x86_32.cpp | 91 +++++------- .../src/cpu/x86/vm/templateTable_x86_64.cpp | 116 +++++----------- hotspot/src/cpu/x86/vm/vtableStubs_x86_32.cpp | 89 ++++++------ hotspot/src/cpu/x86/vm/vtableStubs_x86_64.cpp | 83 ++++------- 10 files changed, 408 insertions(+), 291 deletions(-) diff --git a/hotspot/src/cpu/sparc/vm/assembler_sparc.cpp b/hotspot/src/cpu/sparc/vm/assembler_sparc.cpp index b9d8f6de537..d9a7cf076da 100644 --- a/hotspot/src/cpu/sparc/vm/assembler_sparc.cpp +++ b/hotspot/src/cpu/sparc/vm/assembler_sparc.cpp @@ -2638,6 +2638,135 @@ RegisterConstant MacroAssembler::delayed_value(intptr_t* delayed_value_addr, } +void MacroAssembler::regcon_inc_ptr( RegisterConstant& dest, RegisterConstant src, Register temp ) { + assert(dest.register_or_noreg() != G0, "lost side effect"); + if ((src.is_constant() && src.as_constant() == 0) || + (src.is_register() && src.as_register() == G0)) { + // do nothing + } else if (dest.is_register()) { + add(dest.as_register(), ensure_rs2(src, temp), dest.as_register()); + } else if (src.is_constant()) { + intptr_t res = dest.as_constant() + src.as_constant(); + dest = RegisterConstant(res); // side effect seen by caller + } else { + assert(temp != noreg, "cannot handle constant += register"); + add(src.as_register(), ensure_rs2(dest, temp), temp); + dest = RegisterConstant(temp); // side effect seen by caller + } +} + +void MacroAssembler::regcon_sll_ptr( RegisterConstant& dest, RegisterConstant src, Register temp ) { + assert(dest.register_or_noreg() != G0, "lost side effect"); + if (!is_simm13(src.constant_or_zero())) + src = (src.as_constant() & 0xFF); + if ((src.is_constant() && src.as_constant() == 0) || + (src.is_register() && src.as_register() == G0)) { + // do nothing + } else if (dest.is_register()) { + sll_ptr(dest.as_register(), src, dest.as_register()); + } else if (src.is_constant()) { + intptr_t res = dest.as_constant() << src.as_constant(); + dest = RegisterConstant(res); // side effect seen by caller + } else { + assert(temp != noreg, "cannot handle constant <<= register"); + set(dest.as_constant(), temp); + sll_ptr(temp, src, temp); + dest = RegisterConstant(temp); // side effect seen by caller + } +} + + +// Look up the method for a megamorphic invokeinterface call. +// The target method is determined by . +// The receiver klass is in recv_klass. +// On success, the result will be in method_result, and execution falls through. +// On failure, execution transfers to the given label. +void MacroAssembler::lookup_interface_method(Register recv_klass, + Register intf_klass, + RegisterConstant itable_index, + Register method_result, + Register scan_temp, + Register sethi_temp, + Label& L_no_such_interface) { + assert_different_registers(recv_klass, intf_klass, method_result, scan_temp); + assert(itable_index.is_constant() || itable_index.as_register() == method_result, + "caller must use same register for non-constant itable index as for method"); + + // Compute start of first itableOffsetEntry (which is at the end of the vtable) + int vtable_base = instanceKlass::vtable_start_offset() * wordSize; + int scan_step = itableOffsetEntry::size() * wordSize; + int vte_size = vtableEntry::size() * wordSize; + + lduw(recv_klass, instanceKlass::vtable_length_offset() * wordSize, scan_temp); + // %%% We should store the aligned, prescaled offset in the klassoop. + // Then the next several instructions would fold away. + + int round_to_unit = ((HeapWordsPerLong > 1) ? BytesPerLong : 0); + int itb_offset = vtable_base; + if (round_to_unit != 0) { + // hoist first instruction of round_to(scan_temp, BytesPerLong): + itb_offset += round_to_unit - wordSize; + } + int itb_scale = exact_log2(vtableEntry::size() * wordSize); + sll(scan_temp, itb_scale, scan_temp); + add(scan_temp, itb_offset, scan_temp); + if (round_to_unit != 0) { + // Round up to align_object_offset boundary + // see code for instanceKlass::start_of_itable! + // Was: round_to(scan_temp, BytesPerLong); + // Hoisted: add(scan_temp, BytesPerLong-1, scan_temp); + and3(scan_temp, -round_to_unit, scan_temp); + } + add(recv_klass, scan_temp, scan_temp); + + // Adjust recv_klass by scaled itable_index, so we can free itable_index. + RegisterConstant itable_offset = itable_index; + regcon_sll_ptr(itable_offset, exact_log2(itableMethodEntry::size() * wordSize)); + regcon_inc_ptr(itable_offset, itableMethodEntry::method_offset_in_bytes()); + add(recv_klass, ensure_rs2(itable_offset, sethi_temp), recv_klass); + + // for (scan = klass->itable(); scan->interface() != NULL; scan += scan_step) { + // if (scan->interface() == intf) { + // result = (klass + scan->offset() + itable_index); + // } + // } + Label search, found_method; + + for (int peel = 1; peel >= 0; peel--) { + // %%%% Could load both offset and interface in one ldx, if they were + // in the opposite order. This would save a load. + ld_ptr(scan_temp, itableOffsetEntry::interface_offset_in_bytes(), method_result); + + // Check that this entry is non-null. A null entry means that + // the receiver class doesn't implement the interface, and wasn't the + // same as when the caller was compiled. + bpr(Assembler::rc_z, false, Assembler::pn, method_result, L_no_such_interface); + delayed()->cmp(method_result, intf_klass); + + if (peel) { + brx(Assembler::equal, false, Assembler::pt, found_method); + } else { + brx(Assembler::notEqual, false, Assembler::pn, search); + // (invert the test to fall through to found_method...) + } + delayed()->add(scan_temp, scan_step, scan_temp); + + if (!peel) break; + + bind(search); + } + + bind(found_method); + + // Got a hit. + int ito_offset = itableOffsetEntry::offset_offset_in_bytes(); + // scan_temp[-scan_step] points to the vtable offset we need + ito_offset -= scan_step; + lduw(scan_temp, ito_offset, scan_temp); + ld_ptr(recv_klass, scan_temp, method_result); +} + + void MacroAssembler::biased_locking_enter(Register obj_reg, Register mark_reg, Register temp_reg, Label& done, Label* slow_case, diff --git a/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp b/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp index db934b139e4..8f1de780c28 100644 --- a/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp +++ b/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp @@ -1859,6 +1859,7 @@ class MacroAssembler: public Assembler { // Functions for isolating 64 bit shifts for LP64 inline void sll_ptr( Register s1, Register s2, Register d ); inline void sll_ptr( Register s1, int imm6a, Register d ); + inline void sll_ptr( Register s1, RegisterConstant s2, Register d ); inline void srl_ptr( Register s1, Register s2, Register d ); inline void srl_ptr( Register s1, int imm6a, Register d ); @@ -1986,6 +1987,25 @@ class MacroAssembler: public Assembler { void load_sized_value(Register s1, RegisterConstant s2, Register d, int size_in_bytes, bool is_signed); + // Helpers for address formation. + // They update the dest in place, whether it is a register or constant. + // They emit no code at all if src is a constant zero. + // If dest is a constant and src is a register, the temp argument + // is required, and becomes the result. + // If dest is a register and src is a non-simm13 constant, + // the temp argument is required, and is used to materialize the constant. + void regcon_inc_ptr( RegisterConstant& dest, RegisterConstant src, + Register temp = noreg ); + void regcon_sll_ptr( RegisterConstant& dest, RegisterConstant src, + Register temp = noreg ); + RegisterConstant ensure_rs2(RegisterConstant rs2, Register sethi_temp) { + guarantee(sethi_temp != noreg, "constant offset overflow"); + if (is_simm13(rs2.constant_or_zero())) + return rs2; // register or short constant + set(rs2.as_constant(), sethi_temp); + return sethi_temp; + } + // -------------------------------------------------- public: @@ -2299,6 +2319,14 @@ class MacroAssembler: public Assembler { ); void tlab_refill(Label& retry_tlab, Label& try_eden, Label& slow_case); + // interface method calling + void lookup_interface_method(Register recv_klass, + Register intf_klass, + RegisterConstant itable_index, + Register method_result, + Register temp_reg, Register temp2_reg, + Label& no_such_interface); + // Stack overflow checking // Note: this clobbers G3_scratch diff --git a/hotspot/src/cpu/sparc/vm/assembler_sparc.inline.hpp b/hotspot/src/cpu/sparc/vm/assembler_sparc.inline.hpp index 23810ed0647..d31ab55f3f4 100644 --- a/hotspot/src/cpu/sparc/vm/assembler_sparc.inline.hpp +++ b/hotspot/src/cpu/sparc/vm/assembler_sparc.inline.hpp @@ -455,6 +455,11 @@ inline void MacroAssembler::srl_ptr( Register s1, int imm6a, Register d ) { #endif } +inline void MacroAssembler::sll_ptr( Register s1, RegisterConstant s2, Register d ) { + if (s2.is_register()) sll_ptr(s1, s2.as_register(), d); + else sll_ptr(s1, s2.as_constant(), d); +} + // Use the right branch for the platform inline void MacroAssembler::br( Condition c, bool a, Predict p, address d, relocInfo::relocType rt ) { diff --git a/hotspot/src/cpu/sparc/vm/vtableStubs_sparc.cpp b/hotspot/src/cpu/sparc/vm/vtableStubs_sparc.cpp index af2536b7c48..df9262ccbbd 100644 --- a/hotspot/src/cpu/sparc/vm/vtableStubs_sparc.cpp +++ b/hotspot/src/cpu/sparc/vm/vtableStubs_sparc.cpp @@ -106,6 +106,15 @@ VtableStub* VtableStubs::create_vtable_stub(int vtable_index) { __ delayed()->nop(); masm->flush(); + + if (PrintMiscellaneous && (WizardMode || Verbose)) { + tty->print_cr("vtable #%d at "PTR_FORMAT"[%d] left over: %d", + vtable_index, s->entry_point(), + (int)(s->code_end() - s->entry_point()), + (int)(s->code_end() - __ pc())); + } + guarantee(__ pc() <= s->code_end(), "overflowed buffer"); + s->set_exception_points(npe_addr, ame_addr); return s; } @@ -113,9 +122,9 @@ VtableStub* VtableStubs::create_vtable_stub(int vtable_index) { // NOTE: %%%% if any change is made to this stub make sure that the function // pd_code_size_limit is changed to ensure the correct size for VtableStub -VtableStub* VtableStubs::create_itable_stub(int vtable_index) { +VtableStub* VtableStubs::create_itable_stub(int itable_index) { const int sparc_code_length = VtableStub::pd_code_size_limit(false); - VtableStub* s = new(sparc_code_length) VtableStub(false, vtable_index); + VtableStub* s = new(sparc_code_length) VtableStub(false, itable_index); ResourceMark rm; CodeBuffer cb(s->entry_point(), sparc_code_length); MacroAssembler* masm = new MacroAssembler(&cb); @@ -139,7 +148,6 @@ VtableStub* VtableStubs::create_itable_stub(int vtable_index) { // are passed in the %o registers. Instead, longs are passed in G1 and G4 // and so those registers are not available here. __ save(SP,-frame::register_save_words*wordSize,SP); - Register I0_receiver = I0; // Location of receiver after save #ifndef PRODUCT if (CountCompiledCalls) { @@ -151,63 +159,31 @@ VtableStub* VtableStubs::create_itable_stub(int vtable_index) { } #endif /* PRODUCT */ - // load start of itable entries into L0 register - const int base = instanceKlass::vtable_start_offset() * wordSize; - __ ld(Address(G3_klassOop, 0, instanceKlass::vtable_length_offset() * wordSize), L0); - - // %%% Could store the aligned, prescaled offset in the klassoop. - __ sll(L0, exact_log2(vtableEntry::size() * wordSize), L0); - // see code for instanceKlass::start_of_itable! - const int vtable_alignment = align_object_offset(1); - assert(vtable_alignment == 1 || vtable_alignment == 2, ""); - const int odd_bit = vtableEntry::size() * wordSize; - if (vtable_alignment == 2) { - __ and3(L0, odd_bit, L1); // isolate the odd bit - } - __ add(G3_klassOop, L0, L0); - if (vtable_alignment == 2) { - __ add(L0, L1, L0); // double the odd bit, to align up - } - - // Loop over all itable entries until desired interfaceOop (G5_interface) found - __ bind(search); - - // %%%% Could load both offset and interface in one ldx, if they were - // in the opposite order. This would save a load. - __ ld_ptr(L0, base + itableOffsetEntry::interface_offset_in_bytes(), L1); - - // If the entry is NULL then we've reached the end of the table - // without finding the expected interface, so throw an exception Label throw_icce; - __ bpr(Assembler::rc_z, false, Assembler::pn, L1, throw_icce); - __ delayed()->cmp(G5_interface, L1); - __ brx(Assembler::notEqual, true, Assembler::pn, search); - __ delayed()->add(L0, itableOffsetEntry::size() * wordSize, L0); - // entry found and L0 points to it, move offset of vtable for interface into L0 - __ ld(L0, base + itableOffsetEntry::offset_offset_in_bytes(), L0); - - // Compute itableMethodEntry and get methodOop(G5_method) and entrypoint(L0) for compiler - const int method_offset = (itableMethodEntry::size() * wordSize * vtable_index) + itableMethodEntry::method_offset_in_bytes(); - __ add(G3_klassOop, L0, L1); - __ ld_ptr(L1, method_offset, G5_method); + Register L5_method = L5; + __ lookup_interface_method(// inputs: rec. class, interface, itable index + G3_klassOop, G5_interface, itable_index, + // outputs: method, scan temp. reg + L5_method, L2, L3, + throw_icce); #ifndef PRODUCT if (DebugVtables) { Label L01; - __ ld_ptr(L1, method_offset, G5_method); - __ bpr(Assembler::rc_nz, false, Assembler::pt, G5_method, L01); + __ bpr(Assembler::rc_nz, false, Assembler::pt, L5_method, L01); __ delayed()->nop(); __ stop("methodOop is null"); __ bind(L01); - __ verify_oop(G5_method); + __ verify_oop(L5_method); } #endif // If the following load is through a NULL pointer, we'll take an OS // exception that should translate into an AbstractMethodError. We need the // window count to be correct at that time. - __ restore(); // Restore registers BEFORE the AME point + __ restore(L5_method, 0, G5_method); + // Restore registers *before* the AME point. address ame_addr = __ pc(); // if the vtable entry is null, the method is abstract __ ld_ptr(G5_method, in_bytes(methodOopDesc::from_compiled_offset()), G3_scratch); @@ -225,6 +201,12 @@ VtableStub* VtableStubs::create_itable_stub(int vtable_index) { masm->flush(); + if (PrintMiscellaneous && (WizardMode || Verbose)) { + tty->print_cr("itable #%d at "PTR_FORMAT"[%d] left over: %d", + itable_index, s->entry_point(), + (int)(s->code_end() - s->entry_point()), + (int)(s->code_end() - __ pc())); + } guarantee(__ pc() <= s->code_end(), "overflowed buffer"); s->set_exception_points(npe_addr, ame_addr); @@ -243,8 +225,7 @@ int VtableStub::pd_code_size_limit(bool is_vtable_stub) { (UseCompressedOops ? 2*BytesPerInstWord : 0); return basic + slop; } else { - // save, ld, ld, sll, and, add, add, ld, cmp, br, add, ld, add, ld, ld, jmp, restore, sethi, jmpl, restore - const int basic = (20 LP64_ONLY(+ 6)) * BytesPerInstWord + + const int basic = (28 LP64_ONLY(+ 6)) * BytesPerInstWord + // shift;add for load_klass (UseCompressedOops ? 2*BytesPerInstWord : 0); return (basic + slop); diff --git a/hotspot/src/cpu/x86/vm/assembler_x86.cpp b/hotspot/src/cpu/x86/vm/assembler_x86.cpp index c1c49fc7659..35acd45013e 100644 --- a/hotspot/src/cpu/x86/vm/assembler_x86.cpp +++ b/hotspot/src/cpu/x86/vm/assembler_x86.cpp @@ -7076,6 +7076,81 @@ void MacroAssembler::trigfunc(char trig, int num_fpu_regs_in_use) { } +// Look up the method for a megamorphic invokeinterface call. +// The target method is determined by . +// The receiver klass is in recv_klass. +// On success, the result will be in method_result, and execution falls through. +// On failure, execution transfers to the given label. +void MacroAssembler::lookup_interface_method(Register recv_klass, + Register intf_klass, + RegisterConstant itable_index, + Register method_result, + Register scan_temp, + Label& L_no_such_interface) { + assert_different_registers(recv_klass, intf_klass, method_result, scan_temp); + assert(itable_index.is_constant() || itable_index.as_register() == method_result, + "caller must use same register for non-constant itable index as for method"); + + // Compute start of first itableOffsetEntry (which is at the end of the vtable) + int vtable_base = instanceKlass::vtable_start_offset() * wordSize; + int itentry_off = itableMethodEntry::method_offset_in_bytes(); + int scan_step = itableOffsetEntry::size() * wordSize; + int vte_size = vtableEntry::size() * wordSize; + Address::ScaleFactor times_vte_scale = Address::times_ptr; + assert(vte_size == wordSize, "else adjust times_vte_scale"); + + movl(scan_temp, Address(recv_klass, instanceKlass::vtable_length_offset() * wordSize)); + + // %%% Could store the aligned, prescaled offset in the klassoop. + lea(scan_temp, Address(recv_klass, scan_temp, times_vte_scale, vtable_base)); + if (HeapWordsPerLong > 1) { + // Round up to align_object_offset boundary + // see code for instanceKlass::start_of_itable! + round_to(scan_temp, BytesPerLong); + } + + // Adjust recv_klass by scaled itable_index, so we can free itable_index. + assert(itableMethodEntry::size() * wordSize == wordSize, "adjust the scaling in the code below"); + lea(recv_klass, Address(recv_klass, itable_index, Address::times_ptr, itentry_off)); + + // for (scan = klass->itable(); scan->interface() != NULL; scan += scan_step) { + // if (scan->interface() == intf) { + // result = (klass + scan->offset() + itable_index); + // } + // } + Label search, found_method; + + for (int peel = 1; peel >= 0; peel--) { + movptr(method_result, Address(scan_temp, itableOffsetEntry::interface_offset_in_bytes())); + cmpptr(intf_klass, method_result); + + if (peel) { + jccb(Assembler::equal, found_method); + } else { + jccb(Assembler::notEqual, search); + // (invert the test to fall through to found_method...) + } + + if (!peel) break; + + bind(search); + + // Check that the previous entry is non-null. A null entry means that + // the receiver class doesn't implement the interface, and wasn't the + // same as when the caller was compiled. + testptr(method_result, method_result); + jcc(Assembler::zero, L_no_such_interface); + addptr(scan_temp, scan_step); + } + + bind(found_method); + + // Got a hit. + movl(scan_temp, Address(scan_temp, itableOffsetEntry::offset_offset_in_bytes())); + movptr(method_result, Address(recv_klass, scan_temp, Address::times_1)); +} + + void MacroAssembler::ucomisd(XMMRegister dst, AddressLiteral src) { ucomisd(dst, as_Address(src)); } diff --git a/hotspot/src/cpu/x86/vm/assembler_x86.hpp b/hotspot/src/cpu/x86/vm/assembler_x86.hpp index 78b6dadede7..8f8956a2758 100644 --- a/hotspot/src/cpu/x86/vm/assembler_x86.hpp +++ b/hotspot/src/cpu/x86/vm/assembler_x86.hpp @@ -1765,6 +1765,14 @@ class MacroAssembler: public Assembler { ); void tlab_refill(Label& retry_tlab, Label& try_eden, Label& slow_case); + // interface method calling + void lookup_interface_method(Register recv_klass, + Register intf_klass, + RegisterConstant itable_index, + Register method_result, + Register scan_temp, + Label& no_such_interface); + //---- void set_word_if_not_zero(Register reg); // sets reg to 1 if not zero, otherwise 0 diff --git a/hotspot/src/cpu/x86/vm/templateTable_x86_32.cpp b/hotspot/src/cpu/x86/vm/templateTable_x86_32.cpp index 598c1a64457..5a00db6218e 100644 --- a/hotspot/src/cpu/x86/vm/templateTable_x86_32.cpp +++ b/hotspot/src/cpu/x86/vm/templateTable_x86_32.cpp @@ -3055,35 +3055,44 @@ void TemplateTable::invokeinterface(int byte_no) { // profile this call __ profile_virtual_call(rdx, rsi, rdi); - __ mov(rdi, rdx); // Save klassOop in rdi + Label no_such_interface, no_such_method; - // Compute start of first itableOffsetEntry (which is at the end of the vtable) - const int base = instanceKlass::vtable_start_offset() * wordSize; - assert(vtableEntry::size() * wordSize == (1 << (int)Address::times_ptr), "adjust the scaling in the code below"); - __ movl(rsi, Address(rdx, instanceKlass::vtable_length_offset() * wordSize)); // Get length of vtable - __ lea(rdx, Address(rdx, rsi, Address::times_4, base)); - if (HeapWordsPerLong > 1) { - // Round up to align_object_offset boundary - __ round_to(rdx, BytesPerLong); - } + __ lookup_interface_method(// inputs: rec. class, interface, itable index + rdx, rax, rbx, + // outputs: method, scan temp. reg + rbx, rsi, + no_such_interface); - Label entry, search, interface_ok; + // rbx,: methodOop to call + // rcx: receiver + // Check for abstract method error + // Note: This should be done more efficiently via a throw_abstract_method_error + // interpreter entry point and a conditional jump to it in case of a null + // method. + __ testptr(rbx, rbx); + __ jcc(Assembler::zero, no_such_method); - __ jmpb(entry); - __ bind(search); - __ addptr(rdx, itableOffsetEntry::size() * wordSize); + // do the call + // rcx: receiver + // rbx,: methodOop + __ jump_from_interpreted(rbx, rdx); + __ should_not_reach_here(); - __ bind(entry); + // exception handling code follows... + // note: must restore interpreter registers to canonical + // state for exception handling to work correctly! - // Check that the entry is non-null. A null entry means that the receiver - // class doesn't implement the interface, and wasn't the same as the - // receiver class checked when the interface was resolved. - __ push(rdx); - __ movptr(rdx, Address(rdx, itableOffsetEntry::interface_offset_in_bytes())); - __ testptr(rdx, rdx); - __ jcc(Assembler::notZero, interface_ok); + __ bind(no_such_method); + // throw exception + __ pop(rbx); // pop return address (pushed by prepare_invoke) + __ restore_bcp(); // rsi must be correct for exception handler (was destroyed) + __ restore_locals(); // make sure locals pointer is correct as well (was destroyed) + __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_AbstractMethodError)); + // the call_VM checks for exception, so we should never return here. + __ should_not_reach_here(); + + __ bind(no_such_interface); // throw exception - __ pop(rdx); // pop saved register first. __ pop(rbx); // pop return address (pushed by prepare_invoke) __ restore_bcp(); // rsi must be correct for exception handler (was destroyed) __ restore_locals(); // make sure locals pointer is correct as well (was destroyed) @@ -3091,42 +3100,6 @@ void TemplateTable::invokeinterface(int byte_no) { InterpreterRuntime::throw_IncompatibleClassChangeError)); // the call_VM checks for exception, so we should never return here. __ should_not_reach_here(); - __ bind(interface_ok); - - __ pop(rdx); - - __ cmpptr(rax, Address(rdx, itableOffsetEntry::interface_offset_in_bytes())); - __ jcc(Assembler::notEqual, search); - - __ movl(rdx, Address(rdx, itableOffsetEntry::offset_offset_in_bytes())); - __ addptr(rdx, rdi); // Add offset to klassOop - assert(itableMethodEntry::size() * wordSize == (1 << (int)Address::times_ptr), "adjust the scaling in the code below"); - __ movptr(rbx, Address(rdx, rbx, Address::times_ptr)); - // rbx,: methodOop to call - // rcx: receiver - // Check for abstract method error - // Note: This should be done more efficiently via a throw_abstract_method_error - // interpreter entry point and a conditional jump to it in case of a null - // method. - { Label L; - __ testptr(rbx, rbx); - __ jcc(Assembler::notZero, L); - // throw exception - // note: must restore interpreter registers to canonical - // state for exception handling to work correctly! - __ pop(rbx); // pop return address (pushed by prepare_invoke) - __ restore_bcp(); // rsi must be correct for exception handler (was destroyed) - __ restore_locals(); // make sure locals pointer is correct as well (was destroyed) - __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_AbstractMethodError)); - // the call_VM checks for exception, so we should never return here. - __ should_not_reach_here(); - __ bind(L); - } - - // do the call - // rcx: receiver - // rbx,: methodOop - __ jump_from_interpreted(rbx, rdx); } //---------------------------------------------------------------------------------------------------- diff --git a/hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp b/hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp index 24fb31d4b27..048b8bb1176 100644 --- a/hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp +++ b/hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp @@ -3010,97 +3010,55 @@ void TemplateTable::invokeinterface(int byte_no) { // profile this call __ profile_virtual_call(rdx, r13, r14); - __ mov(r14, rdx); // Save klassOop in r14 + Label no_such_interface, no_such_method; - // Compute start of first itableOffsetEntry (which is at the end of - // the vtable) - const int base = instanceKlass::vtable_start_offset() * wordSize; - // Get length of vtable - assert(vtableEntry::size() * wordSize == 8, - "adjust the scaling in the code below"); - __ movl(r13, Address(rdx, - instanceKlass::vtable_length_offset() * wordSize)); - __ lea(rdx, Address(rdx, r13, Address::times_8, base)); + __ lookup_interface_method(// inputs: rec. class, interface, itable index + rdx, rax, rbx, + // outputs: method, scan temp. reg + rbx, r13, + no_such_interface); - if (HeapWordsPerLong > 1) { - // Round up to align_object_offset boundary - __ round_to(rdx, BytesPerLong); - } + // rbx,: methodOop to call + // rcx: receiver + // Check for abstract method error + // Note: This should be done more efficiently via a throw_abstract_method_error + // interpreter entry point and a conditional jump to it in case of a null + // method. + __ testptr(rbx, rbx); + __ jcc(Assembler::zero, no_such_method); - Label entry, search, interface_ok; + // do the call + // rcx: receiver + // rbx,: methodOop + __ jump_from_interpreted(rbx, rdx); + __ should_not_reach_here(); - __ jmpb(entry); - __ bind(search); - __ addptr(rdx, itableOffsetEntry::size() * wordSize); + // exception handling code follows... + // note: must restore interpreter registers to canonical + // state for exception handling to work correctly! - __ bind(entry); - - // Check that the entry is non-null. A null entry means that the - // receiver class doesn't implement the interface, and wasn't the - // same as the receiver class checked when the interface was - // resolved. - __ push(rdx); - __ movptr(rdx, Address(rdx, itableOffsetEntry::interface_offset_in_bytes())); - __ testptr(rdx, rdx); - __ jcc(Assembler::notZero, interface_ok); + __ bind(no_such_method); // throw exception - __ pop(rdx); // pop saved register first. - __ pop(rbx); // pop return address (pushed by prepare_invoke) - __ restore_bcp(); // r13 must be correct for exception handler (was - // destroyed) - __ restore_locals(); // make sure locals pointer is correct as well - // (was destroyed) + __ pop(rbx); // pop return address (pushed by prepare_invoke) + __ restore_bcp(); // r13 must be correct for exception handler (was destroyed) + __ restore_locals(); // make sure locals pointer is correct as well (was destroyed) + __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_AbstractMethodError)); + // the call_VM checks for exception, so we should never return here. + __ should_not_reach_here(); + + __ bind(no_such_interface); + // throw exception + __ pop(rbx); // pop return address (pushed by prepare_invoke) + __ restore_bcp(); // r13 must be correct for exception handler (was destroyed) + __ restore_locals(); // make sure locals pointer is correct as well (was destroyed) __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_IncompatibleClassChangeError)); // the call_VM checks for exception, so we should never return here. __ should_not_reach_here(); - __ bind(interface_ok); - - __ pop(rdx); - - __ cmpptr(rax, Address(rdx, itableOffsetEntry::interface_offset_in_bytes())); - __ jcc(Assembler::notEqual, search); - - __ movl(rdx, Address(rdx, itableOffsetEntry::offset_offset_in_bytes())); - - __ addptr(rdx, r14); // Add offset to klassOop - assert(itableMethodEntry::size() * wordSize == 8, - "adjust the scaling in the code below"); - __ movptr(rbx, Address(rdx, rbx, Address::times_8)); - // rbx: methodOop to call - // rcx: receiver - // Check for abstract method error - // Note: This should be done more efficiently via a - // throw_abstract_method_error interpreter entry point and a - // conditional jump to it in case of a null method. - { - Label L; - __ testptr(rbx, rbx); - __ jcc(Assembler::notZero, L); - // throw exception - // note: must restore interpreter registers to canonical - // state for exception handling to work correctly! - __ pop(rbx); // pop return address (pushed by prepare_invoke) - __ restore_bcp(); // r13 must be correct for exception handler - // (was destroyed) - __ restore_locals(); // make sure locals pointer is correct as - // well (was destroyed) - __ call_VM(noreg, - CAST_FROM_FN_PTR(address, - InterpreterRuntime::throw_AbstractMethodError)); - // the call_VM checks for exception, so we should never return here. - __ should_not_reach_here(); - __ bind(L); - } - - __ movptr(rcx, Address(rbx, methodOopDesc::interpreter_entry_offset())); - - // do the call - // rcx: receiver - // rbx: methodOop - __ jump_from_interpreted(rbx, rdx); + return; } + //----------------------------------------------------------------------------- // Allocation diff --git a/hotspot/src/cpu/x86/vm/vtableStubs_x86_32.cpp b/hotspot/src/cpu/x86/vm/vtableStubs_x86_32.cpp index c077929db1a..dbc5e262a81 100644 --- a/hotspot/src/cpu/x86/vm/vtableStubs_x86_32.cpp +++ b/hotspot/src/cpu/x86/vm/vtableStubs_x86_32.cpp @@ -34,10 +34,16 @@ extern "C" void bad_compiled_vtable_index(JavaThread* thread, oop receiver, int index); #endif -// used by compiler only; may use only caller saved registers rax, rbx, rcx. -// rdx holds first int arg, rsi, rdi, rbp are callee-save & must be preserved. -// Leave receiver in rcx; required behavior when +OptoArgsInRegisters -// is modifed to put first oop in rcx. +// These stubs are used by the compiler only. +// Argument registers, which must be preserved: +// rcx - receiver (always first argument) +// rdx - second argument (if any) +// Other registers that might be usable: +// rax - inline cache register (is interface for itable stub) +// rbx - method (used when calling out to interpreter) +// Available now, but may become callee-save at some point: +// rsi, rdi +// Note that rax and rdx are also used for return values. // VtableStub* VtableStubs::create_vtable_stub(int vtable_index) { const int i486_code_length = VtableStub::pd_code_size_limit(true); @@ -94,16 +100,25 @@ VtableStub* VtableStubs::create_vtable_stub(int vtable_index) { __ jmp( Address(method, methodOopDesc::from_compiled_offset())); masm->flush(); + + if (PrintMiscellaneous && (WizardMode || Verbose)) { + tty->print_cr("vtable #%d at "PTR_FORMAT"[%d] left over: %d", + vtable_index, s->entry_point(), + (int)(s->code_end() - s->entry_point()), + (int)(s->code_end() - __ pc())); + } + guarantee(__ pc() <= s->code_end(), "overflowed buffer"); + s->set_exception_points(npe_addr, ame_addr); return s; } -VtableStub* VtableStubs::create_itable_stub(int vtable_index) { +VtableStub* VtableStubs::create_itable_stub(int itable_index) { // Note well: pd_code_size_limit is the absolute minimum we can get away with. If you // add code here, bump the code stub size returned by pd_code_size_limit! const int i486_code_length = VtableStub::pd_code_size_limit(false); - VtableStub* s = new(i486_code_length) VtableStub(false, vtable_index); + VtableStub* s = new(i486_code_length) VtableStub(false, itable_index); ResourceMark rm; CodeBuffer cb(s->entry_point(), i486_code_length); MacroAssembler* masm = new MacroAssembler(&cb); @@ -123,50 +138,19 @@ VtableStub* VtableStubs::create_itable_stub(int vtable_index) { // get receiver klass (also an implicit null-check) address npe_addr = __ pc(); - __ movptr(rbx, Address(rcx, oopDesc::klass_offset_in_bytes())); + __ movptr(rsi, Address(rcx, oopDesc::klass_offset_in_bytes())); - __ mov(rsi, rbx); // Save klass in free register - // Most registers are in use, so save a few - __ push(rdx); - // compute itable entry offset (in words) - const int base = instanceKlass::vtable_start_offset() * wordSize; - assert(vtableEntry::size() * wordSize == 4, "adjust the scaling in the code below"); - __ movl(rdx, Address(rbx, instanceKlass::vtable_length_offset() * wordSize)); // Get length of vtable - __ lea(rbx, Address(rbx, rdx, Address::times_ptr, base)); - if (HeapWordsPerLong > 1) { - // Round up to align_object_offset boundary - __ round_to(rbx, BytesPerLong); - } - - Label hit, next, entry, throw_icce; - - __ jmpb(entry); - - __ bind(next); - __ addptr(rbx, itableOffsetEntry::size() * wordSize); - - __ bind(entry); - - // If the entry is NULL then we've reached the end of the table - // without finding the expected interface, so throw an exception - __ movptr(rdx, Address(rbx, itableOffsetEntry::interface_offset_in_bytes())); - __ testptr(rdx, rdx); - __ jcc(Assembler::zero, throw_icce); - __ cmpptr(rax, rdx); - __ jcc(Assembler::notEqual, next); - - // We found a hit, move offset into rbx, - __ movl(rdx, Address(rbx, itableOffsetEntry::offset_offset_in_bytes())); - - // Compute itableMethodEntry. - const int method_offset = (itableMethodEntry::size() * wordSize * vtable_index) + itableMethodEntry::method_offset_in_bytes(); + // Most registers are in use; we'll use rax, rbx, rsi, rdi + // (If we need to make rsi, rdi callee-save, do a push/pop here.) + const Register method = rbx; + Label throw_icce; // Get methodOop and entrypoint for compiler - const Register method = rbx; - __ movptr(method, Address(rsi, rdx, Address::times_1, method_offset)); - - // Restore saved register, before possible trap. - __ pop(rdx); + __ lookup_interface_method(// inputs: rec. class, interface, itable index + rsi, rax, itable_index, + // outputs: method, scan temp. reg + method, rdi, + throw_icce); // method (rbx): methodOop // rcx: receiver @@ -187,12 +171,15 @@ VtableStub* VtableStubs::create_itable_stub(int vtable_index) { __ jmp(Address(method, methodOopDesc::from_compiled_offset())); __ bind(throw_icce); - // Restore saved register - __ pop(rdx); __ jump(RuntimeAddress(StubRoutines::throw_IncompatibleClassChangeError_entry())); - masm->flush(); + if (PrintMiscellaneous && (WizardMode || Verbose)) { + tty->print_cr("itable #%d at "PTR_FORMAT"[%d] left over: %d", + itable_index, s->entry_point(), + (int)(s->code_end() - s->entry_point()), + (int)(s->code_end() - __ pc())); + } guarantee(__ pc() <= s->code_end(), "overflowed buffer"); s->set_exception_points(npe_addr, ame_addr); @@ -207,7 +194,7 @@ int VtableStub::pd_code_size_limit(bool is_vtable_stub) { return (DebugVtables ? 210 : 16) + (CountCompiledCalls ? 6 : 0); } else { // Itable stub size - return (DebugVtables ? 144 : 64) + (CountCompiledCalls ? 6 : 0); + return (DebugVtables ? 256 : 66) + (CountCompiledCalls ? 6 : 0); } } diff --git a/hotspot/src/cpu/x86/vm/vtableStubs_x86_64.cpp b/hotspot/src/cpu/x86/vm/vtableStubs_x86_64.cpp index 7ae875b73cc..927bff5ca9e 100644 --- a/hotspot/src/cpu/x86/vm/vtableStubs_x86_64.cpp +++ b/hotspot/src/cpu/x86/vm/vtableStubs_x86_64.cpp @@ -98,17 +98,26 @@ VtableStub* VtableStubs::create_vtable_stub(int vtable_index) { __ jmp( Address(rbx, methodOopDesc::from_compiled_offset())); __ flush(); + + if (PrintMiscellaneous && (WizardMode || Verbose)) { + tty->print_cr("vtable #%d at "PTR_FORMAT"[%d] left over: %d", + vtable_index, s->entry_point(), + (int)(s->code_end() - s->entry_point()), + (int)(s->code_end() - __ pc())); + } + guarantee(__ pc() <= s->code_end(), "overflowed buffer"); + s->set_exception_points(npe_addr, ame_addr); return s; } -VtableStub* VtableStubs::create_itable_stub(int vtable_index) { +VtableStub* VtableStubs::create_itable_stub(int itable_index) { // Note well: pd_code_size_limit is the absolute minimum we can get // away with. If you add code here, bump the code stub size // returned by pd_code_size_limit! const int amd64_code_length = VtableStub::pd_code_size_limit(false); - VtableStub* s = new(amd64_code_length) VtableStub(false, vtable_index); + VtableStub* s = new(amd64_code_length) VtableStub(false, itable_index); ResourceMark rm; CodeBuffer cb(s->entry_point(), amd64_code_length); MacroAssembler* masm = new MacroAssembler(&cb); @@ -131,68 +140,28 @@ VtableStub* VtableStubs::create_itable_stub(int vtable_index) { // get receiver klass (also an implicit null-check) address npe_addr = __ pc(); - __ load_klass(rbx, j_rarg0); + // Most registers are in use; we'll use rax, rbx, r10, r11 + // (various calling sequences use r[cd]x, r[sd]i, r[89]; stay away from them) + __ load_klass(r10, j_rarg0); // If we take a trap while this arg is on the stack we will not // be able to walk the stack properly. This is not an issue except // when there are mistakes in this assembly code that could generate // a spurious fault. Ask me how I know... - __ push(j_rarg1); // Most registers are in use, so save one - - // compute itable entry offset (in words) - const int base = instanceKlass::vtable_start_offset() * wordSize; - assert(vtableEntry::size() * wordSize == 8, - "adjust the scaling in the code below"); - // Get length of vtable - __ movl(j_rarg1, - Address(rbx, instanceKlass::vtable_length_offset() * wordSize)); - __ lea(rbx, Address(rbx, j_rarg1, Address::times_8, base)); - - if (HeapWordsPerLong > 1) { - // Round up to align_object_offset boundary - __ round_to(rbx, BytesPerLong); - } - Label hit, next, entry, throw_icce; - - __ jmpb(entry); - - __ bind(next); - __ addptr(rbx, itableOffsetEntry::size() * wordSize); - - __ bind(entry); - - // If the entry is NULL then we've reached the end of the table - // without finding the expected interface, so throw an exception - __ movptr(j_rarg1, Address(rbx, itableOffsetEntry::interface_offset_in_bytes())); - __ testptr(j_rarg1, j_rarg1); - __ jcc(Assembler::zero, throw_icce); - __ cmpptr(rax, j_rarg1); - __ jccb(Assembler::notEqual, next); - - // We found a hit, move offset into j_rarg1 - __ movl(j_rarg1, Address(rbx, itableOffsetEntry::offset_offset_in_bytes())); - - // Compute itableMethodEntry - const int method_offset = - (itableMethodEntry::size() * wordSize * vtable_index) + - itableMethodEntry::method_offset_in_bytes(); + const Register method = rbx; + Label throw_icce; // Get methodOop and entrypoint for compiler - - // Get klass pointer again - __ load_klass(rax, j_rarg0); - - const Register method = rbx; - __ movptr(method, Address(rax, j_rarg1, Address::times_1, method_offset)); - - // Restore saved register, before possible trap. - __ pop(j_rarg1); + __ lookup_interface_method(// inputs: rec. class, interface, itable index + r10, rax, itable_index, + // outputs: method, scan temp. reg + method, r11, + throw_icce); // method (rbx): methodOop // j_rarg0: receiver - #ifdef ASSERT if (DebugVtables) { Label L2; @@ -211,12 +180,16 @@ VtableStub* VtableStubs::create_itable_stub(int vtable_index) { __ jmp(Address(method, methodOopDesc::from_compiled_offset())); __ bind(throw_icce); - // Restore saved register - __ pop(j_rarg1); __ jump(RuntimeAddress(StubRoutines::throw_IncompatibleClassChangeError_entry())); __ flush(); + if (PrintMiscellaneous && (WizardMode || Verbose)) { + tty->print_cr("itable #%d at "PTR_FORMAT"[%d] left over: %d", + itable_index, s->entry_point(), + (int)(s->code_end() - s->entry_point()), + (int)(s->code_end() - __ pc())); + } guarantee(__ pc() <= s->code_end(), "overflowed buffer"); s->set_exception_points(npe_addr, ame_addr); @@ -230,7 +203,7 @@ int VtableStub::pd_code_size_limit(bool is_vtable_stub) { (UseCompressedOops ? 16 : 0); // 1 leaq can be 3 bytes + 1 long } else { // Itable stub size - return (DebugVtables ? 636 : 72) + (CountCompiledCalls ? 13 : 0) + + return (DebugVtables ? 512 : 72) + (CountCompiledCalls ? 13 : 0) + (UseCompressedOops ? 32 : 0); // 2 leaqs } } From e7d899910b6525d370471440b96e160e7f2eef8f Mon Sep 17 00:00:00 2001 From: Antonios Printezis Date: Sat, 7 Mar 2009 11:07:36 -0500 Subject: [PATCH 100/292] 6810698: G1: two small bugs in the sparse remembered sets The _expanded flag of the sparse RSets is not reset and this can leave a RSet in an inconsistent state if it is expanded more than once. Also, we should be iterating over the _cur, instead of the _next, sparse table Reviewed-by: apetrusenko, iveresov --- hotspot/src/share/vm/gc_implementation/g1/sparsePRT.cpp | 1 + hotspot/src/share/vm/gc_implementation/g1/sparsePRT.hpp | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/hotspot/src/share/vm/gc_implementation/g1/sparsePRT.cpp b/hotspot/src/share/vm/gc_implementation/g1/sparsePRT.cpp index af25662f603..b8ace43a14a 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/sparsePRT.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/sparsePRT.cpp @@ -504,6 +504,7 @@ void SparsePRT::cleanup() { // Make sure that the current and next tables agree. (Another mechanism // takes care of deleting now-unused tables.) _cur = _next; + set_expanded(false); } void SparsePRT::expand() { diff --git a/hotspot/src/share/vm/gc_implementation/g1/sparsePRT.hpp b/hotspot/src/share/vm/gc_implementation/g1/sparsePRT.hpp index 7c914c7f65c..1159fd211da 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/sparsePRT.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/sparsePRT.hpp @@ -274,7 +274,7 @@ public: // Clean up all tables on the expanded list. Called single threaded. static void cleanup_all(); - RSHashTable* next() const { return _next; } + RSHashTable* cur() const { return _cur; } void init_iterator(SparsePRTIter* sprt_iter); @@ -300,7 +300,7 @@ public: {} void init(const SparsePRT* sprt) { - RSHashTableIter::init(sprt->next()); + RSHashTableIter::init(sprt->cur()); } bool has_next(size_t& card_index) { return RSHashTableIter::has_next(card_index); From 8893530f3a05d48dc8b9e13b7c481dcdcedbcfbb Mon Sep 17 00:00:00 2001 From: Antonios Printezis Date: Sat, 7 Mar 2009 11:07:37 -0500 Subject: [PATCH 101/292] 6812428: G1: Error: assert(ret || obj_in_cs(obj),"sanity") The length of the fast cset test vector is decided at the beginning of a GC, but more regions can be added during the GC. The simple fix is to set the length of the fast cset test vector to the max. Reviewed-by: iveresov --- hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp index efc42b440a1..6e25ee69284 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp @@ -2509,7 +2509,7 @@ G1CollectedHeap::do_collection_pause_at_safepoint(HeapRegion* popular_region) { guarantee(_in_cset_fast_test == NULL, "invariant"); guarantee(_in_cset_fast_test_base == NULL, "invariant"); - _in_cset_fast_test_length = n_regions(); + _in_cset_fast_test_length = max_regions(); _in_cset_fast_test_base = NEW_C_HEAP_ARRAY(bool, _in_cset_fast_test_length); memset(_in_cset_fast_test_base, false, From e4e765e34e6079deee88c30914a5e6144b5da2dd Mon Sep 17 00:00:00 2001 From: Antonios Printezis Date: Sat, 7 Mar 2009 11:07:37 -0500 Subject: [PATCH 102/292] 6814467: G1: small fixes related to concurrent marking verboseness A few small fixes to remove some inconsistencies in the concurrent mark-related verbose GC output. Reviewed-by: jmasa --- hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp | 4 ++++ .../share/vm/gc_implementation/g1/concurrentMarkThread.cpp | 4 +--- hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp | 1 - 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp index c7a7ca7dc8f..5b01157e9a4 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp @@ -420,6 +420,10 @@ ConcurrentMark::ConcurrentMark(ReservedSpace rs, _has_overflown(false), _concurrent(false), + _has_aborted(false), + _restart_for_overflow(false), + _concurrent_marking_in_progress(false), + _should_gray_objects(false), // _verbose_level set below diff --git a/hotspot/src/share/vm/gc_implementation/g1/concurrentMarkThread.cpp b/hotspot/src/share/vm/gc_implementation/g1/concurrentMarkThread.cpp index e26df0caae0..277ac636ecb 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/concurrentMarkThread.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentMarkThread.cpp @@ -107,7 +107,7 @@ void ConcurrentMarkThread::run() { if (PrintGC) { gclog_or_tty->date_stamp(PrintGCDateStamps); gclog_or_tty->stamp(PrintGCTimeStamps); - tty->print_cr("[GC concurrent-mark-start]"); + gclog_or_tty->print_cr("[GC concurrent-mark-start]"); } if (!g1_policy->in_young_gc_mode()) { @@ -320,8 +320,6 @@ void ConcurrentMarkThread::sleepBeforeNextCycle() { set_in_progress(); clear_started(); if (TraceConcurrentMark) gclog_or_tty->print_cr("CM-starting"); - - return; } // Note: this method, although exported by the ConcurrentMarkSweepThread, diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp index 6e25ee69284..8a788e3eb9e 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp @@ -2332,7 +2332,6 @@ class VerifyMarkedObjsClosure: public ObjectClosure { void G1CollectedHeap::checkConcurrentMark() { VerifyMarkedObjsClosure verifycl(this); - doConcurrentMark(); // MutexLockerEx x(getMarkBitMapLock(), // Mutex::_no_safepoint_check_flag); object_iterate(&verifycl); From 89cea91c48a02b63cee6eb486416dba833699043 Mon Sep 17 00:00:00 2001 From: Christian Thalinger Date: Mon, 9 Mar 2009 03:17:11 -0700 Subject: [PATCH 103/292] 6797305: Add LoadUB and LoadUI opcode class Add a LoadUB (unsigned byte) and LoadUI (unsigned int) opcode class so we have these load optimizations in the first place and do not need to handle them in the matcher. Reviewed-by: never, kvn --- hotspot/src/cpu/sparc/vm/sparc.ad | 119 +++++++--- hotspot/src/cpu/x86/vm/assembler_x86.cpp | 70 +++++- hotspot/src/cpu/x86/vm/assembler_x86.hpp | 22 +- hotspot/src/cpu/x86/vm/x86_32.ad | 206 ++++++++++++++---- hotspot/src/cpu/x86/vm/x86_64.ad | 198 ++++++++++------- hotspot/src/share/vm/adlc/forms.cpp | 3 + hotspot/src/share/vm/adlc/forms.hpp | 1 + hotspot/src/share/vm/adlc/formssel.cpp | 12 +- hotspot/src/share/vm/adlc/output_c.cpp | 55 ++++- hotspot/src/share/vm/opto/classes.hpp | 4 +- hotspot/src/share/vm/opto/compile.cpp | 4 +- hotspot/src/share/vm/opto/memnode.cpp | 20 +- hotspot/src/share/vm/opto/memnode.hpp | 27 ++- hotspot/src/share/vm/opto/mulnode.cpp | 50 +++-- hotspot/src/share/vm/opto/type.cpp | 4 +- hotspot/src/share/vm/opto/type.hpp | 3 +- .../test/compiler/6797305/Test6797305.java | 114 ++++++++++ 17 files changed, 726 insertions(+), 186 deletions(-) create mode 100644 hotspot/test/compiler/6797305/Test6797305.java diff --git a/hotspot/src/cpu/sparc/vm/sparc.ad b/hotspot/src/cpu/sparc/vm/sparc.ad index 0095f652caa..f9631ddf61d 100644 --- a/hotspot/src/cpu/sparc/vm/sparc.ad +++ b/hotspot/src/cpu/sparc/vm/sparc.ad @@ -1,5 +1,5 @@ // -// Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. +// Copyright 1998-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 @@ -5286,55 +5286,91 @@ instruct loadB(iRegI dst, memory mem) %{ ins_cost(MEMORY_REF_COST); size(4); - format %{ "LDSB $mem,$dst" %} + format %{ "LDSB $mem,$dst\t! byte" %} opcode(Assembler::ldsb_op3); ins_encode(simple_form3_mem_reg( mem, dst ) ); ins_pipe(iload_mask_mem); %} -// Load Byte (8bit UNsigned) into an int reg -instruct loadUB(iRegI dst, memory mem, immI_255 bytemask) %{ - match(Set dst (AndI (LoadB mem) bytemask)); +// Load Byte (8bit signed) into a Long Register +instruct loadB2L(iRegL dst, memory mem) %{ + match(Set dst (ConvI2L (LoadB mem))); ins_cost(MEMORY_REF_COST); size(4); - format %{ "LDUB $mem,$dst" %} + format %{ "LDSB $mem,$dst\t! byte -> long" %} + opcode(Assembler::ldsb_op3); + ins_encode(simple_form3_mem_reg( mem, dst ) ); + ins_pipe(iload_mask_mem); +%} + +// Load Unsigned Byte (8bit UNsigned) into an int reg +instruct loadUB(iRegI dst, memory mem) %{ + match(Set dst (LoadUB mem)); + ins_cost(MEMORY_REF_COST); + + size(4); + format %{ "LDUB $mem,$dst\t! ubyte" %} opcode(Assembler::ldub_op3); ins_encode(simple_form3_mem_reg( mem, dst ) ); ins_pipe(iload_mask_mem); %} -// Load Byte (8bit UNsigned) into a Long Register -instruct loadUBL(iRegL dst, memory mem, immL_FF bytemask) %{ - match(Set dst (AndL (ConvI2L (LoadB mem)) bytemask)); +// Load Unsigned Byte (8bit UNsigned) into a Long Register +instruct loadUB2L(iRegL dst, memory mem) %{ + match(Set dst (ConvI2L (LoadUB mem))); ins_cost(MEMORY_REF_COST); size(4); - format %{ "LDUB $mem,$dst" %} + format %{ "LDUB $mem,$dst\t! ubyte -> long" %} opcode(Assembler::ldub_op3); ins_encode(simple_form3_mem_reg( mem, dst ) ); ins_pipe(iload_mask_mem); %} -// Load Unsigned Short/Char (16bit UNsigned) into a Long Register -instruct loadUS2L(iRegL dst, memory mem, immL_FFFF bytemask) %{ - match(Set dst (AndL (ConvI2L (LoadUS mem)) bytemask)); +// Load Short (16bit signed) +instruct loadS(iRegI dst, memory mem) %{ + match(Set dst (LoadS mem)); ins_cost(MEMORY_REF_COST); size(4); - format %{ "LDUH $mem,$dst" %} - opcode(Assembler::lduh_op3); + format %{ "LDSH $mem,$dst\t! short" %} + opcode(Assembler::ldsh_op3); ins_encode(simple_form3_mem_reg( mem, dst ) ); ins_pipe(iload_mask_mem); %} -// Load Unsigned Short/Char (16bit unsigned) +// Load Short (16bit signed) into a Long Register +instruct loadS2L(iRegL dst, memory mem) %{ + match(Set dst (ConvI2L (LoadS mem))); + ins_cost(MEMORY_REF_COST); + + size(4); + format %{ "LDSH $mem,$dst\t! short -> long" %} + opcode(Assembler::ldsh_op3); + ins_encode(simple_form3_mem_reg( mem, dst ) ); + ins_pipe(iload_mask_mem); +%} + +// Load Unsigned Short/Char (16bit UNsigned) instruct loadUS(iRegI dst, memory mem) %{ match(Set dst (LoadUS mem)); ins_cost(MEMORY_REF_COST); size(4); - format %{ "LDUH $mem,$dst" %} + format %{ "LDUH $mem,$dst\t! ushort/char" %} + opcode(Assembler::lduh_op3); + ins_encode(simple_form3_mem_reg( mem, dst ) ); + ins_pipe(iload_mask_mem); +%} + +// Load Unsigned Short/Char (16bit UNsigned) into a Long Register +instruct loadUS2L(iRegL dst, memory mem) %{ + match(Set dst (ConvI2L (LoadUS mem))); + ins_cost(MEMORY_REF_COST); + + size(4); + format %{ "LDUH $mem,$dst\t! ushort/char -> long" %} opcode(Assembler::lduh_op3); ins_encode(simple_form3_mem_reg( mem, dst ) ); ins_pipe(iload_mask_mem); @@ -5344,9 +5380,33 @@ instruct loadUS(iRegI dst, memory mem) %{ instruct loadI(iRegI dst, memory mem) %{ match(Set dst (LoadI mem)); ins_cost(MEMORY_REF_COST); - size(4); - format %{ "LDUW $mem,$dst" %} + size(4); + format %{ "LDUW $mem,$dst\t! int" %} + opcode(Assembler::lduw_op3); + ins_encode(simple_form3_mem_reg( mem, dst ) ); + ins_pipe(iload_mem); +%} + +// Load Integer into a Long Register +instruct loadI2L(iRegL dst, memory mem) %{ + match(Set dst (ConvI2L (LoadI mem))); + ins_cost(MEMORY_REF_COST); + + size(4); + format %{ "LDSW $mem,$dst\t! int -> long" %} + opcode(Assembler::ldsw_op3); + ins_encode(simple_form3_mem_reg( mem, dst ) ); + ins_pipe(iload_mem); +%} + +// Load Unsigned Integer into a Long Register +instruct loadUI2L(iRegL dst, memory mem) %{ + match(Set dst (LoadUI2L mem)); + ins_cost(MEMORY_REF_COST); + + size(4); + format %{ "LDUW $mem,$dst\t! uint -> long" %} opcode(Assembler::lduw_op3); ins_encode(simple_form3_mem_reg( mem, dst ) ); ins_pipe(iload_mem); @@ -5356,6 +5416,7 @@ instruct loadI(iRegI dst, memory mem) %{ instruct loadL(iRegL dst, memory mem ) %{ match(Set dst (LoadL mem)); ins_cost(MEMORY_REF_COST); + size(4); format %{ "LDX $mem,$dst\t! long" %} opcode(Assembler::ldx_op3); @@ -5471,13 +5532,11 @@ instruct loadN(iRegN dst, memory mem) %{ format %{ "LDUW $mem,$dst\t! compressed ptr" %} ins_encode %{ - Register base = as_Register($mem$$base); - Register index = as_Register($mem$$index); - Register dst = $dst$$Register; + Register index = $mem$$index$$Register; if (index != G0) { - __ lduw(base, index, dst); + __ lduw($mem$$base$$Register, index, $dst$$Register); } else { - __ lduw(base, $mem$$disp, dst); + __ lduw($mem$$base$$Register, $mem$$disp, $dst$$Register); } %} ins_pipe(iload_mem); @@ -5521,18 +5580,6 @@ instruct loadNKlass(iRegN dst, memory mem) %{ ins_pipe(iload_mem); %} -// Load Short (16bit signed) -instruct loadS(iRegI dst, memory mem) %{ - match(Set dst (LoadS mem)); - ins_cost(MEMORY_REF_COST); - - size(4); - format %{ "LDSH $mem,$dst" %} - opcode(Assembler::ldsh_op3); - ins_encode(simple_form3_mem_reg( mem, dst ) ); - ins_pipe(iload_mask_mem); -%} - // Load Double instruct loadD(regD dst, memory mem) %{ match(Set dst (LoadD mem)); diff --git a/hotspot/src/cpu/x86/vm/assembler_x86.cpp b/hotspot/src/cpu/x86/vm/assembler_x86.cpp index 35acd45013e..46c5a24f45a 100644 --- a/hotspot/src/cpu/x86/vm/assembler_x86.cpp +++ b/hotspot/src/cpu/x86/vm/assembler_x86.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -129,13 +129,19 @@ Address::Address(address loc, RelocationHolder spec) { // Convert the raw encoding form into the form expected by the constructor for // Address. An index of 4 (rsp) corresponds to having no index, so convert // that to noreg for the Address constructor. -Address Address::make_raw(int base, int index, int scale, int disp) { +Address Address::make_raw(int base, int index, int scale, int disp, bool disp_is_oop) { + RelocationHolder rspec; + if (disp_is_oop) { + rspec = Relocation::spec_simple(relocInfo::oop_type); + } bool valid_index = index != rsp->encoding(); if (valid_index) { Address madr(as_Register(base), as_Register(index), (Address::ScaleFactor)scale, in_ByteSize(disp)); + madr._rspec = rspec; return madr; } else { Address madr(as_Register(base), noreg, Address::no_scale, in_ByteSize(disp)); + madr._rspec = rspec; return madr; } } @@ -3892,6 +3898,21 @@ void Assembler::movq(Address dst, Register src) { emit_operand(src, dst); } +void Assembler::movsbq(Register dst, Address src) { + InstructionMark im(this); + prefixq(src, dst); + emit_byte(0x0F); + emit_byte(0xBE); + emit_operand(dst, src); +} + +void Assembler::movsbq(Register dst, Register src) { + int encode = prefixq_and_encode(dst->encoding(), src->encoding()); + emit_byte(0x0F); + emit_byte(0xBE); + emit_byte(0xC0 | encode); +} + void Assembler::movslq(Register dst, int32_t imm32) { // dbx shows movslq(rcx, 3) as movq $0x0000000049000000,(%rbx) // and movslq(r8, 3); as movl $0x0000000048000000,(%rbx) @@ -3925,6 +3946,51 @@ void Assembler::movslq(Register dst, Register src) { emit_byte(0xC0 | encode); } +void Assembler::movswq(Register dst, Address src) { + InstructionMark im(this); + prefixq(src, dst); + emit_byte(0x0F); + emit_byte(0xBF); + emit_operand(dst, src); +} + +void Assembler::movswq(Register dst, Register src) { + int encode = prefixq_and_encode(dst->encoding(), src->encoding()); + emit_byte(0x0F); + emit_byte(0xBF); + emit_byte(0xC0 | encode); +} + +void Assembler::movzbq(Register dst, Address src) { + InstructionMark im(this); + prefixq(src, dst); + emit_byte(0x0F); + emit_byte(0xB6); + emit_operand(dst, src); +} + +void Assembler::movzbq(Register dst, Register src) { + int encode = prefixq_and_encode(dst->encoding(), src->encoding()); + emit_byte(0x0F); + emit_byte(0xB6); + emit_byte(0xC0 | encode); +} + +void Assembler::movzwq(Register dst, Address src) { + InstructionMark im(this); + prefixq(src, dst); + emit_byte(0x0F); + emit_byte(0xB7); + emit_operand(dst, src); +} + +void Assembler::movzwq(Register dst, Register src) { + int encode = prefixq_and_encode(dst->encoding(), src->encoding()); + emit_byte(0x0F); + emit_byte(0xB7); + emit_byte(0xC0 | encode); +} + void Assembler::negq(Register dst) { int encode = prefixq_and_encode(dst->encoding()); emit_byte(0xF7); diff --git a/hotspot/src/cpu/x86/vm/assembler_x86.hpp b/hotspot/src/cpu/x86/vm/assembler_x86.hpp index 8f8956a2758..546f8464efe 100644 --- a/hotspot/src/cpu/x86/vm/assembler_x86.hpp +++ b/hotspot/src/cpu/x86/vm/assembler_x86.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -278,7 +278,7 @@ class Address VALUE_OBJ_CLASS_SPEC { // Convert the raw encoding form into the form expected by the constructor for // Address. An index of 4 (rsp) corresponds to having no index, so convert // that to noreg for the Address constructor. - static Address make_raw(int base, int index, int scale, int disp); + static Address make_raw(int base, int index, int scale, int disp, bool disp_is_oop); static Address make_array(ArrayAddress); @@ -1138,6 +1138,9 @@ private: void movsbl(Register dst, Register src); #ifdef _LP64 + void movsbq(Register dst, Address src); + void movsbq(Register dst, Register src); + // Move signed 32bit immediate to 64bit extending sign void movslq(Address dst, int32_t imm64); void movslq(Register dst, int32_t imm64); @@ -1150,6 +1153,11 @@ private: void movswl(Register dst, Address src); void movswl(Register dst, Register src); +#ifdef _LP64 + void movswq(Register dst, Address src); + void movswq(Register dst, Register src); +#endif + void movw(Address dst, int imm16); void movw(Register dst, Address src); void movw(Address dst, Register src); @@ -1157,9 +1165,19 @@ private: void movzbl(Register dst, Address src); void movzbl(Register dst, Register src); +#ifdef _LP64 + void movzbq(Register dst, Address src); + void movzbq(Register dst, Register src); +#endif + void movzwl(Register dst, Address src); void movzwl(Register dst, Register src); +#ifdef _LP64 + void movzwq(Register dst, Address src); + void movzwq(Register dst, Register src); +#endif + void mull(Address src); void mull(Register src); diff --git a/hotspot/src/cpu/x86/vm/x86_32.ad b/hotspot/src/cpu/x86/vm/x86_32.ad index 0880988ed8b..1e770159226 100644 --- a/hotspot/src/cpu/x86/vm/x86_32.ad +++ b/hotspot/src/cpu/x86/vm/x86_32.ad @@ -1,5 +1,5 @@ // -// Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. +// Copyright 1997-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 @@ -3126,14 +3126,12 @@ encode %{ enc_class movq_ld(regXD dst, memory mem) %{ MacroAssembler _masm(&cbuf); - Address madr = Address::make_raw($mem$$base, $mem$$index, $mem$$scale, $mem$$disp); - __ movq(as_XMMRegister($dst$$reg), madr); + __ movq($dst$$XMMRegister, $mem$$Address); %} enc_class movq_st(memory mem, regXD src) %{ MacroAssembler _masm(&cbuf); - Address madr = Address::make_raw($mem$$base, $mem$$index, $mem$$scale, $mem$$disp); - __ movq(madr, as_XMMRegister($src$$reg)); + __ movq($mem$$Address, $src$$XMMRegister); %} enc_class pshufd_8x8(regX dst, regX src) %{ @@ -6396,21 +6394,94 @@ instruct loadB(xRegI dst, memory mem) %{ match(Set dst (LoadB mem)); ins_cost(125); - format %{ "MOVSX8 $dst,$mem" %} - opcode(0xBE, 0x0F); - ins_encode( OpcS, OpcP, RegMem(dst,mem)); - ins_pipe( ialu_reg_mem ); + format %{ "MOVSX8 $dst,$mem\t# byte" %} + + ins_encode %{ + __ movsbl($dst$$Register, $mem$$Address); + %} + + ins_pipe(ialu_reg_mem); %} -// Load Byte (8bit UNsigned) -instruct loadUB(xRegI dst, memory mem, immI_255 bytemask) %{ - match(Set dst (AndI (LoadB mem) bytemask)); +// Load Byte (8bit signed) into Long Register +instruct loadB2L(eRegL dst, memory mem) %{ + match(Set dst (ConvI2L (LoadB mem))); + + ins_cost(375); + format %{ "MOVSX8 $dst.lo,$mem\t# byte -> long\n\t" + "MOV $dst.hi,$dst.lo\n\t" + "SAR $dst.hi,7" %} + + ins_encode %{ + __ movsbl($dst$$Register, $mem$$Address); + __ movl(HIGH_FROM_LOW($dst$$Register), $dst$$Register); // This is always a different register. + __ sarl(HIGH_FROM_LOW($dst$$Register), 7); // 24+1 MSB are already signed extended. + %} + + ins_pipe(ialu_reg_mem); +%} + +// Load Unsigned Byte (8bit UNsigned) +instruct loadUB(xRegI dst, memory mem) %{ + match(Set dst (LoadUB mem)); ins_cost(125); - format %{ "MOVZX8 $dst,$mem" %} - opcode(0xB6, 0x0F); - ins_encode( OpcS, OpcP, RegMem(dst,mem)); - ins_pipe( ialu_reg_mem ); + format %{ "MOVZX8 $dst,$mem\t# ubyte -> int" %} + + ins_encode %{ + __ movzbl($dst$$Register, $mem$$Address); + %} + + ins_pipe(ialu_reg_mem); +%} + +// Load Unsigned Byte (8 bit UNsigned) into Long Register +instruct loadUB2L(eRegL dst, memory mem) +%{ + match(Set dst (ConvI2L (LoadUB mem))); + + ins_cost(250); + format %{ "MOVZX8 $dst.lo,$mem\t# ubyte -> long\n\t" + "XOR $dst.hi,$dst.hi" %} + + ins_encode %{ + __ movzbl($dst$$Register, $mem$$Address); + __ xorl(HIGH_FROM_LOW($dst$$Register), HIGH_FROM_LOW($dst$$Register)); + %} + + ins_pipe(ialu_reg_mem); +%} + +// Load Short (16bit signed) +instruct loadS(eRegI dst, memory mem) %{ + match(Set dst (LoadS mem)); + + ins_cost(125); + format %{ "MOVSX $dst,$mem\t# short" %} + + ins_encode %{ + __ movswl($dst$$Register, $mem$$Address); + %} + + ins_pipe(ialu_reg_mem); +%} + +// Load Short (16bit signed) into Long Register +instruct loadS2L(eRegL dst, memory mem) %{ + match(Set dst (ConvI2L (LoadS mem))); + + ins_cost(375); + format %{ "MOVSX $dst.lo,$mem\t# short -> long\n\t" + "MOV $dst.hi,$dst.lo\n\t" + "SAR $dst.hi,15" %} + + ins_encode %{ + __ movswl($dst$$Register, $mem$$Address); + __ movl(HIGH_FROM_LOW($dst$$Register), $dst$$Register); // This is always a different register. + __ sarl(HIGH_FROM_LOW($dst$$Register), 15); // 16+1 MSB are already signed extended. + %} + + ins_pipe(ialu_reg_mem); %} // Load Unsigned Short/Char (16bit unsigned) @@ -6418,10 +6489,30 @@ instruct loadUS(eRegI dst, memory mem) %{ match(Set dst (LoadUS mem)); ins_cost(125); - format %{ "MOVZX $dst,$mem" %} - opcode(0xB7, 0x0F); - ins_encode( OpcS, OpcP, RegMem(dst,mem)); - ins_pipe( ialu_reg_mem ); + format %{ "MOVZX $dst,$mem\t# ushort/char -> int" %} + + ins_encode %{ + __ movzwl($dst$$Register, $mem$$Address); + %} + + ins_pipe(ialu_reg_mem); +%} + +// Load Unsigned Short/Char (16 bit UNsigned) into Long Register +instruct loadUS2L(eRegL dst, memory mem) +%{ + match(Set dst (ConvI2L (LoadUS mem))); + + ins_cost(250); + format %{ "MOVZX $dst.lo,$mem\t# ushort/char -> long\n\t" + "XOR $dst.hi,$dst.hi" %} + + ins_encode %{ + __ movzwl($dst$$Register, $mem$$Address); + __ xorl(HIGH_FROM_LOW($dst$$Register), HIGH_FROM_LOW($dst$$Register)); + %} + + ins_pipe(ialu_reg_mem); %} // Load Integer @@ -6429,10 +6520,47 @@ instruct loadI(eRegI dst, memory mem) %{ match(Set dst (LoadI mem)); ins_cost(125); - format %{ "MOV $dst,$mem" %} - opcode(0x8B); - ins_encode( OpcP, RegMem(dst,mem)); - ins_pipe( ialu_reg_mem ); + format %{ "MOV $dst,$mem\t# int" %} + + ins_encode %{ + __ movl($dst$$Register, $mem$$Address); + %} + + ins_pipe(ialu_reg_mem); +%} + +// Load Integer into Long Register +instruct loadI2L(eRegL dst, memory mem) %{ + match(Set dst (ConvI2L (LoadI mem))); + + ins_cost(375); + format %{ "MOV $dst.lo,$mem\t# int -> long\n\t" + "MOV $dst.hi,$dst.lo\n\t" + "SAR $dst.hi,31" %} + + ins_encode %{ + __ movl($dst$$Register, $mem$$Address); + __ movl(HIGH_FROM_LOW($dst$$Register), $dst$$Register); // This is always a different register. + __ sarl(HIGH_FROM_LOW($dst$$Register), 31); + %} + + ins_pipe(ialu_reg_mem); +%} + +// Load Unsigned Integer into Long Register +instruct loadUI2L(eRegL dst, memory mem) %{ + match(Set dst (LoadUI2L mem)); + + ins_cost(250); + format %{ "MOV $dst.lo,$mem\t# uint -> long\n\t" + "XOR $dst.hi,$dst.hi" %} + + ins_encode %{ + __ movl($dst$$Register, $mem$$Address); + __ xorl(HIGH_FROM_LOW($dst$$Register), HIGH_FROM_LOW($dst$$Register)); + %} + + ins_pipe(ialu_reg_mem); %} // Load Long. Cannot clobber address while loading, so restrict address @@ -6442,11 +6570,17 @@ instruct loadL(eRegL dst, load_long_memory mem) %{ match(Set dst (LoadL mem)); ins_cost(250); - format %{ "MOV $dst.lo,$mem\n\t" + format %{ "MOV $dst.lo,$mem\t# long\n\t" "MOV $dst.hi,$mem+4" %} - opcode(0x8B, 0x8B); - ins_encode( OpcP, RegMem(dst,mem), OpcS, RegMem_Hi(dst,mem)); - ins_pipe( ialu_reg_long_mem ); + + ins_encode %{ + Address Amemlo = Address::make_raw($mem$$base, $mem$$index, $mem$$scale, $mem$$disp, false); + Address Amemhi = Address::make_raw($mem$$base, $mem$$index, $mem$$scale, $mem$$disp + 4, false); + __ movl($dst$$Register, Amemlo); + __ movl(HIGH_FROM_LOW($dst$$Register), Amemhi); + %} + + ins_pipe(ialu_reg_long_mem); %} // Volatile Load Long. Must be atomic, so do 64-bit FILD @@ -6521,17 +6655,6 @@ instruct loadKlass(eRegP dst, memory mem) %{ ins_pipe( ialu_reg_mem ); %} -// Load Short (16bit signed) -instruct loadS(eRegI dst, memory mem) %{ - match(Set dst (LoadS mem)); - - ins_cost(125); - format %{ "MOVSX $dst,$mem" %} - opcode(0xBF, 0x0F); - ins_encode( OpcS, OpcP, RegMem(dst,mem)); - ins_pipe( ialu_reg_mem ); -%} - // Load Double instruct loadD(regD dst, memory mem) %{ predicate(UseSSE<=1); @@ -7957,7 +8080,7 @@ instruct storeLConditional( memory mem, eADXRegL oldval, eBCXRegL newval, eFlags __ xchgl(as_Register(EBX_enc), as_Register(ECX_enc)); if( os::is_MP() ) __ lock(); - __ cmpxchg8(Address::make_raw($mem$$base, $mem$$index, $mem$$scale, $mem$$disp)); + __ cmpxchg8($mem$$Address); __ xchgl(as_Register(EBX_enc), as_Register(ECX_enc)); %} ins_pipe( pipe_cmpxchg ); @@ -11467,6 +11590,7 @@ instruct convI2X_reg(regX dst, eRegI src) %{ instruct convI2L_reg( eRegL dst, eRegI src, eFlagsReg cr) %{ match(Set dst (ConvI2L src)); effect(KILL cr); + ins_cost(375); format %{ "MOV $dst.lo,$src\n\t" "MOV $dst.hi,$src\n\t" "SAR $dst.hi,31" %} @@ -11478,6 +11602,7 @@ instruct convI2L_reg( eRegL dst, eRegI src, eFlagsReg cr) %{ instruct convI2L_reg_zex(eRegL dst, eRegI src, immL_32bits mask, eFlagsReg flags ) %{ match(Set dst (AndL (ConvI2L src) mask) ); effect( KILL flags ); + ins_cost(250); format %{ "MOV $dst.lo,$src\n\t" "XOR $dst.hi,$dst.hi" %} opcode(0x33); // XOR @@ -11489,6 +11614,7 @@ instruct convI2L_reg_zex(eRegL dst, eRegI src, immL_32bits mask, eFlagsReg flags instruct zerox_long(eRegL dst, eRegL src, immL_32bits mask, eFlagsReg flags ) %{ match(Set dst (AndL src mask) ); effect( KILL flags ); + ins_cost(250); format %{ "MOV $dst.lo,$src.lo\n\t" "XOR $dst.hi,$dst.hi\n\t" %} opcode(0x33); // XOR diff --git a/hotspot/src/cpu/x86/vm/x86_64.ad b/hotspot/src/cpu/x86/vm/x86_64.ad index 6231c2e6d96..6518663f4a8 100644 --- a/hotspot/src/cpu/x86/vm/x86_64.ad +++ b/hotspot/src/cpu/x86/vm/x86_64.ad @@ -1,5 +1,5 @@ // -// Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. +// Copyright 2003-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 @@ -3462,14 +3462,12 @@ encode %{ enc_class movq_ld(regD dst, memory mem) %{ MacroAssembler _masm(&cbuf); - Address madr = Address::make_raw($mem$$base, $mem$$index, $mem$$scale, $mem$$disp); - __ movq(as_XMMRegister($dst$$reg), madr); + __ movq($dst$$XMMRegister, $mem$$Address); %} enc_class movq_st(memory mem, regD src) %{ MacroAssembler _masm(&cbuf); - Address madr = Address::make_raw($mem$$base, $mem$$index, $mem$$scale, $mem$$disp); - __ movq(madr, as_XMMRegister($src$$reg)); + __ movq($mem$$Address, $src$$XMMRegister); %} enc_class pshufd_8x8(regF dst, regF src) %{ @@ -6031,70 +6029,88 @@ instruct loadB(rRegI dst, memory mem) ins_cost(125); format %{ "movsbl $dst, $mem\t# byte" %} - opcode(0x0F, 0xBE); - ins_encode(REX_reg_mem(dst, mem), OpcP, OpcS, reg_mem(dst, mem)); + + ins_encode %{ + __ movsbl($dst$$Register, $mem$$Address); + %} + ins_pipe(ialu_reg_mem); %} -// Load Byte (8 bit signed) into long -// instruct loadB2L(rRegL dst, memory mem) -// %{ -// match(Set dst (ConvI2L (LoadB mem))); - -// ins_cost(125); -// format %{ "movsbq $dst, $mem\t# byte -> long" %} -// opcode(0x0F, 0xBE); -// ins_encode(REX_reg_mem_wide(dst, mem), OpcP, OpcS, reg_mem(dst, mem)); -// ins_pipe(ialu_reg_mem); -// %} - -// Load Byte (8 bit UNsigned) -instruct loadUB(rRegI dst, memory mem, immI_255 bytemask) +// Load Byte (8 bit signed) into Long Register +instruct loadB2L(rRegL dst, memory mem) %{ - match(Set dst (AndI (LoadB mem) bytemask)); + match(Set dst (ConvI2L (LoadB mem))); + + ins_cost(125); + format %{ "movsbq $dst, $mem\t# byte -> long" %} + + ins_encode %{ + __ movsbq($dst$$Register, $mem$$Address); + %} + + ins_pipe(ialu_reg_mem); +%} + +// Load Unsigned Byte (8 bit UNsigned) +instruct loadUB(rRegI dst, memory mem) +%{ + match(Set dst (LoadUB mem)); ins_cost(125); format %{ "movzbl $dst, $mem\t# ubyte" %} - opcode(0x0F, 0xB6); - ins_encode(REX_reg_mem(dst, mem), OpcP, OpcS, reg_mem(dst, mem)); + + ins_encode %{ + __ movzbl($dst$$Register, $mem$$Address); + %} + ins_pipe(ialu_reg_mem); %} -// Load Byte (8 bit UNsigned) into long -// instruct loadUB2L(rRegL dst, memory mem, immI_255 bytemask) -// %{ -// match(Set dst (ConvI2L (AndI (LoadB mem) bytemask))); +// Load Unsigned Byte (8 bit UNsigned) into Long Register +instruct loadUB2L(rRegL dst, memory mem) +%{ + match(Set dst (ConvI2L (LoadUB mem))); -// ins_cost(125); -// format %{ "movzbl $dst, $mem\t# ubyte -> long" %} -// opcode(0x0F, 0xB6); -// ins_encode(REX_reg_mem(dst, mem), OpcP, OpcS, reg_mem(dst, mem)); -// ins_pipe(ialu_reg_mem); -// %} + ins_cost(125); + format %{ "movzbq $dst, $mem\t# ubyte -> long" %} + + ins_encode %{ + __ movzbq($dst$$Register, $mem$$Address); + %} + + ins_pipe(ialu_reg_mem); +%} // Load Short (16 bit signed) instruct loadS(rRegI dst, memory mem) %{ match(Set dst (LoadS mem)); - ins_cost(125); // XXX + ins_cost(125); format %{ "movswl $dst, $mem\t# short" %} - opcode(0x0F, 0xBF); - ins_encode(REX_reg_mem(dst, mem), OpcP, OpcS, reg_mem(dst, mem)); + + ins_encode %{ + __ movswl($dst$$Register, $mem$$Address); + %} + ins_pipe(ialu_reg_mem); %} -// Load Short (16 bit signed) into long -// instruct loadS2L(rRegL dst, memory mem) -// %{ -// match(Set dst (ConvI2L (LoadS mem))); +// Load Short (16 bit signed) into Long Register +instruct loadS2L(rRegL dst, memory mem) +%{ + match(Set dst (ConvI2L (LoadS mem))); -// ins_cost(125); // XXX -// format %{ "movswq $dst, $mem\t# short -> long" %} -// opcode(0x0F, 0xBF); -// ins_encode(REX_reg_mem_wide(dst, mem), OpcP, OpcS, reg_mem(dst, mem)); -// ins_pipe(ialu_reg_mem); -// %} + ins_cost(125); + format %{ "movswq $dst, $mem\t# short -> long" %} + + ins_encode %{ + __ movswq($dst$$Register, $mem$$Address); + %} + + ins_pipe(ialu_reg_mem); +%} // Load Unsigned Short/Char (16 bit UNsigned) instruct loadUS(rRegI dst, memory mem) @@ -6103,32 +6119,71 @@ instruct loadUS(rRegI dst, memory mem) ins_cost(125); format %{ "movzwl $dst, $mem\t# ushort/char" %} - opcode(0x0F, 0xB7); - ins_encode(REX_reg_mem(dst, mem), OpcP, OpcS, reg_mem(dst, mem)); + + ins_encode %{ + __ movzwl($dst$$Register, $mem$$Address); + %} + ins_pipe(ialu_reg_mem); %} -// Load Unsigned Short/Char (16 bit UNsigned) into long -// instruct loadUS2L(rRegL dst, memory mem) -// %{ -// match(Set dst (ConvI2L (LoadUS mem))); +// Load Unsigned Short/Char (16 bit UNsigned) into Long Register +instruct loadUS2L(rRegL dst, memory mem) +%{ + match(Set dst (ConvI2L (LoadUS mem))); -// ins_cost(125); -// format %{ "movzwl $dst, $mem\t# ushort/char -> long" %} -// opcode(0x0F, 0xB7); -// ins_encode(REX_reg_mem(dst, mem), OpcP, OpcS, reg_mem(dst, mem)); -// ins_pipe(ialu_reg_mem); -// %} + ins_cost(125); + format %{ "movzwq $dst, $mem\t# ushort/char -> long" %} + + ins_encode %{ + __ movzwq($dst$$Register, $mem$$Address); + %} + + ins_pipe(ialu_reg_mem); +%} // Load Integer instruct loadI(rRegI dst, memory mem) %{ match(Set dst (LoadI mem)); - ins_cost(125); // XXX + ins_cost(125); format %{ "movl $dst, $mem\t# int" %} - opcode(0x8B); - ins_encode(REX_reg_mem(dst, mem), OpcP, reg_mem(dst, mem)); + + ins_encode %{ + __ movl($dst$$Register, $mem$$Address); + %} + + ins_pipe(ialu_reg_mem); +%} + +// Load Integer into Long Register +instruct loadI2L(rRegL dst, memory mem) +%{ + match(Set dst (ConvI2L (LoadI mem))); + + ins_cost(125); + format %{ "movslq $dst, $mem\t# int -> long" %} + + ins_encode %{ + __ movslq($dst$$Register, $mem$$Address); + %} + + ins_pipe(ialu_reg_mem); +%} + +// Load Unsigned Integer into Long Register +instruct loadUI2L(rRegL dst, memory mem) +%{ + match(Set dst (LoadUI2L mem)); + + ins_cost(125); + format %{ "movl $dst, $mem\t# uint -> long" %} + + ins_encode %{ + __ movl($dst$$Register, $mem$$Address); + %} + ins_pipe(ialu_reg_mem); %} @@ -6137,10 +6192,13 @@ instruct loadL(rRegL dst, memory mem) %{ match(Set dst (LoadL mem)); - ins_cost(125); // XXX + ins_cost(125); format %{ "movq $dst, $mem\t# long" %} - opcode(0x8B); - ins_encode(REX_reg_mem_wide(dst, mem), OpcP, reg_mem(dst, mem)); + + ins_encode %{ + __ movq($dst$$Register, $mem$$Address); + %} + ins_pipe(ialu_reg_mem); // XXX %} @@ -10804,16 +10862,6 @@ instruct convI2L_reg_reg(rRegL dst, rRegI src) // ins_pipe(ialu_reg_reg); // %} -instruct convI2L_reg_mem(rRegL dst, memory src) -%{ - match(Set dst (ConvI2L (LoadI src))); - - format %{ "movslq $dst, $src\t# i2l" %} - opcode(0x63); // needs REX.W - ins_encode(REX_reg_mem_wide(dst, src), OpcP, reg_mem(dst,src)); - ins_pipe(ialu_reg_mem); -%} - // Zero-extend convert int to long instruct convI2L_reg_reg_zex(rRegL dst, rRegI src, immL_32bits mask) %{ diff --git a/hotspot/src/share/vm/adlc/forms.cpp b/hotspot/src/share/vm/adlc/forms.cpp index 17bbe7f9657..fb9f24aa382 100644 --- a/hotspot/src/share/vm/adlc/forms.cpp +++ b/hotspot/src/share/vm/adlc/forms.cpp @@ -70,6 +70,7 @@ const char *NameList::iter() { else return (_iter <_cur-1 ? _names[++_iter] : NULL); } const char *NameList::current() { return (_iter < _cur ? _names[_iter] : NULL); } +const char *NameList::peek(int skip) { return (_iter + skip < _cur ? _names[_iter + skip] : NULL); } // Return 'true' if current entry is signal bool NameList::current_is_signal() { @@ -248,11 +249,13 @@ Form::DataType Form::ideal_to_Reg_type(const char *name) const { // True if 'opType', an ideal name, loads or stores. Form::DataType Form::is_load_from_memory(const char *opType) const { if( strcmp(opType,"LoadB")==0 ) return Form::idealB; + if( strcmp(opType,"LoadUB")==0 ) return Form::idealB; if( strcmp(opType,"LoadUS")==0 ) return Form::idealC; if( strcmp(opType,"LoadD")==0 ) return Form::idealD; if( strcmp(opType,"LoadD_unaligned")==0 ) return Form::idealD; if( strcmp(opType,"LoadF")==0 ) return Form::idealF; if( strcmp(opType,"LoadI")==0 ) return Form::idealI; + if( strcmp(opType,"LoadUI2L")==0 ) return Form::idealI; if( strcmp(opType,"LoadKlass")==0 ) return Form::idealP; if( strcmp(opType,"LoadNKlass")==0 ) return Form::idealN; if( strcmp(opType,"LoadL")==0 ) return Form::idealL; diff --git a/hotspot/src/share/vm/adlc/forms.hpp b/hotspot/src/share/vm/adlc/forms.hpp index 8a0011b711c..b1615799508 100644 --- a/hotspot/src/share/vm/adlc/forms.hpp +++ b/hotspot/src/share/vm/adlc/forms.hpp @@ -342,6 +342,7 @@ public: void reset(); // Reset iteration const char *iter(); // after reset(), first element : else next const char *current(); // return current element in iteration. + const char *peek(int skip = 1); // returns element + skip in iteration if there is one bool current_is_signal(); // Return 'true' if current entry is signal bool is_signal(const char *entry); // Return true if entry is a signal diff --git a/hotspot/src/share/vm/adlc/formssel.cpp b/hotspot/src/share/vm/adlc/formssel.cpp index d203e2d7f6d..c573511a66e 100644 --- a/hotspot/src/share/vm/adlc/formssel.cpp +++ b/hotspot/src/share/vm/adlc/formssel.cpp @@ -3310,8 +3310,8 @@ int MatchNode::needs_ideal_memory_edge(FormDict &globals) const { static const char *needs_ideal_memory_list[] = { "StoreI","StoreL","StoreP","StoreN","StoreD","StoreF" , "StoreB","StoreC","Store" ,"StoreFP", - "LoadI" ,"LoadL", "LoadP" ,"LoadN", "LoadD" ,"LoadF" , - "LoadB" ,"LoadUS" ,"LoadS" ,"Load" , + "LoadI", "LoadUI2L", "LoadL", "LoadP" ,"LoadN", "LoadD" ,"LoadF" , + "LoadB" , "LoadUB", "LoadUS" ,"LoadS" ,"Load" , "Store4I","Store2I","Store2L","Store2D","Store4F","Store2F","Store16B", "Store8B","Store4B","Store8C","Store4C","Store2C", "Load4I" ,"Load2I" ,"Load2L" ,"Load2D" ,"Load4F" ,"Load2F" ,"Load16B" , @@ -3431,10 +3431,16 @@ int MatchNode::cisc_spill_match(FormDict& globals, RegisterForm* registers, Matc const InstructForm *form2_inst = form2 ? form2->is_instruction() : NULL; const char *name_left = mRule2->_lChild ? mRule2->_lChild->_opType : NULL; const char *name_right = mRule2->_rChild ? mRule2->_rChild->_opType : NULL; + DataType data_type = Form::none; + if (form->is_operand()) { + // Make sure the loadX matches the type of the reg + data_type = form->ideal_to_Reg_type(form->is_operand()->ideal_type(globals)); + } // Detect reg vs (loadX memory) if( form->is_cisc_reg(globals) && form2_inst - && (is_load_from_memory(mRule2->_opType) != Form::none) // reg vs. (load memory) + && data_type != Form::none + && (is_load_from_memory(mRule2->_opType) == data_type) // reg vs. (load memory) && (name_left != NULL) // NOT (load) && (name_right == NULL) ) { // NOT (load memory foo) const Form *form2_left = name_left ? globals[name_left] : NULL; diff --git a/hotspot/src/share/vm/adlc/output_c.cpp b/hotspot/src/share/vm/adlc/output_c.cpp index f1d010979f6..0ae759cc3e2 100644 --- a/hotspot/src/share/vm/adlc/output_c.cpp +++ b/hotspot/src/share/vm/adlc/output_c.cpp @@ -2139,8 +2139,59 @@ public: // A subfield variable, '$$' prefix emit_field( rep_var ); } else { - // A replacement variable, '$' prefix - emit_rep_var( rep_var ); + if (_strings_to_emit.peek() != NULL && + strcmp(_strings_to_emit.peek(), "$Address") == 0) { + fprintf(_fp, "Address::make_raw("); + + emit_rep_var( rep_var ); + fprintf(_fp,"->base(ra_,this,idx%d), ", _operand_idx); + + _reg_status = LITERAL_ACCESSED; + emit_rep_var( rep_var ); + fprintf(_fp,"->index(ra_,this,idx%d), ", _operand_idx); + + _reg_status = LITERAL_ACCESSED; + emit_rep_var( rep_var ); + fprintf(_fp,"->scale(), "); + + _reg_status = LITERAL_ACCESSED; + emit_rep_var( rep_var ); + Form::DataType stack_type = _operand ? _operand->is_user_name_for_sReg() : Form::none; + if( _operand && _operand_idx==0 && stack_type != Form::none ) { + fprintf(_fp,"->disp(ra_,this,0), "); + } else { + fprintf(_fp,"->disp(ra_,this,idx%d), ", _operand_idx); + } + + _reg_status = LITERAL_ACCESSED; + emit_rep_var( rep_var ); + fprintf(_fp,"->disp_is_oop())"); + + // skip trailing $Address + _strings_to_emit.iter(); + } else { + // A replacement variable, '$' prefix + const char* next = _strings_to_emit.peek(); + const char* next2 = _strings_to_emit.peek(2); + if (next != NULL && next2 != NULL && strcmp(next2, "$Register") == 0 && + (strcmp(next, "$base") == 0 || strcmp(next, "$index") == 0)) { + // handle $rev_var$$base$$Register and $rev_var$$index$$Register by + // producing as_Register(opnd_array(#)->base(ra_,this,idx1)). + fprintf(_fp, "as_Register("); + // emit the operand reference + emit_rep_var( rep_var ); + rep_var = _strings_to_emit.iter(); + assert(strcmp(rep_var, "$base") == 0 || strcmp(rep_var, "$index") == 0, "bad pattern"); + // handle base or index + emit_field(rep_var); + rep_var = _strings_to_emit.iter(); + assert(strcmp(rep_var, "$Register") == 0, "bad pattern"); + // close up the parens + fprintf(_fp, ")"); + } else { + emit_rep_var( rep_var ); + } + } } // end replacement and/or subfield } } diff --git a/hotspot/src/share/vm/opto/classes.hpp b/hotspot/src/share/vm/opto/classes.hpp index bbb3e79990e..d527f5ea475 100644 --- a/hotspot/src/share/vm/opto/classes.hpp +++ b/hotspot/src/share/vm/opto/classes.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -129,11 +129,13 @@ macro(JumpProj) macro(LShiftI) macro(LShiftL) macro(LoadB) +macro(LoadUB) macro(LoadUS) macro(LoadD) macro(LoadD_unaligned) macro(LoadF) macro(LoadI) +macro(LoadUI2L) macro(LoadKlass) macro(LoadNKlass) macro(LoadL) diff --git a/hotspot/src/share/vm/opto/compile.cpp b/hotspot/src/share/vm/opto/compile.cpp index 5790af4c6e1..d1b9332a9cd 100644 --- a/hotspot/src/share/vm/opto/compile.cpp +++ b/hotspot/src/share/vm/opto/compile.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -2005,8 +2005,10 @@ static void final_graph_reshaping_impl( Node *n, Final_Reshape_Counts &fpu ) { case Op_StoreP: case Op_StoreN: case Op_LoadB: + case Op_LoadUB: case Op_LoadUS: case Op_LoadI: + case Op_LoadUI2L: case Op_LoadKlass: case Op_LoadNKlass: case Op_LoadL: diff --git a/hotspot/src/share/vm/opto/memnode.cpp b/hotspot/src/share/vm/opto/memnode.cpp index 3d096b248f3..570e813e2fa 100644 --- a/hotspot/src/share/vm/opto/memnode.cpp +++ b/hotspot/src/share/vm/opto/memnode.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -778,7 +778,7 @@ Node *LoadNode::make( PhaseGVN& gvn, Node *ctl, Node *mem, Node *adr, const Type adr_type->offset() == arrayOopDesc::length_offset_in_bytes()), "use LoadRangeNode instead"); switch (bt) { - case T_BOOLEAN: + case T_BOOLEAN: return new (C, 3) LoadUBNode(ctl, mem, adr, adr_type, rt->is_int() ); case T_BYTE: return new (C, 3) LoadBNode (ctl, mem, adr, adr_type, rt->is_int() ); case T_INT: return new (C, 3) LoadINode (ctl, mem, adr, adr_type, rt->is_int() ); case T_CHAR: return new (C, 3) LoadUSNode(ctl, mem, adr, adr_type, rt->is_int() ); @@ -1616,6 +1616,22 @@ Node *LoadBNode::Ideal(PhaseGVN *phase, bool can_reshape) { return LoadNode::Ideal(phase, can_reshape); } +//--------------------------LoadUBNode::Ideal------------------------------------- +// +// If the previous store is to the same address as this load, +// and the value stored was larger than a byte, replace this load +// with the value stored truncated to a byte. If no truncation is +// needed, the replacement is done in LoadNode::Identity(). +// +Node* LoadUBNode::Ideal(PhaseGVN* phase, bool can_reshape) { + Node* mem = in(MemNode::Memory); + Node* value = can_see_stored_value(mem, phase); + if (value && !phase->type(value)->higher_equal(_type)) + return new (phase->C, 3) AndINode(value, phase->intcon(0xFF)); + // Identity call will handle the case where truncation is not needed. + return LoadNode::Ideal(phase, can_reshape); +} + //--------------------------LoadUSNode::Ideal------------------------------------- // // If the previous store is to the same address as this load, diff --git a/hotspot/src/share/vm/opto/memnode.hpp b/hotspot/src/share/vm/opto/memnode.hpp index 3da000dff92..e318f3079f6 100644 --- a/hotspot/src/share/vm/opto/memnode.hpp +++ b/hotspot/src/share/vm/opto/memnode.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -207,6 +207,19 @@ public: virtual BasicType memory_type() const { return T_BYTE; } }; +//------------------------------LoadUBNode------------------------------------- +// Load a unsigned byte (8bits unsigned) from memory +class LoadUBNode : public LoadNode { +public: + LoadUBNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt* ti = TypeInt::UBYTE ) + : LoadNode(c, mem, adr, at, ti) {} + virtual int Opcode() const; + virtual uint ideal_reg() const { return Op_RegI; } + virtual Node* Ideal(PhaseGVN *phase, bool can_reshape); + virtual int store_Opcode() const { return Op_StoreB; } + virtual BasicType memory_type() const { return T_BYTE; } +}; + //------------------------------LoadUSNode------------------------------------- // Load an unsigned short/char (16bits unsigned) from memory class LoadUSNode : public LoadNode { @@ -232,6 +245,18 @@ public: virtual BasicType memory_type() const { return T_INT; } }; +//------------------------------LoadUI2LNode----------------------------------- +// Load an unsigned integer into long from memory +class LoadUI2LNode : public LoadNode { +public: + LoadUI2LNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeLong* t = TypeLong::UINT) + : LoadNode(c, mem, adr, at, t) {} + virtual int Opcode() const; + virtual uint ideal_reg() const { return Op_RegL; } + virtual int store_Opcode() const { return Op_StoreL; } + virtual BasicType memory_type() const { return T_LONG; } +}; + //------------------------------LoadRangeNode---------------------------------- // Load an array length from the array class LoadRangeNode : public LoadINode { diff --git a/hotspot/src/share/vm/opto/mulnode.cpp b/hotspot/src/share/vm/opto/mulnode.cpp index 081dce647bb..7700272f6d9 100644 --- a/hotspot/src/share/vm/opto/mulnode.cpp +++ b/hotspot/src/share/vm/opto/mulnode.cpp @@ -486,20 +486,23 @@ Node *AndINode::Ideal(PhaseGVN *phase, bool can_reshape) { return new (phase->C, 3) AndINode(ldus, phase->intcon(mask&0xFFFF)); } - // Masking sign bits off of a Byte? Let the matcher use an unsigned load - if( lop == Op_LoadB && - (!in(0) && load->in(0)) && - (mask == 0x000000FF) ) { - // Associate this node with the LoadB, so the matcher can see them together. - // If we don't do this, it is common for the LoadB to have one control - // edge, and the store or call containing this AndI to have a different - // control edge. This will cause Label_Root to group the AndI with - // the encoding store or call, so the matcher has no chance to match - // this AndI together with the LoadB. Setting the control edge here - // prevents Label_Root from grouping the AndI with the store or call, - // if it has a control edge that is inconsistent with the LoadB. - set_req(0, load->in(0)); - return this; + // Masking sign bits off of a Byte? Do an unsigned byte load. + if (lop == Op_LoadB && mask == 0x000000FF) { + return new (phase->C, 3) LoadUBNode(load->in(MemNode::Control), + load->in(MemNode::Memory), + load->in(MemNode::Address), + load->adr_type()); + } + + // Masking sign bits off of a Byte plus additional lower bits? Do + // an unsigned byte load plus an and. + if (lop == Op_LoadB && (mask & 0xFFFFFF00) == 0) { + Node* ldub = new (phase->C, 3) LoadUBNode(load->in(MemNode::Control), + load->in(MemNode::Memory), + load->in(MemNode::Address), + load->adr_type()); + ldub = phase->transform(ldub); + return new (phase->C, 3) AndINode(ldub, phase->intcon(mask)); } // Masking off sign bits? Dont make them! @@ -599,12 +602,21 @@ Node *AndLNode::Ideal(PhaseGVN *phase, bool can_reshape) { if( !t2 || !t2->is_con() ) return MulNode::Ideal(phase, can_reshape); const jlong mask = t2->get_con(); - Node *rsh = in(1); - uint rop = rsh->Opcode(); + Node* in1 = in(1); + uint op = in1->Opcode(); + + // Masking sign bits off of an integer? Do an unsigned integer to long load. + if (op == Op_ConvI2L && in1->in(1)->Opcode() == Op_LoadI && mask == 0x00000000FFFFFFFFL) { + Node* load = in1->in(1); + return new (phase->C, 3) LoadUI2LNode(load->in(MemNode::Control), + load->in(MemNode::Memory), + load->in(MemNode::Address), + load->adr_type()); + } // Masking off sign bits? Dont make them! - if( rop == Op_RShiftL ) { - const TypeInt *t12 = phase->type(rsh->in(2))->isa_int(); + if (op == Op_RShiftL) { + const TypeInt *t12 = phase->type(in1->in(2))->isa_int(); if( t12 && t12->is_con() ) { // Shift is by a constant int shift = t12->get_con(); shift &= BitsPerJavaLong - 1; // semantics of Java shifts @@ -613,7 +625,7 @@ Node *AndLNode::Ideal(PhaseGVN *phase, bool can_reshape) { // bits survive. NO sign-extension bits survive the maskings. if( (sign_bits_mask & mask) == 0 ) { // Use zero-fill shift instead - Node *zshift = phase->transform(new (phase->C, 3) URShiftLNode(rsh->in(1),rsh->in(2))); + Node *zshift = phase->transform(new (phase->C, 3) URShiftLNode(in1->in(1), in1->in(2))); return new (phase->C, 3) AndLNode( zshift, in(2) ); } } diff --git a/hotspot/src/share/vm/opto/type.cpp b/hotspot/src/share/vm/opto/type.cpp index 3f250be521b..e831a2ad6f7 100644 --- a/hotspot/src/share/vm/opto/type.cpp +++ b/hotspot/src/share/vm/opto/type.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -226,6 +226,7 @@ void Type::Initialize_shared(Compile* current) { TypeInt::CC_LE = TypeInt::make(-1, 0, WidenMin); TypeInt::CC_GE = TypeInt::make( 0, 1, WidenMin); // == TypeInt::BOOL TypeInt::BYTE = TypeInt::make(-128,127, WidenMin); // Bytes + TypeInt::UBYTE = TypeInt::make(0, 255, WidenMin); // Unsigned Bytes TypeInt::CHAR = TypeInt::make(0,65535, WidenMin); // Java chars TypeInt::SHORT = TypeInt::make(-32768,32767, WidenMin); // Java shorts TypeInt::POS = TypeInt::make(0,max_jint, WidenMin); // Non-neg values @@ -1022,6 +1023,7 @@ const TypeInt *TypeInt::CC_EQ; // [0] == ZERO const TypeInt *TypeInt::CC_LE; // [-1,0] const TypeInt *TypeInt::CC_GE; // [0,1] == BOOL (!) const TypeInt *TypeInt::BYTE; // Bytes, -128 to 127 +const TypeInt *TypeInt::UBYTE; // Unsigned Bytes, 0 to 255 const TypeInt *TypeInt::CHAR; // Java chars, 0-65535 const TypeInt *TypeInt::SHORT; // Java shorts, -32768-32767 const TypeInt *TypeInt::POS; // Positive 32-bit integers or zero diff --git a/hotspot/src/share/vm/opto/type.hpp b/hotspot/src/share/vm/opto/type.hpp index 493b622a28e..917c271cce0 100644 --- a/hotspot/src/share/vm/opto/type.hpp +++ b/hotspot/src/share/vm/opto/type.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -415,6 +415,7 @@ public: static const TypeInt *CC_LE; // [-1,0] static const TypeInt *CC_GE; // [0,1] == BOOL (!) static const TypeInt *BYTE; + static const TypeInt *UBYTE; static const TypeInt *CHAR; static const TypeInt *SHORT; static const TypeInt *POS; diff --git a/hotspot/test/compiler/6797305/Test6797305.java b/hotspot/test/compiler/6797305/Test6797305.java new file mode 100644 index 00000000000..d23b3cca9bc --- /dev/null +++ b/hotspot/test/compiler/6797305/Test6797305.java @@ -0,0 +1,114 @@ +/* + * Copyright 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 6797305 + * @summary Add LoadUB and LoadUI opcode class + * + * @run main/othervm -Xcomp -XX:CompileOnly=Test6797305.loadB,Test6797305.loadB2L,Test6797305.loadUB,Test6797305.loadUBmask,Test6797305.loadUB2L,Test6797305.loadS,Test6797305.loadS2L,Test6797305.loadUS,Test6797305.loadUSmask,Test6797305.loadUS2L,Test6797305.loadI,Test6797305.loadI2L,Test6797305.loadUI2L,Test6797305.loadL Test6797305 + */ + +public class Test6797305 { + static final byte[] ba = new byte[] { -1 }; + static final short[] sa = new short[] { -1 }; + static final int[] ia = new int[] { -1 }; + static final long[] la = new long[] { -1 }; + + public static void main(String[] args) + { + long b = loadB(ba); + if (b != -1) + throw new InternalError("loadB failed: " + b + " != " + -1); + + long b2l = loadB2L(ba); + if (b2l != -1L) + throw new InternalError("loadB2L failed: " + b2l + " != " + -1L); + + int ub = loadUB(ba); + if (ub != 0xFF) + throw new InternalError("loadUB failed: " + ub + " != " + 0xFF); + + int ubmask = loadUBmask(ba); + if (ubmask != 0xFE) + throw new InternalError("loadUBmask failed: " + ubmask + " != " + 0xFE); + + long ub2l = loadUB2L(ba); + if (ub2l != 0xFFL) + throw new InternalError("loadUB2L failed: " + ub2l + " != " + 0xFFL); + + int s = loadS(sa); + if (s != -1) + throw new InternalError("loadS failed: " + s + " != " + -1); + + long s2l = loadS2L(sa); + if (s2l != -1L) + throw new InternalError("loadS2L failed: " + s2l + " != " + -1L); + + int us = loadUS(sa); + if (us != 0xFFFF) + throw new InternalError("loadUS failed: " + us + " != " + 0xFFFF); + + int usmask = loadUSmask(sa); + if (usmask != 0xFFFE) + throw new InternalError("loadUBmask failed: " + ubmask + " != " + 0xFFFE); + + long us2l = loadUS2L(sa); + if (us2l != 0xFFFFL) + throw new InternalError("loadUS2L failed: " + us2l + " != " + 0xFFFFL); + + int i = loadI(ia); + if (i != -1) + throw new InternalError("loadI failed: " + i + " != " + -1); + + long i2l = loadI2L(ia); + if (i2l != -1L) + throw new InternalError("loadI2L failed: " + i2l + " != " + -1L); + + long ui2l = loadUI2L(ia); + if (ui2l != 0xFFFFFFFFL) + throw new InternalError("loadUI2L failed: " + ui2l + " != " + 0xFFFFFFFFL); + + long l = loadL(la); + if (l != -1L) + throw new InternalError("loadL failed: " + l + " != " + -1L); + } + + static int loadB (byte[] ba) { return ba[0]; } + static long loadB2L (byte[] ba) { return ba[0]; } + static int loadUB (byte[] ba) { return ba[0] & 0xFF; } + static int loadUBmask(byte[] ba) { return ba[0] & 0xFE; } + static long loadUB2L (byte[] ba) { return ba[0] & 0xFF; } + + static int loadS (short[] sa) { return sa[0]; } + static long loadS2L (short[] sa) { return sa[0]; } + static int loadUS (short[] sa) { return sa[0] & 0xFFFF; } + static int loadUSmask(short[] sa) { return sa[0] & 0xFFFE; } + static long loadUS2L (short[] sa) { return sa[0] & 0xFFFF; } + + static int loadI (int[] ia) { return ia[0]; } + static long loadI2L (int[] ia) { return ia[0]; } + static long loadUI2L (int[] ia) { return ia[0] & 0xFFFFFFFFL; } + + static long loadL (long[] la) { return la[0]; } +} From 45d1edf5dcc53ec5fc8399f58ff6c824995a39f2 Mon Sep 17 00:00:00 2001 From: Xiomara Jayasena Date: Mon, 9 Mar 2009 13:28:37 -0700 Subject: [PATCH 104/292] 6814575: Update copyright year Update copyright for files that have been modified in 2009, up to 03/09 Reviewed-by: katleman, tbell, ohair --- Makefile | 2 +- make/Defs-internal.gmk | 2 +- make/jdk-rules.gmk | 2 +- make/jprt.config | 2 +- make/jprt.gmk | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 54e5a256873..a0b2dc384f9 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ # -# Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1995-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 diff --git a/make/Defs-internal.gmk b/make/Defs-internal.gmk index 05d8149c5d2..89be05b1efe 100644 --- a/make/Defs-internal.gmk +++ b/make/Defs-internal.gmk @@ -1,5 +1,5 @@ # -# Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1995-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 diff --git a/make/jdk-rules.gmk b/make/jdk-rules.gmk index d0ca905ff02..a84c776a823 100644 --- a/make/jdk-rules.gmk +++ b/make/jdk-rules.gmk @@ -1,5 +1,5 @@ # -# Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2001-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 diff --git a/make/jprt.config b/make/jprt.config index 895d9432e01..aa165472358 100644 --- a/make/jprt.config +++ b/make/jprt.config @@ -1,7 +1,7 @@ #!echo "This is not a shell script" ############################################################################# # -# Copyright 2006-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2006-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 diff --git a/make/jprt.gmk b/make/jprt.gmk index 32803e06256..078e188af73 100644 --- a/make/jprt.gmk +++ b/make/jprt.gmk @@ -1,5 +1,5 @@ # -# Copyright 2006-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2006-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 From 78f81626786216bce7ebdf99fc0f3a7c5ee6ddb5 Mon Sep 17 00:00:00 2001 From: Xiomara Jayasena Date: Mon, 9 Mar 2009 13:28:38 -0700 Subject: [PATCH 105/292] 6814575: Update copyright year Update copyright for files that have been modified in 2009, up to 03/09 Reviewed-by: katleman, tbell, ohair --- .../com/sun/corba/minclude/com_sun_corba_se_impl_dynamicany.jmk | 2 +- .../com/sun/corba/minclude/com_sun_corba_se_impl_encoding.jmk | 2 +- corba/make/com/sun/corba/minclude/com_sun_corba_se_impl_ior.jmk | 2 +- .../com/sun/corba/minclude/com_sun_corba_se_impl_orbutil.jmk | 2 +- .../com/sun/corba/minclude/com_sun_corba_se_impl_protocol.jmk | 2 +- .../corba/minclude/com_sun_corba_se_spi_legacy_interceptor.jmk | 2 +- .../com/sun/corba/minclude/com_sun_corba_se_spi_monitoring.jmk | 2 +- .../corba/minclude/com_sun_corba_se_spi_presentation_rmi.jmk | 2 +- .../com/sun/corba/minclude/com_sun_corba_se_spi_transport.jmk | 2 +- corba/make/com/sun/corba/minclude/org_omg_CosNaming.jmk | 2 +- corba/make/com/sun/corba/minclude/org_omg_DynamicAny.jmk | 2 +- .../make/com/sun/corba/minclude/org_omg_PortableInterceptor.jmk | 2 +- corba/make/com/sun/corba/se/sources/Makefile | 2 +- corba/make/common/Defs-windows.gmk | 2 +- corba/make/common/shared/Compiler-msvc.gmk | 2 +- corba/make/common/shared/Compiler-sun.gmk | 2 +- corba/make/common/shared/Defs-utils.gmk | 2 +- corba/make/common/shared/Defs.gmk | 2 +- corba/make/javax/xa/Makefile | 2 +- corba/make/jprt.config | 2 +- corba/make/org/omg/CORBA/Makefile | 2 +- corba/src/share/classes/org/omg/CORBA/ir.idl | 2 +- corba/src/share/classes/org/omg/DynamicAny/DynamicAny.idl | 2 +- 23 files changed, 23 insertions(+), 23 deletions(-) diff --git a/corba/make/com/sun/corba/minclude/com_sun_corba_se_impl_dynamicany.jmk b/corba/make/com/sun/corba/minclude/com_sun_corba_se_impl_dynamicany.jmk index a3a4ffb5fdd..2907634301b 100644 --- a/corba/make/com/sun/corba/minclude/com_sun_corba_se_impl_dynamicany.jmk +++ b/corba/make/com/sun/corba/minclude/com_sun_corba_se_impl_dynamicany.jmk @@ -1,5 +1,5 @@ # -# Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2000-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 diff --git a/corba/make/com/sun/corba/minclude/com_sun_corba_se_impl_encoding.jmk b/corba/make/com/sun/corba/minclude/com_sun_corba_se_impl_encoding.jmk index 84f725c3353..3ecad394981 100644 --- a/corba/make/com/sun/corba/minclude/com_sun_corba_se_impl_encoding.jmk +++ b/corba/make/com/sun/corba/minclude/com_sun_corba_se_impl_encoding.jmk @@ -1,5 +1,5 @@ # -# Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2003-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 diff --git a/corba/make/com/sun/corba/minclude/com_sun_corba_se_impl_ior.jmk b/corba/make/com/sun/corba/minclude/com_sun_corba_se_impl_ior.jmk index c4cddea8de3..6616877f547 100644 --- a/corba/make/com/sun/corba/minclude/com_sun_corba_se_impl_ior.jmk +++ b/corba/make/com/sun/corba/minclude/com_sun_corba_se_impl_ior.jmk @@ -1,5 +1,5 @@ # -# Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2000-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 diff --git a/corba/make/com/sun/corba/minclude/com_sun_corba_se_impl_orbutil.jmk b/corba/make/com/sun/corba/minclude/com_sun_corba_se_impl_orbutil.jmk index 871b48df55d..476fec4be41 100644 --- a/corba/make/com/sun/corba/minclude/com_sun_corba_se_impl_orbutil.jmk +++ b/corba/make/com/sun/corba/minclude/com_sun_corba_se_impl_orbutil.jmk @@ -1,5 +1,5 @@ # -# Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2000-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 diff --git a/corba/make/com/sun/corba/minclude/com_sun_corba_se_impl_protocol.jmk b/corba/make/com/sun/corba/minclude/com_sun_corba_se_impl_protocol.jmk index 0a6b350ae85..ae588f38bab 100644 --- a/corba/make/com/sun/corba/minclude/com_sun_corba_se_impl_protocol.jmk +++ b/corba/make/com/sun/corba/minclude/com_sun_corba_se_impl_protocol.jmk @@ -1,5 +1,5 @@ # -# Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2002-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 diff --git a/corba/make/com/sun/corba/minclude/com_sun_corba_se_spi_legacy_interceptor.jmk b/corba/make/com/sun/corba/minclude/com_sun_corba_se_spi_legacy_interceptor.jmk index 156eb299ee2..f8cec1b92aa 100644 --- a/corba/make/com/sun/corba/minclude/com_sun_corba_se_spi_legacy_interceptor.jmk +++ b/corba/make/com/sun/corba/minclude/com_sun_corba_se_spi_legacy_interceptor.jmk @@ -1,5 +1,5 @@ # -# Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2003-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 diff --git a/corba/make/com/sun/corba/minclude/com_sun_corba_se_spi_monitoring.jmk b/corba/make/com/sun/corba/minclude/com_sun_corba_se_spi_monitoring.jmk index 6a423c0bb9b..67610d6e5d4 100644 --- a/corba/make/com/sun/corba/minclude/com_sun_corba_se_spi_monitoring.jmk +++ b/corba/make/com/sun/corba/minclude/com_sun_corba_se_spi_monitoring.jmk @@ -1,5 +1,5 @@ # -# Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2003-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 diff --git a/corba/make/com/sun/corba/minclude/com_sun_corba_se_spi_presentation_rmi.jmk b/corba/make/com/sun/corba/minclude/com_sun_corba_se_spi_presentation_rmi.jmk index d6e5e7f94dd..7f78d64ee24 100644 --- a/corba/make/com/sun/corba/minclude/com_sun_corba_se_spi_presentation_rmi.jmk +++ b/corba/make/com/sun/corba/minclude/com_sun_corba_se_spi_presentation_rmi.jmk @@ -1,5 +1,5 @@ # -# Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2003-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 diff --git a/corba/make/com/sun/corba/minclude/com_sun_corba_se_spi_transport.jmk b/corba/make/com/sun/corba/minclude/com_sun_corba_se_spi_transport.jmk index 68f68bae04c..e3e75e7fd05 100644 --- a/corba/make/com/sun/corba/minclude/com_sun_corba_se_spi_transport.jmk +++ b/corba/make/com/sun/corba/minclude/com_sun_corba_se_spi_transport.jmk @@ -1,5 +1,5 @@ # -# Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2002-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 diff --git a/corba/make/com/sun/corba/minclude/org_omg_CosNaming.jmk b/corba/make/com/sun/corba/minclude/org_omg_CosNaming.jmk index 0cff6b03d7d..960eeea740c 100644 --- a/corba/make/com/sun/corba/minclude/org_omg_CosNaming.jmk +++ b/corba/make/com/sun/corba/minclude/org_omg_CosNaming.jmk @@ -1,5 +1,5 @@ # -# Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1997-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 diff --git a/corba/make/com/sun/corba/minclude/org_omg_DynamicAny.jmk b/corba/make/com/sun/corba/minclude/org_omg_DynamicAny.jmk index d9e7c1f8ea8..2ce167ee7ee 100644 --- a/corba/make/com/sun/corba/minclude/org_omg_DynamicAny.jmk +++ b/corba/make/com/sun/corba/minclude/org_omg_DynamicAny.jmk @@ -1,5 +1,5 @@ # -# Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2000-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 diff --git a/corba/make/com/sun/corba/minclude/org_omg_PortableInterceptor.jmk b/corba/make/com/sun/corba/minclude/org_omg_PortableInterceptor.jmk index 5f0a661971c..1c050e894f8 100644 --- a/corba/make/com/sun/corba/minclude/org_omg_PortableInterceptor.jmk +++ b/corba/make/com/sun/corba/minclude/org_omg_PortableInterceptor.jmk @@ -1,5 +1,5 @@ # -# Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2000-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 diff --git a/corba/make/com/sun/corba/se/sources/Makefile b/corba/make/com/sun/corba/se/sources/Makefile index 624661e5afa..164a4e65a93 100644 --- a/corba/make/com/sun/corba/se/sources/Makefile +++ b/corba/make/com/sun/corba/se/sources/Makefile @@ -1,5 +1,5 @@ # -# Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2000-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 diff --git a/corba/make/common/Defs-windows.gmk b/corba/make/common/Defs-windows.gmk index b387e8b51d2..f85c9c14229 100644 --- a/corba/make/common/Defs-windows.gmk +++ b/corba/make/common/Defs-windows.gmk @@ -1,5 +1,5 @@ # -# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1999-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 diff --git a/corba/make/common/shared/Compiler-msvc.gmk b/corba/make/common/shared/Compiler-msvc.gmk index e7ae0e35dcc..a29f7dab6d8 100644 --- a/corba/make/common/shared/Compiler-msvc.gmk +++ b/corba/make/common/shared/Compiler-msvc.gmk @@ -1,5 +1,5 @@ # -# Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2005-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 diff --git a/corba/make/common/shared/Compiler-sun.gmk b/corba/make/common/shared/Compiler-sun.gmk index 1dda0891d03..0baa24abec8 100644 --- a/corba/make/common/shared/Compiler-sun.gmk +++ b/corba/make/common/shared/Compiler-sun.gmk @@ -1,5 +1,5 @@ # -# Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2005-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 diff --git a/corba/make/common/shared/Defs-utils.gmk b/corba/make/common/shared/Defs-utils.gmk index b008c5ed0f4..51bdb660372 100644 --- a/corba/make/common/shared/Defs-utils.gmk +++ b/corba/make/common/shared/Defs-utils.gmk @@ -1,5 +1,5 @@ # -# Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2005-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 diff --git a/corba/make/common/shared/Defs.gmk b/corba/make/common/shared/Defs.gmk index 5af64523ff7..e5afa8eb8e3 100644 --- a/corba/make/common/shared/Defs.gmk +++ b/corba/make/common/shared/Defs.gmk @@ -1,5 +1,5 @@ # -# Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2005-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 diff --git a/corba/make/javax/xa/Makefile b/corba/make/javax/xa/Makefile index 6efdbe1e4f8..693bbdfdd3e 100644 --- a/corba/make/javax/xa/Makefile +++ b/corba/make/javax/xa/Makefile @@ -1,5 +1,5 @@ # -# Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2000-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 diff --git a/corba/make/jprt.config b/corba/make/jprt.config index 2bff1a54c49..37d0086f525 100644 --- a/corba/make/jprt.config +++ b/corba/make/jprt.config @@ -1,7 +1,7 @@ #!echo "This is not a shell script" ############################################################################# # -# Copyright 2006-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2006-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 diff --git a/corba/make/org/omg/CORBA/Makefile b/corba/make/org/omg/CORBA/Makefile index 110660256e4..c6295ccaf37 100644 --- a/corba/make/org/omg/CORBA/Makefile +++ b/corba/make/org/omg/CORBA/Makefile @@ -1,5 +1,5 @@ # -# Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1997-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 diff --git a/corba/src/share/classes/org/omg/CORBA/ir.idl b/corba/src/share/classes/org/omg/CORBA/ir.idl index d7312f993a1..60a985fa516 100644 --- a/corba/src/share/classes/org/omg/CORBA/ir.idl +++ b/corba/src/share/classes/org/omg/CORBA/ir.idl @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/corba/src/share/classes/org/omg/DynamicAny/DynamicAny.idl b/corba/src/share/classes/org/omg/DynamicAny/DynamicAny.idl index 2d21393963e..204880e1484 100644 --- a/corba/src/share/classes/org/omg/DynamicAny/DynamicAny.idl +++ b/corba/src/share/classes/org/omg/DynamicAny/DynamicAny.idl @@ -1,5 +1,5 @@ /* - * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-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 From 2be2e027b0b61c48b501c650691898fa42e405f8 Mon Sep 17 00:00:00 2001 From: Xiomara Jayasena Date: Mon, 9 Mar 2009 13:28:46 -0700 Subject: [PATCH 106/292] 6814575: Update copyright year Update copyright for files that have been modified in 2009, up to 03/09 Reviewed-by: katleman, tbell, ohair --- hotspot/agent/src/os/linux/ps_core.c | 2 +- hotspot/agent/src/os/solaris/proc/saproc.cpp | 2 +- hotspot/make/hotspot_version | 2 +- hotspot/make/linux/makefiles/adlc.make | 2 +- hotspot/make/linux/makefiles/gcc.make | 2 +- hotspot/make/solaris/makefiles/adlc.make | 2 +- hotspot/src/cpu/sparc/vm/jni_sparc.h | 2 +- hotspot/src/cpu/sparc/vm/sparc.ad | 2 +- hotspot/src/cpu/x86/vm/assembler_x86.cpp | 2 +- hotspot/src/cpu/x86/vm/bytecodeInterpreter_x86.inline.hpp | 2 +- hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp | 2 +- hotspot/src/cpu/x86/vm/c1_Runtime1_x86.cpp | 2 +- hotspot/src/cpu/x86/vm/cppInterpreter_x86.cpp | 2 +- hotspot/src/cpu/x86/vm/frame_x86.inline.hpp | 2 +- hotspot/src/cpu/x86/vm/interp_masm_x86_32.cpp | 2 +- hotspot/src/cpu/x86/vm/interp_masm_x86_32.hpp | 2 +- hotspot/src/cpu/x86/vm/interp_masm_x86_64.cpp | 2 +- hotspot/src/cpu/x86/vm/interpreterRT_x86_32.cpp | 2 +- hotspot/src/cpu/x86/vm/jni_x86.h | 2 +- hotspot/src/cpu/x86/vm/runtime_x86_32.cpp | 2 +- hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp | 2 +- hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp | 2 +- hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp | 2 +- hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp | 2 +- hotspot/src/cpu/x86/vm/templateInterpreter_x86_32.cpp | 2 +- hotspot/src/cpu/x86/vm/templateTable_x86_32.cpp | 2 +- hotspot/src/cpu/x86/vm/x86_32.ad | 2 +- hotspot/src/cpu/x86/vm/x86_64.ad | 2 +- hotspot/src/os/linux/vm/os_linux.cpp | 2 +- hotspot/src/os/solaris/vm/os_solaris.cpp | 2 +- hotspot/src/os/windows/vm/os_windows.cpp | 2 +- hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp | 2 +- hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp | 2 +- hotspot/src/os_cpu/solaris_x86/vm/solaris_x86_32.il | 2 +- hotspot/src/os_cpu/solaris_x86/vm/solaris_x86_64.il | 2 +- hotspot/src/share/vm/adlc/adlparse.cpp | 2 +- hotspot/src/share/vm/adlc/adlparse.hpp | 2 +- hotspot/src/share/vm/adlc/archDesc.cpp | 2 +- hotspot/src/share/vm/adlc/dfa.cpp | 2 +- hotspot/src/share/vm/adlc/dict2.cpp | 2 +- hotspot/src/share/vm/adlc/filebuff.hpp | 2 +- hotspot/src/share/vm/adlc/forms.cpp | 2 +- hotspot/src/share/vm/adlc/formssel.cpp | 2 +- hotspot/src/share/vm/asm/codeBuffer.cpp | 2 +- hotspot/src/share/vm/c1/c1_LIRGenerator.cpp | 2 +- hotspot/src/share/vm/c1/c1_Optimizer.cpp | 2 +- hotspot/src/share/vm/c1/c1_Runtime1.cpp | 2 +- hotspot/src/share/vm/classfile/classFileParser.cpp | 2 +- hotspot/src/share/vm/classfile/javaClasses.cpp | 2 +- hotspot/src/share/vm/classfile/javaClasses.hpp | 2 +- hotspot/src/share/vm/classfile/systemDictionary.cpp | 2 +- hotspot/src/share/vm/classfile/systemDictionary.hpp | 2 +- hotspot/src/share/vm/classfile/vmSymbols.hpp | 2 +- .../concurrentMarkSweep/compactibleFreeListSpace.cpp | 2 +- .../concurrentMarkSweep/compactibleFreeListSpace.hpp | 2 +- .../concurrentMarkSweep/concurrentMarkSweepGeneration.cpp | 2 +- .../concurrentMarkSweep/concurrentMarkSweepGeneration.hpp | 2 +- .../share/vm/gc_implementation/g1/collectionSetChooser.hpp | 2 +- .../src/share/vm/gc_implementation/g1/concurrentG1Refine.hpp | 2 +- hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp | 2 +- hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp | 2 +- hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp | 2 +- .../share/vm/gc_implementation/g1/g1CollectedHeap.inline.hpp | 2 +- .../src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp | 2 +- .../src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp | 2 +- hotspot/src/share/vm/gc_implementation/g1/g1MMUTracker.hpp | 2 +- hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.hpp | 2 +- hotspot/src/share/vm/gc_implementation/g1/g1RemSet.cpp | 2 +- hotspot/src/share/vm/gc_implementation/g1/g1RemSet.hpp | 2 +- hotspot/src/share/vm/gc_implementation/g1/g1_globals.hpp | 2 +- .../vm/gc_implementation/g1/g1_specialized_oop_closures.hpp | 2 +- hotspot/src/share/vm/gc_implementation/g1/heapRegion.hpp | 2 +- .../src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp | 2 +- .../src/share/vm/gc_implementation/g1/heapRegionRemSet.hpp | 2 +- hotspot/src/share/vm/gc_implementation/g1/heapRegionSeq.cpp | 2 +- hotspot/src/share/vm/gc_implementation/g1/ptrQueue.hpp | 2 +- hotspot/src/share/vm/gc_implementation/g1/sparsePRT.hpp | 2 +- hotspot/src/share/vm/gc_implementation/g1/survRateGroup.cpp | 2 +- hotspot/src/share/vm/gc_implementation/g1/survRateGroup.hpp | 2 +- .../vm/gc_implementation/includeDB_gc_concurrentMarkSweep | 2 +- hotspot/src/share/vm/gc_implementation/includeDB_gc_g1 | 2 +- .../share/vm/gc_implementation/includeDB_gc_parallelScavenge | 2 +- hotspot/src/share/vm/gc_implementation/includeDB_gc_shared | 2 +- .../share/vm/gc_implementation/parNew/parGCAllocBuffer.cpp | 2 +- .../share/vm/gc_implementation/parNew/parNewGeneration.cpp | 2 +- .../share/vm/gc_implementation/parNew/parNewGeneration.hpp | 2 +- .../parallelScavenge/parallelScavengeHeap.hpp | 2 +- .../vm/gc_implementation/parallelScavenge/psMarkSweep.cpp | 2 +- .../parallelScavenge/psMarkSweepDecorator.cpp | 2 +- .../share/vm/gc_implementation/parallelScavenge/psOldGen.cpp | 2 +- .../gc_implementation/parallelScavenge/psParallelCompact.cpp | 2 +- .../gc_implementation/parallelScavenge/psParallelCompact.hpp | 2 +- .../gc_implementation/parallelScavenge/psPromotionManager.cpp | 2 +- .../vm/gc_implementation/parallelScavenge/psScavenge.cpp | 2 +- .../vm/gc_implementation/parallelScavenge/psVirtualspace.cpp | 2 +- .../vm/gc_implementation/parallelScavenge/psVirtualspace.hpp | 2 +- .../vm/gc_implementation/parallelScavenge/psYoungGen.cpp | 2 +- hotspot/src/share/vm/gc_implementation/shared/ageTable.cpp | 4 ++-- hotspot/src/share/vm/gc_implementation/shared/ageTable.hpp | 4 ++-- .../share/vm/gc_implementation/shared/mutableNUMASpace.cpp | 2 +- .../share/vm/gc_implementation/shared/mutableNUMASpace.hpp | 2 +- .../src/share/vm/gc_implementation/shared/mutableSpace.cpp | 2 +- .../src/share/vm/gc_implementation/shared/mutableSpace.hpp | 2 +- hotspot/src/share/vm/gc_interface/collectedHeap.cpp | 2 +- hotspot/src/share/vm/gc_interface/collectedHeap.hpp | 2 +- hotspot/src/share/vm/gc_interface/collectedHeap.inline.hpp | 2 +- hotspot/src/share/vm/includeDB_compiler2 | 2 +- hotspot/src/share/vm/includeDB_core | 2 +- hotspot/src/share/vm/includeDB_features | 2 +- hotspot/src/share/vm/includeDB_gc | 2 +- hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp | 2 +- hotspot/src/share/vm/interpreter/bytecodeInterpreter.hpp | 2 +- hotspot/src/share/vm/interpreter/rewriter.cpp | 2 +- hotspot/src/share/vm/libadt/dict.cpp | 2 +- hotspot/src/share/vm/libadt/port.hpp | 2 +- hotspot/src/share/vm/memory/cardTableModRefBS.cpp | 2 +- hotspot/src/share/vm/memory/cardTableModRefBS.hpp | 2 +- hotspot/src/share/vm/memory/genCollectedHeap.cpp | 2 +- hotspot/src/share/vm/memory/genCollectedHeap.hpp | 2 +- hotspot/src/share/vm/memory/generation.cpp | 2 +- hotspot/src/share/vm/memory/generation.hpp | 2 +- hotspot/src/share/vm/memory/heapInspection.cpp | 2 +- hotspot/src/share/vm/memory/oopFactory.cpp | 2 +- hotspot/src/share/vm/memory/oopFactory.hpp | 2 +- hotspot/src/share/vm/memory/permGen.cpp | 2 +- hotspot/src/share/vm/memory/referenceProcessor.cpp | 2 +- hotspot/src/share/vm/memory/sharedHeap.cpp | 2 +- hotspot/src/share/vm/memory/sharedHeap.hpp | 2 +- hotspot/src/share/vm/memory/space.cpp | 2 +- hotspot/src/share/vm/memory/space.hpp | 2 +- hotspot/src/share/vm/memory/tenuredGeneration.cpp | 2 +- hotspot/src/share/vm/memory/threadLocalAllocBuffer.cpp | 2 +- hotspot/src/share/vm/memory/universe.cpp | 2 +- hotspot/src/share/vm/memory/universe.hpp | 2 +- hotspot/src/share/vm/oops/arrayOop.hpp | 2 +- hotspot/src/share/vm/oops/constMethodKlass.cpp | 2 +- hotspot/src/share/vm/oops/constMethodKlass.hpp | 2 +- hotspot/src/share/vm/oops/constMethodOop.hpp | 2 +- hotspot/src/share/vm/oops/constantPoolKlass.cpp | 2 +- hotspot/src/share/vm/oops/constantPoolKlass.hpp | 2 +- hotspot/src/share/vm/oops/constantPoolOop.cpp | 2 +- hotspot/src/share/vm/oops/constantPoolOop.hpp | 2 +- hotspot/src/share/vm/oops/cpCacheKlass.cpp | 2 +- hotspot/src/share/vm/oops/cpCacheKlass.hpp | 2 +- hotspot/src/share/vm/oops/cpCacheOop.hpp | 2 +- hotspot/src/share/vm/oops/klass.hpp | 2 +- hotspot/src/share/vm/oops/methodOop.cpp | 2 +- hotspot/src/share/vm/oops/methodOop.hpp | 2 +- hotspot/src/share/vm/oops/oop.hpp | 2 +- hotspot/src/share/vm/oops/oop.inline.hpp | 2 +- hotspot/src/share/vm/oops/oopsHierarchy.hpp | 2 +- hotspot/src/share/vm/oops/typeArrayKlass.cpp | 2 +- hotspot/src/share/vm/oops/typeArrayKlass.hpp | 2 +- hotspot/src/share/vm/opto/block.cpp | 2 +- hotspot/src/share/vm/opto/c2_globals.hpp | 2 +- hotspot/src/share/vm/opto/cfgnode.cpp | 2 +- hotspot/src/share/vm/opto/chaitin.cpp | 2 +- hotspot/src/share/vm/opto/chaitin.hpp | 2 +- hotspot/src/share/vm/opto/classes.hpp | 2 +- hotspot/src/share/vm/opto/compile.cpp | 2 +- hotspot/src/share/vm/opto/gcm.cpp | 2 +- hotspot/src/share/vm/opto/graphKit.cpp | 2 +- hotspot/src/share/vm/opto/graphKit.hpp | 2 +- hotspot/src/share/vm/opto/idealGraphPrinter.cpp | 2 +- hotspot/src/share/vm/opto/ifg.cpp | 2 +- hotspot/src/share/vm/opto/lcm.cpp | 2 +- hotspot/src/share/vm/opto/live.cpp | 2 +- hotspot/src/share/vm/opto/loopnode.cpp | 2 +- hotspot/src/share/vm/opto/macro.cpp | 2 +- hotspot/src/share/vm/opto/matcher.cpp | 2 +- hotspot/src/share/vm/opto/memnode.cpp | 2 +- hotspot/src/share/vm/opto/memnode.hpp | 2 +- hotspot/src/share/vm/opto/reg_split.cpp | 2 +- hotspot/src/share/vm/opto/superword.cpp | 2 +- hotspot/src/share/vm/opto/type.cpp | 2 +- hotspot/src/share/vm/opto/type.hpp | 2 +- hotspot/src/share/vm/opto/vectornode.cpp | 2 +- hotspot/src/share/vm/prims/jni.cpp | 2 +- hotspot/src/share/vm/prims/jvm.cpp | 2 +- hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp | 2 +- hotspot/src/share/vm/prims/jvmtiTagMap.cpp | 2 +- hotspot/src/share/vm/runtime/arguments.cpp | 2 +- hotspot/src/share/vm/runtime/arguments.hpp | 2 +- hotspot/src/share/vm/runtime/globals.hpp | 2 +- hotspot/src/share/vm/runtime/javaCalls.cpp | 2 +- hotspot/src/share/vm/runtime/memprofiler.cpp | 2 +- hotspot/src/share/vm/runtime/os.cpp | 2 +- hotspot/src/share/vm/runtime/os.hpp | 2 +- hotspot/src/share/vm/runtime/safepoint.cpp | 2 +- hotspot/src/share/vm/runtime/sharedRuntime.cpp | 2 +- hotspot/src/share/vm/runtime/synchronizer.cpp | 2 +- hotspot/src/share/vm/services/heapDumper.cpp | 2 +- hotspot/src/share/vm/services/management.cpp | 2 +- hotspot/src/share/vm/utilities/globalDefinitions_gcc.hpp | 2 +- .../src/share/vm/utilities/globalDefinitions_sparcWorks.hpp | 2 +- hotspot/src/share/vm/utilities/ostream.cpp | 2 +- hotspot/src/share/vm/utilities/taskqueue.cpp | 2 +- hotspot/src/share/vm/utilities/taskqueue.hpp | 2 +- hotspot/src/share/vm/utilities/vmError.cpp | 2 +- hotspot/src/share/vm/utilities/vmError.hpp | 2 +- hotspot/src/share/vm/utilities/workgroup.hpp | 2 +- hotspot/test/Makefile | 2 +- hotspot/test/compiler/6757316/Test6757316.java | 2 +- hotspot/test/compiler/6758234/Test6758234.java | 2 +- hotspot/test/compiler/6775880/Test.java | 2 +- hotspot/test/compiler/6778657/Test.java | 2 +- 206 files changed, 208 insertions(+), 208 deletions(-) diff --git a/hotspot/agent/src/os/linux/ps_core.c b/hotspot/agent/src/os/linux/ps_core.c index a6156f0a8d4..95e14574894 100644 --- a/hotspot/agent/src/os/linux/ps_core.c +++ b/hotspot/agent/src/os/linux/ps_core.c @@ -1,5 +1,5 @@ /* - * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-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 diff --git a/hotspot/agent/src/os/solaris/proc/saproc.cpp b/hotspot/agent/src/os/solaris/proc/saproc.cpp index 415e28af658..dc1018e2602 100644 --- a/hotspot/agent/src/os/solaris/proc/saproc.cpp +++ b/hotspot/agent/src/os/solaris/proc/saproc.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2002-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-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 diff --git a/hotspot/make/hotspot_version b/hotspot/make/hotspot_version index eea8597c7cf..4b57338eb9a 100644 --- a/hotspot/make/hotspot_version +++ b/hotspot/make/hotspot_version @@ -1,5 +1,5 @@ # -# Copyright 2006-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2006-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 diff --git a/hotspot/make/linux/makefiles/adlc.make b/hotspot/make/linux/makefiles/adlc.make index 5e48fed1567..5d5f721519c 100644 --- a/hotspot/make/linux/makefiles/adlc.make +++ b/hotspot/make/linux/makefiles/adlc.make @@ -1,5 +1,5 @@ # -# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1999-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 diff --git a/hotspot/make/linux/makefiles/gcc.make b/hotspot/make/linux/makefiles/gcc.make index 1a1f1465c81..002e960d36e 100644 --- a/hotspot/make/linux/makefiles/gcc.make +++ b/hotspot/make/linux/makefiles/gcc.make @@ -1,5 +1,5 @@ # -# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1999-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 diff --git a/hotspot/make/solaris/makefiles/adlc.make b/hotspot/make/solaris/makefiles/adlc.make index 2d1a87a20b4..e5b6ad6a7fc 100644 --- a/hotspot/make/solaris/makefiles/adlc.make +++ b/hotspot/make/solaris/makefiles/adlc.make @@ -1,5 +1,5 @@ # -# Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1997-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 diff --git a/hotspot/src/cpu/sparc/vm/jni_sparc.h b/hotspot/src/cpu/sparc/vm/jni_sparc.h index 33a494b6066..8eaab8d9481 100644 --- a/hotspot/src/cpu/sparc/vm/jni_sparc.h +++ b/hotspot/src/cpu/sparc/vm/jni_sparc.h @@ -1,5 +1,5 @@ /* - * Copyright 1997-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/cpu/sparc/vm/sparc.ad b/hotspot/src/cpu/sparc/vm/sparc.ad index b4a94ac240a..174e9d4d813 100644 --- a/hotspot/src/cpu/sparc/vm/sparc.ad +++ b/hotspot/src/cpu/sparc/vm/sparc.ad @@ -1,5 +1,5 @@ // -// Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. +// Copyright 1998-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 diff --git a/hotspot/src/cpu/x86/vm/assembler_x86.cpp b/hotspot/src/cpu/x86/vm/assembler_x86.cpp index d6433f0e176..9a81793c4fd 100644 --- a/hotspot/src/cpu/x86/vm/assembler_x86.cpp +++ b/hotspot/src/cpu/x86/vm/assembler_x86.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/cpu/x86/vm/bytecodeInterpreter_x86.inline.hpp b/hotspot/src/cpu/x86/vm/bytecodeInterpreter_x86.inline.hpp index f66bfd4d309..388e1cfd967 100644 --- a/hotspot/src/cpu/x86/vm/bytecodeInterpreter_x86.inline.hpp +++ b/hotspot/src/cpu/x86/vm/bytecodeInterpreter_x86.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2002 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-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 diff --git a/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp b/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp index cdf508fab01..1a69ebf5cd6 100644 --- a/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp +++ b/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-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 diff --git a/hotspot/src/cpu/x86/vm/c1_Runtime1_x86.cpp b/hotspot/src/cpu/x86/vm/c1_Runtime1_x86.cpp index 12aea3fde07..3edbcbbd194 100644 --- a/hotspot/src/cpu/x86/vm/c1_Runtime1_x86.cpp +++ b/hotspot/src/cpu/x86/vm/c1_Runtime1_x86.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-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 diff --git a/hotspot/src/cpu/x86/vm/cppInterpreter_x86.cpp b/hotspot/src/cpu/x86/vm/cppInterpreter_x86.cpp index a3621ad886c..b09178fab7e 100644 --- a/hotspot/src/cpu/x86/vm/cppInterpreter_x86.cpp +++ b/hotspot/src/cpu/x86/vm/cppInterpreter_x86.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2007-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 diff --git a/hotspot/src/cpu/x86/vm/frame_x86.inline.hpp b/hotspot/src/cpu/x86/vm/frame_x86.inline.hpp index 82c37fd41da..c3bfdae6d01 100644 --- a/hotspot/src/cpu/x86/vm/frame_x86.inline.hpp +++ b/hotspot/src/cpu/x86/vm/frame_x86.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/cpu/x86/vm/interp_masm_x86_32.cpp b/hotspot/src/cpu/x86/vm/interp_masm_x86_32.cpp index c11c3bc5404..119d141bede 100644 --- a/hotspot/src/cpu/x86/vm/interp_masm_x86_32.cpp +++ b/hotspot/src/cpu/x86/vm/interp_masm_x86_32.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/cpu/x86/vm/interp_masm_x86_32.hpp b/hotspot/src/cpu/x86/vm/interp_masm_x86_32.hpp index 57cd7f325fe..dc6c7bce25c 100644 --- a/hotspot/src/cpu/x86/vm/interp_masm_x86_32.hpp +++ b/hotspot/src/cpu/x86/vm/interp_masm_x86_32.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/cpu/x86/vm/interp_masm_x86_64.cpp b/hotspot/src/cpu/x86/vm/interp_masm_x86_64.cpp index ebcac0fddf9..1c56a9d8c35 100644 --- a/hotspot/src/cpu/x86/vm/interp_masm_x86_64.cpp +++ b/hotspot/src/cpu/x86/vm/interp_masm_x86_64.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-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 diff --git a/hotspot/src/cpu/x86/vm/interpreterRT_x86_32.cpp b/hotspot/src/cpu/x86/vm/interpreterRT_x86_32.cpp index 60af2f45735..2faa99b294c 100644 --- a/hotspot/src/cpu/x86/vm/interpreterRT_x86_32.cpp +++ b/hotspot/src/cpu/x86/vm/interpreterRT_x86_32.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-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 diff --git a/hotspot/src/cpu/x86/vm/jni_x86.h b/hotspot/src/cpu/x86/vm/jni_x86.h index 625562bb3f2..3156a94aa92 100644 --- a/hotspot/src/cpu/x86/vm/jni_x86.h +++ b/hotspot/src/cpu/x86/vm/jni_x86.h @@ -1,5 +1,5 @@ /* - * Copyright 1997-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/cpu/x86/vm/runtime_x86_32.cpp b/hotspot/src/cpu/x86/vm/runtime_x86_32.cpp index 6a92a2c053e..5a0de22f475 100644 --- a/hotspot/src/cpu/x86/vm/runtime_x86_32.cpp +++ b/hotspot/src/cpu/x86/vm/runtime_x86_32.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-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 diff --git a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp index 3cf22d7fa05..dd5a00640a0 100644 --- a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp +++ b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-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 diff --git a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp index 7fc2b6685e4..79986f2e1d5 100644 --- a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp +++ b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-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 diff --git a/hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp b/hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp index 9b220e20449..870355a4ab4 100644 --- a/hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp +++ b/hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-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 diff --git a/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp b/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp index 6c2fb5694e8..03f8a3c0d20 100644 --- a/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp +++ b/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-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 diff --git a/hotspot/src/cpu/x86/vm/templateInterpreter_x86_32.cpp b/hotspot/src/cpu/x86/vm/templateInterpreter_x86_32.cpp index ed40fb70124..2969c38f3db 100644 --- a/hotspot/src/cpu/x86/vm/templateInterpreter_x86_32.cpp +++ b/hotspot/src/cpu/x86/vm/templateInterpreter_x86_32.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/cpu/x86/vm/templateTable_x86_32.cpp b/hotspot/src/cpu/x86/vm/templateTable_x86_32.cpp index 13242651c7e..91e7a3b413d 100644 --- a/hotspot/src/cpu/x86/vm/templateTable_x86_32.cpp +++ b/hotspot/src/cpu/x86/vm/templateTable_x86_32.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/cpu/x86/vm/x86_32.ad b/hotspot/src/cpu/x86/vm/x86_32.ad index edc6a63e79f..700ba3dcfab 100644 --- a/hotspot/src/cpu/x86/vm/x86_32.ad +++ b/hotspot/src/cpu/x86/vm/x86_32.ad @@ -1,5 +1,5 @@ // -// Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. +// Copyright 1997-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 diff --git a/hotspot/src/cpu/x86/vm/x86_64.ad b/hotspot/src/cpu/x86/vm/x86_64.ad index ad4f03b23a3..28b412392d6 100644 --- a/hotspot/src/cpu/x86/vm/x86_64.ad +++ b/hotspot/src/cpu/x86/vm/x86_64.ad @@ -1,5 +1,5 @@ // -// Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. +// Copyright 2003-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 diff --git a/hotspot/src/os/linux/vm/os_linux.cpp b/hotspot/src/os/linux/vm/os_linux.cpp index 846906951d4..9f80f6611ae 100644 --- a/hotspot/src/os/linux/vm/os_linux.cpp +++ b/hotspot/src/os/linux/vm/os_linux.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-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 diff --git a/hotspot/src/os/solaris/vm/os_solaris.cpp b/hotspot/src/os/solaris/vm/os_solaris.cpp index c5c83883f48..a8aef4af965 100644 --- a/hotspot/src/os/solaris/vm/os_solaris.cpp +++ b/hotspot/src/os/solaris/vm/os_solaris.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/os/windows/vm/os_windows.cpp b/hotspot/src/os/windows/vm/os_windows.cpp index dce602e8ecb..808bc7bd3a3 100644 --- a/hotspot/src/os/windows/vm/os_windows.cpp +++ b/hotspot/src/os/windows/vm/os_windows.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp b/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp index 90e1921f8a0..df685ff5148 100644 --- a/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp +++ b/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-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 diff --git a/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp b/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp index c37370b572b..bf5a0e079c8 100644 --- a/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp +++ b/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-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 diff --git a/hotspot/src/os_cpu/solaris_x86/vm/solaris_x86_32.il b/hotspot/src/os_cpu/solaris_x86/vm/solaris_x86_32.il index 9e1d6ce8ed3..5ac1d25a766 100644 --- a/hotspot/src/os_cpu/solaris_x86/vm/solaris_x86_32.il +++ b/hotspot/src/os_cpu/solaris_x86/vm/solaris_x86_32.il @@ -1,5 +1,5 @@ // -// Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. +// Copyright 2003-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 diff --git a/hotspot/src/os_cpu/solaris_x86/vm/solaris_x86_64.il b/hotspot/src/os_cpu/solaris_x86/vm/solaris_x86_64.il index 169bebc9984..6b4c23a342f 100644 --- a/hotspot/src/os_cpu/solaris_x86/vm/solaris_x86_64.il +++ b/hotspot/src/os_cpu/solaris_x86/vm/solaris_x86_64.il @@ -1,5 +1,5 @@ // -// Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved. +// 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 diff --git a/hotspot/src/share/vm/adlc/adlparse.cpp b/hotspot/src/share/vm/adlc/adlparse.cpp index 81a95e861ab..4c65c3a1586 100644 --- a/hotspot/src/share/vm/adlc/adlparse.cpp +++ b/hotspot/src/share/vm/adlc/adlparse.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/adlc/adlparse.hpp b/hotspot/src/share/vm/adlc/adlparse.hpp index 0840bfc758b..caedec483a4 100644 --- a/hotspot/src/share/vm/adlc/adlparse.hpp +++ b/hotspot/src/share/vm/adlc/adlparse.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/adlc/archDesc.cpp b/hotspot/src/share/vm/adlc/archDesc.cpp index a73ad76da23..15c522ce207 100644 --- a/hotspot/src/share/vm/adlc/archDesc.cpp +++ b/hotspot/src/share/vm/adlc/archDesc.cpp @@ -1,5 +1,5 @@ // -// Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. +// Copyright 1997-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 diff --git a/hotspot/src/share/vm/adlc/dfa.cpp b/hotspot/src/share/vm/adlc/dfa.cpp index 1075c9da774..520cee5c54a 100644 --- a/hotspot/src/share/vm/adlc/dfa.cpp +++ b/hotspot/src/share/vm/adlc/dfa.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/adlc/dict2.cpp b/hotspot/src/share/vm/adlc/dict2.cpp index f46693fd06c..cdfdf216f76 100644 --- a/hotspot/src/share/vm/adlc/dict2.cpp +++ b/hotspot/src/share/vm/adlc/dict2.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2002 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-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 diff --git a/hotspot/src/share/vm/adlc/filebuff.hpp b/hotspot/src/share/vm/adlc/filebuff.hpp index 8f12f9262d9..d0d2ebe11ff 100644 --- a/hotspot/src/share/vm/adlc/filebuff.hpp +++ b/hotspot/src/share/vm/adlc/filebuff.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/adlc/forms.cpp b/hotspot/src/share/vm/adlc/forms.cpp index cfcfd0a36d8..5c3c8c52189 100644 --- a/hotspot/src/share/vm/adlc/forms.cpp +++ b/hotspot/src/share/vm/adlc/forms.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/adlc/formssel.cpp b/hotspot/src/share/vm/adlc/formssel.cpp index c265c1d04c7..76bf0c7fd86 100644 --- a/hotspot/src/share/vm/adlc/formssel.cpp +++ b/hotspot/src/share/vm/adlc/formssel.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-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 diff --git a/hotspot/src/share/vm/asm/codeBuffer.cpp b/hotspot/src/share/vm/asm/codeBuffer.cpp index 7ae4a13232a..3aa6036aff2 100644 --- a/hotspot/src/share/vm/asm/codeBuffer.cpp +++ b/hotspot/src/share/vm/asm/codeBuffer.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp b/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp index 9b718a3d28f..12357678191 100644 --- a/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp +++ b/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-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 diff --git a/hotspot/src/share/vm/c1/c1_Optimizer.cpp b/hotspot/src/share/vm/c1/c1_Optimizer.cpp index 1b9f77aeef2..ca6c6f7f2ce 100644 --- a/hotspot/src/share/vm/c1/c1_Optimizer.cpp +++ b/hotspot/src/share/vm/c1/c1_Optimizer.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-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 diff --git a/hotspot/src/share/vm/c1/c1_Runtime1.cpp b/hotspot/src/share/vm/c1/c1_Runtime1.cpp index dcd0f282ab9..986cfd28561 100644 --- a/hotspot/src/share/vm/c1/c1_Runtime1.cpp +++ b/hotspot/src/share/vm/c1/c1_Runtime1.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-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 diff --git a/hotspot/src/share/vm/classfile/classFileParser.cpp b/hotspot/src/share/vm/classfile/classFileParser.cpp index 4f8ec88f866..c49e4a62306 100644 --- a/hotspot/src/share/vm/classfile/classFileParser.cpp +++ b/hotspot/src/share/vm/classfile/classFileParser.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/classfile/javaClasses.cpp b/hotspot/src/share/vm/classfile/javaClasses.cpp index 385e6a16e7f..4b8b9892b6c 100644 --- a/hotspot/src/share/vm/classfile/javaClasses.cpp +++ b/hotspot/src/share/vm/classfile/javaClasses.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/classfile/javaClasses.hpp b/hotspot/src/share/vm/classfile/javaClasses.hpp index 612a0013562..64b0d4768f9 100644 --- a/hotspot/src/share/vm/classfile/javaClasses.hpp +++ b/hotspot/src/share/vm/classfile/javaClasses.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/classfile/systemDictionary.cpp b/hotspot/src/share/vm/classfile/systemDictionary.cpp index 9ab749afb3e..95551841633 100644 --- a/hotspot/src/share/vm/classfile/systemDictionary.cpp +++ b/hotspot/src/share/vm/classfile/systemDictionary.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/classfile/systemDictionary.hpp b/hotspot/src/share/vm/classfile/systemDictionary.hpp index 38abf2d3c0a..7ee23212587 100644 --- a/hotspot/src/share/vm/classfile/systemDictionary.hpp +++ b/hotspot/src/share/vm/classfile/systemDictionary.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/classfile/vmSymbols.hpp b/hotspot/src/share/vm/classfile/vmSymbols.hpp index 8379af9c414..338b14877a0 100644 --- a/hotspot/src/share/vm/classfile/vmSymbols.hpp +++ b/hotspot/src/share/vm/classfile/vmSymbols.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp index 6c6272a2f84..6b4bd36d934 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp index e0c48a1b79a..9f16f8d2eb0 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp index d716797bab4..3848395f000 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp index d36c6fc47df..dd5f5605595 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_implementation/g1/collectionSetChooser.hpp b/hotspot/src/share/vm/gc_implementation/g1/collectionSetChooser.hpp index 2c23680ced6..5960d8cce26 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/collectionSetChooser.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/collectionSetChooser.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_implementation/g1/concurrentG1Refine.hpp b/hotspot/src/share/vm/gc_implementation/g1/concurrentG1Refine.hpp index 1436e5a1c52..a2717150206 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/concurrentG1Refine.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentG1Refine.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp index db4b4dfb834..274f8c19e6e 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp index 1c6766b9947..63bac050d7b 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp index 2e139b7f2d2..26719c07360 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.inline.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.inline.hpp index 4d88ee4cbb6..d022044e0b0 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.inline.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp index 949e3f99700..7ee7252dce3 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp index 1649584cd31..2d30a398ed5 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1MMUTracker.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1MMUTracker.hpp index 8eb83a8bef6..05a258f7c65 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1MMUTracker.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1MMUTracker.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.hpp index 2791bf6ee6b..1619770a663 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.cpp index 7946c41ff79..64080f03835 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.hpp index 9f03d394db2..30eddfb5fab 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1_globals.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1_globals.hpp index 43b1d59c852..b68457af556 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1_globals.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1_globals.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1_specialized_oop_closures.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1_specialized_oop_closures.hpp index 4cfb76464e4..5171bdb62cb 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1_specialized_oop_closures.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1_specialized_oop_closures.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_implementation/g1/heapRegion.hpp b/hotspot/src/share/vm/gc_implementation/g1/heapRegion.hpp index 10ed5a7d19b..2899021d8bb 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/heapRegion.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegion.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp b/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp index 5e54b091976..acb51a4fc4d 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.hpp b/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.hpp index e5a713109f9..042588458ef 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_implementation/g1/heapRegionSeq.cpp b/hotspot/src/share/vm/gc_implementation/g1/heapRegionSeq.cpp index 5eeb42fbf6c..915cd439336 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/heapRegionSeq.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegionSeq.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_implementation/g1/ptrQueue.hpp b/hotspot/src/share/vm/gc_implementation/g1/ptrQueue.hpp index df5557c29a6..b64c4efc75c 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/ptrQueue.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/ptrQueue.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_implementation/g1/sparsePRT.hpp b/hotspot/src/share/vm/gc_implementation/g1/sparsePRT.hpp index 7c914c7f65c..1fc0212e3ab 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/sparsePRT.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/sparsePRT.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_implementation/g1/survRateGroup.cpp b/hotspot/src/share/vm/gc_implementation/g1/survRateGroup.cpp index dbd709a95f4..e1d2b1890f6 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/survRateGroup.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/survRateGroup.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_implementation/g1/survRateGroup.hpp b/hotspot/src/share/vm/gc_implementation/g1/survRateGroup.hpp index 1f5aa2c8bee..889453b3cea 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/survRateGroup.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/survRateGroup.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_implementation/includeDB_gc_concurrentMarkSweep b/hotspot/src/share/vm/gc_implementation/includeDB_gc_concurrentMarkSweep index ac88dc1752b..a58a72c39a9 100644 --- a/hotspot/src/share/vm/gc_implementation/includeDB_gc_concurrentMarkSweep +++ b/hotspot/src/share/vm/gc_implementation/includeDB_gc_concurrentMarkSweep @@ -1,5 +1,5 @@ // -// Copyright 2004-2008 Sun Microsystems, Inc. All Rights Reserved. +// 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 diff --git a/hotspot/src/share/vm/gc_implementation/includeDB_gc_g1 b/hotspot/src/share/vm/gc_implementation/includeDB_gc_g1 index 84942954651..ab466d70e1b 100644 --- a/hotspot/src/share/vm/gc_implementation/includeDB_gc_g1 +++ b/hotspot/src/share/vm/gc_implementation/includeDB_gc_g1 @@ -1,5 +1,5 @@ // -// Copyright 2004-2008 Sun Microsystems, Inc. All Rights Reserved. +// 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 diff --git a/hotspot/src/share/vm/gc_implementation/includeDB_gc_parallelScavenge b/hotspot/src/share/vm/gc_implementation/includeDB_gc_parallelScavenge index 0e0ae1a1e0e..90161a4c7d7 100644 --- a/hotspot/src/share/vm/gc_implementation/includeDB_gc_parallelScavenge +++ b/hotspot/src/share/vm/gc_implementation/includeDB_gc_parallelScavenge @@ -1,5 +1,5 @@ // -// Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. +// Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_implementation/includeDB_gc_shared b/hotspot/src/share/vm/gc_implementation/includeDB_gc_shared index 99ce759a474..fca8d2f2ed3 100644 --- a/hotspot/src/share/vm/gc_implementation/includeDB_gc_shared +++ b/hotspot/src/share/vm/gc_implementation/includeDB_gc_shared @@ -1,5 +1,5 @@ // -// Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. +// Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_implementation/parNew/parGCAllocBuffer.cpp b/hotspot/src/share/vm/gc_implementation/parNew/parGCAllocBuffer.cpp index e2d0ebd701f..a0025382e01 100644 --- a/hotspot/src/share/vm/gc_implementation/parNew/parGCAllocBuffer.cpp +++ b/hotspot/src/share/vm/gc_implementation/parNew/parGCAllocBuffer.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp b/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp index a5010925b00..7bafe50aa36 100644 --- a/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp +++ b/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.hpp b/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.hpp index b8de0b1e7ac..51e4c5f39f1 100644 --- a/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.hpp +++ b/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.hpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.hpp index c268b6a2f86..2b8904cfa29 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.hpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp index 608eedb8fb1..7c1c3132fa6 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweepDecorator.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweepDecorator.cpp index 4cc90cd2de2..96dd8a96d88 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweepDecorator.cpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweepDecorator.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psOldGen.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psOldGen.cpp index 2d31e5d72a0..47d0aab44ec 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psOldGen.cpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psOldGen.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp index 686c65b2c53..27f69d5712a 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-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 diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.hpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.hpp index eb9ed0fc86b..0a4ba77581d 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.hpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-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 diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.cpp index 11b6118322b..92a41738ed8 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.cpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-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 diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp index f0bc6a85e8b..adfa59e684f 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-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 diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psVirtualspace.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psVirtualspace.cpp index 4003e19c614..943bb006528 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psVirtualspace.cpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psVirtualspace.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-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 diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psVirtualspace.hpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psVirtualspace.hpp index c3c1035998a..d2ad54aa350 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psVirtualspace.hpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psVirtualspace.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-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 diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psYoungGen.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psYoungGen.cpp index 1b12c6bf802..d78fbae12de 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psYoungGen.cpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psYoungGen.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_implementation/shared/ageTable.cpp b/hotspot/src/share/vm/gc_implementation/shared/ageTable.cpp index 64fe87f7ca9..5a1a42142ab 100644 --- a/hotspot/src/share/vm/gc_implementation/shared/ageTable.cpp +++ b/hotspot/src/share/vm/gc_implementation/shared/ageTable.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -22,7 +22,7 @@ * */ -/* Copyright 1992 Sun Microsystems, Inc. and Stanford University. +/* Copyright 1992-2009 Sun Microsystems, Inc. and Stanford University. See the LICENSE file for license information. */ # include "incls/_precompiled.incl" diff --git a/hotspot/src/share/vm/gc_implementation/shared/ageTable.hpp b/hotspot/src/share/vm/gc_implementation/shared/ageTable.hpp index fffef2af1ad..beb33cd852b 100644 --- a/hotspot/src/share/vm/gc_implementation/shared/ageTable.hpp +++ b/hotspot/src/share/vm/gc_implementation/shared/ageTable.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -22,7 +22,7 @@ * */ -/* Copyright 1992 Sun Microsystems, Inc. and Stanford University. +/* Copyright 1992-2009 Sun Microsystems, Inc. and Stanford University. See the LICENSE file for license information. */ // Age table for adaptive feedback-mediated tenuring (scavenging) diff --git a/hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp b/hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp index a3787c8cd29..6e7ef2e20ab 100644 --- a/hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp +++ b/hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp @@ -1,6 +1,6 @@ /* - * Copyright 2006-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2006-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 diff --git a/hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.hpp b/hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.hpp index 128db555b58..0fc182a37ac 100644 --- a/hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.hpp +++ b/hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2006-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2006-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 diff --git a/hotspot/src/share/vm/gc_implementation/shared/mutableSpace.cpp b/hotspot/src/share/vm/gc_implementation/shared/mutableSpace.cpp index 90e1d3ca2ca..3cd21b51515 100644 --- a/hotspot/src/share/vm/gc_implementation/shared/mutableSpace.cpp +++ b/hotspot/src/share/vm/gc_implementation/shared/mutableSpace.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_implementation/shared/mutableSpace.hpp b/hotspot/src/share/vm/gc_implementation/shared/mutableSpace.hpp index 98382d6c410..940894595f4 100644 --- a/hotspot/src/share/vm/gc_implementation/shared/mutableSpace.hpp +++ b/hotspot/src/share/vm/gc_implementation/shared/mutableSpace.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_interface/collectedHeap.cpp b/hotspot/src/share/vm/gc_interface/collectedHeap.cpp index 3e5cf87c1d4..ab09442e55d 100644 --- a/hotspot/src/share/vm/gc_interface/collectedHeap.cpp +++ b/hotspot/src/share/vm/gc_interface/collectedHeap.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_interface/collectedHeap.hpp b/hotspot/src/share/vm/gc_interface/collectedHeap.hpp index 210e6b32b90..552481baed7 100644 --- a/hotspot/src/share/vm/gc_interface/collectedHeap.hpp +++ b/hotspot/src/share/vm/gc_interface/collectedHeap.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/gc_interface/collectedHeap.inline.hpp b/hotspot/src/share/vm/gc_interface/collectedHeap.inline.hpp index c8e59edac33..9b65c40b95a 100644 --- a/hotspot/src/share/vm/gc_interface/collectedHeap.inline.hpp +++ b/hotspot/src/share/vm/gc_interface/collectedHeap.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/includeDB_compiler2 b/hotspot/src/share/vm/includeDB_compiler2 index bf84589334c..6ba7bfaf867 100644 --- a/hotspot/src/share/vm/includeDB_compiler2 +++ b/hotspot/src/share/vm/includeDB_compiler2 @@ -1,5 +1,5 @@ // -// Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. +// Copyright 2000-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 diff --git a/hotspot/src/share/vm/includeDB_core b/hotspot/src/share/vm/includeDB_core index 8d39f327758..dc1bcbe9a95 100644 --- a/hotspot/src/share/vm/includeDB_core +++ b/hotspot/src/share/vm/includeDB_core @@ -1,5 +1,5 @@ // -// Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. +// Copyright 1997-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 diff --git a/hotspot/src/share/vm/includeDB_features b/hotspot/src/share/vm/includeDB_features index e136dfe784a..863f6513340 100644 --- a/hotspot/src/share/vm/includeDB_features +++ b/hotspot/src/share/vm/includeDB_features @@ -1,5 +1,5 @@ // -// Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved. +// Copyright 2007-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 diff --git a/hotspot/src/share/vm/includeDB_gc b/hotspot/src/share/vm/includeDB_gc index 336148bf8fa..876d7079a36 100644 --- a/hotspot/src/share/vm/includeDB_gc +++ b/hotspot/src/share/vm/includeDB_gc @@ -1,5 +1,5 @@ // -// Copyright 2001-2005 Sun Microsystems, Inc. All Rights Reserved. +// Copyright 2001-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 diff --git a/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp b/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp index 351d29cc9cc..f46ab467a3c 100644 --- a/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp +++ b/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-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 diff --git a/hotspot/src/share/vm/interpreter/bytecodeInterpreter.hpp b/hotspot/src/share/vm/interpreter/bytecodeInterpreter.hpp index a1504851a38..ea68b860b4c 100644 --- a/hotspot/src/share/vm/interpreter/bytecodeInterpreter.hpp +++ b/hotspot/src/share/vm/interpreter/bytecodeInterpreter.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2002-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-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 diff --git a/hotspot/src/share/vm/interpreter/rewriter.cpp b/hotspot/src/share/vm/interpreter/rewriter.cpp index 323ea8f9a28..77815389539 100644 --- a/hotspot/src/share/vm/interpreter/rewriter.cpp +++ b/hotspot/src/share/vm/interpreter/rewriter.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-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 diff --git a/hotspot/src/share/vm/libadt/dict.cpp b/hotspot/src/share/vm/libadt/dict.cpp index 003dd6a4f05..5f3637d9078 100644 --- a/hotspot/src/share/vm/libadt/dict.cpp +++ b/hotspot/src/share/vm/libadt/dict.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/libadt/port.hpp b/hotspot/src/share/vm/libadt/port.hpp index 68a84f1a4ce..5d6d527bdd0 100644 --- a/hotspot/src/share/vm/libadt/port.hpp +++ b/hotspot/src/share/vm/libadt/port.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/memory/cardTableModRefBS.cpp b/hotspot/src/share/vm/memory/cardTableModRefBS.cpp index ee9ed1fc8be..63c52abe49c 100644 --- a/hotspot/src/share/vm/memory/cardTableModRefBS.cpp +++ b/hotspot/src/share/vm/memory/cardTableModRefBS.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-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 diff --git a/hotspot/src/share/vm/memory/cardTableModRefBS.hpp b/hotspot/src/share/vm/memory/cardTableModRefBS.hpp index 9a48ab5497d..a27e6dd246c 100644 --- a/hotspot/src/share/vm/memory/cardTableModRefBS.hpp +++ b/hotspot/src/share/vm/memory/cardTableModRefBS.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-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 diff --git a/hotspot/src/share/vm/memory/genCollectedHeap.cpp b/hotspot/src/share/vm/memory/genCollectedHeap.cpp index 5bb817f0280..e07a1836bad 100644 --- a/hotspot/src/share/vm/memory/genCollectedHeap.cpp +++ b/hotspot/src/share/vm/memory/genCollectedHeap.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-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 diff --git a/hotspot/src/share/vm/memory/genCollectedHeap.hpp b/hotspot/src/share/vm/memory/genCollectedHeap.hpp index 3ab20cfd19f..0630eec6395 100644 --- a/hotspot/src/share/vm/memory/genCollectedHeap.hpp +++ b/hotspot/src/share/vm/memory/genCollectedHeap.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-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 diff --git a/hotspot/src/share/vm/memory/generation.cpp b/hotspot/src/share/vm/memory/generation.cpp index d7b1d9f871d..117ee18526c 100644 --- a/hotspot/src/share/vm/memory/generation.cpp +++ b/hotspot/src/share/vm/memory/generation.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/memory/generation.hpp b/hotspot/src/share/vm/memory/generation.hpp index 206949901e4..985e9db1028 100644 --- a/hotspot/src/share/vm/memory/generation.hpp +++ b/hotspot/src/share/vm/memory/generation.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/memory/heapInspection.cpp b/hotspot/src/share/vm/memory/heapInspection.cpp index 3bc17bea600..b79a3efdde7 100644 --- a/hotspot/src/share/vm/memory/heapInspection.cpp +++ b/hotspot/src/share/vm/memory/heapInspection.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-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 diff --git a/hotspot/src/share/vm/memory/oopFactory.cpp b/hotspot/src/share/vm/memory/oopFactory.cpp index 32bd1f82236..99763784255 100644 --- a/hotspot/src/share/vm/memory/oopFactory.cpp +++ b/hotspot/src/share/vm/memory/oopFactory.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/memory/oopFactory.hpp b/hotspot/src/share/vm/memory/oopFactory.hpp index a0db0f52172..add1aed4df0 100644 --- a/hotspot/src/share/vm/memory/oopFactory.hpp +++ b/hotspot/src/share/vm/memory/oopFactory.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/memory/permGen.cpp b/hotspot/src/share/vm/memory/permGen.cpp index 65635fe26cf..787da381e52 100644 --- a/hotspot/src/share/vm/memory/permGen.cpp +++ b/hotspot/src/share/vm/memory/permGen.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-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 diff --git a/hotspot/src/share/vm/memory/referenceProcessor.cpp b/hotspot/src/share/vm/memory/referenceProcessor.cpp index ac6f4777e5f..36d95144f46 100644 --- a/hotspot/src/share/vm/memory/referenceProcessor.cpp +++ b/hotspot/src/share/vm/memory/referenceProcessor.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/memory/sharedHeap.cpp b/hotspot/src/share/vm/memory/sharedHeap.cpp index 392487a31ad..d1ec7e0fda5 100644 --- a/hotspot/src/share/vm/memory/sharedHeap.cpp +++ b/hotspot/src/share/vm/memory/sharedHeap.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-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 diff --git a/hotspot/src/share/vm/memory/sharedHeap.hpp b/hotspot/src/share/vm/memory/sharedHeap.hpp index c8c570e87db..c44800a9bc4 100644 --- a/hotspot/src/share/vm/memory/sharedHeap.hpp +++ b/hotspot/src/share/vm/memory/sharedHeap.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-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 diff --git a/hotspot/src/share/vm/memory/space.cpp b/hotspot/src/share/vm/memory/space.cpp index 00f97001384..53c3c2600e1 100644 --- a/hotspot/src/share/vm/memory/space.cpp +++ b/hotspot/src/share/vm/memory/space.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/memory/space.hpp b/hotspot/src/share/vm/memory/space.hpp index f055638e8dd..e6164ba19ef 100644 --- a/hotspot/src/share/vm/memory/space.hpp +++ b/hotspot/src/share/vm/memory/space.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/memory/tenuredGeneration.cpp b/hotspot/src/share/vm/memory/tenuredGeneration.cpp index 56eed211d98..eb601c51f2c 100644 --- a/hotspot/src/share/vm/memory/tenuredGeneration.cpp +++ b/hotspot/src/share/vm/memory/tenuredGeneration.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/memory/threadLocalAllocBuffer.cpp b/hotspot/src/share/vm/memory/threadLocalAllocBuffer.cpp index 01d7d6e6a2f..be7538604ff 100644 --- a/hotspot/src/share/vm/memory/threadLocalAllocBuffer.cpp +++ b/hotspot/src/share/vm/memory/threadLocalAllocBuffer.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-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 diff --git a/hotspot/src/share/vm/memory/universe.cpp b/hotspot/src/share/vm/memory/universe.cpp index 88243f2d56c..3b0463308ea 100644 --- a/hotspot/src/share/vm/memory/universe.cpp +++ b/hotspot/src/share/vm/memory/universe.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/memory/universe.hpp b/hotspot/src/share/vm/memory/universe.hpp index 45c9f96d21f..95a5f467d94 100644 --- a/hotspot/src/share/vm/memory/universe.hpp +++ b/hotspot/src/share/vm/memory/universe.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/oops/arrayOop.hpp b/hotspot/src/share/vm/oops/arrayOop.hpp index 364d1dbfe40..659002f28b9 100644 --- a/hotspot/src/share/vm/oops/arrayOop.hpp +++ b/hotspot/src/share/vm/oops/arrayOop.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/oops/constMethodKlass.cpp b/hotspot/src/share/vm/oops/constMethodKlass.cpp index f2fe1706a16..c1ad90c1d57 100644 --- a/hotspot/src/share/vm/oops/constMethodKlass.cpp +++ b/hotspot/src/share/vm/oops/constMethodKlass.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-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 diff --git a/hotspot/src/share/vm/oops/constMethodKlass.hpp b/hotspot/src/share/vm/oops/constMethodKlass.hpp index a3f7d9710f7..2387d0210a6 100644 --- a/hotspot/src/share/vm/oops/constMethodKlass.hpp +++ b/hotspot/src/share/vm/oops/constMethodKlass.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-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 diff --git a/hotspot/src/share/vm/oops/constMethodOop.hpp b/hotspot/src/share/vm/oops/constMethodOop.hpp index 4669e6a852f..c6d373946e1 100644 --- a/hotspot/src/share/vm/oops/constMethodOop.hpp +++ b/hotspot/src/share/vm/oops/constMethodOop.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-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 diff --git a/hotspot/src/share/vm/oops/constantPoolKlass.cpp b/hotspot/src/share/vm/oops/constantPoolKlass.cpp index 2a17c00e1ce..ab2dac81cad 100644 --- a/hotspot/src/share/vm/oops/constantPoolKlass.cpp +++ b/hotspot/src/share/vm/oops/constantPoolKlass.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/oops/constantPoolKlass.hpp b/hotspot/src/share/vm/oops/constantPoolKlass.hpp index 2f9efc285ef..a01edbab42c 100644 --- a/hotspot/src/share/vm/oops/constantPoolKlass.hpp +++ b/hotspot/src/share/vm/oops/constantPoolKlass.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/oops/constantPoolOop.cpp b/hotspot/src/share/vm/oops/constantPoolOop.cpp index e90bda568e9..d6362e775b0 100644 --- a/hotspot/src/share/vm/oops/constantPoolOop.cpp +++ b/hotspot/src/share/vm/oops/constantPoolOop.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/oops/constantPoolOop.hpp b/hotspot/src/share/vm/oops/constantPoolOop.hpp index fd2264c1eab..8ccbcd2ba07 100644 --- a/hotspot/src/share/vm/oops/constantPoolOop.hpp +++ b/hotspot/src/share/vm/oops/constantPoolOop.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/oops/cpCacheKlass.cpp b/hotspot/src/share/vm/oops/cpCacheKlass.cpp index 95fd11ded28..028a9c9c3f3 100644 --- a/hotspot/src/share/vm/oops/cpCacheKlass.cpp +++ b/hotspot/src/share/vm/oops/cpCacheKlass.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-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 diff --git a/hotspot/src/share/vm/oops/cpCacheKlass.hpp b/hotspot/src/share/vm/oops/cpCacheKlass.hpp index 299910052ae..859f64a46f5 100644 --- a/hotspot/src/share/vm/oops/cpCacheKlass.hpp +++ b/hotspot/src/share/vm/oops/cpCacheKlass.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-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 diff --git a/hotspot/src/share/vm/oops/cpCacheOop.hpp b/hotspot/src/share/vm/oops/cpCacheOop.hpp index c5ba6052191..c09d7c4da29 100644 --- a/hotspot/src/share/vm/oops/cpCacheOop.hpp +++ b/hotspot/src/share/vm/oops/cpCacheOop.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-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 diff --git a/hotspot/src/share/vm/oops/klass.hpp b/hotspot/src/share/vm/oops/klass.hpp index 881da970d03..3e1f7afa8b5 100644 --- a/hotspot/src/share/vm/oops/klass.hpp +++ b/hotspot/src/share/vm/oops/klass.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/oops/methodOop.cpp b/hotspot/src/share/vm/oops/methodOop.cpp index c239ccf1a2c..ddef9043a68 100644 --- a/hotspot/src/share/vm/oops/methodOop.cpp +++ b/hotspot/src/share/vm/oops/methodOop.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/oops/methodOop.hpp b/hotspot/src/share/vm/oops/methodOop.hpp index 8b03a68380a..9ec7bef598e 100644 --- a/hotspot/src/share/vm/oops/methodOop.hpp +++ b/hotspot/src/share/vm/oops/methodOop.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/oops/oop.hpp b/hotspot/src/share/vm/oops/oop.hpp index ba13ca63c44..16c52d21901 100644 --- a/hotspot/src/share/vm/oops/oop.hpp +++ b/hotspot/src/share/vm/oops/oop.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/oops/oop.inline.hpp b/hotspot/src/share/vm/oops/oop.inline.hpp index 9161310de60..7a184f3a638 100644 --- a/hotspot/src/share/vm/oops/oop.inline.hpp +++ b/hotspot/src/share/vm/oops/oop.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/oops/oopsHierarchy.hpp b/hotspot/src/share/vm/oops/oopsHierarchy.hpp index 06c64d0e46f..1e864522d97 100644 --- a/hotspot/src/share/vm/oops/oopsHierarchy.hpp +++ b/hotspot/src/share/vm/oops/oopsHierarchy.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/oops/typeArrayKlass.cpp b/hotspot/src/share/vm/oops/typeArrayKlass.cpp index 2e0ffbcba26..f5d53faa853 100644 --- a/hotspot/src/share/vm/oops/typeArrayKlass.cpp +++ b/hotspot/src/share/vm/oops/typeArrayKlass.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/oops/typeArrayKlass.hpp b/hotspot/src/share/vm/oops/typeArrayKlass.hpp index dac77f6b9bf..99ac60a55b8 100644 --- a/hotspot/src/share/vm/oops/typeArrayKlass.hpp +++ b/hotspot/src/share/vm/oops/typeArrayKlass.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/opto/block.cpp b/hotspot/src/share/vm/opto/block.cpp index cf15fa7c4fb..357953085d0 100644 --- a/hotspot/src/share/vm/opto/block.cpp +++ b/hotspot/src/share/vm/opto/block.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/opto/c2_globals.hpp b/hotspot/src/share/vm/opto/c2_globals.hpp index 3a516ab98bd..6734321d8da 100644 --- a/hotspot/src/share/vm/opto/c2_globals.hpp +++ b/hotspot/src/share/vm/opto/c2_globals.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-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 diff --git a/hotspot/src/share/vm/opto/cfgnode.cpp b/hotspot/src/share/vm/opto/cfgnode.cpp index e29cc0d58e3..fdc4bb0591c 100644 --- a/hotspot/src/share/vm/opto/cfgnode.cpp +++ b/hotspot/src/share/vm/opto/cfgnode.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/opto/chaitin.cpp b/hotspot/src/share/vm/opto/chaitin.cpp index 82558d8f577..d551519c0d2 100644 --- a/hotspot/src/share/vm/opto/chaitin.cpp +++ b/hotspot/src/share/vm/opto/chaitin.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-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 diff --git a/hotspot/src/share/vm/opto/chaitin.hpp b/hotspot/src/share/vm/opto/chaitin.hpp index 307d6110c04..32f3eb0c1ec 100644 --- a/hotspot/src/share/vm/opto/chaitin.hpp +++ b/hotspot/src/share/vm/opto/chaitin.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/opto/classes.hpp b/hotspot/src/share/vm/opto/classes.hpp index bbb3e79990e..94aaa6c7fec 100644 --- a/hotspot/src/share/vm/opto/classes.hpp +++ b/hotspot/src/share/vm/opto/classes.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/opto/compile.cpp b/hotspot/src/share/vm/opto/compile.cpp index 7c6f751f8ff..e7b215c3825 100644 --- a/hotspot/src/share/vm/opto/compile.cpp +++ b/hotspot/src/share/vm/opto/compile.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/opto/gcm.cpp b/hotspot/src/share/vm/opto/gcm.cpp index b56fb157119..c68fc086323 100644 --- a/hotspot/src/share/vm/opto/gcm.cpp +++ b/hotspot/src/share/vm/opto/gcm.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/opto/graphKit.cpp b/hotspot/src/share/vm/opto/graphKit.cpp index c0cb4ba0132..1fc77ca3f81 100644 --- a/hotspot/src/share/vm/opto/graphKit.cpp +++ b/hotspot/src/share/vm/opto/graphKit.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/opto/graphKit.hpp b/hotspot/src/share/vm/opto/graphKit.hpp index 160e3376c95..7445aa277b7 100644 --- a/hotspot/src/share/vm/opto/graphKit.hpp +++ b/hotspot/src/share/vm/opto/graphKit.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/opto/idealGraphPrinter.cpp b/hotspot/src/share/vm/opto/idealGraphPrinter.cpp index ad45b566eda..a375b92a93b 100644 --- a/hotspot/src/share/vm/opto/idealGraphPrinter.cpp +++ b/hotspot/src/share/vm/opto/idealGraphPrinter.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2007-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 diff --git a/hotspot/src/share/vm/opto/ifg.cpp b/hotspot/src/share/vm/opto/ifg.cpp index b3250513d7a..892a114837b 100644 --- a/hotspot/src/share/vm/opto/ifg.cpp +++ b/hotspot/src/share/vm/opto/ifg.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-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 diff --git a/hotspot/src/share/vm/opto/lcm.cpp b/hotspot/src/share/vm/opto/lcm.cpp index dcedbd61f83..eedfa6928f9 100644 --- a/hotspot/src/share/vm/opto/lcm.cpp +++ b/hotspot/src/share/vm/opto/lcm.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-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 diff --git a/hotspot/src/share/vm/opto/live.cpp b/hotspot/src/share/vm/opto/live.cpp index d2ff515058c..394d1314f67 100644 --- a/hotspot/src/share/vm/opto/live.cpp +++ b/hotspot/src/share/vm/opto/live.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/opto/loopnode.cpp b/hotspot/src/share/vm/opto/loopnode.cpp index fba4a350bbb..b07d25cfc56 100644 --- a/hotspot/src/share/vm/opto/loopnode.cpp +++ b/hotspot/src/share/vm/opto/loopnode.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-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 diff --git a/hotspot/src/share/vm/opto/macro.cpp b/hotspot/src/share/vm/opto/macro.cpp index f77b14ada56..38ed4d59386 100644 --- a/hotspot/src/share/vm/opto/macro.cpp +++ b/hotspot/src/share/vm/opto/macro.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-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 diff --git a/hotspot/src/share/vm/opto/matcher.cpp b/hotspot/src/share/vm/opto/matcher.cpp index e911c065ccd..8df615efce1 100644 --- a/hotspot/src/share/vm/opto/matcher.cpp +++ b/hotspot/src/share/vm/opto/matcher.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/opto/memnode.cpp b/hotspot/src/share/vm/opto/memnode.cpp index 9c79f2ec936..7038a731c1c 100644 --- a/hotspot/src/share/vm/opto/memnode.cpp +++ b/hotspot/src/share/vm/opto/memnode.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/opto/memnode.hpp b/hotspot/src/share/vm/opto/memnode.hpp index 63cb0d653f7..d640672613e 100644 --- a/hotspot/src/share/vm/opto/memnode.hpp +++ b/hotspot/src/share/vm/opto/memnode.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/opto/reg_split.cpp b/hotspot/src/share/vm/opto/reg_split.cpp index 003df4c48b7..0efbe04b9c0 100644 --- a/hotspot/src/share/vm/opto/reg_split.cpp +++ b/hotspot/src/share/vm/opto/reg_split.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-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 diff --git a/hotspot/src/share/vm/opto/superword.cpp b/hotspot/src/share/vm/opto/superword.cpp index 4551162bff3..0b125a922d7 100644 --- a/hotspot/src/share/vm/opto/superword.cpp +++ b/hotspot/src/share/vm/opto/superword.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2007-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 diff --git a/hotspot/src/share/vm/opto/type.cpp b/hotspot/src/share/vm/opto/type.cpp index 6830277ea3f..dff39c8e56d 100644 --- a/hotspot/src/share/vm/opto/type.cpp +++ b/hotspot/src/share/vm/opto/type.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/opto/type.hpp b/hotspot/src/share/vm/opto/type.hpp index 493b622a28e..0b14763b048 100644 --- a/hotspot/src/share/vm/opto/type.hpp +++ b/hotspot/src/share/vm/opto/type.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/opto/vectornode.cpp b/hotspot/src/share/vm/opto/vectornode.cpp index 7b6fef64bdf..cd1fcdf42cf 100644 --- a/hotspot/src/share/vm/opto/vectornode.cpp +++ b/hotspot/src/share/vm/opto/vectornode.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2007-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 diff --git a/hotspot/src/share/vm/prims/jni.cpp b/hotspot/src/share/vm/prims/jni.cpp index e3f715dd23e..bd4f1ec3223 100644 --- a/hotspot/src/share/vm/prims/jni.cpp +++ b/hotspot/src/share/vm/prims/jni.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/prims/jvm.cpp b/hotspot/src/share/vm/prims/jvm.cpp index 1835594ba0b..cf866df9f61 100644 --- a/hotspot/src/share/vm/prims/jvm.cpp +++ b/hotspot/src/share/vm/prims/jvm.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp b/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp index 4cc6b577b47..ad832c35d60 100644 --- a/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp +++ b/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-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 diff --git a/hotspot/src/share/vm/prims/jvmtiTagMap.cpp b/hotspot/src/share/vm/prims/jvmtiTagMap.cpp index dcf83bb22d4..41c0693a4c3 100644 --- a/hotspot/src/share/vm/prims/jvmtiTagMap.cpp +++ b/hotspot/src/share/vm/prims/jvmtiTagMap.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-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 diff --git a/hotspot/src/share/vm/runtime/arguments.cpp b/hotspot/src/share/vm/runtime/arguments.cpp index 417522943ad..1930dc4113c 100644 --- a/hotspot/src/share/vm/runtime/arguments.cpp +++ b/hotspot/src/share/vm/runtime/arguments.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/runtime/arguments.hpp b/hotspot/src/share/vm/runtime/arguments.hpp index b5dca5b90de..b3efa55cbdd 100644 --- a/hotspot/src/share/vm/runtime/arguments.hpp +++ b/hotspot/src/share/vm/runtime/arguments.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/runtime/globals.hpp b/hotspot/src/share/vm/runtime/globals.hpp index c16ae09ec32..0bcf29d849e 100644 --- a/hotspot/src/share/vm/runtime/globals.hpp +++ b/hotspot/src/share/vm/runtime/globals.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/runtime/javaCalls.cpp b/hotspot/src/share/vm/runtime/javaCalls.cpp index 77950cf7679..92773e80930 100644 --- a/hotspot/src/share/vm/runtime/javaCalls.cpp +++ b/hotspot/src/share/vm/runtime/javaCalls.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/runtime/memprofiler.cpp b/hotspot/src/share/vm/runtime/memprofiler.cpp index f8a259f9be2..c141e3216a6 100644 --- a/hotspot/src/share/vm/runtime/memprofiler.cpp +++ b/hotspot/src/share/vm/runtime/memprofiler.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-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 diff --git a/hotspot/src/share/vm/runtime/os.cpp b/hotspot/src/share/vm/runtime/os.cpp index 8c81d42734a..0d953b2dc48 100644 --- a/hotspot/src/share/vm/runtime/os.cpp +++ b/hotspot/src/share/vm/runtime/os.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/runtime/os.hpp b/hotspot/src/share/vm/runtime/os.hpp index ce653c5f6f2..2a573fb8ca9 100644 --- a/hotspot/src/share/vm/runtime/os.hpp +++ b/hotspot/src/share/vm/runtime/os.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/runtime/safepoint.cpp b/hotspot/src/share/vm/runtime/safepoint.cpp index c13af643a85..545bf1d19e1 100644 --- a/hotspot/src/share/vm/runtime/safepoint.cpp +++ b/hotspot/src/share/vm/runtime/safepoint.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/runtime/sharedRuntime.cpp b/hotspot/src/share/vm/runtime/sharedRuntime.cpp index cf69631c0bb..ff217d589dc 100644 --- a/hotspot/src/share/vm/runtime/sharedRuntime.cpp +++ b/hotspot/src/share/vm/runtime/sharedRuntime.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/runtime/synchronizer.cpp b/hotspot/src/share/vm/runtime/synchronizer.cpp index e0f3cfe04bb..ca6bdb13ade 100644 --- a/hotspot/src/share/vm/runtime/synchronizer.cpp +++ b/hotspot/src/share/vm/runtime/synchronizer.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-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 diff --git a/hotspot/src/share/vm/services/heapDumper.cpp b/hotspot/src/share/vm/services/heapDumper.cpp index 18bd9f477d7..fae6fec7760 100644 --- a/hotspot/src/share/vm/services/heapDumper.cpp +++ b/hotspot/src/share/vm/services/heapDumper.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-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 diff --git a/hotspot/src/share/vm/services/management.cpp b/hotspot/src/share/vm/services/management.cpp index f58e546ea13..669afbaeac8 100644 --- a/hotspot/src/share/vm/services/management.cpp +++ b/hotspot/src/share/vm/services/management.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-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 diff --git a/hotspot/src/share/vm/utilities/globalDefinitions_gcc.hpp b/hotspot/src/share/vm/utilities/globalDefinitions_gcc.hpp index 48f2c7e886a..22cabe99f90 100644 --- a/hotspot/src/share/vm/utilities/globalDefinitions_gcc.hpp +++ b/hotspot/src/share/vm/utilities/globalDefinitions_gcc.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-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 diff --git a/hotspot/src/share/vm/utilities/globalDefinitions_sparcWorks.hpp b/hotspot/src/share/vm/utilities/globalDefinitions_sparcWorks.hpp index 62c8b92e255..7053e8a06d8 100644 --- a/hotspot/src/share/vm/utilities/globalDefinitions_sparcWorks.hpp +++ b/hotspot/src/share/vm/utilities/globalDefinitions_sparcWorks.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/utilities/ostream.cpp b/hotspot/src/share/vm/utilities/ostream.cpp index 65d18802ba2..60bc65e4eaf 100644 --- a/hotspot/src/share/vm/utilities/ostream.cpp +++ b/hotspot/src/share/vm/utilities/ostream.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 diff --git a/hotspot/src/share/vm/utilities/taskqueue.cpp b/hotspot/src/share/vm/utilities/taskqueue.cpp index 2b3145813fd..768f9b5580b 100644 --- a/hotspot/src/share/vm/utilities/taskqueue.cpp +++ b/hotspot/src/share/vm/utilities/taskqueue.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/utilities/taskqueue.hpp b/hotspot/src/share/vm/utilities/taskqueue.hpp index 3a80a814238..6b83bc083f5 100644 --- a/hotspot/src/share/vm/utilities/taskqueue.hpp +++ b/hotspot/src/share/vm/utilities/taskqueue.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 diff --git a/hotspot/src/share/vm/utilities/vmError.cpp b/hotspot/src/share/vm/utilities/vmError.cpp index a4d0cb0baf0..dc78b2c95b6 100644 --- a/hotspot/src/share/vm/utilities/vmError.cpp +++ b/hotspot/src/share/vm/utilities/vmError.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-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 diff --git a/hotspot/src/share/vm/utilities/vmError.hpp b/hotspot/src/share/vm/utilities/vmError.hpp index 8e618d91462..c6cac32663f 100644 --- a/hotspot/src/share/vm/utilities/vmError.hpp +++ b/hotspot/src/share/vm/utilities/vmError.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-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 diff --git a/hotspot/src/share/vm/utilities/workgroup.hpp b/hotspot/src/share/vm/utilities/workgroup.hpp index 45ddc9cbfc2..ebb111e6396 100644 --- a/hotspot/src/share/vm/utilities/workgroup.hpp +++ b/hotspot/src/share/vm/utilities/workgroup.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2002-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-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 diff --git a/hotspot/test/Makefile b/hotspot/test/Makefile index f78c2d971c6..5fcc877dc5b 100644 --- a/hotspot/test/Makefile +++ b/hotspot/test/Makefile @@ -1,5 +1,5 @@ # -# Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1995-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 diff --git a/hotspot/test/compiler/6757316/Test6757316.java b/hotspot/test/compiler/6757316/Test6757316.java index 2efc5acd84d..c91183e9550 100644 --- a/hotspot/test/compiler/6757316/Test6757316.java +++ b/hotspot/test/compiler/6757316/Test6757316.java @@ -1,5 +1,5 @@ /* - * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2008-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 diff --git a/hotspot/test/compiler/6758234/Test6758234.java b/hotspot/test/compiler/6758234/Test6758234.java index be916a2a191..f1b0a1f137c 100644 --- a/hotspot/test/compiler/6758234/Test6758234.java +++ b/hotspot/test/compiler/6758234/Test6758234.java @@ -1,5 +1,5 @@ /* - * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2008-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 diff --git a/hotspot/test/compiler/6775880/Test.java b/hotspot/test/compiler/6775880/Test.java index a938f9e73c4..925e616cae5 100644 --- a/hotspot/test/compiler/6775880/Test.java +++ b/hotspot/test/compiler/6775880/Test.java @@ -1,5 +1,5 @@ /* - * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2008-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 diff --git a/hotspot/test/compiler/6778657/Test.java b/hotspot/test/compiler/6778657/Test.java index 4fdd33e9386..efb6687425f 100644 --- a/hotspot/test/compiler/6778657/Test.java +++ b/hotspot/test/compiler/6778657/Test.java @@ -1,5 +1,5 @@ /* - * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2008-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 From 27f75e71c5d2116d545aeb85639d86f5ca0b9c39 Mon Sep 17 00:00:00 2001 From: Xiomara Jayasena Date: Mon, 9 Mar 2009 13:28:54 -0700 Subject: [PATCH 107/292] 6814575: Update copyright year Update copyright for files that have been modified in 2009, up to 03/09 Reviewed-by: katleman, tbell, ohair --- jaxp/make/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jaxp/make/Makefile b/jaxp/make/Makefile index 1f742fd849d..e8ea3347b31 100644 --- a/jaxp/make/Makefile +++ b/jaxp/make/Makefile @@ -1,5 +1,5 @@ # -# Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2007-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 From 380fa9ec0fee6c68e69b7c5dcbae70a1acccbaba Mon Sep 17 00:00:00 2001 From: Xiomara Jayasena Date: Mon, 9 Mar 2009 13:28:55 -0700 Subject: [PATCH 108/292] 6814575: Update copyright year Update copyright for files that have been modified in 2009, up to 03/09 Reviewed-by: katleman, tbell, ohair --- jaxws/make/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jaxws/make/Makefile b/jaxws/make/Makefile index e3019a3d45e..56696720183 100644 --- a/jaxws/make/Makefile +++ b/jaxws/make/Makefile @@ -1,5 +1,5 @@ # -# Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2007-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 From 56fcf6c05249b8fd0f9f20392f0431737c534943 Mon Sep 17 00:00:00 2001 From: Xiomara Jayasena Date: Mon, 9 Mar 2009 13:29:06 -0700 Subject: [PATCH 109/292] 6814575: Update copyright year Update copyright for files that have been modified in 2009, up to 03/09 Reviewed-by: katleman, tbell, ohair --- langtools/make/build.properties | 2 +- langtools/make/build.xml | 2 +- langtools/make/netbeans/langtools/build.xml | 2 +- langtools/make/netbeans/langtools/nbproject/project.xml | 2 +- .../langtools/nbproject/standard-context-menu-items.ent | 2 +- .../make/netbeans/langtools/nbproject/standard-ide-actions.ent | 2 +- langtools/make/tools/SelectTool/SelectToolTask.java | 2 +- .../com/sun/tools/apt/comp/AnnotationProcessingError.java | 2 +- langtools/src/share/classes/com/sun/tools/apt/comp/Apt.java | 2 +- .../com/sun/tools/apt/comp/UsageMessageNeededException.java | 2 +- .../src/share/classes/com/sun/tools/apt/main/JavaCompiler.java | 2 +- .../com/sun/tools/apt/mirror/apt/RoundCompleteEventImpl.java | 2 +- .../sun/tools/apt/mirror/declaration/AnnotationProxyMaker.java | 2 +- .../classes/com/sun/tools/apt/mirror/type/TypeVariableImpl.java | 2 +- .../src/share/classes/com/sun/tools/classfile/Annotation.java | 2 +- .../classes/com/sun/tools/classfile/AttributeException.java | 2 +- .../share/classes/com/sun/tools/classfile/Code_attribute.java | 2 +- .../src/share/classes/com/sun/tools/classfile/ConstantPool.java | 2 +- .../classes/com/sun/tools/classfile/ConstantPoolException.java | 2 +- .../src/share/classes/com/sun/tools/classfile/Descriptor.java | 2 +- .../classes/com/sun/tools/classfile/DescriptorException.java | 2 +- .../com/sun/tools/classfile/StackMapTable_attribute.java | 2 +- .../com/sun/tools/doclets/formats/html/ConfigurationImpl.java | 2 +- .../com/sun/tools/doclets/formats/html/HtmlDocletWriter.java | 2 +- .../sun/tools/doclets/formats/html/HtmlSerialFieldWriter.java | 2 +- .../com/sun/tools/doclets/formats/html/PackageIndexWriter.java | 2 +- .../com/sun/tools/doclets/formats/html/TagletOutputImpl.java | 2 +- .../sun/tools/doclets/formats/html/markup/HtmlDocWriter.java | 2 +- .../com/sun/tools/doclets/formats/html/markup/HtmlWriter.java | 2 +- .../com/sun/tools/doclets/internal/toolkit/Configuration.java | 2 +- .../tools/doclets/internal/toolkit/SerializedFormWriter.java | 2 +- .../internal/toolkit/builders/SerializedFormBuilder.java | 2 +- .../com/sun/tools/doclets/internal/toolkit/resources/doclet.xml | 2 +- .../doclets/internal/toolkit/util/DocletAbortException.java | 2 +- .../tools/doclets/internal/toolkit/util/MessageRetriever.java | 2 +- .../doclets/internal/toolkit/util/SourceToHTMLConverter.java | 2 +- .../com/sun/tools/doclets/internal/toolkit/util/Util.java | 2 +- .../classes/com/sun/tools/javac/api/DiagnosticFormatter.java | 2 +- .../src/share/classes/com/sun/tools/javac/api/Messages.java | 2 +- langtools/src/share/classes/com/sun/tools/javac/code/Types.java | 2 +- langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java | 2 +- langtools/src/share/classes/com/sun/tools/javac/comp/Check.java | 2 +- langtools/src/share/classes/com/sun/tools/javac/comp/Flow.java | 2 +- langtools/src/share/classes/com/sun/tools/javac/comp/Infer.java | 2 +- .../share/classes/com/sun/tools/javac/main/JavaCompiler.java | 2 +- langtools/src/share/classes/com/sun/tools/javac/main/Main.java | 2 +- .../src/share/classes/com/sun/tools/javac/main/OptionName.java | 2 +- .../classes/com/sun/tools/javac/main/RecognizedOptions.java | 2 +- .../share/classes/com/sun/tools/javac/parser/JavacParser.java | 2 +- .../com/sun/tools/javac/processing/PrintingProcessor.java | 2 +- .../classes/com/sun/tools/javac/resources/compiler.properties | 2 +- .../classes/com/sun/tools/javac/resources/javac.properties | 2 +- .../src/share/classes/com/sun/tools/javac/tree/JCTree.java | 2 +- .../com/sun/tools/javac/util/AbstractDiagnosticFormatter.java | 2 +- .../com/sun/tools/javac/util/BasicDiagnosticFormatter.java | 2 +- .../classes/com/sun/tools/javac/util/LayoutCharacters.java | 2 +- langtools/src/share/classes/com/sun/tools/javac/util/Log.java | 2 +- .../com/sun/tools/javac/util/RawDiagnosticFormatter.java | 2 +- .../src/share/classes/com/sun/tools/javadoc/ClassDocImpl.java | 2 +- langtools/src/share/classes/com/sun/tools/javadoc/Comment.java | 2 +- langtools/src/share/classes/com/sun/tools/javadoc/DocEnv.java | 2 +- langtools/src/share/classes/com/sun/tools/javadoc/DocImpl.java | 2 +- .../src/share/classes/com/sun/tools/javadoc/DocletInvoker.java | 2 +- .../classes/com/sun/tools/javadoc/ExecutableMemberDocImpl.java | 2 +- .../src/share/classes/com/sun/tools/javadoc/FieldDocImpl.java | 2 +- .../share/classes/com/sun/tools/javadoc/JavadocClassReader.java | 2 +- .../src/share/classes/com/sun/tools/javadoc/JavadocTool.java | 2 +- langtools/src/share/classes/com/sun/tools/javadoc/Messager.java | 2 +- .../src/share/classes/com/sun/tools/javadoc/PackageDocImpl.java | 2 +- .../src/share/classes/com/sun/tools/javadoc/RootDocImpl.java | 2 +- .../share/classes/com/sun/tools/javadoc/SourcePositionImpl.java | 2 +- .../src/share/classes/com/sun/tools/javadoc/TypeMaker.java | 2 +- langtools/src/share/classes/com/sun/tools/javah/Gen.java | 2 +- .../src/share/classes/com/sun/tools/javap/InternalError.java | 2 +- langtools/src/share/classes/sun/tools/javap/JavapPrinter.java | 2 +- langtools/test/tools/javac/6668794/badClass/Test.java | 2 +- langtools/test/tools/javac/cast/6558559/T6558559a.java | 2 +- langtools/test/tools/javac/cast/6558559/T6558559b.java | 2 +- langtools/test/tools/javac/cast/6665356/T6665356.java | 2 +- langtools/test/tools/javac/generics/6723444/T6723444.java | 2 +- langtools/test/tools/javac/generics/6729401/T6729401.java | 2 +- langtools/test/tools/javac/generics/rare/6665356/T6665356.java | 2 +- .../tools/javac/processing/model/testgetallmembers/Main.java | 2 +- langtools/test/tools/javadoc/6176978/T6176978.java | 2 +- langtools/test/tools/javadoc/6176978/X.java | 2 +- 85 files changed, 85 insertions(+), 85 deletions(-) diff --git a/langtools/make/build.properties b/langtools/make/build.properties index 6e792bb106d..1f3b7c2e406 100644 --- a/langtools/make/build.properties +++ b/langtools/make/build.properties @@ -1,5 +1,5 @@ # -# Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2007-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 diff --git a/langtools/make/build.xml b/langtools/make/build.xml index 770f3dd040c..932332d295a 100644 --- a/langtools/make/build.xml +++ b/langtools/make/build.xml @@ -1,6 +1,6 @@ "); } + /** + * Print <CAPTION CLASS="stylename"> tag. Adds a newline character + * at the end. + * + * @param stylename style to be applied. + */ + public void captionStyle(String stylename) { + println(""); + } + + /** + * Print </CAPTION> tag. Add a newline character at the end. + */ + public void captionEnd() { + println(""); + } + /** * Print <TR BGCOLOR="color" CLASS="stylename"> tag. Adds a newline character * at the end. @@ -952,6 +1031,23 @@ public class HtmlWriter extends PrintWriter { print(""); } + /** + * Print <TH CLASS="stylename" SCOPE="scope" NOWRAP> tag. + * + * @param stylename style to be applied. + * @param scope the scope attribute. + */ + public void thScopeNoWrap(String stylename, String scope) { + print(""); + } + + /* + * Returns a header for Modifier and Type column of a table. + */ + public String getModifierTypeHeader() { + return modifierTypeHeader; + } + /** * Print <TH align="align" COLSPAN=i> tag. * diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/resources/standard.properties b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/resources/standard.properties index 492a77e7fcc..f4d86e3d5d8 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/resources/standard.properties +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/resources/standard.properties @@ -83,6 +83,17 @@ doclet.Deprecated_Constructors=Deprecated Constructors doclet.Deprecated_Methods=Deprecated Methods doclet.Deprecated_Enum_Constants=Deprecated Enum Constants doclet.Deprecated_Annotation_Type_Members=Deprecated Annotation Type Elements +doclet.deprecated_classes=deprecated classes +doclet.deprecated_enums=deprecated enums +doclet.deprecated_interfaces=deprecated interfaces +doclet.deprecated_exceptions=deprecated exceptions +doclet.deprecated_annotation_types=deprecated annotation types +doclet.deprecated_errors=deprecated errors +doclet.deprecated_fields=deprecated fields +doclet.deprecated_constructors=deprecated constructors +doclet.deprecated_methods=deprecated methods +doclet.deprecated_enum_constants=deprecated enum constants +doclet.deprecated_annotation_type_members=deprecated annotation type elements doclet.Frame_Output=Frame Output doclet.Docs_generated_by_Javadoc=Documentation generated by Javadoc. doclet.Generated_Docs_Untitled=Generated Documentation (Untitled) @@ -171,6 +182,7 @@ doclet.Style_line_8=Font used in left-hand frame lists doclet.Style_line_9=Example of smaller, sans-serif font in frames doclet.Style_line_10=Navigation bar fonts and colors doclet.Style_line_11=Dark Blue +doclet.Style_line_12=Table caption style doclet.ClassUse_Packages.that.use.0=Packages that use {0} doclet.ClassUse_Uses.of.0.in.1=Uses of {0} in {1} doclet.ClassUse_Classes.in.0.used.by.1=Classes in {0} used by {1} diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/PackageSummaryWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/PackageSummaryWriter.java index eb86fbea2d9..d46807d02e4 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/PackageSummaryWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/PackageSummaryWriter.java @@ -64,7 +64,7 @@ public interface PackageSummaryWriter { * @param classes the array of classes to document. * @param label the label for this table. */ - public abstract void writeClassesSummary(ClassDoc[] classes, String label); + public abstract void writeClassesSummary(ClassDoc[] classes, String label, String tableSummary, String[] tableHeader); /** * Write the header for the summary. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/PackageSummaryBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/PackageSummaryBuilder.java index c85b0b30b8d..ac25c257739 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/PackageSummaryBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/PackageSummaryBuilder.java @@ -40,6 +40,7 @@ import java.lang.reflect.*; * Do not use it as an API * * @author Jamie Ho + * @author Bhavesh Patel (Modified) * @since 1.5 */ public class PackageSummaryBuilder extends AbstractBuilder { @@ -184,7 +185,15 @@ public class PackageSummaryBuilder extends AbstractBuilder { * Build the summary for the classes in this package. */ public void buildClassSummary() { - ClassDoc[] classes = + String classTableSummary = + configuration.getText("doclet.Member_Table_Summary", + configuration.getText("doclet.Class_Summary"), + configuration.getText("doclet.classes")); + String[] classTableHeader = new String[] { + configuration.getText("doclet.Class"), + configuration.getText("doclet.Description") + }; + ClassDoc[] classes = packageDoc.isIncluded() ? packageDoc.ordinaryClasses() : configuration.classDocCatalog.ordinaryClasses( @@ -192,7 +201,8 @@ public class PackageSummaryBuilder extends AbstractBuilder { if (classes.length > 0) { packageWriter.writeClassesSummary( classes, - configuration.getText("doclet.Class_Summary")); + configuration.getText("doclet.Class_Summary"), + classTableSummary, classTableHeader); } } @@ -200,7 +210,15 @@ public class PackageSummaryBuilder extends AbstractBuilder { * Build the summary for the interfaces in this package. */ public void buildInterfaceSummary() { - ClassDoc[] interfaces = + String interfaceTableSummary = + configuration.getText("doclet.Member_Table_Summary", + configuration.getText("doclet.Interface_Summary"), + configuration.getText("doclet.interfaces")); + String[] interfaceTableHeader = new String[] { + configuration.getText("doclet.Interface"), + configuration.getText("doclet.Description") + }; + ClassDoc[] interfaces = packageDoc.isIncluded() ? packageDoc.interfaces() : configuration.classDocCatalog.interfaces( @@ -208,7 +226,8 @@ public class PackageSummaryBuilder extends AbstractBuilder { if (interfaces.length > 0) { packageWriter.writeClassesSummary( interfaces, - configuration.getText("doclet.Interface_Summary")); + configuration.getText("doclet.Interface_Summary"), + interfaceTableSummary, interfaceTableHeader); } } @@ -216,7 +235,15 @@ public class PackageSummaryBuilder extends AbstractBuilder { * Build the summary for the enums in this package. */ public void buildAnnotationTypeSummary() { - ClassDoc[] annotationTypes = + String annotationtypeTableSummary = + configuration.getText("doclet.Member_Table_Summary", + configuration.getText("doclet.Annotation_Types_Summary"), + configuration.getText("doclet.annotationtypes")); + String[] annotationtypeTableHeader = new String[] { + configuration.getText("doclet.AnnotationType"), + configuration.getText("doclet.Description") + }; + ClassDoc[] annotationTypes = packageDoc.isIncluded() ? packageDoc.annotationTypes() : configuration.classDocCatalog.annotationTypes( @@ -224,7 +251,8 @@ public class PackageSummaryBuilder extends AbstractBuilder { if (annotationTypes.length > 0) { packageWriter.writeClassesSummary( annotationTypes, - configuration.getText("doclet.Annotation_Types_Summary")); + configuration.getText("doclet.Annotation_Types_Summary"), + annotationtypeTableSummary, annotationtypeTableHeader); } } @@ -232,7 +260,15 @@ public class PackageSummaryBuilder extends AbstractBuilder { * Build the summary for the enums in this package. */ public void buildEnumSummary() { - ClassDoc[] enums = + String enumTableSummary = + configuration.getText("doclet.Member_Table_Summary", + configuration.getText("doclet.Enum_Summary"), + configuration.getText("doclet.enums")); + String[] enumTableHeader = new String[] { + configuration.getText("doclet.Enum"), + configuration.getText("doclet.Description") + }; + ClassDoc[] enums = packageDoc.isIncluded() ? packageDoc.enums() : configuration.classDocCatalog.enums( @@ -240,7 +276,8 @@ public class PackageSummaryBuilder extends AbstractBuilder { if (enums.length > 0) { packageWriter.writeClassesSummary( enums, - configuration.getText("doclet.Enum_Summary")); + configuration.getText("doclet.Enum_Summary"), + enumTableSummary, enumTableHeader); } } @@ -248,7 +285,15 @@ public class PackageSummaryBuilder extends AbstractBuilder { * Build the summary for the exceptions in this package. */ public void buildExceptionSummary() { - ClassDoc[] exceptions = + String exceptionTableSummary = + configuration.getText("doclet.Member_Table_Summary", + configuration.getText("doclet.Exception_Summary"), + configuration.getText("doclet.exceptions")); + String[] exceptionTableHeader = new String[] { + configuration.getText("doclet.Exception"), + configuration.getText("doclet.Description") + }; + ClassDoc[] exceptions = packageDoc.isIncluded() ? packageDoc.exceptions() : configuration.classDocCatalog.exceptions( @@ -256,7 +301,8 @@ public class PackageSummaryBuilder extends AbstractBuilder { if (exceptions.length > 0) { packageWriter.writeClassesSummary( exceptions, - configuration.getText("doclet.Exception_Summary")); + configuration.getText("doclet.Exception_Summary"), + exceptionTableSummary, exceptionTableHeader); } } @@ -264,7 +310,15 @@ public class PackageSummaryBuilder extends AbstractBuilder { * Build the summary for the errors in this package. */ public void buildErrorSummary() { - ClassDoc[] errors = + String errorTableSummary = + configuration.getText("doclet.Member_Table_Summary", + configuration.getText("doclet.Error_Summary"), + configuration.getText("doclet.errors")); + String[] errorTableHeader = new String[] { + configuration.getText("doclet.Error"), + configuration.getText("doclet.Description") + }; + ClassDoc[] errors = packageDoc.isIncluded() ? packageDoc.errors() : configuration.classDocCatalog.errors( @@ -272,7 +326,8 @@ public class PackageSummaryBuilder extends AbstractBuilder { if (errors.length > 0) { packageWriter.writeClassesSummary( errors, - configuration.getText("doclet.Error_Summary")); + configuration.getText("doclet.Error_Summary"), + errorTableSummary, errorTableHeader); } } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclets.properties b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclets.properties index 57382de9ab2..371bdf596f1 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclets.properties +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclets.properties @@ -82,6 +82,7 @@ doclet.Exceptions=Exceptions doclet.Errors=Errors doclet.Classes=Classes doclet.Packages=Packages +doclet.packages=packages doclet.All_Classes=All Classes doclet.All_Superinterfaces=All Superinterfaces: doclet.All_Implemented_Interfaces=All Implemented Interfaces: @@ -92,14 +93,20 @@ doclet.Interface=Interface doclet.Class=Class doclet.AnnotationType=Annotation Type doclet.annotationtype=annotation type +doclet.annotationtypes=annotation types doclet.Enum=Enum doclet.enum=enum +doclet.enums=enums doclet.interface=interface +doclet.interfaces=interfaces doclet.class=class +doclet.classes=classes doclet.Error=Error doclet.error=error +doclet.errors=errors doclet.Exception=Exception doclet.exception=exception +doclet.exceptions=exceptions doclet.extended_by=extended by doclet.extends=extends doclet.Package_private=(package private) @@ -125,6 +132,32 @@ doclet.value_tag_invalid_reference={0} (referenced by @value tag) is an unknown doclet.value_tag_invalid_constant=@value tag (which references {0}) can only be used in constants. doclet.dest_dir_create=Creating destination directory: "{0}" doclet.in={0} in {1} +doclet.Use_Table_Summary=Use table, listing {0}, and an explanation +doclet.Constants_Table_Summary={0} table, listing constant fields, and values +doclet.Member_Table_Summary={0} table, listing {1}, and an explanation +doclet.fields=fields +doclet.constructors=constructors +doclet.methods=methods +doclet.annotation_type_optional_members=optional elements +doclet.annotation_type_required_members=required elements +doclet.enum_constants=enum constants +doclet.nested_classes=nested classes +doclet.subclasses=subclasses +doclet.subinterfaces=subinterfaces +doclet.Modifier=Modifier +doclet.Type=Type +doclet.Field=Field +doclet.Constructor=Constructor +doclet.Method=Method +doclet.Annotation_Type_Optional_Member=Optional Element +doclet.Annotation_Type_Required_Member=Required Element +doclet.Annotation_Type_Member=Annotation Type Element +doclet.Enum_Constant=Enum Constant +doclet.Class=Class +doclet.Description=Description +doclet.ConstantField=Constant Field +doclet.Value=Value +doclet.0_and_1={0} and {1} #Documentation for Enums doclet.enum_values_doc=\n\ diff --git a/langtools/test/com/sun/javadoc/testHeadings/TestHeadings.java b/langtools/test/com/sun/javadoc/testHeadings/TestHeadings.java index 1ed62c535db..eb82d715b91 100644 --- a/langtools/test/com/sun/javadoc/testHeadings/TestHeadings.java +++ b/langtools/test/com/sun/javadoc/testHeadings/TestHeadings.java @@ -47,14 +47,16 @@ public class TestHeadings extends JavadocTester { private static final String[][] TEST = { //Package summary {BUG_ID + FS + "pkg1" + FS + "package-summary.html", - "" + NL + - "Class Summary" + "" + + "Class" + NL + "Description" }, // Class documentation {BUG_ID + FS + "pkg1" + FS + "C1.html", - "" + NL + - "Field Summary" + "" + + "Modifier and Type" + NL + "Field and Description" }, {BUG_ID + FS + "pkg1" + FS + "C1.html", "Methods inherited from class " + "java.lang.Object" @@ -62,29 +64,32 @@ public class TestHeadings extends JavadocTester { // Class use documentation {BUG_ID + FS + "pkg1" + FS + "class-use" + FS + "C1.html", - "" + NL + - "Packages that use C1" + "" + + "Package" + NL + "Description" }, {BUG_ID + FS + "pkg1" + FS + "class-use" + FS + "C1.html", "" + NL + "Uses of C1 in " + "pkg2" }, {BUG_ID + FS + "pkg1" + FS + "class-use" + FS + "C1.html", - "Fields in " + "pkg2 " + "declared as C1" + "" + + "Modifier and Type" + NL + "Field and Description" }, // Deprecated {BUG_ID + FS + "deprecated-list.html", - "" + NL + - "Deprecated Methods" + "" + + "Method and Description" }, // Constant values {BUG_ID + FS + "constant-values.html", - "pkg1.C1" - }, - {BUG_ID + FS + "constant-values.html", - "pkg1.C1" + "" + + "Modifier and Type" + NL + "Constant Field" + NL + + "Value" }, // Serialized Form diff --git a/langtools/test/com/sun/javadoc/testHtmlStrongTag/TestHtmlStrongTag.java b/langtools/test/com/sun/javadoc/testHtmlStrongTag/TestHtmlStrongTag.java index 3bb26e83992..c1445255c42 100644 --- a/langtools/test/com/sun/javadoc/testHtmlStrongTag/TestHtmlStrongTag.java +++ b/langtools/test/com/sun/javadoc/testHtmlStrongTag/TestHtmlStrongTag.java @@ -38,14 +38,15 @@ public class TestHtmlStrongTag extends JavadocTester { private static final String BUG_ID = "6786028"; private static final String[][] TEST1 = { - {BUG_ID + FS + "pkg1" + FS + "C1.html", "Method Summary"}, - {BUG_ID + FS + "pkg1" + FS + "C1.html", "See Also:"}, - {BUG_ID + FS + "pkg1" + FS + "package-summary.html", "Class Summary"}}; + {BUG_ID + FS + "pkg1" + FS + "C1.html", "See Also:"}}; private static final String[][] NEGATED_TEST1 = { - {BUG_ID + FS + "pkg1" + FS + "C1.html", ""}}; + {BUG_ID + FS + "pkg1" + FS + "C1.html", "Method Summary"}, + {BUG_ID + FS + "pkg1" + FS + "C1.html", ""}, + {BUG_ID + FS + "pkg1" + FS + "package-summary.html", "Class Summary"}}; private static final String[][] TEST2 = { + {BUG_ID + FS + "pkg2" + FS + "C2.html", "Comments:"}}; + private static final String[][] NEGATED_TEST2 = { {BUG_ID + FS + "pkg2" + FS + "C2.html", "Method Summary"}, - {BUG_ID + FS + "pkg2" + FS + "C2.html", "Comments:"}, {BUG_ID + FS + "pkg1" + FS + "package-summary.html", "Class Summary"}}; private static final String[] ARGS1 = @@ -62,7 +63,7 @@ public class TestHtmlStrongTag extends JavadocTester { public static void main(String[] args) { TestHtmlStrongTag tester = new TestHtmlStrongTag(); run(tester, ARGS1, TEST1, NEGATED_TEST1); - run(tester, ARGS2, TEST2, NO_TEST); + run(tester, ARGS2, TEST2, NEGATED_TEST2); tester.printSummary(); } diff --git a/langtools/test/com/sun/javadoc/testHtmlTableTags/TestHtmlTableTags.java b/langtools/test/com/sun/javadoc/testHtmlTableTags/TestHtmlTableTags.java new file mode 100644 index 00000000000..f08ff5783d1 --- /dev/null +++ b/langtools/test/com/sun/javadoc/testHtmlTableTags/TestHtmlTableTags.java @@ -0,0 +1,478 @@ +/* + * Copyright 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 6786688 + * @summary HTML tables should have table summary, caption and table headers. + * @author Bhavesh Patel + * @library ../lib/ + * @build JavadocTester + * @build TestHtmlTableTags + * @run main TestHtmlTableTags + */ + +public class TestHtmlTableTags extends JavadocTester { + + //Test information. + private static final String BUG_ID = "6786688"; + + //Javadoc arguments. + private static final String[] ARGS = new String[] { + "-d", BUG_ID, "-sourcepath", SRC_DIR, "-use", "pkg1", "pkg2" + }; + + //Input for string tests for HTML table tags. + private static final String[][] TABLE_TAGS_TEST = { + /* + * Test for validating summary for HTML tables + */ + + //Package summary + {BUG_ID + FS + "pkg1" + FS + "package-summary.html", + "" + }, + {BUG_ID + FS + "pkg1" + FS + "package-summary.html", + "
" + }, + {BUG_ID + FS + "pkg2" + FS + "package-summary.html", + "
" + }, + {BUG_ID + FS + "pkg2" + FS + "package-summary.html", + "
" + }, + // Class documentation + {BUG_ID + FS + "pkg1" + FS + "C1.html", + "
" + }, + {BUG_ID + FS + "pkg1" + FS + "C1.html", + "
" + }, + {BUG_ID + FS + "pkg2" + FS + "C2.html", + "
" + }, + {BUG_ID + FS + "pkg2" + FS + "C2.html", + "
" + }, + {BUG_ID + FS + "pkg2" + FS + "C2.ModalExclusionType.html", + "
" + }, + {BUG_ID + FS + "pkg2" + FS + "C3.html", + "
" + }, + {BUG_ID + FS + "pkg2" + FS + "C4.html", + "
" + }, + // Class use documentation + {BUG_ID + FS + "pkg1" + FS + "class-use" + FS + "I1.html", + "
" + }, + {BUG_ID + FS + "pkg1" + FS + "class-use" + FS + "C1.html", + "
" + }, + {BUG_ID + FS + "pkg1" + FS + "class-use" + FS + "C1.html", + "
" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "C2.html", + "
" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "C2.html", + "
" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "C2.ModalExclusionType.html", + "
" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "C2.ModalExclusionType.html", + "
" + }, + // Package use documentation + {BUG_ID + FS + "pkg1" + FS + "package-use.html", + "
" + }, + {BUG_ID + FS + "pkg1" + FS + "package-use.html", + "
" + }, + {BUG_ID + FS + "pkg2" + FS + "package-use.html", + "
" + }, + {BUG_ID + FS + "pkg2" + FS + "package-use.html", + "
" + }, + // Deprecated + {BUG_ID + FS + "deprecated-list.html", + "
" + }, + {BUG_ID + FS + "deprecated-list.html", + "
" + }, + // Constant values + {BUG_ID + FS + "constant-values.html", + "
" + }, + // Overview Summary + {BUG_ID + FS + "overview-summary.html", + "
" + }, + + /* + * Test for validating caption for HTML tables + */ + + //Package summary + {BUG_ID + FS + "pkg1" + FS + "package-summary.html", + "" + }, + {BUG_ID + FS + "pkg1" + FS + "package-summary.html", + "" + }, + {BUG_ID + FS + "pkg2" + FS + "package-summary.html", + "" + }, + {BUG_ID + FS + "pkg2" + FS + "package-summary.html", + "" + }, + // Class documentation + {BUG_ID + FS + "pkg1" + FS + "C1.html", + "" + }, + {BUG_ID + FS + "pkg1" + FS + "C1.html", + "" + }, + {BUG_ID + FS + "pkg2" + FS + "C2.html", + "" + }, + {BUG_ID + FS + "pkg2" + FS + "C2.html", + "" + }, + {BUG_ID + FS + "pkg2" + FS + "C2.ModalExclusionType.html", + "" + }, + {BUG_ID + FS + "pkg2" + FS + "C3.html", + "" + }, + {BUG_ID + FS + "pkg2" + FS + "C4.html", + "" + }, + // Class use documentation + {BUG_ID + FS + "pkg1" + FS + "class-use" + FS + "I1.html", + "" + }, + {BUG_ID + FS + "pkg1" + FS + "class-use" + FS + "C1.html", + "" + }, + {BUG_ID + FS + "pkg1" + FS + "class-use" + FS + "C1.html", + "" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "C2.html", + "" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "C2.html", + "" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "C2.ModalExclusionType.html", + "" + }, + // Package use documentation + {BUG_ID + FS + "pkg1" + FS + "package-use.html", + "" + }, + {BUG_ID + FS + "pkg1" + FS + "package-use.html", + "" + }, + {BUG_ID + FS + "pkg2" + FS + "package-use.html", + "" + }, + {BUG_ID + FS + "pkg2" + FS + "package-use.html", + "" + }, + // Deprecated + {BUG_ID + FS + "deprecated-list.html", + "" + }, + {BUG_ID + FS + "deprecated-list.html", + "" + }, + // Constant values + {BUG_ID + FS + "constant-values.html", + "" + }, + // Overview Summary + {BUG_ID + FS + "overview-summary.html", + "" + }, + + /* + * Test for validating headers for HTML tables + */ + + //Package summary + {BUG_ID + FS + "pkg1" + FS + "package-summary.html", + "" + NL + "" + }, + {BUG_ID + FS + "pkg1" + FS + "package-summary.html", + "" + NL + "" + }, + {BUG_ID + FS + "pkg2" + FS + "package-summary.html", + "" + NL + "" + }, + {BUG_ID + FS + "pkg2" + FS + "package-summary.html", + "" + NL + "" + }, + // Class documentation + {BUG_ID + FS + "pkg1" + FS + "C1.html", + "" + NL + "" + }, + {BUG_ID + FS + "pkg1" + FS + "C1.html", + "" + NL + "" + }, + {BUG_ID + FS + "pkg2" + FS + "C2.html", + "" + NL + "" + }, + {BUG_ID + FS + "pkg2" + FS + "C2.html", + "" + }, + {BUG_ID + FS + "pkg2" + FS + "C2.ModalExclusionType.html", + "" + }, + {BUG_ID + FS + "pkg2" + FS + "C3.html", + "" + NL + "" + }, + {BUG_ID + FS + "pkg2" + FS + "C4.html", + "" + NL + "" + }, + // Class use documentation + {BUG_ID + FS + "pkg1" + FS + "class-use" + FS + "I1.html", + "" + NL + "" + }, + {BUG_ID + FS + "pkg1" + FS + "class-use" + FS + "C1.html", + "" + NL + "" + }, + {BUG_ID + FS + "pkg1" + FS + "class-use" + FS + "C1.html", + "" + NL + "" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "C2.html", + "" + NL + "" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "C2.html", + "" + NL + "" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "C2.ModalExclusionType.html", + "" + NL + "" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "C2.ModalExclusionType.html", + "" + NL + "" + }, + // Package use documentation + {BUG_ID + FS + "pkg1" + FS + "package-use.html", + "" + NL + "" + }, + {BUG_ID + FS + "pkg1" + FS + "package-use.html", + "" + }, + {BUG_ID + FS + "pkg2" + FS + "package-use.html", + "" + NL + "" + }, + {BUG_ID + FS + "pkg2" + FS + "package-use.html", + "" + }, + // Deprecated + {BUG_ID + FS + "deprecated-list.html", + "" + }, + {BUG_ID + FS + "deprecated-list.html", + "" + }, + // Constant values + {BUG_ID + FS + "constant-values.html", + "" + NL + "" + NL + + "" + }, + // Overview Summary + {BUG_ID + FS + "overview-summary.html", + "" + NL + "" + } + }; + private static final String[][] NEGATED_TEST = NO_TEST; + + /** + * The entry point of the test. + * @param args the array of command line arguments. + */ + public static void main(String[] args) { + TestHtmlTableTags tester = new TestHtmlTableTags(); + run(tester, ARGS, TABLE_TAGS_TEST, NEGATED_TEST); + tester.printSummary(); + } + + /** + * {@inheritDoc} + */ + public String getBugId() { + return BUG_ID; + } + + /** + * {@inheritDoc} + */ + public String getBugName() { + return getClass().getName(); + } +} diff --git a/langtools/test/com/sun/javadoc/testHtmlTableTags/pkg1/C1.java b/langtools/test/com/sun/javadoc/testHtmlTableTags/pkg1/C1.java new file mode 100644 index 00000000000..5f38d4f1f29 --- /dev/null +++ b/langtools/test/com/sun/javadoc/testHtmlTableTags/pkg1/C1.java @@ -0,0 +1,81 @@ +/* + * Copyright 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. + */ + +package pkg1; + +import pkg2.*; + +/** + * A test class. + * + * @author Bhavesh Patel + */ +public class C1 implements I1 { + + /** + * Test field for class. + */ + public C2 field; + + /** + * Constant value. + */ + public static final String CONSTANT1 = "C1"; + + /** + * A test constructor. + */ + C1() { + } + + /** + * Method thats does some processing. + * + * @param param some parameter that is passed. + * @return a sample object. + */ + public C2 method(C2 param) { + return param; + } + + /** + * Method that is implemented. + * + * @param a some random value. + * @param b some random value. + */ + public void method1(int a, int b) { + } + + /** + * Another inherited method. + * @param c some value. + */ + public void method2(int c) { + } + + /** + * @deprecated don't use this anymore. + */ + public void deprecatedMethod() {} +} diff --git a/langtools/test/com/sun/javadoc/testHtmlTableTags/pkg1/I1.java b/langtools/test/com/sun/javadoc/testHtmlTableTags/pkg1/I1.java new file mode 100644 index 00000000000..509417825ac --- /dev/null +++ b/langtools/test/com/sun/javadoc/testHtmlTableTags/pkg1/I1.java @@ -0,0 +1,48 @@ +/* + * Copyright 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. + */ + +package pkg1; + +/** + * A sample interface used to test table tags. + * + * @author Bhavesh Patel + */ +public interface I1 { + + /** + * A test method. + * + * @param a blah. + * @param b blah. + */ + void method1(int a, int b); + + /** + * Another test method. + * + * @param c blah. + */ + void method2(int c); + +} diff --git a/langtools/test/com/sun/javadoc/testHtmlTableTags/pkg1/package-info.java b/langtools/test/com/sun/javadoc/testHtmlTableTags/pkg1/package-info.java new file mode 100644 index 00000000000..024483be5a7 --- /dev/null +++ b/langtools/test/com/sun/javadoc/testHtmlTableTags/pkg1/package-info.java @@ -0,0 +1,27 @@ +/* + * Copyright 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 package 1 used to test table tags. + */ +package pkg1; diff --git a/langtools/test/com/sun/javadoc/testHtmlTableTags/pkg2/C2.java b/langtools/test/com/sun/javadoc/testHtmlTableTags/pkg2/C2.java new file mode 100644 index 00000000000..07992e2bad1 --- /dev/null +++ b/langtools/test/com/sun/javadoc/testHtmlTableTags/pkg2/C2.java @@ -0,0 +1,73 @@ +/* + * Copyright 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. + */ + +package pkg2; + +import pkg1.*; + +/** + * Another test class. + * + * @author Bhavesh Patel + */ +public class C2 { + + /** + * A test field. + */ + public C1 field; + + /** + * @deprecated don't use this field anymore. + */ + public C1 dep_field; + + /** + * A sample enum. + */ + public static enum ModalExclusionType { + /** + * Test comment. + */ + NO_EXCLUDE, + /** + * Another comment. + */ + APPLICATION_EXCLUDE + }; + + /** + * A string constant. + */ + public static final String CONSTANT1 = "C2"; + + /** + * A sample method. + * + * @param param some parameter. + * @return a test object. + */ + public C1 method(C1 param) { + return param; + } +} diff --git a/langtools/test/com/sun/javadoc/testHtmlTableTags/pkg2/C3.java b/langtools/test/com/sun/javadoc/testHtmlTableTags/pkg2/C3.java new file mode 100644 index 00000000000..e410266b6a5 --- /dev/null +++ b/langtools/test/com/sun/javadoc/testHtmlTableTags/pkg2/C3.java @@ -0,0 +1,40 @@ +/* + * Copyright 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. 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. + */ + +package pkg2; + +import java.lang.annotation.*; + +/** + * Test Annotation class. + * + * @author Bhavesh Patel + */ +public @interface C3 { + /** + * Comment. + */ + String[] value(); +} diff --git a/langtools/test/com/sun/javadoc/testHtmlTableTags/pkg2/C4.java b/langtools/test/com/sun/javadoc/testHtmlTableTags/pkg2/C4.java new file mode 100644 index 00000000000..7eec427be53 --- /dev/null +++ b/langtools/test/com/sun/javadoc/testHtmlTableTags/pkg2/C4.java @@ -0,0 +1,35 @@ +/* + * Copyright 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. 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. + */ + +package pkg2; + +import java.lang.annotation.*; + +/* + * A sample interface. + */ +public @interface C4 { + boolean value() default true; +} diff --git a/langtools/test/com/sun/javadoc/testHtmlTableTags/pkg2/package-info.java b/langtools/test/com/sun/javadoc/testHtmlTableTags/pkg2/package-info.java new file mode 100644 index 00000000000..a1523b14326 --- /dev/null +++ b/langtools/test/com/sun/javadoc/testHtmlTableTags/pkg2/package-info.java @@ -0,0 +1,27 @@ +/* + * Copyright 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 package 2 used to test table tags. + */ +package pkg2; diff --git a/langtools/test/com/sun/javadoc/testNewLanguageFeatures/TestNewLanguageFeatures.java b/langtools/test/com/sun/javadoc/testNewLanguageFeatures/TestNewLanguageFeatures.java index 17eac18887a..5a5fb82b399 100644 --- a/langtools/test/com/sun/javadoc/testNewLanguageFeatures/TestNewLanguageFeatures.java +++ b/langtools/test/com/sun/javadoc/testNewLanguageFeatures/TestNewLanguageFeatures.java @@ -58,7 +58,8 @@ public class TestNewLanguageFeatures extends JavadocTester { "Coin>" }, //Check for enum constant section - {BUG_ID + FS + "pkg" + FS + "Coin.html", "Enum Constant Summary"}, + {BUG_ID + FS + "pkg" + FS + "Coin.html", ""}, //Detail for enum constant {BUG_ID + FS + "pkg" + FS + "Coin.html", "Dime"}, @@ -158,9 +159,11 @@ public class TestNewLanguageFeatures extends JavadocTester { "public @interface AnnotationType"}, //Make sure member summary headings are correct. {BUG_ID + FS + "pkg" + FS + "AnnotationType.html", - "Required Element Summary"}, + ""}, {BUG_ID + FS + "pkg" + FS + "AnnotationType.html", - "Optional Element Summary"}, + ""}, //Make sure element detail heading is correct {BUG_ID + FS + "pkg" + FS + "AnnotationType.html", "Element Detail"}, @@ -286,39 +289,57 @@ public class TestNewLanguageFeatures extends JavadocTester { //ClassUseTest1: {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo.html", - "" + "" }, {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo.html", "" + "" }, {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo.html", "" + "" }, {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo.html", "ParamTest<Foo>" }, {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "ParamTest.html", - "" + "" }, {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "ParamTest.html", "ParamTest<Foo>" }, {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo2.html", - "" + "" }, {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo2.html", "" + "" }, {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo2.html", "" + "" }, {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "ParamTest.html", "" + "" }, {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "ParamTest.html", "" + "" }, {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "ParamTest.html", "ParamTest<Foo>" }, {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "ParamTest.html", - "" + "" }, {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "ParamTest.html", "<T extends ParamTest<Foo3>>" }, {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo3.html", - "" + "" }, {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo3.html", "" + "" }, {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo3.html", "" + "" }, {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo3.html", "<T extends ParamTest<Foo3>>" @@ -371,38 +414,61 @@ public class TestNewLanguageFeatures extends JavadocTester { //ClassUseTest3: >> {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "ParamTest2.html", - "" + "" }, {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "ParamTest2.html", "" + "" }, {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "ParamTest2.html", "" + "" }, {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "ParamTest2.html", "<T extends ParamTest2<java.util.List<? extends Foo4>>>" }, {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo4.html", - "" + "" }, {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo4.html", "" + "" }, {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo4.html", "" + "" }, {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo4.html", "<T extends ParamTest2<java.util.List<? extends Foo4>>>" @@ -410,81 +476,147 @@ public class TestNewLanguageFeatures extends JavadocTester { //Type parameters in constructor and method args {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo4.html", - "" + NL + - "" + NL + - "" + NL + - "" + NL + - "" + NL + + "" + NL + "" + NL + "" + NL + + "" + NL + + "" + NL + + "" + NL + + "" + NL + - "" + NL + - "" + NL + - "" + NL + + "" + NL + "" + NL + "" + NL + + "" + NL + + "" + NL + - "" + NL + - "" + "Packages with annotations of type " + + "AnnotationType" + NL + + "" + NL + "" + NL + "" + NL + "" + NL + + "" + NL + + "" }, {BUG_ID + FS + "pkg" + FS + "class-use" + FS + "AnnotationType.html", - "Classes in pkg with annotations of type AnnotationType" + NL + - "" + NL + - "" + NL + - "" + NL + - "" + NL + "" + NL + "" + NL + + "" + NL + + "" + NL + + "" + NL + + "" + NL + - "" + NL + - "" + NL + - "" + NL + "" + NL + "" + NL + + "" + NL + + "" + NL + + "" + NL + + "" + NL + - "" + NL + - "" + NL + - "" + NL + "" + NL + "" + NL + + "" + NL + + "" + NL + + "" + NL + + "" + NL + - "" + NL + - "" + NL + - "" + NL + "" + NL + "" + NL + + "" + NL + + "" + NL + + "" + NL + + "" + NL + - "" + NL + - "" + NL + "" + NL + "" + NL + + "" + NL + + "" + NL + - "" + NL + - "" + NL + "" + NL + "" + NL + + "" + NL + + ""} }; private static final String[][] NEGATED_TEST = NO_TEST; From dc5ad18362fa8fd6a2457983c1cfc81374565035 Mon Sep 17 00:00:00 2001 From: Dmitry Cherepanov Date: Fri, 20 Mar 2009 08:41:43 -0400 Subject: [PATCH 155/292] 6774258: api/java_awt/Component/index.html#PaintUpdate fails randomly Reviewed-by: art --- .../sun/awt/windows/WComponentPeer.java | 2 +- .../java2d/d3d/D3DScreenUpdateManager.java | 17 +- .../NoUpdateUponShow/NoUpdateUponShow.java | 381 ++++++++++++++++++ 3 files changed, 390 insertions(+), 10 deletions(-) create mode 100644 jdk/test/java/awt/Component/NoUpdateUponShow/NoUpdateUponShow.java diff --git a/jdk/src/windows/classes/sun/awt/windows/WComponentPeer.java b/jdk/src/windows/classes/sun/awt/windows/WComponentPeer.java index 2f895640ccb..6ad608452a1 100644 --- a/jdk/src/windows/classes/sun/awt/windows/WComponentPeer.java +++ b/jdk/src/windows/classes/sun/awt/windows/WComponentPeer.java @@ -778,7 +778,7 @@ public abstract class WComponentPeer extends WObjectPeer * NOTE: This is called on the privileged toolkit thread. Do not * call directly into user code using this thread! */ - void handlePaint(int x, int y, int w, int h) { + public void handlePaint(int x, int y, int w, int h) { postPaintIfNecessary(x, y, w, h); } diff --git a/jdk/src/windows/classes/sun/java2d/d3d/D3DScreenUpdateManager.java b/jdk/src/windows/classes/sun/java2d/d3d/D3DScreenUpdateManager.java index b3b0fa8d5fc..53ae895ddfe 100644 --- a/jdk/src/windows/classes/sun/java2d/d3d/D3DScreenUpdateManager.java +++ b/jdk/src/windows/classes/sun/java2d/d3d/D3DScreenUpdateManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2007-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 @@ -37,6 +37,7 @@ import java.security.PrivilegedAction; import java.util.ArrayList; import java.util.HashMap; import sun.awt.SunToolkit; +import sun.awt.AWTAccessor; import sun.awt.Win32GraphicsConfig; import sun.awt.windows.WComponentPeer; import sun.java2d.InvalidPipeException; @@ -284,14 +285,12 @@ public class D3DScreenUpdateManager extends ScreenUpdateManager * @param peer for which target's the repaint should be issued */ private void repaintPeerTarget(WComponentPeer peer) { - // we don't want to call user code on our priveleged - // thread, delegate to EDT - final Component target = (Component)peer.getTarget(); - SunToolkit.executeOnEventHandlerThread(target, new Runnable() { - public void run() { - target.repaint(); - } - }); + Component target = (Component)peer.getTarget(); + Rectangle bounds = AWTAccessor.getComponentAccessor().getBounds(target); + // the system-level painting operations should call the handlePaint() + // method of the WComponentPeer class to repaint the component; + // calling repaint() forces AWT to make call to update() + peer.handlePaint(0, 0, bounds.width, bounds.height); } /** diff --git a/jdk/test/java/awt/Component/NoUpdateUponShow/NoUpdateUponShow.java b/jdk/test/java/awt/Component/NoUpdateUponShow/NoUpdateUponShow.java new file mode 100644 index 00000000000..d401f986aeb --- /dev/null +++ b/jdk/test/java/awt/Component/NoUpdateUponShow/NoUpdateUponShow.java @@ -0,0 +1,381 @@ +/* + * Copyright 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 6774258 + @summary api/java_awt/Component/index.html#PaintUpdate fails randomly + @author dmitry.cherepanov@...: area=awt.painting + @run main NoUpdateUponShow +*/ + +/** + * NoUpdateUponShow.java + * + * summary: System-level painting operations shouldn't make call to update() + */ + +import java.awt.*; +import sun.awt.SunToolkit; + +public class NoUpdateUponShow +{ + + static volatile boolean wasUpdate = false; + + private static void init() + { + //*** Create instructions for the user here *** + + String[] instructions = + { + "This is an AUTOMATIC test, simply wait until it is done.", + "The result (passed or failed) will be shown in the", + "message window below." + }; + Sysout.createDialog( ); + Sysout.printInstructions( instructions ); + + + // Create the frame and the button + Frame f = new Frame(); + f.setBounds(100, 100, 200, 200); + f.setLayout(new FlowLayout()); + f.add(new Button() { + @Override + public void update(Graphics g) { + wasUpdate = true; + super.update(g); + } + }); + f.setVisible(true); + + ((SunToolkit)Toolkit.getDefaultToolkit()).realSync(); + + if (wasUpdate) { + fail(" Unexpected update. "); + } else { + pass(); + } + }//End init() + + /***************************************************** + * Standard Test Machinery Section + * DO NOT modify anything in this section -- it's a + * standard chunk of code which has all of the + * synchronisation necessary for the test harness. + * By keeping it the same in all tests, it is easier + * to read and understand someone else's test, as + * well as insuring that all tests behave correctly + * with the test harness. + * There is a section following this for test- + * classes + ******************************************************/ + private static boolean theTestPassed = false; + private static boolean testGeneratedInterrupt = false; + private static String failureMessage = ""; + + private static Thread mainThread = null; + + private static int sleepTime = 300000; + + // Not sure about what happens if multiple of this test are + // instantiated in the same VM. Being static (and using + // static vars), it aint gonna work. Not worrying about + // it for now. + public static void main( String args[] ) throws InterruptedException + { + mainThread = Thread.currentThread(); + try + { + init(); + } + catch( TestPassedException e ) + { + //The test passed, so just return from main and harness will + // interepret this return as a pass + return; + } + //At this point, neither test pass nor test fail has been + // called -- either would have thrown an exception and ended the + // test, so we know we have multiple threads. + + //Test involves other threads, so sleep and wait for them to + // called pass() or fail() + try + { + Thread.sleep( sleepTime ); + //Timed out, so fail the test + throw new RuntimeException( "Timed out after " + sleepTime/1000 + " seconds" ); + } + catch (InterruptedException e) + { + //The test harness may have interrupted the test. If so, rethrow the exception + // so that the harness gets it and deals with it. + if( ! testGeneratedInterrupt ) throw e; + + //reset flag in case hit this code more than once for some reason (just safety) + testGeneratedInterrupt = false; + + if ( theTestPassed == false ) + { + throw new RuntimeException( failureMessage ); + } + } + + }//main + + public static synchronized void setTimeoutTo( int seconds ) + { + sleepTime = seconds * 1000; + } + + public static synchronized void pass() + { + Sysout.println( "The test passed." ); + Sysout.println( "The test is over, hit Ctl-C to stop Java VM" ); + //first check if this is executing in main thread + if ( mainThread == Thread.currentThread() ) + { + //Still in the main thread, so set the flag just for kicks, + // and throw a test passed exception which will be caught + // and end the test. + theTestPassed = true; + throw new TestPassedException(); + } + theTestPassed = true; + testGeneratedInterrupt = true; + mainThread.interrupt(); + }//pass() + + public static synchronized void fail() + { + //test writer didn't specify why test failed, so give generic + fail( "it just plain failed! :-)" ); + } + + public static synchronized void fail( String whyFailed ) + { + Sysout.println( "The test failed: " + whyFailed ); + Sysout.println( "The test is over, hit Ctl-C to stop Java VM" ); + //check if this called from main thread + if ( mainThread == Thread.currentThread() ) + { + //If main thread, fail now 'cause not sleeping + throw new RuntimeException( whyFailed ); + } + theTestPassed = false; + testGeneratedInterrupt = true; + failureMessage = whyFailed; + mainThread.interrupt(); + }//fail() + +}// class ValidBounds + +//This exception is used to exit from any level of call nesting +// when it's determined that the test has passed, and immediately +// end the test. +class TestPassedException extends RuntimeException +{ +} + +//*********** End Standard Test Machinery Section ********** + + +//************ Begin classes defined for the test **************** + +// if want to make listeners, here is the recommended place for them, then instantiate +// them in init() + +/* Example of a class which may be written as part of a test +class NewClass implements anInterface + { + static int newVar = 0; + + public void eventDispatched(AWTEvent e) + { + //Counting events to see if we get enough + eventCount++; + + if( eventCount == 20 ) + { + //got enough events, so pass + + ValidBounds.pass(); + } + else if( tries == 20 ) + { + //tried too many times without getting enough events so fail + + ValidBounds.fail(); + } + + }// eventDispatched() + + }// NewClass class + +*/ + + +//************** End classes defined for the test ******************* + + + + +/**************************************************** + Standard Test Machinery + DO NOT modify anything below -- it's a standard + chunk of code whose purpose is to make user + interaction uniform, and thereby make it simpler + to read and understand someone else's test. + ****************************************************/ + +/** + This is part of the standard test machinery. + It creates a dialog (with the instructions), and is the interface + for sending text messages to the user. + To print the instructions, send an array of strings to Sysout.createDialog + WithInstructions method. Put one line of instructions per array entry. + To display a message for the tester to see, simply call Sysout.println + with the string to be displayed. + This mimics System.out.println but works within the test harness as well + as standalone. + */ + +class Sysout +{ + private static TestDialog dialog; + + public static void createDialogWithInstructions( String[] instructions ) + { + dialog = new TestDialog( new Frame(), "Instructions" ); + dialog.printInstructions( instructions ); + dialog.setVisible(true); + 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.setVisible(true); + 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 ); + System.out.println(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(); + + setVisible(true); + }// 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" ); + System.out.println(messageIn); + } + +}// TestDialog class From fba4182589813159ab0fb85ab476eb12543ba41f Mon Sep 17 00:00:00 2001 From: Karen Kinnear Date: Fri, 20 Mar 2009 11:23:24 -0400 Subject: [PATCH 156/292] 6819853: VM does not detect JDK which supports parallel class loaders Reviewed-by: coleenp, pbk, xlu, alanb --- hotspot/src/share/vm/classfile/vmSymbols.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hotspot/src/share/vm/classfile/vmSymbols.hpp b/hotspot/src/share/vm/classfile/vmSymbols.hpp index 338b14877a0..bfa94aabec1 100644 --- a/hotspot/src/share/vm/classfile/vmSymbols.hpp +++ b/hotspot/src/share/vm/classfile/vmSymbols.hpp @@ -376,7 +376,7 @@ template(unknown_class_name, "") \ \ /* used to identify class loaders handling parallel class loading */ \ - template(parallelCapable_name, "parallelLockMap;") \ + template(parallelCapable_name, "parallelLockMap") \ \ /* JVM monitoring and management support */ \ template(java_lang_StackTraceElement_array, "[Ljava/lang/StackTraceElement;") \ From 7f2828e070ad79d9bf6c8c7e797abbd344bc1a9e Mon Sep 17 00:00:00 2001 From: Alexey Ushakov Date: Fri, 20 Mar 2009 20:05:22 +0300 Subject: [PATCH 157/292] 6733501: Apply IcedTea little cms patches Reviewed-by: bae, prr --- .../share/native/sun/java2d/cmm/lcms/LCMS.c | 226 +++++++++++++++++- .../share/native/sun/java2d/cmm/lcms/cmsio0.c | 30 ++- .../share/native/sun/java2d/cmm/lcms/lcms.h | 1 + .../cmm/ProfileOp/ReadWriteProfileTest.java | 120 ++++++++++ 4 files changed, 374 insertions(+), 3 deletions(-) create mode 100644 jdk/test/sun/java2d/cmm/ProfileOp/ReadWriteProfileTest.java diff --git a/jdk/src/share/native/sun/java2d/cmm/lcms/LCMS.c b/jdk/src/share/native/sun/java2d/cmm/lcms/LCMS.c index 0573a021876..404ab2e686d 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/LCMS.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/LCMS.c @@ -30,6 +30,41 @@ #include "Disposer.h" #include "lcms.h" + +#define ALIGNLONG(x) (((x)+3) & ~(3)) // Aligns to DWORD boundary + +#ifdef USE_BIG_ENDIAN +#define AdjustEndianess32(a) +#else + +static +void AdjustEndianess32(LPBYTE pByte) +{ + BYTE temp1; + BYTE temp2; + + temp1 = *pByte++; + temp2 = *pByte++; + *(pByte-1) = *pByte; + *pByte++ = temp2; + *(pByte-3) = *pByte; + *pByte = temp1; +} + +#endif + +// Transports to properly encoded values - note that icc profiles does use +// big endian notation. + +static +icInt32Number TransportValue32(icInt32Number Value) +{ + icInt32Number Temp = Value; + + AdjustEndianess32((LPBYTE) &Temp); + return Temp; +} + #define SigMake(a,b,c,d) \ ( ( ((int) ((unsigned char) (a))) << 24) | \ ( ((int) ((unsigned char) (b))) << 16) | \ @@ -182,6 +217,8 @@ JNIEXPORT jlong JNICALL Java_sun_java2d_cmm_lcms_LCMS_loadProfile sProf.pf = cmsOpenProfileFromMem((LPVOID)dataArray, (DWORD) dataSize); + (*env)->ReleaseByteArrayElements (env, data, dataArray, 0); + if (sProf.pf == NULL) { JNU_ThrowIllegalArgumentException(env, "Invalid profile data"); } @@ -345,7 +382,23 @@ JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_getTagData JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_setTagData (JNIEnv *env, jobject obj, jlong id, jint tagSig, jbyteArray data) { - fprintf(stderr, "setTagData operation is not implemented"); + cmsHPROFILE profile; + storeID_t sProf; + jbyte* dataArray; + int tagSize; + + if (tagSig == SigHead) { + J2dRlsTraceLn(J2D_TRACE_ERROR, "LCMS_setTagData on icSigHead not " + "permitted"); + return; + } + + sProf.j = id; + profile = (cmsHPROFILE) sProf.pf; + dataArray = (*env)->GetByteArrayElements(env, data, 0); + tagSize =(*env)->GetArrayLength(env, data); + _cmsModifyTagData(profile, (icTagSignature) tagSig, dataArray, tagSize); + (*env)->ReleaseByteArrayElements(env, data, dataArray, 0); } void* getILData (JNIEnv *env, jobject img, jint* pDataType, @@ -507,3 +560,174 @@ JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_initLCMS PF_ID_fID = (*env)->GetFieldID (env, Pf, "ID", "J"); } + +BOOL _cmsModifyTagData(cmsHPROFILE hProfile, icTagSignature sig, + void *data, size_t size) +{ + BOOL isNew; + int i, idx, delta, count; + LPBYTE padChars[3] = {0, 0, 0}; + LPBYTE beforeBuf, afterBuf, ptr; + size_t beforeSize, afterSize; + icUInt32Number profileSize, temp; + LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile; + + isNew = FALSE; + idx = _cmsSearchTag(Icc, sig, FALSE); + if (idx < 0) { + isNew = TRUE; + idx = Icc->TagCount++; + if (Icc->TagCount >= MAX_TABLE_TAG) { + J2dRlsTraceLn1(J2D_TRACE_ERROR, "_cmsModifyTagData: Too many tags " + "(%d)\n", Icc->TagCount); + Icc->TagCount = MAX_TABLE_TAG-1; + return FALSE; + } + } + + /* Read in size from header */ + Icc->Seek(Icc, 0); + Icc->Read(&profileSize, sizeof(icUInt32Number), 1, Icc); + AdjustEndianess32((LPBYTE) &profileSize); + + /* Compute the change in profile size */ + if (isNew) { + delta = sizeof(icTag) + ALIGNLONG(size); + } else { + delta = ALIGNLONG(size) - ALIGNLONG(Icc->TagSizes[idx]); + } + /* Add tag to internal structures */ + ptr = malloc(size); + if (ptr == NULL) { + if(isNew) { + Icc->TagCount--; + } + J2dRlsTraceLn(J2D_TRACE_ERROR, "_cmsModifyTagData: ptr == NULL"); + return FALSE; + } + + if (!Icc->Grow(Icc, delta)) { + free(ptr); + if(isNew) { + Icc->TagCount--; + } + J2dRlsTraceLn(J2D_TRACE_ERROR, + "_cmsModifyTagData: Icc->Grow() == FALSE"); + return FALSE; + } + + /* Compute size of tag data before/after the modified tag */ + beforeSize = ((isNew)?profileSize:Icc->TagOffsets[idx]) - + Icc->TagOffsets[0]; + if (Icc->TagCount == (idx + 1)) { + afterSize = 0; + } else { + afterSize = profileSize - Icc->TagOffsets[idx+1]; + } + /* Make copies of the data before/after the modified tag */ + if (beforeSize > 0) { + beforeBuf = malloc(beforeSize); + if (!beforeBuf) { + if(isNew) { + Icc->TagCount--; + } + free(ptr); + J2dRlsTraceLn(J2D_TRACE_ERROR, + "_cmsModifyTagData: beforeBuf == NULL"); + return FALSE; + } + Icc->Seek(Icc, Icc->TagOffsets[0]); + Icc->Read(beforeBuf, beforeSize, 1, Icc); + } + + if (afterSize > 0) { + afterBuf = malloc(afterSize); + if (!afterBuf) { + free(ptr); + if(isNew) { + Icc->TagCount--; + } + if (beforeSize > 0) { + free(beforeBuf); + } + J2dRlsTraceLn(J2D_TRACE_ERROR, + "_cmsModifyTagData: afterBuf == NULL"); + return FALSE; + } + Icc->Seek(Icc, Icc->TagOffsets[idx+1]); + Icc->Read(afterBuf, afterSize, 1, Icc); + } + + CopyMemory(ptr, data, size); + Icc->TagSizes[idx] = size; + Icc->TagNames[idx] = sig; + if (Icc->TagPtrs[idx]) { + free(Icc->TagPtrs[idx]); + } + Icc->TagPtrs[idx] = ptr; + if (isNew) { + Icc->TagOffsets[idx] = profileSize; + } + + + /* Update the profile size in the header */ + profileSize += delta; + Icc->Seek(Icc, 0); + temp = TransportValue32(profileSize); + Icc->Write(Icc, sizeof(icUInt32Number), &temp); + + + /* Adjust tag offsets: if the tag is new, we must account + for the new tag table entry; otherwise, only those tags after + the modified tag are changed (by delta) */ + if (isNew) { + for (i = 0; i < Icc->TagCount; ++i) { + Icc->TagOffsets[i] += sizeof(icTag); + } + } else { + for (i = idx+1; i < Icc->TagCount; ++i) { + Icc->TagOffsets[i] += delta; + } + } + + /* Write out a new tag table */ + count = 0; + for (i = 0; i < Icc->TagCount; ++i) { + if (Icc->TagNames[i] != 0) { + ++count; + } + } + Icc->Seek(Icc, sizeof(icHeader)); + temp = TransportValue32(count); + Icc->Write(Icc, sizeof(icUInt32Number), &temp); + + for (i = 0; i < Icc->TagCount; ++i) { + if (Icc->TagNames[i] != 0) { + icTag tag; + tag.sig = TransportValue32(Icc->TagNames[i]); + tag.offset = TransportValue32((icInt32Number) Icc->TagOffsets[i]); + tag.size = TransportValue32((icInt32Number) Icc->TagSizes[i]); + Icc->Write(Icc, sizeof(icTag), &tag); + } + } + + /* Write unchanged data before the modified tag */ + if (beforeSize > 0) { + Icc->Write(Icc, beforeSize, beforeBuf); + free(beforeBuf); + } + + /* Write modified tag data */ + Icc->Write(Icc, size, data); + if (size % 4) { + Icc->Write(Icc, 4 - (size % 4), padChars); + } + + /* Write unchanged data after the modified tag */ + if (afterSize > 0) { + Icc->Write(Icc, afterSize, afterBuf); + free(afterBuf); + } + + return TRUE; +} diff --git a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsio0.c b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsio0.c index 1556fa5e8af..d09100d653a 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsio0.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsio0.c @@ -157,14 +157,31 @@ BOOL MemoryWrite(struct _lcms_iccprofile_struct* Icc, size_t size, void *Ptr) if (size == 0) return TRUE; if (ResData != NULL) - CopyMemory(ResData ->Block + Icc ->UsedSpace, Ptr, size); + CopyMemory(ResData ->Block + ResData ->Pointer, Ptr, size); + ResData->Pointer += size; Icc->UsedSpace += size; return TRUE; } +static +BOOL MemoryGrow(struct _lcms_iccprofile_struct* Icc, size_t size) +{ + FILEMEM* ResData = (FILEMEM*) Icc->stream; + + void* newBlock = realloc(ResData->Block, ResData->Size + size); + + if (!newBlock) { + return FALSE; + } + ResData->Block = newBlock; + ResData->Size += size; + return TRUE; +} + + static BOOL MemoryClose(struct _lcms_iccprofile_struct* Icc) { @@ -238,6 +255,13 @@ BOOL FileWrite(struct _lcms_iccprofile_struct* Icc, size_t size, LPVOID Ptr) } +static +BOOL FileGrow(struct _lcms_iccprofile_struct* Icc, size_t size) +{ + return TRUE; +} + + static BOOL FileClose(struct _lcms_iccprofile_struct* Icc) { @@ -382,6 +406,7 @@ LPLCMSICCPROFILE _cmsCreateProfileFromFilePlaceholder(const char* FileName) NewIcc ->Seek = FileSeek; NewIcc ->Tell = FileTell; NewIcc ->Close = FileClose; + NewIcc ->Grow = FileGrow; NewIcc ->Write = NULL; NewIcc ->IsWrite = FALSE; @@ -419,7 +444,8 @@ LPLCMSICCPROFILE _cmsCreateProfileFromMemPlaceholder(LPVOID MemPtr, DWORD dwSize NewIcc ->Seek = MemorySeek; NewIcc ->Tell = MemoryTell; NewIcc ->Close = MemoryClose; - NewIcc ->Write = NULL; + NewIcc ->Grow = MemoryGrow; + NewIcc ->Write = MemoryWrite; NewIcc ->IsWrite = FALSE; diff --git a/jdk/src/share/native/sun/java2d/cmm/lcms/lcms.h b/jdk/src/share/native/sun/java2d/cmm/lcms/lcms.h index 81184b098fb..404c1020bb0 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/lcms.h +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/lcms.h @@ -1838,6 +1838,7 @@ typedef struct _lcms_iccprofile_struct { BOOL (* Seek)(struct _lcms_iccprofile_struct* Icc, size_t offset); BOOL (* Close)(struct _lcms_iccprofile_struct* Icc); size_t (* Tell)(struct _lcms_iccprofile_struct* Icc); + BOOL (* Grow)(struct _lcms_iccprofile_struct* Icc, size_t amount); // Writting diff --git a/jdk/test/sun/java2d/cmm/ProfileOp/ReadWriteProfileTest.java b/jdk/test/sun/java2d/cmm/ProfileOp/ReadWriteProfileTest.java new file mode 100644 index 00000000000..dc54d94ab45 --- /dev/null +++ b/jdk/test/sun/java2d/cmm/ProfileOp/ReadWriteProfileTest.java @@ -0,0 +1,120 @@ +/* + * Copyright 2007-2008 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 6476665 6523403 6733501 + * @summary Verifies reading and writing profiles and tags of the standard color + * spaces + * @run main ReadWriteProfileTest + */ +import java.awt.color.ColorSpace; +import java.awt.color.ICC_Profile; +import java.util.*; +import java.nio.*; +import java.util.Hashtable; + +public class ReadWriteProfileTest implements Runnable { + /* Location of the tag sig counter in 4-byte words */ + final static int TAG_COUNT_OFFSET = 32; + + /* Location of the tag sig table in 4-byte words */ + final static int TAG_ELEM_OFFSET = 33; + + static byte[][] profiles; + static int [][] tagSigs; + static Hashtable [] tags; + + static int [] cspaces = {ColorSpace.CS_sRGB, ColorSpace.CS_PYCC, + ColorSpace.CS_LINEAR_RGB, ColorSpace.CS_CIEXYZ, + ColorSpace.CS_GRAY}; + + static String [] csNames = {"sRGB", "PYCC", "LINEAR_RGB", "CIEXYZ", "GRAY"}; + + static void getProfileTags(byte [] data, Hashtable tags) { + ByteBuffer byteBuf = ByteBuffer.wrap(data); + IntBuffer intBuf = byteBuf.asIntBuffer(); + int tagCount = intBuf.get(TAG_COUNT_OFFSET); + intBuf.position(TAG_ELEM_OFFSET); + for (int i = 0; i < tagCount; i++) { + int tagSig = intBuf.get(); + int tagDataOff = intBuf.get(); + int tagSize = intBuf.get(); + + byte [] tagData = new byte[tagSize]; + byteBuf.position(tagDataOff); + byteBuf.get(tagData); + tags.put(tagSig, tagData); + } + } + + static { + profiles = new byte[cspaces.length][]; + tags = new Hashtable[cspaces.length]; + + for (int i = 0; i < cspaces.length; i++) { + ICC_Profile pf = ICC_Profile.getInstance(cspaces[i]); + profiles[i] = pf.getData(); + tags[i] = new Hashtable(); + getProfileTags(profiles[i], tags[i]); + } + } + + public void run() { + for (int i = 0; i < cspaces.length; i++) { + ICC_Profile pf = ICC_Profile.getInstance(cspaces[i]); + byte [] data = pf.getData(); + pf = ICC_Profile.getInstance(data); + if (!Arrays.equals(data, profiles[i])) { + System.err.println("Incorrect result of getData() " + "with " + + csNames[i] + " profile"); + throw new RuntimeException("Incorrect result of getData()"); + } + + for (int tagSig : tags[i].keySet()) { + byte [] tagData = pf.getData(tagSig); + byte [] empty = new byte[tagData.length]; + pf.setData(tagSig, empty); + pf.setData(tagSig, tagData); + + byte [] tagData1 = pf.getData(tagSig); + + if (!Arrays.equals(tagData1, tags[i].get(tagSig))) + { + System.err.println("Incorrect result of getData(int) with" + + " tag " + + Integer.toHexString(tagSig) + + " of " + csNames[i] + " profile"); + + throw new RuntimeException("Incorrect result of " + + "getData(int)"); + } + } + } + } + + public static void main(String [] args) { + ReadWriteProfileTest test = new ReadWriteProfileTest(); + test.run(); + } +} From 34d8fbb5e26e14cea387c6cefbeaa0512d1376d8 Mon Sep 17 00:00:00 2001 From: Bhavesh Patel Date: Fri, 20 Mar 2009 15:50:50 -0700 Subject: [PATCH 158/292] 6820360: Fix for definition list tags nesting adds an extra list tag for package summary page Reviewed-by: jjg --- .../formats/html/HtmlDocletWriter.java | 10 ++++--- .../TestHtmlDefinitionListTag.java | 12 ++++++-- .../pkg1/package-info.java | 29 +++++++++++++++++++ 3 files changed, 45 insertions(+), 6 deletions(-) create mode 100644 langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/pkg1/package-info.java diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDocletWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDocletWriter.java index 74d287dd79b..453b8e8e74a 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDocletWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDocletWriter.java @@ -236,17 +236,19 @@ public class HtmlDocletWriter extends HtmlDocWriter { configuration.tagletManager.getCustomTags(doc), getTagletWriterInstance(false), output); String outputString = output.toString().trim(); - // For RootDoc and ClassDoc, this section is not the definition description - // but the start of definition list. + // For RootDoc, ClassDoc and PackageDoc, this section is not the + // definition description but the start of definition list. if (!outputString.isEmpty()) { - if (!(doc instanceof RootDoc || doc instanceof ClassDoc)) { + if (!(doc instanceof RootDoc || doc instanceof ClassDoc || + doc instanceof PackageDoc)) { printMemberDetailsListStartTag(); dd(); } printTagsInfoHeader(); print(outputString); printTagsInfoFooter(); - if (!(doc instanceof RootDoc || doc instanceof ClassDoc)) + if (!(doc instanceof RootDoc || doc instanceof ClassDoc || + doc instanceof PackageDoc)) ddEnd(); } } diff --git a/langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/TestHtmlDefinitionListTag.java b/langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/TestHtmlDefinitionListTag.java index 5fa8db63ca5..652de517cb5 100644 --- a/langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/TestHtmlDefinitionListTag.java +++ b/langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/TestHtmlDefinitionListTag.java @@ -25,7 +25,7 @@ /* * @test - * @bug 6786690 + * @bug 6786690 6820360 * @summary This test verifies the nesting of definition list tags. * @author Bhavesh Patel * @library ../lib/ @@ -36,7 +36,7 @@ public class TestHtmlDefinitionListTag extends JavadocTester { - private static final String BUG_ID = "6786690"; + private static final String BUG_ID = "6786690-6820360"; // Test common to all runs of javadoc. The class signature should print // properly enclosed definition list tags and the Annotation Type @@ -55,6 +55,9 @@ public class TestHtmlDefinitionListTag extends JavadocTester { // serialized form should have properly nested definition list tags // enclosing comments, tags and deprecated information. private static final String[][] TEST_CMNT_DEPR = { + {BUG_ID + FS + "pkg1" + FS + "package-summary.html", "
" + NL + + "
Since:
" + NL + + "
JDK1.0
"}, {BUG_ID + FS + "pkg1" + FS + "C1.html", "
" + NL + "
Since:
" + NL + "
JDK1.0
" + NL + "
See Also:
" + @@ -193,6 +196,9 @@ public class TestHtmlDefinitionListTag extends JavadocTester { // should display properly nested definition list tags for comments, tags // and deprecated information. private static final String[][] TEST_NODEPR = { + {BUG_ID + FS + "pkg1" + FS + "package-summary.html", "
" + NL + + "
Since:
" + NL + + "
JDK1.0
"}, {BUG_ID + FS + "pkg1" + FS + "C1.html", "
" + NL + "
Since:
" + NL + "
JDK1.0
" + NL + "
See Also:
" + @@ -302,6 +308,8 @@ public class TestHtmlDefinitionListTag extends JavadocTester { // Test for valid HTML generation which should not comprise of empty // definition list tags. private static final String[][] NEGATED_TEST = { + {BUG_ID + FS + "pkg1" + FS + "package-summary.html", "
"}, + {BUG_ID + FS + "pkg1" + FS + "package-summary.html", "
" + NL + "
"}, {BUG_ID + FS + "pkg1" + FS + "C1.html", "
"}, {BUG_ID + FS + "pkg1" + FS + "C1.html", "
" + NL + "
"}, {BUG_ID + FS + "pkg1" + FS + "C1.ModalExclusionType.html", "
"}, diff --git a/langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/pkg1/package-info.java b/langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/pkg1/package-info.java new file mode 100644 index 00000000000..201ea4b6199 --- /dev/null +++ b/langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/pkg1/package-info.java @@ -0,0 +1,29 @@ +/* + * Copyright 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 package 1. + * + * @since JDK1.0 + */ +package pkg1; From df65a88edb38fec4aee98467c9821c8068414a98 Mon Sep 17 00:00:00 2001 From: Xueming Shen Date: Fri, 20 Mar 2009 16:22:59 -0700 Subject: [PATCH 159/292] 6817475: named-capturing group name started with digit causes PSE exception Need accept the digit as the first char of the group name Reviewed-by: alanb --- jdk/src/share/classes/java/util/regex/Pattern.java | 3 ++- jdk/test/java/util/regex/RegExTest.java | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/jdk/src/share/classes/java/util/regex/Pattern.java b/jdk/src/share/classes/java/util/regex/Pattern.java index 919c1bf3c55..ccbf1140ea5 100644 --- a/jdk/src/share/classes/java/util/regex/Pattern.java +++ b/jdk/src/share/classes/java/util/regex/Pattern.java @@ -2567,7 +2567,8 @@ loop: for(int x=0, offset=0; xy+)z+"), + "xxxyyyzzz", + "8gname", + "yyy"); + //backref Pattern pattern = Pattern.compile("(a*)bc\\1"); check(pattern, "zzzaabcazzz", true); // found "abca" From c8da21faa95ef0d691b02934e91c3f749f90243a Mon Sep 17 00:00:00 2001 From: Coleen Phillimore Date: Fri, 20 Mar 2009 22:08:48 -0400 Subject: [PATCH 160/292] 6805748: Assertion "don't reset to 0 -- could be mistaken for never-executed" in CompilationPolicy Resetting the invocation counter for a method invocation event was setting count to zero for CompileThreshold=1, making it look like a never executed method. Reviewed-by: phh, kamg, acorn, never --- hotspot/src/share/vm/interpreter/invocationCounter.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/hotspot/src/share/vm/interpreter/invocationCounter.cpp b/hotspot/src/share/vm/interpreter/invocationCounter.cpp index cb650778556..7ecc70d1997 100644 --- a/hotspot/src/share/vm/interpreter/invocationCounter.cpp +++ b/hotspot/src/share/vm/interpreter/invocationCounter.cpp @@ -47,6 +47,8 @@ void InvocationCounter::set_carry() { // executed many more times before re-entering the VM. int old_count = count(); int new_count = MIN2(old_count, (int) (CompileThreshold / 2)); + // prevent from going to zero, to distinguish from never-executed methods + if (new_count == 0) new_count = 1; if (old_count != new_count) set(state(), new_count); } From cfb08c72ba7f1fc038e01334e8a57c670aef0ef7 Mon Sep 17 00:00:00 2001 From: John R Rose Date: Fri, 20 Mar 2009 23:19:36 -0700 Subject: [PATCH 161/292] 6814659: separable cleanups and subroutines for 6655638 Preparatory but separable changes for method handles Reviewed-by: kvn, never --- hotspot/src/cpu/sparc/vm/assembler_sparc.cpp | 34 +++---- hotspot/src/cpu/sparc/vm/assembler_sparc.hpp | 60 ++++++------ .../cpu/sparc/vm/assembler_sparc.inline.hpp | 42 ++++---- .../cpu/sparc/vm/c1_LIRAssembler_sparc.cpp | 8 +- hotspot/src/cpu/x86/vm/assembler_x86.cpp | 16 +-- hotspot/src/cpu/x86/vm/assembler_x86.hpp | 14 +-- hotspot/src/share/vm/asm/assembler.hpp | 20 ++-- .../src/share/vm/classfile/javaClasses.cpp | 98 ++++++++++++++++--- .../src/share/vm/classfile/javaClasses.hpp | 6 ++ .../share/vm/classfile/loaderConstraints.hpp | 8 +- .../src/share/vm/classfile/symbolTable.cpp | 45 +++++++-- .../src/share/vm/classfile/symbolTable.hpp | 15 ++- .../share/vm/classfile/systemDictionary.cpp | 54 +++++++++- .../share/vm/classfile/systemDictionary.hpp | 16 +++ .../parallelScavenge/parallelScavengeHeap.cpp | 3 +- hotspot/src/share/vm/oops/instanceKlass.cpp | 96 ++++++++++++++++-- hotspot/src/share/vm/oops/instanceKlass.hpp | 18 +++- .../src/share/vm/oops/instanceKlassKlass.cpp | 74 +++++++------- hotspot/src/share/vm/oops/klassVtable.cpp | 23 ++++- hotspot/src/share/vm/oops/klassVtable.hpp | 4 +- hotspot/src/share/vm/oops/methodKlass.cpp | 15 ++- hotspot/src/share/vm/oops/objArrayKlass.cpp | 19 +++- hotspot/src/share/vm/oops/oop.cpp | 8 +- hotspot/src/share/vm/prims/jvm.cpp | 59 ++++++++--- .../src/share/vm/runtime/fieldDescriptor.cpp | 14 +-- hotspot/src/share/vm/runtime/handles.hpp | 10 +- hotspot/src/share/vm/runtime/reflection.cpp | 21 +++- hotspot/src/share/vm/runtime/reflection.hpp | 10 +- .../src/share/vm/runtime/sharedRuntime.cpp | 42 -------- .../src/share/vm/runtime/sharedRuntime.hpp | 5 +- 30 files changed, 598 insertions(+), 259 deletions(-) diff --git a/hotspot/src/cpu/sparc/vm/assembler_sparc.cpp b/hotspot/src/cpu/sparc/vm/assembler_sparc.cpp index 4a61d2f2c5d..f95b12a3a12 100644 --- a/hotspot/src/cpu/sparc/vm/assembler_sparc.cpp +++ b/hotspot/src/cpu/sparc/vm/assembler_sparc.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -2615,12 +2615,12 @@ void MacroAssembler::cas_under_lock(Register top_ptr_reg, Register top_reg, Regi } } -RegisterConstant MacroAssembler::delayed_value(intptr_t* delayed_value_addr, - Register tmp, - int offset) { +RegisterOrConstant MacroAssembler::delayed_value_impl(intptr_t* delayed_value_addr, + Register tmp, + int offset) { intptr_t value = *delayed_value_addr; if (value != 0) - return RegisterConstant(value + offset); + return RegisterOrConstant(value + offset); // load indirectly to solve generation ordering problem Address a(tmp, (address) delayed_value_addr); @@ -2634,11 +2634,11 @@ RegisterConstant MacroAssembler::delayed_value(intptr_t* delayed_value_addr, if (offset != 0) add(tmp, offset, tmp); - return RegisterConstant(tmp); + return RegisterOrConstant(tmp); } -void MacroAssembler::regcon_inc_ptr( RegisterConstant& dest, RegisterConstant src, Register temp ) { +void MacroAssembler::regcon_inc_ptr( RegisterOrConstant& dest, RegisterOrConstant src, Register temp ) { assert(dest.register_or_noreg() != G0, "lost side effect"); if ((src.is_constant() && src.as_constant() == 0) || (src.is_register() && src.as_register() == G0)) { @@ -2647,15 +2647,15 @@ void MacroAssembler::regcon_inc_ptr( RegisterConstant& dest, RegisterConstant sr add(dest.as_register(), ensure_rs2(src, temp), dest.as_register()); } else if (src.is_constant()) { intptr_t res = dest.as_constant() + src.as_constant(); - dest = RegisterConstant(res); // side effect seen by caller + dest = RegisterOrConstant(res); // side effect seen by caller } else { assert(temp != noreg, "cannot handle constant += register"); add(src.as_register(), ensure_rs2(dest, temp), temp); - dest = RegisterConstant(temp); // side effect seen by caller + dest = RegisterOrConstant(temp); // side effect seen by caller } } -void MacroAssembler::regcon_sll_ptr( RegisterConstant& dest, RegisterConstant src, Register temp ) { +void MacroAssembler::regcon_sll_ptr( RegisterOrConstant& dest, RegisterOrConstant src, Register temp ) { assert(dest.register_or_noreg() != G0, "lost side effect"); if (!is_simm13(src.constant_or_zero())) src = (src.as_constant() & 0xFF); @@ -2666,12 +2666,12 @@ void MacroAssembler::regcon_sll_ptr( RegisterConstant& dest, RegisterConstant sr sll_ptr(dest.as_register(), src, dest.as_register()); } else if (src.is_constant()) { intptr_t res = dest.as_constant() << src.as_constant(); - dest = RegisterConstant(res); // side effect seen by caller + dest = RegisterOrConstant(res); // side effect seen by caller } else { assert(temp != noreg, "cannot handle constant <<= register"); set(dest.as_constant(), temp); sll_ptr(temp, src, temp); - dest = RegisterConstant(temp); // side effect seen by caller + dest = RegisterOrConstant(temp); // side effect seen by caller } } @@ -2683,7 +2683,7 @@ void MacroAssembler::regcon_sll_ptr( RegisterConstant& dest, RegisterConstant sr // On failure, execution transfers to the given label. void MacroAssembler::lookup_interface_method(Register recv_klass, Register intf_klass, - RegisterConstant itable_index, + RegisterOrConstant itable_index, Register method_result, Register scan_temp, Register sethi_temp, @@ -2720,7 +2720,7 @@ void MacroAssembler::lookup_interface_method(Register recv_klass, add(recv_klass, scan_temp, scan_temp); // Adjust recv_klass by scaled itable_index, so we can free itable_index. - RegisterConstant itable_offset = itable_index; + RegisterOrConstant itable_offset = itable_index; regcon_sll_ptr(itable_offset, exact_log2(itableMethodEntry::size() * wordSize)); regcon_inc_ptr(itable_offset, itableMethodEntry::method_offset_in_bytes()); add(recv_klass, ensure_rs2(itable_offset, sethi_temp), recv_klass); @@ -2805,7 +2805,7 @@ void MacroAssembler::check_klass_subtype_fast_path(Register sub_klass, Label* L_success, Label* L_failure, Label* L_slow_path, - RegisterConstant super_check_offset, + RegisterOrConstant super_check_offset, Register instanceof_hack) { int sc_offset = (klassOopDesc::header_size() * HeapWordSize + Klass::secondary_super_cache_offset_in_bytes()); @@ -2867,7 +2867,7 @@ void MacroAssembler::check_klass_subtype_fast_path(Register sub_klass, if (must_load_sco) { // The super check offset is always positive... lduw(super_klass, sco_offset, temp2_reg); - super_check_offset = RegisterConstant(temp2_reg); + super_check_offset = RegisterOrConstant(temp2_reg); } ld_ptr(sub_klass, super_check_offset, temp_reg); cmp(super_klass, temp_reg); @@ -4472,7 +4472,7 @@ void MacroAssembler::card_write_barrier_post(Register store_addr, Register new_v } // Loading values by size and signed-ness -void MacroAssembler::load_sized_value(Register s1, RegisterConstant s2, Register d, +void MacroAssembler::load_sized_value(Register s1, RegisterOrConstant s2, Register d, int size_in_bytes, bool is_signed) { switch (size_in_bytes ^ (is_signed ? -1 : 0)) { case ~8: // fall through: diff --git a/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp b/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp index fc05cef68a4..5c756c4b6b1 100644 --- a/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp +++ b/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -1088,8 +1088,8 @@ public: inline void add( Register s1, Register s2, Register d ); inline void add( Register s1, int simm13a, Register d, relocInfo::relocType rtype = relocInfo::none); inline void add( Register s1, int simm13a, Register d, RelocationHolder const& rspec); - inline void add( Register s1, RegisterConstant s2, Register d, int offset = 0); - inline void add( const Address& a, Register d, int offset = 0); + inline void add( Register s1, RegisterOrConstant s2, Register d, int offset = 0); + inline void add( const Address& a, Register d, int offset = 0); void addcc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(add_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); } void addcc( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(add_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); } @@ -1305,15 +1305,15 @@ public: inline void ld( const Address& a, Register d, int offset = 0 ); inline void ldd( const Address& a, Register d, int offset = 0 ); - inline void ldub( Register s1, RegisterConstant s2, Register d ); - inline void ldsb( Register s1, RegisterConstant s2, Register d ); - inline void lduh( Register s1, RegisterConstant s2, Register d ); - inline void ldsh( Register s1, RegisterConstant s2, Register d ); - inline void lduw( Register s1, RegisterConstant s2, Register d ); - inline void ldsw( Register s1, RegisterConstant s2, Register d ); - inline void ldx( Register s1, RegisterConstant s2, Register d ); - inline void ld( Register s1, RegisterConstant s2, Register d ); - inline void ldd( Register s1, RegisterConstant s2, Register d ); + inline void ldub( Register s1, RegisterOrConstant s2, Register d ); + inline void ldsb( Register s1, RegisterOrConstant s2, Register d ); + inline void lduh( Register s1, RegisterOrConstant s2, Register d ); + inline void ldsh( Register s1, RegisterOrConstant s2, Register d ); + inline void lduw( Register s1, RegisterOrConstant s2, Register d ); + inline void ldsw( Register s1, RegisterOrConstant s2, Register d ); + inline void ldx( Register s1, RegisterOrConstant s2, Register d ); + inline void ld( Register s1, RegisterOrConstant s2, Register d ); + inline void ldd( Register s1, RegisterOrConstant s2, Register d ); // pp 177 @@ -1535,12 +1535,12 @@ public: inline void st( Register d, const Address& a, int offset = 0 ); inline void std( Register d, const Address& a, int offset = 0 ); - inline void stb( Register d, Register s1, RegisterConstant s2 ); - inline void sth( Register d, Register s1, RegisterConstant s2 ); - inline void stw( Register d, Register s1, RegisterConstant s2 ); - inline void stx( Register d, Register s1, RegisterConstant s2 ); - inline void std( Register d, Register s1, RegisterConstant s2 ); - inline void st( Register d, Register s1, RegisterConstant s2 ); + inline void stb( Register d, Register s1, RegisterOrConstant s2 ); + inline void sth( Register d, Register s1, RegisterOrConstant s2 ); + inline void stw( Register d, Register s1, RegisterOrConstant s2 ); + inline void stx( Register d, Register s1, RegisterOrConstant s2 ); + inline void std( Register d, Register s1, RegisterOrConstant s2 ); + inline void st( Register d, Register s1, RegisterOrConstant s2 ); // pp 177 @@ -1859,7 +1859,7 @@ class MacroAssembler: public Assembler { // Functions for isolating 64 bit shifts for LP64 inline void sll_ptr( Register s1, Register s2, Register d ); inline void sll_ptr( Register s1, int imm6a, Register d ); - inline void sll_ptr( Register s1, RegisterConstant s2, Register d ); + inline void sll_ptr( Register s1, RegisterOrConstant s2, Register d ); inline void srl_ptr( Register s1, Register s2, Register d ); inline void srl_ptr( Register s1, int imm6a, Register d ); @@ -1965,26 +1965,26 @@ class MacroAssembler: public Assembler { // st_ptr will perform st for 32 bit VM's and stx for 64 bit VM's inline void ld_ptr( Register s1, Register s2, Register d ); inline void ld_ptr( Register s1, int simm13a, Register d); - inline void ld_ptr( Register s1, RegisterConstant s2, Register d ); + inline void ld_ptr( Register s1, RegisterOrConstant s2, Register d ); inline void ld_ptr( const Address& a, Register d, int offset = 0 ); inline void st_ptr( Register d, Register s1, Register s2 ); inline void st_ptr( Register d, Register s1, int simm13a); - inline void st_ptr( Register d, Register s1, RegisterConstant s2 ); + inline void st_ptr( Register d, Register s1, RegisterOrConstant s2 ); inline void st_ptr( Register d, const Address& a, int offset = 0 ); // ld_long will perform ld for 32 bit VM's and ldx for 64 bit VM's // st_long will perform st for 32 bit VM's and stx for 64 bit VM's inline void ld_long( Register s1, Register s2, Register d ); inline void ld_long( Register s1, int simm13a, Register d ); - inline void ld_long( Register s1, RegisterConstant s2, Register d ); + inline void ld_long( Register s1, RegisterOrConstant s2, Register d ); inline void ld_long( const Address& a, Register d, int offset = 0 ); inline void st_long( Register d, Register s1, Register s2 ); inline void st_long( Register d, Register s1, int simm13a ); - inline void st_long( Register d, Register s1, RegisterConstant s2 ); + inline void st_long( Register d, Register s1, RegisterOrConstant s2 ); inline void st_long( Register d, const Address& a, int offset = 0 ); // Loading values by size and signed-ness - void load_sized_value(Register s1, RegisterConstant s2, Register d, + void load_sized_value(Register s1, RegisterOrConstant s2, Register d, int size_in_bytes, bool is_signed); // Helpers for address formation. @@ -1994,11 +1994,11 @@ class MacroAssembler: public Assembler { // is required, and becomes the result. // If dest is a register and src is a non-simm13 constant, // the temp argument is required, and is used to materialize the constant. - void regcon_inc_ptr( RegisterConstant& dest, RegisterConstant src, + void regcon_inc_ptr( RegisterOrConstant& dest, RegisterOrConstant src, Register temp = noreg ); - void regcon_sll_ptr( RegisterConstant& dest, RegisterConstant src, + void regcon_sll_ptr( RegisterOrConstant& dest, RegisterOrConstant src, Register temp = noreg ); - RegisterConstant ensure_rs2(RegisterConstant rs2, Register sethi_temp) { + RegisterOrConstant ensure_rs2(RegisterOrConstant rs2, Register sethi_temp) { guarantee(sethi_temp != noreg, "constant offset overflow"); if (is_simm13(rs2.constant_or_zero())) return rs2; // register or short constant @@ -2322,7 +2322,7 @@ class MacroAssembler: public Assembler { // interface method calling void lookup_interface_method(Register recv_klass, Register intf_klass, - RegisterConstant itable_index, + RegisterOrConstant itable_index, Register method_result, Register temp_reg, Register temp2_reg, Label& no_such_interface); @@ -2341,7 +2341,7 @@ class MacroAssembler: public Assembler { Label* L_success, Label* L_failure, Label* L_slow_path, - RegisterConstant super_check_offset = RegisterConstant(-1), + RegisterOrConstant super_check_offset = RegisterOrConstant(-1), Register instanceof_hack = noreg); // The rest of the type check; must be wired to a corresponding fast path. @@ -2381,7 +2381,7 @@ class MacroAssembler: public Assembler { // stack overflow + shadow pages. Clobbers tsp and scratch registers. void bang_stack_size(Register Rsize, Register Rtsp, Register Rscratch); - virtual RegisterConstant delayed_value(intptr_t* delayed_value_addr, Register tmp, int offset); + virtual RegisterOrConstant delayed_value_impl(intptr_t* delayed_value_addr, Register tmp, int offset); void verify_tlab(); diff --git a/hotspot/src/cpu/sparc/vm/assembler_sparc.inline.hpp b/hotspot/src/cpu/sparc/vm/assembler_sparc.inline.hpp index d31ab55f3f4..d9053f7f6b7 100644 --- a/hotspot/src/cpu/sparc/vm/assembler_sparc.inline.hpp +++ b/hotspot/src/cpu/sparc/vm/assembler_sparc.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -143,45 +143,45 @@ inline void Assembler::ld( Register s1, Register s2, Register d) { lduw( s1, s2 inline void Assembler::ld( Register s1, int simm13a, Register d) { lduw( s1, simm13a, d); } #endif -inline void Assembler::ldub( Register s1, RegisterConstant s2, Register d) { +inline void Assembler::ldub( Register s1, RegisterOrConstant s2, Register d) { if (s2.is_register()) ldsb(s1, s2.as_register(), d); else ldsb(s1, s2.as_constant(), d); } -inline void Assembler::ldsb( Register s1, RegisterConstant s2, Register d) { +inline void Assembler::ldsb( Register s1, RegisterOrConstant s2, Register d) { if (s2.is_register()) ldsb(s1, s2.as_register(), d); else ldsb(s1, s2.as_constant(), d); } -inline void Assembler::lduh( Register s1, RegisterConstant s2, Register d) { +inline void Assembler::lduh( Register s1, RegisterOrConstant s2, Register d) { if (s2.is_register()) ldsh(s1, s2.as_register(), d); else ldsh(s1, s2.as_constant(), d); } -inline void Assembler::ldsh( Register s1, RegisterConstant s2, Register d) { +inline void Assembler::ldsh( Register s1, RegisterOrConstant s2, Register d) { if (s2.is_register()) ldsh(s1, s2.as_register(), d); else ldsh(s1, s2.as_constant(), d); } -inline void Assembler::lduw( Register s1, RegisterConstant s2, Register d) { +inline void Assembler::lduw( Register s1, RegisterOrConstant s2, Register d) { if (s2.is_register()) ldsw(s1, s2.as_register(), d); else ldsw(s1, s2.as_constant(), d); } -inline void Assembler::ldsw( Register s1, RegisterConstant s2, Register d) { +inline void Assembler::ldsw( Register s1, RegisterOrConstant s2, Register d) { if (s2.is_register()) ldsw(s1, s2.as_register(), d); else ldsw(s1, s2.as_constant(), d); } -inline void Assembler::ldx( Register s1, RegisterConstant s2, Register d) { +inline void Assembler::ldx( Register s1, RegisterOrConstant s2, Register d) { if (s2.is_register()) ldx(s1, s2.as_register(), d); else ldx(s1, s2.as_constant(), d); } -inline void Assembler::ld( Register s1, RegisterConstant s2, Register d) { +inline void Assembler::ld( Register s1, RegisterOrConstant s2, Register d) { if (s2.is_register()) ld(s1, s2.as_register(), d); else ld(s1, s2.as_constant(), d); } -inline void Assembler::ldd( Register s1, RegisterConstant s2, Register d) { +inline void Assembler::ldd( Register s1, RegisterOrConstant s2, Register d) { if (s2.is_register()) ldd(s1, s2.as_register(), d); else ldd(s1, s2.as_constant(), d); } // form effective addresses this way: -inline void Assembler::add( Register s1, RegisterConstant s2, Register d, int offset) { +inline void Assembler::add( Register s1, RegisterOrConstant s2, Register d, int offset) { if (s2.is_register()) add(s1, s2.as_register(), d); else { add(s1, s2.as_constant() + offset, d); offset = 0; } if (offset != 0) add(d, offset, d); @@ -243,23 +243,23 @@ inline void Assembler::std( Register d, Register s1, int simm13a) { v9_dep(); a inline void Assembler::st( Register d, Register s1, Register s2) { stw(d, s1, s2); } inline void Assembler::st( Register d, Register s1, int simm13a) { stw(d, s1, simm13a); } -inline void Assembler::stb( Register d, Register s1, RegisterConstant s2) { +inline void Assembler::stb( Register d, Register s1, RegisterOrConstant s2) { if (s2.is_register()) stb(d, s1, s2.as_register()); else stb(d, s1, s2.as_constant()); } -inline void Assembler::sth( Register d, Register s1, RegisterConstant s2) { +inline void Assembler::sth( Register d, Register s1, RegisterOrConstant s2) { if (s2.is_register()) sth(d, s1, s2.as_register()); else sth(d, s1, s2.as_constant()); } -inline void Assembler::stx( Register d, Register s1, RegisterConstant s2) { +inline void Assembler::stx( Register d, Register s1, RegisterOrConstant s2) { if (s2.is_register()) stx(d, s1, s2.as_register()); else stx(d, s1, s2.as_constant()); } -inline void Assembler::std( Register d, Register s1, RegisterConstant s2) { +inline void Assembler::std( Register d, Register s1, RegisterOrConstant s2) { if (s2.is_register()) std(d, s1, s2.as_register()); else std(d, s1, s2.as_constant()); } -inline void Assembler::st( Register d, Register s1, RegisterConstant s2) { +inline void Assembler::st( Register d, Register s1, RegisterOrConstant s2) { if (s2.is_register()) st(d, s1, s2.as_register()); else st(d, s1, s2.as_constant()); } @@ -308,7 +308,7 @@ inline void MacroAssembler::ld_ptr( Register s1, int simm13a, Register d ) { #endif } -inline void MacroAssembler::ld_ptr( Register s1, RegisterConstant s2, Register d ) { +inline void MacroAssembler::ld_ptr( Register s1, RegisterOrConstant s2, Register d ) { #ifdef _LP64 Assembler::ldx( s1, s2, d); #else @@ -340,7 +340,7 @@ inline void MacroAssembler::st_ptr( Register d, Register s1, int simm13a ) { #endif } -inline void MacroAssembler::st_ptr( Register d, Register s1, RegisterConstant s2 ) { +inline void MacroAssembler::st_ptr( Register d, Register s1, RegisterOrConstant s2 ) { #ifdef _LP64 Assembler::stx( d, s1, s2); #else @@ -373,7 +373,7 @@ inline void MacroAssembler::ld_long( Register s1, int simm13a, Register d ) { #endif } -inline void MacroAssembler::ld_long( Register s1, RegisterConstant s2, Register d ) { +inline void MacroAssembler::ld_long( Register s1, RegisterOrConstant s2, Register d ) { #ifdef _LP64 Assembler::ldx(s1, s2, d); #else @@ -405,7 +405,7 @@ inline void MacroAssembler::st_long( Register d, Register s1, int simm13a ) { #endif } -inline void MacroAssembler::st_long( Register d, Register s1, RegisterConstant s2 ) { +inline void MacroAssembler::st_long( Register d, Register s1, RegisterOrConstant s2 ) { #ifdef _LP64 Assembler::stx(d, s1, s2); #else @@ -455,7 +455,7 @@ inline void MacroAssembler::srl_ptr( Register s1, int imm6a, Register d ) { #endif } -inline void MacroAssembler::sll_ptr( Register s1, RegisterConstant s2, Register d ) { +inline void MacroAssembler::sll_ptr( Register s1, RegisterOrConstant s2, Register d ) { if (s2.is_register()) sll_ptr(s1, s2.as_register(), d); else sll_ptr(s1, s2.as_constant(), d); } diff --git a/hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp b/hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp index 389acd2ee26..1e8c190c0bf 100644 --- a/hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp +++ b/hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-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 @@ -2489,7 +2489,7 @@ void LIR_Assembler::emit_opTypeCheck(LIR_OpTypeCheck* op) { __ check_klass_subtype_fast_path(klass_RInfo, k_RInfo, Rtmp1, noreg, (need_slow_path ? &done : NULL), stub->entry(), NULL, - RegisterConstant(k->super_check_offset())); + RegisterOrConstant(k->super_check_offset())); } else { // perform the fast part of the checking logic __ check_klass_subtype_fast_path(klass_RInfo, k_RInfo, Rtmp1, O7, @@ -2550,14 +2550,14 @@ void LIR_Assembler::emit_opTypeCheck(LIR_OpTypeCheck* op) { __ check_klass_subtype_fast_path(klass_RInfo, k_RInfo, O7, noreg, (need_slow_path ? &done : NULL), (need_slow_path ? &done : NULL), NULL, - RegisterConstant(k->super_check_offset()), + RegisterOrConstant(k->super_check_offset()), dst); } else { assert(dst != klass_RInfo && dst != k_RInfo, "need 3 registers"); // perform the fast part of the checking logic __ check_klass_subtype_fast_path(klass_RInfo, k_RInfo, O7, dst, &done, &done, NULL, - RegisterConstant(-1), + RegisterOrConstant(-1), dst); } if (need_slow_path) { diff --git a/hotspot/src/cpu/x86/vm/assembler_x86.cpp b/hotspot/src/cpu/x86/vm/assembler_x86.cpp index b043c9d3506..351ae044728 100644 --- a/hotspot/src/cpu/x86/vm/assembler_x86.cpp +++ b/hotspot/src/cpu/x86/vm/assembler_x86.cpp @@ -7218,7 +7218,7 @@ void MacroAssembler::trigfunc(char trig, int num_fpu_regs_in_use) { // On failure, execution transfers to the given label. void MacroAssembler::lookup_interface_method(Register recv_klass, Register intf_klass, - RegisterConstant itable_index, + RegisterOrConstant itable_index, Register method_result, Register scan_temp, Label& L_no_such_interface) { @@ -7303,7 +7303,7 @@ void MacroAssembler::check_klass_subtype_fast_path(Register sub_klass, Label* L_success, Label* L_failure, Label* L_slow_path, - RegisterConstant super_check_offset) { + RegisterOrConstant super_check_offset) { assert_different_registers(sub_klass, super_klass, temp_reg); bool must_load_sco = (super_check_offset.constant_or_zero() == -1); if (super_check_offset.is_register()) { @@ -7352,7 +7352,7 @@ void MacroAssembler::check_klass_subtype_fast_path(Register sub_klass, if (must_load_sco) { // Positive movl does right thing on LP64. movl(temp_reg, super_check_offset_addr); - super_check_offset = RegisterConstant(temp_reg); + super_check_offset = RegisterOrConstant(temp_reg); } Address super_check_addr(sub_klass, super_check_offset, Address::times_1, 0); cmpptr(super_klass, super_check_addr); // load displayed supertype @@ -7550,12 +7550,12 @@ void MacroAssembler::verify_oop(Register reg, const char* s) { } -RegisterConstant MacroAssembler::delayed_value(intptr_t* delayed_value_addr, - Register tmp, - int offset) { +RegisterOrConstant MacroAssembler::delayed_value_impl(intptr_t* delayed_value_addr, + Register tmp, + int offset) { intptr_t value = *delayed_value_addr; if (value != 0) - return RegisterConstant(value + offset); + return RegisterOrConstant(value + offset); // load indirectly to solve generation ordering problem movptr(tmp, ExternalAddress((address) delayed_value_addr)); @@ -7571,7 +7571,7 @@ RegisterConstant MacroAssembler::delayed_value(intptr_t* delayed_value_addr, if (offset != 0) addptr(tmp, offset); - return RegisterConstant(tmp); + return RegisterOrConstant(tmp); } diff --git a/hotspot/src/cpu/x86/vm/assembler_x86.hpp b/hotspot/src/cpu/x86/vm/assembler_x86.hpp index 9b54b800ba1..4dfe7fec22e 100644 --- a/hotspot/src/cpu/x86/vm/assembler_x86.hpp +++ b/hotspot/src/cpu/x86/vm/assembler_x86.hpp @@ -212,7 +212,7 @@ class Address VALUE_OBJ_CLASS_SPEC { "inconsistent address"); } - Address(Register base, RegisterConstant index, ScaleFactor scale = times_1, int disp = 0) + Address(Register base, RegisterOrConstant index, ScaleFactor scale = times_1, int disp = 0) : _base (base), _index(index.register_or_noreg()), _scale(scale), @@ -256,7 +256,7 @@ class Address VALUE_OBJ_CLASS_SPEC { "inconsistent address"); } - Address(Register base, RegisterConstant index, ScaleFactor scale, ByteSize disp) + Address(Register base, RegisterOrConstant index, ScaleFactor scale, ByteSize disp) : _base (base), _index(index.register_or_noreg()), _scale(scale), @@ -1802,7 +1802,7 @@ class MacroAssembler: public Assembler { // interface method calling void lookup_interface_method(Register recv_klass, Register intf_klass, - RegisterConstant itable_index, + RegisterOrConstant itable_index, Register method_result, Register scan_temp, Label& no_such_interface); @@ -1819,7 +1819,7 @@ class MacroAssembler: public Assembler { Label* L_success, Label* L_failure, Label* L_slow_path, - RegisterConstant super_check_offset = RegisterConstant(-1)); + RegisterOrConstant super_check_offset = RegisterOrConstant(-1)); // The rest of the type check; must be wired to a corresponding fast path. // It does not repeat the fast path logic, so don't use it standalone. @@ -1883,9 +1883,9 @@ class MacroAssembler: public Assembler { // stack overflow + shadow pages. Also, clobbers tmp void bang_stack_size(Register size, Register tmp); - virtual RegisterConstant delayed_value(intptr_t* delayed_value_addr, - Register tmp, - int offset); + virtual RegisterOrConstant delayed_value_impl(intptr_t* delayed_value_addr, + Register tmp, + int offset); // Support for serializing memory accesses between threads void serialize_memory(Register thread, Register tmp); diff --git a/hotspot/src/share/vm/asm/assembler.hpp b/hotspot/src/share/vm/asm/assembler.hpp index 13a4c6dfad6..8027e4e1322 100644 --- a/hotspot/src/share/vm/asm/assembler.hpp +++ b/hotspot/src/share/vm/asm/assembler.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -143,15 +143,15 @@ class Label VALUE_OBJ_CLASS_SPEC { // A union type for code which has to assemble both constant and // non-constant operands, when the distinction cannot be made // statically. -class RegisterConstant VALUE_OBJ_CLASS_SPEC { +class RegisterOrConstant VALUE_OBJ_CLASS_SPEC { private: Register _r; intptr_t _c; public: - RegisterConstant(): _r(noreg), _c(0) {} - RegisterConstant(Register r): _r(r), _c(0) {} - RegisterConstant(intptr_t c): _r(noreg), _c(c) {} + RegisterOrConstant(): _r(noreg), _c(0) {} + RegisterOrConstant(Register r): _r(r), _c(0) {} + RegisterOrConstant(intptr_t c): _r(noreg), _c(c) {} Register as_register() const { assert(is_register(),""); return _r; } intptr_t as_constant() const { assert(is_constant(),""); return _c; } @@ -310,13 +310,13 @@ class AbstractAssembler : public ResourceObj { // offsets in code which must be generated before the object class is loaded. // Field offsets are never zero, since an object's header (mark word) // is located at offset zero. - RegisterConstant delayed_value(int(*value_fn)(), Register tmp, int offset = 0) { - return delayed_value(delayed_value_addr(value_fn), tmp, offset); + RegisterOrConstant delayed_value(int(*value_fn)(), Register tmp, int offset = 0) { + return delayed_value_impl(delayed_value_addr(value_fn), tmp, offset); } - RegisterConstant delayed_value(address(*value_fn)(), Register tmp, int offset = 0) { - return delayed_value(delayed_value_addr(value_fn), tmp, offset); + RegisterOrConstant delayed_value(address(*value_fn)(), Register tmp, int offset = 0) { + return delayed_value_impl(delayed_value_addr(value_fn), tmp, offset); } - virtual RegisterConstant delayed_value(intptr_t* delayed_value_addr, Register tmp, int offset) = 0; + virtual RegisterOrConstant delayed_value_impl(intptr_t* delayed_value_addr, Register tmp, int offset) = 0; // Last overloading is platform-dependent; look in assembler_.cpp. static intptr_t* delayed_value_addr(int(*constant_fn)()); static intptr_t* delayed_value_addr(address(*constant_fn)()); diff --git a/hotspot/src/share/vm/classfile/javaClasses.cpp b/hotspot/src/share/vm/classfile/javaClasses.cpp index 4b8b9892b6c..cb6b41f3bb9 100644 --- a/hotspot/src/share/vm/classfile/javaClasses.cpp +++ b/hotspot/src/share/vm/classfile/javaClasses.cpp @@ -239,22 +239,20 @@ symbolHandle java_lang_String::as_symbol(Handle java_string, TRAPS) { typeArrayOop value = java_lang_String::value(obj); int offset = java_lang_String::offset(obj); int length = java_lang_String::length(obj); - - ResourceMark rm(THREAD); - symbolHandle result; - - if (length > 0) { - int utf8_length = UNICODE::utf8_length(value->char_at_addr(offset), length); - char* chars = NEW_RESOURCE_ARRAY(char, utf8_length + 1); - UNICODE::convert_to_utf8(value->char_at_addr(offset), length, chars); - // Allocate the symbol - result = oopFactory::new_symbol_handle(chars, utf8_length, CHECK_(symbolHandle())); - } else { - result = oopFactory::new_symbol_handle("", 0, CHECK_(symbolHandle())); - } - return result; + jchar* base = value->char_at_addr(offset); + symbolOop sym = SymbolTable::lookup_unicode(base, length, THREAD); + return symbolHandle(THREAD, sym); } +symbolOop java_lang_String::as_symbol_or_null(oop java_string) { + typeArrayOop value = java_lang_String::value(java_string); + int offset = java_lang_String::offset(java_string); + int length = java_lang_String::length(java_string); + jchar* base = value->char_at_addr(offset); + return SymbolTable::probe_unicode(base, length); +} + + int java_lang_String::utf8_length(oop java_string) { typeArrayOop value = java_lang_String::value(java_string); int offset = java_lang_String::offset(java_string); @@ -385,6 +383,48 @@ klassOop java_lang_Class::as_klassOop(oop java_class) { } +void java_lang_Class::print_signature(oop java_class, outputStream* st) { + assert(java_lang_Class::is_instance(java_class), "must be a Class object"); + symbolOop name = NULL; + bool is_instance = false; + if (is_primitive(java_class)) { + name = vmSymbols::type_signature(primitive_type(java_class)); + } else { + klassOop k = as_klassOop(java_class); + is_instance = Klass::cast(k)->oop_is_instance(); + name = Klass::cast(k)->name(); + } + if (name == NULL) { + st->print(""); + return; + } + if (is_instance) st->print("L"); + st->write((char*) name->base(), (int) name->utf8_length()); + if (is_instance) st->print(";"); +} + +symbolOop java_lang_Class::as_signature(oop java_class, bool intern_if_not_found, TRAPS) { + assert(java_lang_Class::is_instance(java_class), "must be a Class object"); + symbolOop name = NULL; + if (is_primitive(java_class)) { + return vmSymbols::type_signature(primitive_type(java_class)); + } else { + klassOop k = as_klassOop(java_class); + if (!Klass::cast(k)->oop_is_instance()) { + return Klass::cast(k)->name(); + } else { + ResourceMark rm; + const char* sigstr = Klass::cast(k)->signature_name(); + int siglen = (int) strlen(sigstr); + if (!intern_if_not_found) + return SymbolTable::probe(sigstr, siglen); + else + return oopFactory::new_symbol(sigstr, siglen, THREAD); + } + } +} + + klassOop java_lang_Class::array_klass(oop java_class) { klassOop k = klassOop(java_class->obj_field(array_klass_offset)); assert(k == NULL || k->is_klass() && Klass::cast(k)->oop_is_javaArray(), "should be array klass"); @@ -412,6 +452,8 @@ void java_lang_Class::set_resolved_constructor(oop java_class, methodOop constru bool java_lang_Class::is_primitive(oop java_class) { + // should assert: + //assert(java_lang_Class::is_instance(java_class), "must be a Class object"); klassOop k = klassOop(java_class->obj_field(klass_offset)); return k == NULL; } @@ -431,6 +473,19 @@ BasicType java_lang_Class::primitive_type(oop java_class) { return type; } +BasicType java_lang_Class::as_BasicType(oop java_class, klassOop* reference_klass) { + assert(java_lang_Class::is_instance(java_class), "must be a Class object"); + if (is_primitive(java_class)) { + if (reference_klass != NULL) + (*reference_klass) = NULL; + return primitive_type(java_class); + } else { + if (reference_klass != NULL) + (*reference_klass) = as_klassOop(java_class); + return T_OBJECT; + } +} + oop java_lang_Class::primitive_mirror(BasicType t) { oop mirror = Universe::java_mirror(t); @@ -1988,6 +2043,21 @@ BasicType java_lang_boxing_object::set_value(oop box, jvalue* value) { } +void java_lang_boxing_object::print(BasicType type, jvalue* value, outputStream* st) { + switch (type) { + case T_BOOLEAN: st->print("%s", value->z ? "true" : "false"); break; + case T_CHAR: st->print("%d", value->c); break; + case T_BYTE: st->print("%d", value->b); break; + case T_SHORT: st->print("%d", value->s); break; + case T_INT: st->print("%d", value->i); break; + case T_LONG: st->print(INT64_FORMAT, value->j); break; + case T_FLOAT: st->print("%f", value->f); break; + case T_DOUBLE: st->print("%lf", value->d); break; + default: st->print("type %d?", type); break; + } +} + + // Support for java_lang_ref_Reference oop java_lang_ref_Reference::pending_list_lock() { instanceKlass* ik = instanceKlass::cast(SystemDictionary::reference_klass()); diff --git a/hotspot/src/share/vm/classfile/javaClasses.hpp b/hotspot/src/share/vm/classfile/javaClasses.hpp index 64b0d4768f9..3ae5b5337f8 100644 --- a/hotspot/src/share/vm/classfile/javaClasses.hpp +++ b/hotspot/src/share/vm/classfile/javaClasses.hpp @@ -107,6 +107,7 @@ class java_lang_String : AllStatic { // Conversion static symbolHandle as_symbol(Handle java_string, TRAPS); + static symbolOop as_symbol_or_null(oop java_string); // Testers static bool is_instance(oop obj) { @@ -149,6 +150,9 @@ class java_lang_Class : AllStatic { static oop create_basic_type_mirror(const char* basic_type_name, BasicType type, TRAPS); // Conversion static klassOop as_klassOop(oop java_class); + static BasicType as_BasicType(oop java_class, klassOop* reference_klass = NULL); + static symbolOop as_signature(oop java_class, bool intern_if_not_found, TRAPS); + static void print_signature(oop java_class, outputStream *st); // Testing static bool is_instance(oop obj) { return obj != NULL && obj->klass() == SystemDictionary::class_klass(); @@ -668,6 +672,8 @@ class java_lang_boxing_object: AllStatic { static BasicType basic_type(oop box); static bool is_instance(oop box) { return basic_type(box) != T_ILLEGAL; } static bool is_instance(oop box, BasicType type) { return basic_type(box) == type; } + static void print(oop box, outputStream* st) { jvalue value; print(get_value(box, &value), &value, st); } + static void print(BasicType type, jvalue* value, outputStream* st); static int value_offset_in_bytes(BasicType type) { return ( type == T_LONG || type == T_DOUBLE ) ? long_value_offset : diff --git a/hotspot/src/share/vm/classfile/loaderConstraints.hpp b/hotspot/src/share/vm/classfile/loaderConstraints.hpp index 9d1a6880a89..6928180d22a 100644 --- a/hotspot/src/share/vm/classfile/loaderConstraints.hpp +++ b/hotspot/src/share/vm/classfile/loaderConstraints.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-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 @@ -60,8 +60,10 @@ public: bool add_entry(symbolHandle name, klassOop klass1, Handle loader1, klassOop klass2, Handle loader2); - void check_signature_loaders(symbolHandle signature, Handle loader1, - Handle loader2, bool is_method, TRAPS); + // Note: The main entry point for this module is via SystemDictionary. + // SystemDictionary::check_signature_loaders(symbolHandle signature, + // Handle loader1, Handle loader2, + // bool is_method, TRAPS) klassOop find_constrained_klass(symbolHandle name, Handle loader); klassOop find_constrained_elem_klass(symbolHandle name, symbolHandle elem_name, diff --git a/hotspot/src/share/vm/classfile/symbolTable.cpp b/hotspot/src/share/vm/classfile/symbolTable.cpp index b77db6bd952..076e29e3009 100644 --- a/hotspot/src/share/vm/classfile/symbolTable.cpp +++ b/hotspot/src/share/vm/classfile/symbolTable.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -109,6 +109,40 @@ symbolOop SymbolTable::lookup_only(const char* name, int len, return the_table()->lookup(index, name, len, hash); } +// Suggestion: Push unicode-based lookup all the way into the hashing +// and probing logic, so there is no need for convert_to_utf8 until +// an actual new symbolOop is created. +symbolOop SymbolTable::lookup_unicode(const jchar* name, int utf16_length, TRAPS) { + int utf8_length = UNICODE::utf8_length((jchar*) name, utf16_length); + char stack_buf[128]; + if (utf8_length < (int) sizeof(stack_buf)) { + char* chars = stack_buf; + UNICODE::convert_to_utf8(name, utf16_length, chars); + return lookup(chars, utf8_length, THREAD); + } else { + ResourceMark rm(THREAD); + char* chars = NEW_RESOURCE_ARRAY(char, utf8_length + 1);; + UNICODE::convert_to_utf8(name, utf16_length, chars); + return lookup(chars, utf8_length, THREAD); + } +} + +symbolOop SymbolTable::lookup_only_unicode(const jchar* name, int utf16_length, + unsigned int& hash) { + int utf8_length = UNICODE::utf8_length((jchar*) name, utf16_length); + char stack_buf[128]; + if (utf8_length < (int) sizeof(stack_buf)) { + char* chars = stack_buf; + UNICODE::convert_to_utf8(name, utf16_length, chars); + return lookup_only(chars, utf8_length, hash); + } else { + ResourceMark rm; + char* chars = NEW_RESOURCE_ARRAY(char, utf8_length + 1);; + UNICODE::convert_to_utf8(name, utf16_length, chars); + return lookup_only(chars, utf8_length, hash); + } +} + void SymbolTable::add(constantPoolHandle cp, int names_count, const char** names, int* lengths, int* cp_indices, unsigned int* hashValues, TRAPS) { @@ -126,15 +160,6 @@ void SymbolTable::add(constantPoolHandle cp, int names_count, } } -// Needed for preloading classes in signatures when compiling. - -symbolOop SymbolTable::probe(const char* name, int len) { - unsigned int hashValue = hash_symbol(name, len); - int index = the_table()->hash_to_index(hashValue); - return the_table()->lookup(index, name, len, hashValue); -} - - symbolOop SymbolTable::basic_add(int index, u1 *name, int len, unsigned int hashValue, TRAPS) { assert(!Universe::heap()->is_in_reserved(name) || GC_locker::is_active(), diff --git a/hotspot/src/share/vm/classfile/symbolTable.hpp b/hotspot/src/share/vm/classfile/symbolTable.hpp index 828512780bf..bb0f67d1cdd 100644 --- a/hotspot/src/share/vm/classfile/symbolTable.hpp +++ b/hotspot/src/share/vm/classfile/symbolTable.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -91,6 +91,10 @@ public: // Only copy to C string to be added if lookup failed. static symbolOop lookup(symbolHandle sym, int begin, int end, TRAPS); + // jchar (utf16) version of lookups + static symbolOop lookup_unicode(const jchar* name, int len, TRAPS); + static symbolOop lookup_only_unicode(const jchar* name, int len, unsigned int& hash); + static void add(constantPoolHandle cp, int names_count, const char** names, int* lengths, int* cp_indices, unsigned int* hashValues, TRAPS); @@ -112,7 +116,14 @@ public: // Needed for preloading classes in signatures when compiling. // Returns the symbol is already present in symbol table, otherwise // NULL. NO ALLOCATION IS GUARANTEED! - static symbolOop probe(const char* name, int len); + static symbolOop probe(const char* name, int len) { + unsigned int ignore_hash; + return lookup_only(name, len, ignore_hash); + } + static symbolOop probe_unicode(const jchar* name, int len) { + unsigned int ignore_hash; + return lookup_only_unicode(name, len, ignore_hash); + } // Histogram static void print_histogram() PRODUCT_RETURN; diff --git a/hotspot/src/share/vm/classfile/systemDictionary.cpp b/hotspot/src/share/vm/classfile/systemDictionary.cpp index 95551841633..b6af53d2d27 100644 --- a/hotspot/src/share/vm/classfile/systemDictionary.cpp +++ b/hotspot/src/share/vm/classfile/systemDictionary.cpp @@ -1964,6 +1964,13 @@ BasicType SystemDictionary::box_klass_type(klassOop k) { return T_OBJECT; } +KlassHandle SystemDictionaryHandles::box_klass(BasicType t) { + if (t >= T_BOOLEAN && t <= T_VOID) + return KlassHandle(&SystemDictionary::_box_klasses[t], true); + else + return KlassHandle(); +} + // Constraints on class loaders. The details of the algorithm can be // found in the OOPSLA'98 paper "Dynamic Class Loading in the Java // Virtual Machine" by Sheng Liang and Gilad Bracha. The basic idea is @@ -2174,11 +2181,56 @@ symbolOop SystemDictionary::find_resolution_error(constantPoolHandle pool, int w } +// Signature constraints ensure that callers and callees agree about +// the meaning of type names in their signatures. This routine is the +// intake for constraints. It collects them from several places: +// +// * LinkResolver::resolve_method (if check_access is true) requires +// that the resolving class (the caller) and the defining class of +// the resolved method (the callee) agree on each type in the +// method's signature. +// +// * LinkResolver::resolve_interface_method performs exactly the same +// checks. +// +// * LinkResolver::resolve_field requires that the constant pool +// attempting to link to a field agree with the field's defining +// class about the type of the field signature. +// +// * klassVtable::initialize_vtable requires that, when a class +// overrides a vtable entry allocated by a superclass, that the +// overriding method (i.e., the callee) agree with the superclass +// on each type in the method's signature. +// +// * klassItable::initialize_itable requires that, when a class fills +// in its itables, for each non-abstract method installed in an +// itable, the method (i.e., the callee) agree with the interface +// on each type in the method's signature. +// +// All those methods have a boolean (check_access, checkconstraints) +// which turns off the checks. This is used from specialized contexts +// such as bootstrapping, dumping, and debugging. +// +// No direct constraint is placed between the class and its +// supertypes. Constraints are only placed along linked relations +// between callers and callees. When a method overrides or implements +// an abstract method in a supertype (superclass or interface), the +// constraints are placed as if the supertype were the caller to the +// overriding method. (This works well, since callers to the +// supertype have already established agreement between themselves and +// the supertype.) As a result of all this, a class can disagree with +// its supertype about the meaning of a type name, as long as that +// class neither calls a relevant method of the supertype, nor is +// called (perhaps via an override) from the supertype. +// +// +// SystemDictionary::check_signature_loaders(sig, l1, l2) +// // Make sure all class components (including arrays) in the given // signature will be resolved to the same class in both loaders. // Returns the name of the type that failed a loader constraint check, or // NULL if no constraint failed. The returned C string needs cleaning up -// with a ResourceMark in the caller +// with a ResourceMark in the caller. No exception except OOME is thrown. char* SystemDictionary::check_signature_loaders(symbolHandle signature, Handle loader1, Handle loader2, bool is_method, TRAPS) { diff --git a/hotspot/src/share/vm/classfile/systemDictionary.hpp b/hotspot/src/share/vm/classfile/systemDictionary.hpp index 7ee23212587..6444709dd62 100644 --- a/hotspot/src/share/vm/classfile/systemDictionary.hpp +++ b/hotspot/src/share/vm/classfile/systemDictionary.hpp @@ -161,6 +161,7 @@ class ResolutionErrorTable; class SystemDictionary : AllStatic { friend class VMStructs; friend class CompactingPermGenGen; + friend class SystemDictionaryHandles; NOT_PRODUCT(friend class instanceKlassKlass;) public: @@ -595,3 +596,18 @@ private: static bool _has_loadClassInternal; static bool _has_checkPackageAccess; }; + +// Cf. vmSymbols vs. vmSymbolHandles +class SystemDictionaryHandles : AllStatic { +public: + #define WK_KLASS_HANDLE_DECLARE(name, ignore_symbol, option) \ + static KlassHandle name() { \ + SystemDictionary::name(); \ + klassOop* loc = &SystemDictionary::_well_known_klasses[SystemDictionary::WK_KLASS_ENUM_NAME(name)]; \ + return KlassHandle(loc, true); \ + } + WK_KLASSES_DO(WK_KLASS_HANDLE_DECLARE); + #undef WK_KLASS_HANDLE_DECLARE + + static KlassHandle box_klass(BasicType t); +}; diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.cpp index 195847a66e2..d0fa3a4eecf 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.cpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-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 @@ -825,6 +825,7 @@ HeapWord* ParallelScavengeHeap::block_start(const void* addr) const { if (young_gen()->is_in_reserved(addr)) { assert(young_gen()->is_in(addr), "addr should be in allocated part of young gen"); + if (Debugging) return NULL; // called from find() in debug.cpp Unimplemented(); } else if (old_gen()->is_in_reserved(addr)) { assert(old_gen()->is_in(addr), diff --git a/hotspot/src/share/vm/oops/instanceKlass.cpp b/hotspot/src/share/vm/oops/instanceKlass.cpp index 12adb12aba6..c52a00184cc 100644 --- a/hotspot/src/share/vm/oops/instanceKlass.cpp +++ b/hotspot/src/share/vm/oops/instanceKlass.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -1813,6 +1813,8 @@ bool instanceKlass::is_same_class_package(oop class_loader1, symbolOop class_nam oop class_loader2, symbolOop class_name2) { if (class_loader1 != class_loader2) { return false; + } else if (class_name1 == class_name2) { + return true; // skip painful bytewise comparison } else { ResourceMark rm; @@ -1859,6 +1861,55 @@ bool instanceKlass::is_same_class_package(oop class_loader1, symbolOop class_nam } } +/* defined for now in jvm.cpp, for historical reasons *-- +klassOop instanceKlass::compute_enclosing_class_impl(instanceKlassHandle self, + symbolOop& simple_name_result, TRAPS) { + ... +} +*/ + +// tell if two classes have the same enclosing class (at package level) +bool instanceKlass::is_same_package_member_impl(instanceKlassHandle class1, + klassOop class2_oop, TRAPS) { + if (class2_oop == class1->as_klassOop()) return true; + if (!Klass::cast(class2_oop)->oop_is_instance()) return false; + instanceKlassHandle class2(THREAD, class2_oop); + + // must be in same package before we try anything else + if (!class1->is_same_class_package(class2->class_loader(), class2->name())) + return false; + + // As long as there is an outer1.getEnclosingClass, + // shift the search outward. + instanceKlassHandle outer1 = class1; + for (;;) { + // As we walk along, look for equalities between outer1 and class2. + // Eventually, the walks will terminate as outer1 stops + // at the top-level class around the original class. + symbolOop ignore_name; + klassOop next = outer1->compute_enclosing_class(ignore_name, CHECK_false); + if (next == NULL) break; + if (next == class2()) return true; + outer1 = instanceKlassHandle(THREAD, next); + } + + // Now do the same for class2. + instanceKlassHandle outer2 = class2; + for (;;) { + symbolOop ignore_name; + klassOop next = outer2->compute_enclosing_class(ignore_name, CHECK_false); + if (next == NULL) break; + // Might as well check the new outer against all available values. + if (next == class1()) return true; + if (next == outer1()) return true; + outer2 = instanceKlassHandle(THREAD, next); + } + + // If by this point we have not found an equality between the + // two classes, we know they are in separate package members. + return false; +} + jint instanceKlass::compute_modifier_flags(TRAPS) const { klassOop k = as_klassOop(); @@ -1996,9 +2047,11 @@ nmethod* instanceKlass::lookup_osr_nmethod(const methodOop m, int bci) const { // Printing +#define BULLET " - " + void FieldPrinter::do_field(fieldDescriptor* fd) { - if (fd->is_static() == (_obj == NULL)) { - _st->print(" - "); + _st->print(BULLET); + if (fd->is_static() || (_obj == NULL)) { fd->print_on(_st); _st->cr(); } else { @@ -2019,7 +2072,7 @@ void instanceKlass::oop_print_on(oop obj, outputStream* st) { value->is_typeArray() && offset <= (juint) value->length() && offset + length <= (juint) value->length()) { - st->print("string: "); + st->print(BULLET"string: "); Handle h_obj(obj); java_lang_String::print(h_obj, st); st->cr(); @@ -2027,22 +2080,25 @@ void instanceKlass::oop_print_on(oop obj, outputStream* st) { } } - st->print_cr("fields:"); + st->print_cr(BULLET"---- fields (total size %d words):", oop_size(obj)); FieldPrinter print_nonstatic_field(st, obj); do_nonstatic_fields(&print_nonstatic_field); if (as_klassOop() == SystemDictionary::class_klass()) { + st->print(BULLET"signature: "); + java_lang_Class::print_signature(obj, st); + st->cr(); klassOop mirrored_klass = java_lang_Class::as_klassOop(obj); - st->print(" - fake entry for mirror: "); + st->print(BULLET"fake entry for mirror: "); mirrored_klass->print_value_on(st); st->cr(); - st->print(" - fake entry resolved_constructor: "); + st->print(BULLET"fake entry resolved_constructor: "); methodOop ctor = java_lang_Class::resolved_constructor(obj); ctor->print_value_on(st); klassOop array_klass = java_lang_Class::array_klass(obj); - st->print(" - fake entry for array: "); - array_klass->print_value_on(st); st->cr(); + st->print(BULLET"fake entry for array: "); + array_klass->print_value_on(st); st->cr(); } } @@ -2051,6 +2107,28 @@ void instanceKlass::oop_print_value_on(oop obj, outputStream* st) { st->print("a "); name()->print_value_on(st); obj->print_address_on(st); + if (as_klassOop() == SystemDictionary::string_klass() + && java_lang_String::value(obj) != NULL) { + ResourceMark rm; + int len = java_lang_String::length(obj); + int plen = (len < 24 ? len : 12); + char* str = java_lang_String::as_utf8_string(obj, 0, plen); + st->print(" = \"%s\"", str); + if (len > plen) + st->print("...[%d]", len); + } else if (as_klassOop() == SystemDictionary::class_klass()) { + klassOop k = java_lang_Class::as_klassOop(obj); + st->print(" = "); + if (k != NULL) { + k->print_value_on(st); + } else { + const char* tname = type2name(java_lang_Class::primitive_type(obj)); + st->print("%s", tname ? tname : "type?"); + } + } else if (java_lang_boxing_object::is_instance(obj)) { + st->print(" = "); + java_lang_boxing_object::print(obj, st); + } } #endif // ndef PRODUCT diff --git a/hotspot/src/share/vm/oops/instanceKlass.hpp b/hotspot/src/share/vm/oops/instanceKlass.hpp index 8586ecba03b..5e6eddbe78d 100644 --- a/hotspot/src/share/vm/oops/instanceKlass.hpp +++ b/hotspot/src/share/vm/oops/instanceKlass.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -308,6 +308,22 @@ class instanceKlass: public Klass { bool is_same_class_package(oop classloader2, symbolOop classname2); static bool is_same_class_package(oop class_loader1, symbolOop class_name1, oop class_loader2, symbolOop class_name2); + // find an enclosing class (defined where original code was, in jvm.cpp!) + klassOop compute_enclosing_class(symbolOop& simple_name_result, TRAPS) { + instanceKlassHandle self(THREAD, this->as_klassOop()); + return compute_enclosing_class_impl(self, simple_name_result, THREAD); + } + static klassOop compute_enclosing_class_impl(instanceKlassHandle self, + symbolOop& simple_name_result, TRAPS); + + // tell if two classes have the same enclosing class (at package level) + bool is_same_package_member(klassOop class2, TRAPS) { + instanceKlassHandle self(THREAD, this->as_klassOop()); + return is_same_package_member_impl(self, class2, THREAD); + } + static bool is_same_package_member_impl(instanceKlassHandle self, + klassOop class2, TRAPS); + // initialization state bool is_loaded() const { return _init_state >= loaded; } bool is_linked() const { return _init_state >= linked; } diff --git a/hotspot/src/share/vm/oops/instanceKlassKlass.cpp b/hotspot/src/share/vm/oops/instanceKlassKlass.cpp index 94a6bee03ec..23ebfaba967 100644 --- a/hotspot/src/share/vm/oops/instanceKlassKlass.cpp +++ b/hotspot/src/share/vm/oops/instanceKlassKlass.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -487,6 +487,8 @@ klassOop instanceKlassKlass::allocate_instance_klass(int vtable_len, int itable_ // Printing +#define BULLET " - " + static const char* state_names[] = { "unparseable_by_gc", "allocated", "loaded", "linked", "being_initialized", "fully_initialized", "initialization_error" }; @@ -497,13 +499,13 @@ void instanceKlassKlass::oop_print_on(oop obj, outputStream* st) { instanceKlass* ik = instanceKlass::cast(klassOop(obj)); klassKlass::oop_print_on(obj, st); - st->print(" - instance size: %d", ik->size_helper()); st->cr(); - st->print(" - klass size: %d", ik->object_size()); st->cr(); - st->print(" - access: "); ik->access_flags().print_on(st); st->cr(); - st->print(" - state: "); st->print_cr(state_names[ik->_init_state]); - st->print(" - name: "); ik->name()->print_value_on(st); st->cr(); - st->print(" - super: "); ik->super()->print_value_on(st); st->cr(); - st->print(" - sub: "); + st->print(BULLET"instance size: %d", ik->size_helper()); st->cr(); + st->print(BULLET"klass size: %d", ik->object_size()); st->cr(); + st->print(BULLET"access: "); ik->access_flags().print_on(st); st->cr(); + st->print(BULLET"state: "); st->print_cr(state_names[ik->_init_state]); + st->print(BULLET"name: "); ik->name()->print_value_on(st); st->cr(); + st->print(BULLET"super: "); ik->super()->print_value_on(st); st->cr(); + st->print(BULLET"sub: "); Klass* sub = ik->subklass(); int n; for (n = 0; sub != NULL; n++, sub = sub->next_sibling()) { @@ -516,12 +518,12 @@ void instanceKlassKlass::oop_print_on(oop obj, outputStream* st) { st->cr(); if (ik->is_interface()) { - st->print_cr(" - nof implementors: %d", ik->nof_implementors()); + st->print_cr(BULLET"nof implementors: %d", ik->nof_implementors()); int print_impl = 0; for (int i = 0; i < instanceKlass::implementors_limit; i++) { if (ik->implementor(i) != NULL) { if (++print_impl == 1) - st->print_cr(" - implementor: "); + st->print_cr(BULLET"implementor: "); st->print(" "); ik->implementor(i)->print_value_on(st); } @@ -529,34 +531,33 @@ void instanceKlassKlass::oop_print_on(oop obj, outputStream* st) { if (print_impl > 0) st->cr(); } - st->print(" - arrays: "); ik->array_klasses()->print_value_on(st); st->cr(); - st->print(" - methods: "); ik->methods()->print_value_on(st); st->cr(); + st->print(BULLET"arrays: "); ik->array_klasses()->print_value_on(st); st->cr(); + st->print(BULLET"methods: "); ik->methods()->print_value_on(st); st->cr(); if (Verbose) { objArrayOop methods = ik->methods(); for(int i = 0; i < methods->length(); i++) { tty->print("%d : ", i); methods->obj_at(i)->print_value(); tty->cr(); } } - st->print(" - method ordering: "); ik->method_ordering()->print_value_on(st); st->cr(); - st->print(" - local interfaces: "); ik->local_interfaces()->print_value_on(st); st->cr(); - st->print(" - trans. interfaces: "); ik->transitive_interfaces()->print_value_on(st); st->cr(); - st->print(" - constants: "); ik->constants()->print_value_on(st); st->cr(); - st->print(" - class loader: "); ik->class_loader()->print_value_on(st); st->cr(); - st->print(" - protection domain: "); ik->protection_domain()->print_value_on(st); st->cr(); - st->print(" - host class: "); ik->host_klass()->print_value_on(st); st->cr(); - st->print(" - signers: "); ik->signers()->print_value_on(st); st->cr(); + st->print(BULLET"method ordering: "); ik->method_ordering()->print_value_on(st); st->cr(); + st->print(BULLET"local interfaces: "); ik->local_interfaces()->print_value_on(st); st->cr(); + st->print(BULLET"trans. interfaces: "); ik->transitive_interfaces()->print_value_on(st); st->cr(); + st->print(BULLET"constants: "); ik->constants()->print_value_on(st); st->cr(); + st->print(BULLET"class loader: "); ik->class_loader()->print_value_on(st); st->cr(); + st->print(BULLET"protection domain: "); ik->protection_domain()->print_value_on(st); st->cr(); + st->print(BULLET"host class: "); ik->host_klass()->print_value_on(st); st->cr(); + st->print(BULLET"signers: "); ik->signers()->print_value_on(st); st->cr(); if (ik->source_file_name() != NULL) { - st->print(" - source file: "); + st->print(BULLET"source file: "); ik->source_file_name()->print_value_on(st); st->cr(); } if (ik->source_debug_extension() != NULL) { - st->print(" - source debug extension: "); + st->print(BULLET"source debug extension: "); ik->source_debug_extension()->print_value_on(st); st->cr(); } - st->print_cr(" - previous version: "); { ResourceMark rm; // PreviousVersionInfo objects returned via PreviousVersionWalker @@ -564,38 +565,43 @@ void instanceKlassKlass::oop_print_on(oop obj, outputStream* st) { // GrowableArray _after_ the PreviousVersionWalker destructor // has destroyed the handles. { + bool have_pv = false; PreviousVersionWalker pvw(ik); for (PreviousVersionInfo * pv_info = pvw.next_previous_version(); pv_info != NULL; pv_info = pvw.next_previous_version()) { + if (!have_pv) + st->print(BULLET"previous version: "); + have_pv = true; pv_info->prev_constant_pool_handle()()->print_value_on(st); } - st->cr(); + if (have_pv) st->cr(); } // pvw is cleaned up } // rm is cleaned up if (ik->generic_signature() != NULL) { - st->print(" - generic signature: "); + st->print(BULLET"generic signature: "); ik->generic_signature()->print_value_on(st); + st->cr(); } - st->print(" - inner classes: "); ik->inner_classes()->print_value_on(st); st->cr(); - st->print(" - java mirror: "); ik->java_mirror()->print_value_on(st); st->cr(); - st->print(" - vtable length %d (start addr: " INTPTR_FORMAT ")", ik->vtable_length(), ik->start_of_vtable()); st->cr(); - st->print(" - itable length %d (start addr: " INTPTR_FORMAT ")", ik->itable_length(), ik->start_of_itable()); st->cr(); - st->print_cr(" - static fields:"); + st->print(BULLET"inner classes: "); ik->inner_classes()->print_value_on(st); st->cr(); + st->print(BULLET"java mirror: "); ik->java_mirror()->print_value_on(st); st->cr(); + st->print(BULLET"vtable length %d (start addr: " INTPTR_FORMAT ")", ik->vtable_length(), ik->start_of_vtable()); st->cr(); + st->print(BULLET"itable length %d (start addr: " INTPTR_FORMAT ")", ik->itable_length(), ik->start_of_itable()); st->cr(); + st->print_cr(BULLET"---- static fields (%d words):", ik->static_field_size()); FieldPrinter print_static_field(st); ik->do_local_static_fields(&print_static_field); - st->print_cr(" - non-static fields:"); - FieldPrinter print_nonstatic_field(st, obj); + st->print_cr(BULLET"---- non-static fields (%d words):", ik->nonstatic_field_size()); + FieldPrinter print_nonstatic_field(st); ik->do_nonstatic_fields(&print_nonstatic_field); - st->print(" - static oop maps: "); + st->print(BULLET"static oop maps: "); if (ik->static_oop_field_size() > 0) { int first_offset = ik->offset_of_static_fields(); st->print("%d-%d", first_offset, first_offset + ik->static_oop_field_size() - 1); } st->cr(); - st->print(" - non-static oop maps: "); + st->print(BULLET"non-static oop maps: "); OopMapBlock* map = ik->start_of_nonstatic_oop_maps(); OopMapBlock* end_map = map + ik->nonstatic_oop_map_size(); while (map < end_map) { diff --git a/hotspot/src/share/vm/oops/klassVtable.cpp b/hotspot/src/share/vm/oops/klassVtable.cpp index 9411e76509b..48511fe25ba 100644 --- a/hotspot/src/share/vm/oops/klassVtable.cpp +++ b/hotspot/src/share/vm/oops/klassVtable.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -1153,6 +1153,27 @@ int klassItable::compute_itable_index(methodOop m) { return index; } + +// inverse to compute_itable_index +methodOop klassItable::method_for_itable_index(klassOop intf, int itable_index) { + assert(instanceKlass::cast(intf)->is_interface(), "sanity check"); + objArrayOop methods = instanceKlass::cast(intf)->methods(); + + int index = itable_index; + // Adjust for , which is left out of table if first method + if (methods->length() > 0 && ((methodOop)methods->obj_at(0))->name() == vmSymbols::class_initializer_name()) { + index++; + } + + if (itable_index < 0 || index >= methods->length()) + return NULL; // help caller defend against bad indexes + + methodOop m = (methodOop)methods->obj_at(index); + assert(compute_itable_index(m) == itable_index, "correct inverse"); + + return m; +} + void klassVtable::verify(outputStream* st, bool forced) { // make sure table is initialized if (!Universe::is_fully_initialized()) return; diff --git a/hotspot/src/share/vm/oops/klassVtable.hpp b/hotspot/src/share/vm/oops/klassVtable.hpp index 2ef1848f59e..d73af3761d8 100644 --- a/hotspot/src/share/vm/oops/klassVtable.hpp +++ b/hotspot/src/share/vm/oops/klassVtable.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -298,6 +298,8 @@ class klassItable : public ResourceObj { // Resolving of method to index static int compute_itable_index(methodOop m); + // ...and back again: + static methodOop method_for_itable_index(klassOop klass, int itable_index); // Debugging/Statistics static void print_statistics() PRODUCT_RETURN; diff --git a/hotspot/src/share/vm/oops/methodKlass.cpp b/hotspot/src/share/vm/oops/methodKlass.cpp index bcc9afb4f31..3144312ef6c 100644 --- a/hotspot/src/share/vm/oops/methodKlass.cpp +++ b/hotspot/src/share/vm/oops/methodKlass.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -247,9 +247,14 @@ void methodKlass::oop_print_on(oop obj, outputStream* st) { st->print_cr(" - size of params: %d", m->size_of_parameters()); st->print_cr(" - method size: %d", m->method_size()); st->print_cr(" - vtable index: %d", m->_vtable_index); + st->print_cr(" - i2i entry: " INTPTR_FORMAT, m->interpreter_entry()); + st->print_cr(" - adapter: " INTPTR_FORMAT, m->adapter()); + st->print_cr(" - compiled entry " INTPTR_FORMAT, m->from_compiled_entry()); st->print_cr(" - code size: %d", m->code_size()); - st->print_cr(" - code start: " INTPTR_FORMAT, m->code_base()); - st->print_cr(" - code end (excl): " INTPTR_FORMAT, m->code_base() + m->code_size()); + if (m->code_size() != 0) { + st->print_cr(" - code start: " INTPTR_FORMAT, m->code_base()); + st->print_cr(" - code end (excl): " INTPTR_FORMAT, m->code_base() + m->code_size()); + } if (m->method_data() != NULL) { st->print_cr(" - method data: " INTPTR_FORMAT, (address)m->method_data()); } @@ -293,6 +298,10 @@ void methodKlass::oop_print_on(oop obj, outputStream* st) { m->code()->print_value_on(st); st->cr(); } + if (m->is_native()) { + st->print_cr(" - native function: " INTPTR_FORMAT, m->native_function()); + st->print_cr(" - signature handler: " INTPTR_FORMAT, m->signature_handler()); + } } diff --git a/hotspot/src/share/vm/oops/objArrayKlass.cpp b/hotspot/src/share/vm/oops/objArrayKlass.cpp index 1f2574b9c43..3f56d9c1ff6 100644 --- a/hotspot/src/share/vm/oops/objArrayKlass.cpp +++ b/hotspot/src/share/vm/oops/objArrayKlass.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -502,12 +502,25 @@ void objArrayKlass::oop_print_on(oop obj, outputStream* st) { } } +static int max_objArray_print_length = 4; void objArrayKlass::oop_print_value_on(oop obj, outputStream* st) { assert(obj->is_objArray(), "must be objArray"); + st->print("a "); element_klass()->print_value_on(st); - st->print("a [%d] ", objArrayOop(obj)->length()); - as_klassOop()->klass()->print_value_on(st); + int len = objArrayOop(obj)->length(); + st->print("[%d] ", len); + obj->print_address_on(st); + if (PrintOopAddress || PrintMiscellaneous && (WizardMode || Verbose)) { + st->print("{"); + for (int i = 0; i < len; i++) { + if (i > max_objArray_print_length) { + st->print("..."); break; + } + st->print(" "INTPTR_FORMAT, (intptr_t)(void*)objArrayOop(obj)->obj_at(i)); + } + st->print(" }"); + } } #endif // PRODUCT diff --git a/hotspot/src/share/vm/oops/oop.cpp b/hotspot/src/share/vm/oops/oop.cpp index 505a81f263e..da787bed038 100644 --- a/hotspot/src/share/vm/oops/oop.cpp +++ b/hotspot/src/share/vm/oops/oop.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -65,11 +65,7 @@ void oopDesc::print_value_on(outputStream* st) const { void oopDesc::print_address_on(outputStream* st) const { if (PrintOopAddress) { - st->print("{"); - if (PrintOopAddress) { - st->print(INTPTR_FORMAT, this); - } - st->print("}"); + st->print("{"INTPTR_FORMAT"}", this); } } diff --git a/hotspot/src/share/vm/prims/jvm.cpp b/hotspot/src/share/vm/prims/jvm.cpp index cf866df9f61..507759940df 100644 --- a/hotspot/src/share/vm/prims/jvm.cpp +++ b/hotspot/src/share/vm/prims/jvm.cpp @@ -1242,7 +1242,7 @@ JVM_ENTRY(jobjectArray, JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass)) // Throws an exception if outer klass has not declared k as // an inner klass - Reflection::check_for_inner_class(k, inner_klass, CHECK_NULL); + Reflection::check_for_inner_class(k, inner_klass, true, CHECK_NULL); result->obj_at_put(members, inner_klass->java_mirror()); members++; @@ -1265,16 +1265,29 @@ JVM_END JVM_ENTRY(jclass, JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass)) - const int inner_class_info_index = 0; - const int outer_class_info_index = 1; - +{ // ofClass is a reference to a java_lang_Class object. if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass)) || ! Klass::cast(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(ofClass)))->oop_is_instance()) { return NULL; } - instanceKlassHandle k(thread, java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(ofClass))); + symbolOop simple_name = NULL; + klassOop outer_klass + = instanceKlass::cast(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(ofClass)) + )->compute_enclosing_class(simple_name, CHECK_NULL); + if (outer_klass == NULL) return NULL; // already a top-level class + if (simple_name == NULL) return NULL; // an anonymous class (inside a method) + return (jclass) JNIHandles::make_local(env, Klass::cast(outer_klass)->java_mirror()); +} +JVM_END + +// should be in instanceKlass.cpp, but is here for historical reasons +klassOop instanceKlass::compute_enclosing_class_impl(instanceKlassHandle k, + symbolOop& simple_name_result, TRAPS) { + Thread* thread = THREAD; + const int inner_class_info_index = inner_class_inner_class_info_offset; + const int outer_class_info_index = inner_class_outer_class_info_offset; if (k->inner_classes()->length() == 0) { // No inner class info => no declaring class @@ -1288,35 +1301,51 @@ JVM_ENTRY(jclass, JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass)) bool found = false; klassOop ok; instanceKlassHandle outer_klass; + bool inner_is_member = false; + int simple_name_index = 0; // Find inner_klass attribute - for(int i = 0; i < i_length && !found; i+= 4) { + for (int i = 0; i < i_length && !found; i += inner_class_next_offset) { int ioff = i_icls->ushort_at(i + inner_class_info_index); int ooff = i_icls->ushort_at(i + outer_class_info_index); - - if (ioff != 0 && ooff != 0) { + int noff = i_icls->ushort_at(i + inner_class_inner_name_offset); + if (ioff != 0) { // Check to see if the name matches the class we're looking for // before attempting to find the class. if (i_cp->klass_name_at_matches(k, ioff)) { klassOop inner_klass = i_cp->klass_at(ioff, CHECK_NULL); - if (k() == inner_klass) { - found = true; + found = (k() == inner_klass); + if (found && ooff != 0) { ok = i_cp->klass_at(ooff, CHECK_NULL); outer_klass = instanceKlassHandle(thread, ok); + simple_name_index = noff; + inner_is_member = true; } } } } + if (found && outer_klass.is_null()) { + // It may be anonymous; try for that. + int encl_method_class_idx = k->enclosing_method_class_index(); + if (encl_method_class_idx != 0) { + ok = i_cp->klass_at(encl_method_class_idx, CHECK_NULL); + outer_klass = instanceKlassHandle(thread, ok); + inner_is_member = false; + } + } + // If no inner class attribute found for this class. - if (!found) return NULL; + if (outer_klass.is_null()) return NULL; // Throws an exception if outer klass has not declared k as an inner klass - Reflection::check_for_inner_class(outer_klass, k, CHECK_NULL); - - return (jclass)JNIHandles::make_local(env, outer_klass->java_mirror()); -JVM_END + // We need evidence that each klass knows about the other, or else + // the system could allow a spoof of an inner class to gain access rights. + Reflection::check_for_inner_class(outer_klass, k, inner_is_member, CHECK_NULL); + simple_name_result = (inner_is_member ? i_cp->symbol_at(simple_name_index) : symbolOop(NULL)); + return outer_klass(); +} JVM_ENTRY(jstring, JVM_GetClassSignature(JNIEnv *env, jclass cls)) assert (cls != NULL, "illegal class"); diff --git a/hotspot/src/share/vm/runtime/fieldDescriptor.cpp b/hotspot/src/share/vm/runtime/fieldDescriptor.cpp index d750981a4c3..a5e40ad8e26 100644 --- a/hotspot/src/share/vm/runtime/fieldDescriptor.cpp +++ b/hotspot/src/share/vm/runtime/fieldDescriptor.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -107,13 +107,14 @@ void fieldDescriptor::print_on(outputStream* st) const { void fieldDescriptor::print_on_for(outputStream* st, oop obj) { print_on(st); BasicType ft = field_type(); - jint as_int; + jint as_int = 0; switch (ft) { case T_BYTE: as_int = (jint)obj->byte_field(offset()); st->print(" %d", obj->byte_field(offset())); break; case T_CHAR: + as_int = (jint)obj->char_field(offset()); { jchar c = obj->char_field(offset()); as_int = c; @@ -128,6 +129,7 @@ void fieldDescriptor::print_on_for(outputStream* st, oop obj) { st->print(" %f", obj->float_field(offset())); break; case T_INT: + as_int = obj->int_field(offset()); st->print(" %d", obj->int_field(offset())); break; case T_LONG: @@ -144,12 +146,12 @@ void fieldDescriptor::print_on_for(outputStream* st, oop obj) { break; case T_ARRAY: st->print(" "); - as_int = obj->int_field(offset()); + NOT_LP64(as_int = obj->int_field(offset())); obj->obj_field(offset())->print_value_on(st); break; case T_OBJECT: st->print(" "); - as_int = obj->int_field(offset()); + NOT_LP64(as_int = obj->int_field(offset())); obj->obj_field(offset())->print_value_on(st); break; default: @@ -158,9 +160,9 @@ void fieldDescriptor::print_on_for(outputStream* st, oop obj) { } // Print a hint as to the underlying integer representation. This can be wrong for // pointers on an LP64 machine - if (ft == T_LONG || ft == T_DOUBLE) { + if (ft == T_LONG || ft == T_DOUBLE LP64_ONLY(|| !is_java_primitive(ft)) ) { st->print(" (%x %x)", obj->int_field(offset()), obj->int_field(offset()+sizeof(jint))); - } else { + } else if (as_int < 0 || as_int > 9) { st->print(" (%x)", as_int); } } diff --git a/hotspot/src/share/vm/runtime/handles.hpp b/hotspot/src/share/vm/runtime/handles.hpp index 55e9b41fa20..c44c6ac3d22 100644 --- a/hotspot/src/share/vm/runtime/handles.hpp +++ b/hotspot/src/share/vm/runtime/handles.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -137,6 +137,14 @@ class KlassHandle: public Handle { assert(is_null() || obj()->is_klass(), "not a klassOop"); } + // Direct interface, use very sparingly. + // Used by SystemDictionaryHandles to create handles on existing WKKs. + // The obj of such a klass handle may be null, because the handle is formed + // during system bootstrapping. + KlassHandle(klassOop *handle, bool dummy) : Handle((oop*)handle, dummy) { + assert(SharedSkipVerify || is_null() || obj() == NULL || obj()->is_klass(), "not a klassOop"); + } + // General access klassOop operator () () const { return obj(); } Klass* operator -> () const { return as_klass(); } diff --git a/hotspot/src/share/vm/runtime/reflection.cpp b/hotspot/src/share/vm/runtime/reflection.cpp index 3bc1b029d4c..6c7fe33ee6b 100644 --- a/hotspot/src/share/vm/runtime/reflection.cpp +++ b/hotspot/src/share/vm/runtime/reflection.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -554,10 +554,18 @@ bool Reflection::is_same_class_package(klassOop class1, klassOop class2) { return instanceKlass::cast(class1)->is_same_class_package(class2); } +bool Reflection::is_same_package_member(klassOop class1, klassOop class2, TRAPS) { + return instanceKlass::cast(class1)->is_same_package_member(class2, THREAD); +} + // Checks that the 'outer' klass has declared 'inner' as being an inner klass. If not, // throw an incompatible class change exception -void Reflection::check_for_inner_class(instanceKlassHandle outer, instanceKlassHandle inner, TRAPS) { +// If inner_is_member, require the inner to be a member of the outer. +// If !inner_is_member, require the inner to be anonymous (a non-member). +// Caller is responsible for figuring out in advance which case must be true. +void Reflection::check_for_inner_class(instanceKlassHandle outer, instanceKlassHandle inner, + bool inner_is_member, TRAPS) { const int inner_class_info_index = 0; const int outer_class_info_index = 1; @@ -567,7 +575,7 @@ void Reflection::check_for_inner_class(instanceKlassHandle outer, instanceKlassH int ioff = icls->ushort_at(i + inner_class_info_index); int ooff = icls->ushort_at(i + outer_class_info_index); - if (ioff != 0 && ooff != 0) { + if (inner_is_member && ioff != 0 && ooff != 0) { klassOop o = cp->klass_at(ooff, CHECK); if (o == outer()) { klassOop i = cp->klass_at(ioff, CHECK); @@ -576,6 +584,13 @@ void Reflection::check_for_inner_class(instanceKlassHandle outer, instanceKlassH } } } + if (!inner_is_member && ioff != 0 && ooff == 0 && + cp->klass_name_at_matches(inner, ioff)) { + klassOop i = cp->klass_at(ioff, CHECK); + if (i == inner()) { + return; + } + } } // 'inner' not declared as an inner klass in outer diff --git a/hotspot/src/share/vm/runtime/reflection.hpp b/hotspot/src/share/vm/runtime/reflection.hpp index 4e8054af5cd..56a54cd0e32 100644 --- a/hotspot/src/share/vm/runtime/reflection.hpp +++ b/hotspot/src/share/vm/runtime/reflection.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -87,12 +87,18 @@ class Reflection: public AllStatic { bool classloader_only, bool protected_restriction = false); static bool is_same_class_package(klassOop class1, klassOop class2); + static bool is_same_package_member(klassOop class1, klassOop class2, TRAPS); static bool can_relax_access_check_for( klassOop accessor, klassOop accesee, bool classloader_only); // inner class reflection - static void check_for_inner_class(instanceKlassHandle outer, instanceKlassHandle inner, TRAPS); + // raise an ICCE unless the required relationship can be proven to hold + // If inner_is_member, require the inner to be a member of the outer. + // If !inner_is_member, require the inner to be anonymous (a non-member). + // Caller is responsible for figuring out in advance which case must be true. + static void check_for_inner_class(instanceKlassHandle outer, instanceKlassHandle inner, + bool inner_is_member, TRAPS); // // Support for reflection based on dynamic bytecode generation (JDK 1.4) diff --git a/hotspot/src/share/vm/runtime/sharedRuntime.cpp b/hotspot/src/share/vm/runtime/sharedRuntime.cpp index 54c94ba0358..787674569e7 100644 --- a/hotspot/src/share/vm/runtime/sharedRuntime.cpp +++ b/hotspot/src/share/vm/runtime/sharedRuntime.cpp @@ -675,48 +675,6 @@ JRT_ENTRY(void, SharedRuntime::yield_all(JavaThread* thread, int attempts)) JRT_END -// --------------------------------------------------------------------------------------------------------- -// Non-product code -#ifndef PRODUCT - -void SharedRuntime::verify_caller_frame(frame caller_frame, methodHandle callee_method) { - ResourceMark rm; - assert (caller_frame.is_interpreted_frame(), "sanity check"); - assert (callee_method->has_compiled_code(), "callee must be compiled"); - methodHandle caller_method (Thread::current(), caller_frame.interpreter_frame_method()); - jint bci = caller_frame.interpreter_frame_bci(); - methodHandle method = find_callee_method_inside_interpreter(caller_frame, caller_method, bci); - assert (callee_method == method, "incorrect method"); -} - -methodHandle SharedRuntime::find_callee_method_inside_interpreter(frame caller_frame, methodHandle caller_method, int bci) { - EXCEPTION_MARK; - Bytecode_invoke* bytecode = Bytecode_invoke_at(caller_method, bci); - methodHandle staticCallee = bytecode->static_target(CATCH); // Non-product code - - bytecode = Bytecode_invoke_at(caller_method, bci); - int bytecode_index = bytecode->index(); - Bytecodes::Code bc = bytecode->adjusted_invoke_code(); - - Handle receiver; - if (bc == Bytecodes::_invokeinterface || - bc == Bytecodes::_invokevirtual || - bc == Bytecodes::_invokespecial) { - symbolHandle signature (THREAD, staticCallee->signature()); - receiver = Handle(THREAD, retrieve_receiver(signature, caller_frame)); - } else { - receiver = Handle(); - } - CallInfo result; - constantPoolHandle constants (THREAD, caller_method->constants()); - LinkResolver::resolve_invoke(result, receiver, constants, bytecode_index, bc, CATCH); // Non-product code - methodHandle calleeMethod = result.selected_method(); - return calleeMethod; -} - -#endif // PRODUCT - - JRT_ENTRY_NO_ASYNC(void, SharedRuntime::register_finalizer(JavaThread* thread, oopDesc* obj)) assert(obj->is_oop(), "must be a valid oop"); assert(obj->klass()->klass_part()->has_finalizer(), "shouldn't be here otherwise"); diff --git a/hotspot/src/share/vm/runtime/sharedRuntime.hpp b/hotspot/src/share/vm/runtime/sharedRuntime.hpp index bea176a9dce..e98f71d1ce6 100644 --- a/hotspot/src/share/vm/runtime/sharedRuntime.hpp +++ b/hotspot/src/share/vm/runtime/sharedRuntime.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -180,9 +180,6 @@ class SharedRuntime: AllStatic { static oop retrieve_receiver( symbolHandle sig, frame caller ); - static void verify_caller_frame(frame caller_frame, methodHandle callee_method) PRODUCT_RETURN; - static methodHandle find_callee_method_inside_interpreter(frame caller_frame, methodHandle caller_method, int bci) PRODUCT_RETURN_(return methodHandle();); - static void register_finalizer(JavaThread* thread, oopDesc* obj); // dtrace notifications From d5e5e5a3d155caf3558765355349d60ad312e872 Mon Sep 17 00:00:00 2001 From: Antonios Printezis Date: Sat, 21 Mar 2009 22:53:04 -0400 Subject: [PATCH 162/292] 6820321: G1: Error: guarantee(check_nums(total, n, parts), "all seq lengths should match") Small fixes to sort out some verbosegc-related incorrectness and a failure Reviewed-by: apetrusenko --- .../vm/gc_implementation/g1/g1CollectorPolicy.cpp | 13 +++++++------ .../src/share/vm/gc_implementation/g1/g1RemSet.cpp | 8 ++++++++ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp index d66e382f9b4..6147c8b6c67 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp @@ -1637,7 +1637,9 @@ void G1CollectorPolicy::record_collection_pause_end(bool popular, double obj_copy_time = avg_value(_par_last_obj_copy_times_ms); double termination_time = avg_value(_par_last_termination_times_ms); - double parallel_other_time; + double parallel_other_time = _cur_collection_par_time_ms - + (update_rs_time + ext_root_scan_time + mark_stack_scan_time + + scan_only_time + scan_rs_time + obj_copy_time + termination_time); if (update_stats) { MainBodySummary* body_summary = summary->main_body_summary(); guarantee(body_summary != NULL, "should not be null!"); @@ -1656,9 +1658,6 @@ void G1CollectorPolicy::record_collection_pause_end(bool popular, body_summary->record_parallel_time_ms(_cur_collection_par_time_ms); body_summary->record_clear_ct_time_ms(_cur_clear_ct_time_ms); body_summary->record_termination_time_ms(termination_time); - parallel_other_time = _cur_collection_par_time_ms - - (update_rs_time + ext_root_scan_time + mark_stack_scan_time + - scan_only_time + scan_rs_time + obj_copy_time + termination_time); body_summary->record_parallel_other_time_ms(parallel_other_time); } body_summary->record_mark_closure_time_ms(_mark_closure_time_ms); @@ -1803,8 +1802,10 @@ void G1CollectorPolicy::record_collection_pause_end(bool popular, gclog_or_tty->print_cr("]"); _all_pause_times_ms->add(elapsed_ms); - summary->record_total_time_ms(elapsed_ms); - summary->record_other_time_ms(other_time_ms); + if (update_stats) { + summary->record_total_time_ms(elapsed_ms); + summary->record_other_time_ms(other_time_ms); + } for (int i = 0; i < _aux_num; ++i) if (_cur_aux_times_set[i]) _all_aux_times_ms[i].add(_cur_aux_times_ms[i]); diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.cpp index 3c5a4a5b11f..d0482ea1054 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.cpp @@ -511,9 +511,17 @@ HRInto_G1RemSet::oops_into_collection_set_do(OopsInHeapRegionClosure* oc, if (G1EnableParallelRSetUpdating || (worker_i == 0)) { updateRS(worker_i); scanNewRefsRS(oc, worker_i); + } else { + _g1p->record_update_rs_start_time(worker_i, os::elapsedTime()); + _g1p->record_update_rs_processed_buffers(worker_i, 0.0); + _g1p->record_update_rs_time(worker_i, 0.0); + _g1p->record_scan_new_refs_time(worker_i, 0.0); } if (G1EnableParallelRSetScanning || (worker_i == 0)) { scanRS(oc, worker_i); + } else { + _g1p->record_scan_rs_start_time(worker_i, os::elapsedTime()); + _g1p->record_scan_rs_time(worker_i, 0.0); } } else { assert(worker_i == 0, "invariant"); From 542f88fae5d02db1790b4f283c8f286cfce74f07 Mon Sep 17 00:00:00 2001 From: Dmitry Cherepanov Date: Mon, 23 Mar 2009 11:59:55 +0300 Subject: [PATCH 163/292] 6516404: regression: Choice vertical scrollbar is not seen when the item in the choice is increased more than Reviewed-by: art, dav --- jdk/src/windows/native/sun/windows/awt_Choice.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/jdk/src/windows/native/sun/windows/awt_Choice.cpp b/jdk/src/windows/native/sun/windows/awt_Choice.cpp index cfbf2b863ad..03fdde96f19 100644 --- a/jdk/src/windows/native/sun/windows/awt_Choice.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Choice.cpp @@ -77,6 +77,8 @@ BOOL AwtChoice::skipNextMouseUp = FALSE; BOOL AwtChoice::sm_isMouseMoveInList = FALSE; +static const UINT MINIMUM_NUMBER_OF_VISIBLE_ITEMS = 8; + /************************************************************************* * AwtChoice class methods */ @@ -176,6 +178,10 @@ AwtChoice* AwtChoice::Create(jobject peer, jobject parent) { env->SetIntField(target, AwtComponent::widthID, (jint) rc.right); env->SetIntField(target, AwtComponent::heightID, (jint) rc.bottom); + if (IS_WINXP) { + ::SendMessage(c->GetHWnd(), CB_SETMINVISIBLE, (WPARAM) MINIMUM_NUMBER_OF_VISIBLE_ITEMS, 0); + } + env->DeleteLocalRef(dimension); } } catch (...) { @@ -195,7 +201,7 @@ int AwtChoice::GetDropDownHeight() { int itemHeight =(int)::SendMessage(GetHWnd(), CB_GETITEMHEIGHT, (UINT)0,0); int numItemsToShow = (int)::SendMessage(GetHWnd(), CB_GETCOUNT, 0,0); - numItemsToShow = numItemsToShow > 8 ? 8 : numItemsToShow; + numItemsToShow = min(MINIMUM_NUMBER_OF_VISIBLE_ITEMS, numItemsToShow); // drop-down height snaps to nearest line, so add a // fudge factor of 1/2 line to ensure last line shows return itemHeight*numItemsToShow + itemHeight/2; From b1d6f69a580abe9ecc711fd4d0c7629a9ce67391 Mon Sep 17 00:00:00 2001 From: Weijun Wang Date: Mon, 23 Mar 2009 17:05:48 +0800 Subject: [PATCH 164/292] 6820606: keytool can generate serialno more randomly Reviewed-by: xuelei --- jdk/src/share/classes/sun/security/tools/KeyTool.java | 8 ++++---- .../share/classes/sun/security/x509/CertAndKeyGen.java | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/jdk/src/share/classes/sun/security/tools/KeyTool.java b/jdk/src/share/classes/sun/security/tools/KeyTool.java index a3aa50f435d..163e78fc5cf 100644 --- a/jdk/src/share/classes/sun/security/tools/KeyTool.java +++ b/jdk/src/share/classes/sun/security/tools/KeyTool.java @@ -1072,8 +1072,8 @@ public final class KeyTool { X509CertInfo info = new X509CertInfo(); info.set(X509CertInfo.VALIDITY, interval); - info.set(X509CertInfo.SERIAL_NUMBER, new CertificateSerialNumber - ((int)(firstDate.getTime()/1000))); + info.set(X509CertInfo.SERIAL_NUMBER, new CertificateSerialNumber( + new java.util.Random().nextInt() & 0x7fffffff)); info.set(X509CertInfo.VERSION, new CertificateVersion(CertificateVersion.V3)); info.set(X509CertInfo.ALGORITHM_ID, @@ -2121,8 +2121,8 @@ public final class KeyTool { certInfo.set(X509CertInfo.VALIDITY, interval); // Make new serial number - certInfo.set(X509CertInfo.SERIAL_NUMBER, new CertificateSerialNumber - ((int)(firstDate.getTime()/1000))); + certInfo.set(X509CertInfo.SERIAL_NUMBER, new CertificateSerialNumber( + new java.util.Random().nextInt() & 0x7fffffff)); // Set owner and issuer fields X500Name owner; diff --git a/jdk/src/share/classes/sun/security/x509/CertAndKeyGen.java b/jdk/src/share/classes/sun/security/x509/CertAndKeyGen.java index 38ca600927b..2cf34c871ec 100644 --- a/jdk/src/share/classes/sun/security/x509/CertAndKeyGen.java +++ b/jdk/src/share/classes/sun/security/x509/CertAndKeyGen.java @@ -265,8 +265,8 @@ public final class CertAndKeyGen { // Add all mandatory attributes info.set(X509CertInfo.VERSION, new CertificateVersion(CertificateVersion.V3)); - info.set(X509CertInfo.SERIAL_NUMBER, - new CertificateSerialNumber((int)(firstDate.getTime()/1000))); + info.set(X509CertInfo.SERIAL_NUMBER, new CertificateSerialNumber( + new java.util.Random().nextInt() & 0x7fffffff)); AlgorithmId algID = issuer.getAlgorithmId(); info.set(X509CertInfo.ALGORITHM_ID, new CertificateAlgorithmId(algID)); From 4ce28ac8a05af146517f6242b303cc15a28fec2e Mon Sep 17 00:00:00 2001 From: Peter Zhelezniakov Date: Mon, 23 Mar 2009 14:09:32 +0300 Subject: [PATCH 165/292] 6653395: Default LAF is set to CrossPlatformLookAndFeel not SystemLookAndFeel Swing now checks AppContext properties to determine default LAF name. This is needed for plugin to be able to set default LAF w/o loading Swing classes. Reviewed-by: alexp, loneid --- .../share/classes/javax/swing/UIManager.java | 32 +++++++++++++------ 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/jdk/src/share/classes/javax/swing/UIManager.java b/jdk/src/share/classes/javax/swing/UIManager.java index 43476f2d693..bd6f6ac9144 100644 --- a/jdk/src/share/classes/javax/swing/UIManager.java +++ b/jdk/src/share/classes/javax/swing/UIManager.java @@ -58,6 +58,8 @@ import sun.awt.OSInfo; import sun.security.action.GetPropertyAction; import sun.swing.SwingUtilities2; import java.lang.reflect.Method; +import java.util.HashMap; +import sun.awt.AppContext; /** @@ -1323,19 +1325,29 @@ public class UIManager implements Serializable return; } - String metalLnf = getCrossPlatformLookAndFeelClassName(); - String lnfDefault = metalLnf; + // Try to get default LAF from system property, then from AppContext + // (6653395), then use cross-platform one by default. + String lafName = null; + HashMap lafData = + (HashMap) AppContext.getAppContext().remove("swing.lafdata"); + if (lafData != null) { + lafName = (String) lafData.remove("defaultlaf"); + } + if (lafName == null) { + lafName = getCrossPlatformLookAndFeelClassName(); + } + lafName = swingProps.getProperty(defaultLAFKey, lafName); - String lnfName = "" ; try { - lnfName = swingProps.getProperty(defaultLAFKey, lnfDefault); - setLookAndFeel(lnfName); + setLookAndFeel(lafName); } catch (Exception e) { - try { - lnfName = swingProps.getProperty(defaultLAFKey, metalLnf); - setLookAndFeel(lnfName); - } catch (Exception e2) { - throw new Error("can't load " + lnfName); + throw new Error("Cannot load " + lafName); + } + + // Set any properties passed through AppContext (6653395). + if (lafData != null) { + for (Object key: lafData.keySet()) { + UIManager.put(key, lafData.get(key)); } } } From 1a1db06a37d6ae18abf589f410fdb784f583fcab Mon Sep 17 00:00:00 2001 From: Peter Zhelezniakov Date: Mon, 23 Mar 2009 16:41:47 +0300 Subject: [PATCH 166/292] 4783068: Components with HTML text should gray out the text when disabled Views fixed to use different colors when container is disabled Reviewed-by: gsm, rupashka --- .../classes/javax/swing/text/GlyphView.java | 10 +- .../javax/swing/text/html/ImageView.java | 97 +++++++++++-------- .../javax/swing/text/html/StyleSheet.java | 18 ++-- .../javax/swing/text/html/Test4783068.java | 93 ++++++++++++++++++ 4 files changed, 162 insertions(+), 56 deletions(-) create mode 100644 jdk/test/javax/swing/text/html/Test4783068.java diff --git a/jdk/src/share/classes/javax/swing/text/GlyphView.java b/jdk/src/share/classes/javax/swing/text/GlyphView.java index 3cb4efe59f9..364fd69e8ee 100644 --- a/jdk/src/share/classes/javax/swing/text/GlyphView.java +++ b/jdk/src/share/classes/javax/swing/text/GlyphView.java @@ -30,6 +30,7 @@ import javax.swing.event.*; import java.util.BitSet; import java.util.Locale; +import javax.swing.UIManager; import sun.swing.SwingUtilities2; /** @@ -382,11 +383,10 @@ public class GlyphView extends View implements TabableView, Cloneable { Color bg = getBackground(); Color fg = getForeground(); - if (c instanceof JTextComponent) { - JTextComponent tc = (JTextComponent) c; - if (!tc.isEnabled()) { - fg = tc.getDisabledTextColor(); - } + if (c != null && ! c.isEnabled()) { + fg = (c instanceof JTextComponent ? + ((JTextComponent)c).getDisabledTextColor() : + UIManager.getColor("textInactiveText")); } if (bg != null) { g.setColor(bg); diff --git a/jdk/src/share/classes/javax/swing/text/html/ImageView.java b/jdk/src/share/classes/javax/swing/text/html/ImageView.java index 4b645b6a725..0831e2567cd 100644 --- a/jdk/src/share/classes/javax/swing/text/html/ImageView.java +++ b/jdk/src/share/classes/javax/swing/text/html/ImageView.java @@ -25,9 +25,7 @@ package javax.swing.text.html; import java.awt.*; -import java.awt.event.*; import java.awt.image.ImageObserver; -import java.io.*; import java.net.*; import java.util.Dictionary; import javax.swing.*; @@ -97,6 +95,7 @@ public class ImageView extends View { private AttributeSet attr; private Image image; + private Image disabledImage; private int width; private int height; /** Bitmask containing some of the above bitmask values. Because the @@ -193,6 +192,17 @@ public class ImageView extends View { return image; } + private Image getImage(boolean enabled) { + Image img = getImage(); + if (! enabled) { + if (disabledImage == null) { + disabledImage = GrayFilter.createDisabledImage(img); + } + img = disabledImage; + } + return img; + } + /** * Sets how the image is loaded. If newValue is true, * the image we be loaded when first asked for, otherwise it will @@ -338,8 +348,6 @@ public class ImageView extends View { Rectangle rect = (a instanceof Rectangle) ? (Rectangle)a : a.getBounds(); - - Image image = getImage(); Rectangle clip = g.getClipBounds(); fBounds.setBounds(rect); @@ -350,29 +358,29 @@ public class ImageView extends View { rect.width - leftInset - rightInset, rect.height - topInset - bottomInset); } - if (image != null) { - if (!hasPixels(image)) { - // No pixels yet, use the default - Icon icon = (image == null) ? getNoImageIcon() : - getLoadingImageIcon(); + Container host = getContainer(); + Image img = getImage(host == null || host.isEnabled()); + if (img != null) { + if (! hasPixels(img)) { + // No pixels yet, use the default + Icon icon = getLoadingImageIcon(); if (icon != null) { - icon.paintIcon(getContainer(), g, rect.x + leftInset, - rect.y + topInset); + icon.paintIcon(host, g, + rect.x + leftInset, rect.y + topInset); } } else { // Draw the image - g.drawImage(image, rect.x + leftInset, rect.y + topInset, + g.drawImage(img, rect.x + leftInset, rect.y + topInset, width, height, imageObserver); } } else { Icon icon = getNoImageIcon(); - if (icon != null) { - icon.paintIcon(getContainer(), g, rect.x + leftInset, - rect.y + topInset); + icon.paintIcon(host, g, + rect.x + leftInset, rect.y + topInset); } View view = getAltView(); // Paint the view representing the alt text, if its non-null @@ -855,7 +863,9 @@ public class ImageView extends View { // it will pick up the new height/width, if necessary. public boolean imageUpdate(Image img, int flags, int x, int y, int newWidth, int newHeight ) { - if (image == null || image != img || getParent() == null) { + if (img != image && img != disabledImage || + image == null || getParent() == null) { + return false; } @@ -873,6 +883,8 @@ public class ImageView extends View { if ((state & HEIGHT_FLAG) != HEIGHT_FLAG) { height = DEFAULT_HEIGHT; } + } else { + disabledImage = null; } if ((state & LOADING_FLAG) == LOADING_FLAG) { // No need to resize or repaint, still in the process @@ -885,38 +897,37 @@ public class ImageView extends View { return false; } - // Resize image if necessary: - short changed = 0; - if ((flags & ImageObserver.HEIGHT) != 0 && !getElement(). - getAttributes().isDefined(HTML.Attribute.HEIGHT)) { - changed |= 1; - } - if ((flags & ImageObserver.WIDTH) != 0 && !getElement(). - getAttributes().isDefined(HTML.Attribute.WIDTH)) { - changed |= 2; - } + if (image == img) { + // Resize image if necessary: + short changed = 0; + if ((flags & ImageObserver.HEIGHT) != 0 && !getElement(). + getAttributes().isDefined(HTML.Attribute.HEIGHT)) { + changed |= 1; + } + if ((flags & ImageObserver.WIDTH) != 0 && !getElement(). + getAttributes().isDefined(HTML.Attribute.WIDTH)) { + changed |= 2; + } - synchronized(ImageView.this) { - if (image != img) { - return false; + synchronized(ImageView.this) { + if ((changed & 1) == 1 && (state & WIDTH_FLAG) == 0) { + width = newWidth; + } + if ((changed & 2) == 2 && (state & HEIGHT_FLAG) == 0) { + height = newHeight; + } + if ((state & LOADING_FLAG) == LOADING_FLAG) { + // No need to resize or repaint, still in the process of + // loading. + return true; + } } - if ((changed & 1) == 1 && (state & WIDTH_FLAG) == 0) { - width = newWidth; - } - if ((changed & 2) == 2 && (state & HEIGHT_FLAG) == 0) { - height = newHeight; - } - if ((state & LOADING_FLAG) == LOADING_FLAG) { - // No need to resize or repaint, still in the process of - // loading. + if (changed != 0) { + // May need to resize myself, asynchronously: + safePreferenceChanged(); return true; } } - if (changed != 0) { - // May need to resize myself, asynchronously: - safePreferenceChanged(); - return true; - } // Repaint when done or when new pixels arrive: if ((flags & (FRAMEBITS|ALLBITS)) != 0) { diff --git a/jdk/src/share/classes/javax/swing/text/html/StyleSheet.java b/jdk/src/share/classes/javax/swing/text/html/StyleSheet.java index 0cf18047872..c2a07739a04 100644 --- a/jdk/src/share/classes/javax/swing/text/html/StyleSheet.java +++ b/jdk/src/share/classes/javax/swing/text/html/StyleSheet.java @@ -31,6 +31,7 @@ import java.io.*; import java.net.*; import javax.swing.Icon; import javax.swing.ImageIcon; +import javax.swing.UIManager; import javax.swing.border.*; import javax.swing.event.ChangeListener; import javax.swing.text.*; @@ -2161,6 +2162,7 @@ public class StyleSheet extends StyleContext { */ public void paint(Graphics g, float x, float y, float w, float h, View v, int item) { View cv = v.getView(item); + Container host = v.getContainer(); Object name = cv.getElement().getAttributes().getAttribute (StyleConstants.NameAttribute); // Only draw something if the View is a list item. This won't @@ -2171,7 +2173,7 @@ public class StyleSheet extends StyleContext { } // deside on what side draw bullets, etc. isLeftToRight = - cv.getContainer().getComponentOrientation().isLeftToRight(); + host.getComponentOrientation().isLeftToRight(); // How the list indicator is aligned is not specified, it is // left up to the UA. IE and NS differ on this behavior. @@ -2200,15 +2202,15 @@ public class StyleSheet extends StyleContext { } // set the color of a decoration - if (ss != null) { - g.setColor(ss.getForeground(cv.getAttributes())); - } else { - g.setColor(Color.black); - } + Color c = (host.isEnabled() + ? (ss != null + ? ss.getForeground(cv.getAttributes()) + : host.getForeground()) + : UIManager.getColor("textInactiveText")); + g.setColor(c); if (img != null) { - drawIcon(g, (int) x, (int) y, (int) w, (int) h, align, - v.getContainer()); + drawIcon(g, (int) x, (int) y, (int) w, (int) h, align, host); return; } CSS.Value childtype = getChildType(cv); diff --git a/jdk/test/javax/swing/text/html/Test4783068.java b/jdk/test/javax/swing/text/html/Test4783068.java new file mode 100644 index 00000000000..08859788e05 --- /dev/null +++ b/jdk/test/javax/swing/text/html/Test4783068.java @@ -0,0 +1,93 @@ +/* + * Copyright 2007 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 4783068 + @summary Disabled components should render grayed-out HTML + @author Peter Zhelezniakov + @run main Test4783068 +*/ + +import java.awt.*; +import java.awt.image.BufferedImage; +import javax.swing.*; +import javax.swing.plaf.metal.MetalLookAndFeel; + +public class Test4783068 { + final static Color TEST_COLOR = Color.WHITE; + + final static String html = "" + + "This is a colored text" + + "

with a link" + + "

  • an unordered
  • list
" + + "
  1. and an ordered
  2. list
" + + ""; + + + void test() { + try { + UIManager.setLookAndFeel(new MetalLookAndFeel()); + } catch (UnsupportedLookAndFeelException e) { + throw new Error("Cannot set Metal LAF"); + } + // Render text using background color + UIManager.put("textInactiveText", TEST_COLOR); + + test(new JLabel(html)); + test(new JButton(html)); + + JEditorPane pane = new JEditorPane("text/html", html); + pane.setDisabledTextColor(TEST_COLOR); + test(pane); + } + + void test(JComponent c) { + c.setEnabled(false); + c.setOpaque(true); + c.setBackground(TEST_COLOR); + c.setBorder(null); + Dimension size = c.getPreferredSize(); + c.setBounds(0, 0, size.width, size.height); + + BufferedImage image = new BufferedImage(size.width, size.height, BufferedImage.TYPE_INT_ARGB); + c.paint(image.getGraphics()); + + int rgb = TEST_COLOR.getRGB(); + for (int i = 0; i < size.height; i++) { + for (int j = 0; j < size.width; j++) { + if (image.getRGB(j, i) != rgb) { + throw new RuntimeException( + String.format("Color mismatch at [%d, %d]", j, i)); + } + } + } + } + + public static void main(String[] args) throws Exception { + SwingUtilities.invokeAndWait(new Runnable() { + @Override public void run() { + new Test4783068().test(); + } + }); + } +} From cd71edadc5d1a1018d4ef71a36c977ff308b89ba Mon Sep 17 00:00:00 2001 From: Dmitry Cherepanov Date: Mon, 23 Mar 2009 09:47:39 -0400 Subject: [PATCH 167/292] 6730447: Support for high resolution mouse wheel is still incomplete. AWT panel needs to be supported Reviewed-by: art, dav --- .../native/sun/windows/awt_Component.cpp | 15 +- .../native/sun/windows/awt_Component.h | 2 +- .../AWTPanelSmoothWheel.html | 20 ++ .../AWTPanelSmoothWheel.java | 251 ++++++++++++++++++ 4 files changed, 280 insertions(+), 8 deletions(-) create mode 100644 jdk/test/java/awt/event/MouseEvent/AWTPanelSmoothWheel/AWTPanelSmoothWheel.html create mode 100644 jdk/test/java/awt/event/MouseEvent/AWTPanelSmoothWheel/AWTPanelSmoothWheel.java diff --git a/jdk/src/windows/native/sun/windows/awt_Component.cpp b/jdk/src/windows/native/sun/windows/awt_Component.cpp index 959998d9ec1..97c7ad4605f 100644 --- a/jdk/src/windows/native/sun/windows/awt_Component.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Component.cpp @@ -205,8 +205,6 @@ BOOL AwtComponent::m_QueryNewPaletteCalled = FALSE; CriticalSection windowMoveLock; BOOL windowMoveLockHeld = FALSE; -int AwtComponent::sm_wheelRotationAmount = 0; - /************************************************************************ * AwtComponent methods */ @@ -246,6 +244,7 @@ AwtComponent::AwtComponent() m_bSubclassed = FALSE; m_MessagesProcessing = 0; + m_wheelRotationAmount = 0; } AwtComponent::~AwtComponent() @@ -2014,13 +2013,13 @@ MsgRouting AwtComponent::WmShowWindow(BOOL show, UINT status) MsgRouting AwtComponent::WmSetFocus(HWND hWndLostFocus) { - sm_wheelRotationAmount = 0; + m_wheelRotationAmount = 0; return mrDoDefault; } MsgRouting AwtComponent::WmKillFocus(HWND hWndGotFocus) { - sm_wheelRotationAmount = 0; + m_wheelRotationAmount = 0; return mrDoDefault; } @@ -2431,11 +2430,11 @@ MsgRouting AwtComponent::WmMouseWheel(UINT flags, int x, int y, BOOL result; UINT platformLines; - sm_wheelRotationAmount += wheelRotation; + m_wheelRotationAmount += wheelRotation; // AWT interprets wheel rotation differently than win32, so we need to // decode wheel amount. - jint roundedWheelRotation = sm_wheelRotationAmount / (-1 * WHEEL_DELTA); + jint roundedWheelRotation = m_wheelRotationAmount / (-1 * WHEEL_DELTA); jdouble preciseWheelRotation = (jdouble) wheelRotation / (-1 * WHEEL_DELTA); MSG msg; @@ -2461,7 +2460,9 @@ MsgRouting AwtComponent::WmMouseWheel(UINT flags, int x, int y, eventPt.x, eventPt.y, GetJavaModifiers(), 0, 0, scrollType, scrollLines, roundedWheelRotation, preciseWheelRotation, &msg); - sm_wheelRotationAmount %= WHEEL_DELTA; + m_wheelRotationAmount %= WHEEL_DELTA; + // this message could be propagated up to the parent chain + // by the mouse message post processors return mrConsume; } diff --git a/jdk/src/windows/native/sun/windows/awt_Component.h b/jdk/src/windows/native/sun/windows/awt_Component.h index 148bdcfc005..3860c605018 100644 --- a/jdk/src/windows/native/sun/windows/awt_Component.h +++ b/jdk/src/windows/native/sun/windows/awt_Component.h @@ -807,7 +807,7 @@ private: int windowMoveLockPosCY; // 6524352: support finer-resolution - static int sm_wheelRotationAmount; + int m_wheelRotationAmount; /* * The association list of children's IDs and corresponding components. diff --git a/jdk/test/java/awt/event/MouseEvent/AWTPanelSmoothWheel/AWTPanelSmoothWheel.html b/jdk/test/java/awt/event/MouseEvent/AWTPanelSmoothWheel/AWTPanelSmoothWheel.html new file mode 100644 index 00000000000..2e613212541 --- /dev/null +++ b/jdk/test/java/awt/event/MouseEvent/AWTPanelSmoothWheel/AWTPanelSmoothWheel.html @@ -0,0 +1,20 @@ + + + + AWTPanelSmoothWheel + + + +

AWTPanelSmoothWheel
Bug ID: 6730447

+ +

See the dialog box (usually in upper left corner) for instructions

+ + + + diff --git a/jdk/test/java/awt/event/MouseEvent/AWTPanelSmoothWheel/AWTPanelSmoothWheel.java b/jdk/test/java/awt/event/MouseEvent/AWTPanelSmoothWheel/AWTPanelSmoothWheel.java new file mode 100644 index 00000000000..c28682e6475 --- /dev/null +++ b/jdk/test/java/awt/event/MouseEvent/AWTPanelSmoothWheel/AWTPanelSmoothWheel.java @@ -0,0 +1,251 @@ +/* + * Copyright 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 6730447 + @summary Support for high resolution mouse wheel is still incomplete. AWT panel needs to be supported + @author dmitry.cherepanov@...: area=awt.mouse + @run applet/manual=yesno AWTPanelSmoothWheel.html +*/ + +/** + * AWTPanelSmoothWheel.java + * + * summary: + */ + +import java.applet.Applet; +import java.awt.*; +import java.awt.event.*; + +//Manual tests should run as applet tests if possible because they +// get their environments cleaned up, including AWT threads, any +// test created threads, and any system resources used by the test +// such as file descriptors. (This is normally not a problem as +// main tests usually run in a separate VM, however on some platforms +// such as the Mac, separate VMs are not possible and non-applet +// tests will cause problems). Also, you don't have to worry about +// synchronisation stuff in Applet tests the way you do in main +// tests... + + +public class AWTPanelSmoothWheel extends Applet +{ + //Declare things used in the test, like buttons and labels here + + public void init() + { + //Create instructions for the user here, as well as set up + // the environment -- set the layout manager, add buttons, + // etc. + this.setLayout (new BorderLayout ()); + + String[] instructions = + { + " the test is relevant for windows platforms and ", + " mouses with high-resolution wheel, please just press pass if it's not the case ", + " place the mouse cursor above the green panel and rotate the mouse wheel " , + " the test will print all mouse wheel messages into the logging panel, ", + " please make sure that some of the messages have non-zero 'wheelRotation' value ", + " in this case the test passes, otherwise it fails, ", + " please make sure the test works OK if the mouse wheel is rotated very slow " + }; + Sysout.createDialogWithInstructions( instructions ); + + }//End init() + + public void start () + { + Panel panel = new Panel(); + panel.setBackground(Color.green); + panel.addMouseWheelListener(new MouseWheelListener() { + public void mouseWheelMoved(MouseWheelEvent e) { + Sysout.println(e.toString()); + } + }); + + //Get things going. Request focus, set size, et cetera + setSize (200,200); + setLayout(new BorderLayout()); + add(panel, BorderLayout.CENTER); + setVisible(true); + validate(); + + //What would normally go into main() will probably go here. + //Use System.out.println for diagnostic messages that you want + // to read after the test is done. + //Use Sysout.println for messages you want the tester to read. + + }// start() + + //The rest of this class is the actions which perform the test... + + //Use Sysout.println to communicate with the user NOT System.out!! + //Sysout.println ("Something Happened!"); + +}// class ManualYesNoTest + +/* Place other classes related to the test after this line */ + + + + + +/**************************************************** + Standard Test Machinery + DO NOT modify anything below -- it's a standard + chunk of code whose purpose is to make user + interaction uniform, and thereby make it simpler + to read and understand someone else's test. + ****************************************************/ + +/** + This is part of the standard test machinery. + It creates a dialog (with the instructions), and is the interface + for sending text messages to the user. + To print the instructions, send an array of strings to Sysout.createDialog + WithInstructions method. Put one line of instructions per array entry. + To display a message for the tester to see, simply call Sysout.println + with the string to be displayed. + This mimics System.out.println but works within the test harness as well + as standalone. + */ + +class Sysout +{ + private static TestDialog dialog; + + public static void createDialogWithInstructions( String[] instructions ) + { + dialog = new TestDialog( new Frame(), "Instructions" ); + dialog.printInstructions( instructions ); + dialog.setVisible(true); + 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.setVisible(true); + 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(); + + setVisible(true); + }// 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" ); + System.out.println(messageIn); + } + +}// TestDialog class + From 3f0b988cfc8d0cd062d366da0db0cc2e2f094f3a Mon Sep 17 00:00:00 2001 From: Xueming Shen Date: Mon, 23 Mar 2009 09:19:23 -0700 Subject: [PATCH 168/292] 6636323: Optimize handling of builtin charsets 6636319: Encoders should implement isLegalReplacement(byte[] repl) Optimized new String(byte[], cs/csn) and String.getBytes(cs/csn) for speed and memory consumption in singlebyte case. Reviewed-by: alanb --- jdk/make/java/nio/FILES_java.gmk | 2 + .../share/classes/java/lang/StringCoding.java | 188 +++++++++++----- .../classes/sun/nio/cs/ArrayDecoder.java | 35 +++ .../classes/sun/nio/cs/ArrayEncoder.java | 35 +++ .../share/classes/sun/nio/cs/ISO_8859_1.java | 54 ++++- .../share/classes/sun/nio/cs/SingleByte.java | 59 +++++- .../share/classes/sun/nio/cs/US_ASCII.java | 59 +++++- jdk/test/sun/nio/cs/FindEncoderBugs.java | 1 - jdk/test/sun/nio/cs/StrCodingBenchmark.java | 200 ++++++++++++++++++ jdk/test/sun/nio/cs/TestStringCoding.java | 151 +++++++++++++ 10 files changed, 711 insertions(+), 73 deletions(-) create mode 100644 jdk/src/share/classes/sun/nio/cs/ArrayDecoder.java create mode 100644 jdk/src/share/classes/sun/nio/cs/ArrayEncoder.java create mode 100644 jdk/test/sun/nio/cs/StrCodingBenchmark.java create mode 100644 jdk/test/sun/nio/cs/TestStringCoding.java diff --git a/jdk/make/java/nio/FILES_java.gmk b/jdk/make/java/nio/FILES_java.gmk index 5027274f209..637b8dc4f96 100644 --- a/jdk/make/java/nio/FILES_java.gmk +++ b/jdk/make/java/nio/FILES_java.gmk @@ -220,6 +220,8 @@ FILES_src = \ sun/nio/ch/Util.java \ \ sun/nio/cs/AbstractCharsetProvider.java \ + sun/nio/cs/ArrayDecoder.java \ + sun/nio/cs/ArrayEncoder.java \ sun/nio/cs/FastCharsetProvider.java \ sun/nio/cs/HistoricallyNamedCharset.java \ sun/nio/cs/ISO_8859_1.java \ diff --git a/jdk/src/share/classes/java/lang/StringCoding.java b/jdk/src/share/classes/java/lang/StringCoding.java index 833fdf5f603..885db317af5 100644 --- a/jdk/src/share/classes/java/lang/StringCoding.java +++ b/jdk/src/share/classes/java/lang/StringCoding.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-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 @@ -25,13 +25,10 @@ package java.lang; -import java.io.CharConversionException; import java.io.UnsupportedEncodingException; import java.lang.ref.SoftReference; import java.nio.ByteBuffer; import java.nio.CharBuffer; -import java.nio.BufferOverflowException; -import java.nio.BufferUnderflowException; import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import java.nio.charset.CharsetEncoder; @@ -39,11 +36,12 @@ import java.nio.charset.CharacterCodingException; import java.nio.charset.CoderResult; import java.nio.charset.CodingErrorAction; import java.nio.charset.IllegalCharsetNameException; -import java.nio.charset.MalformedInputException; import java.nio.charset.UnsupportedCharsetException; import java.util.Arrays; import sun.misc.MessageUtils; import sun.nio.cs.HistoricallyNamedCharset; +import sun.nio.cs.ArrayDecoder; +import sun.nio.cs.ArrayEncoder; /** * Utility class for string encoding and decoding. @@ -74,10 +72,8 @@ class StringCoding { // Trim the given byte array to the given length // - private static byte[] safeTrim(byte[] ba, int len, Charset cs) { - if (len == ba.length - && (System.getSecurityManager() == null - || cs.getClass().getClassLoader0() == null)) + private static byte[] safeTrim(byte[] ba, int len, Charset cs, boolean isTrusted) { + if (len == ba.length && (isTrusted || System.getSecurityManager() == null)) return ba; else return Arrays.copyOf(ba, len); @@ -85,10 +81,9 @@ class StringCoding { // Trim the given char array to the given length // - private static char[] safeTrim(char[] ca, int len, Charset cs) { - if (len == ca.length - && (System.getSecurityManager() == null - || cs.getClass().getClassLoader0() == null)) + private static char[] safeTrim(char[] ca, int len, + Charset cs, boolean isTrusted) { + if (len == ca.length && (isTrusted || System.getSecurityManager() == null)) return ca; else return Arrays.copyOf(ca, len); @@ -128,6 +123,7 @@ class StringCoding { private final String requestedCharsetName; private final Charset cs; private final CharsetDecoder cd; + private final boolean isTrusted; private StringDecoder(Charset cs, String rcn) { this.requestedCharsetName = rcn; @@ -135,6 +131,7 @@ class StringCoding { this.cd = cs.newDecoder() .onMalformedInput(CodingErrorAction.REPLACE) .onUnmappableCharacter(CodingErrorAction.REPLACE); + this.isTrusted = (cs.getClass().getClassLoader0() == null); } String charsetName() { @@ -152,24 +149,28 @@ class StringCoding { char[] ca = new char[en]; if (len == 0) return ca; - cd.reset(); - ByteBuffer bb = ByteBuffer.wrap(ba, off, len); - CharBuffer cb = CharBuffer.wrap(ca); - try { - CoderResult cr = cd.decode(bb, cb, true); - if (!cr.isUnderflow()) - cr.throwException(); - cr = cd.flush(cb); - if (!cr.isUnderflow()) - cr.throwException(); - } catch (CharacterCodingException x) { - // Substitution is always enabled, - // so this shouldn't happen - throw new Error(x); + if (cd instanceof ArrayDecoder) { + int clen = ((ArrayDecoder)cd).decode(ba, off, len, ca); + return safeTrim(ca, clen, cs, isTrusted); + } else { + cd.reset(); + ByteBuffer bb = ByteBuffer.wrap(ba, off, len); + CharBuffer cb = CharBuffer.wrap(ca); + try { + CoderResult cr = cd.decode(bb, cb, true); + if (!cr.isUnderflow()) + cr.throwException(); + cr = cd.flush(cb); + if (!cr.isUnderflow()) + cr.throwException(); + } catch (CharacterCodingException x) { + // Substitution is always enabled, + // so this shouldn't happen + throw new Error(x); + } + return safeTrim(ca, cb.position(), cs, isTrusted); } - return safeTrim(ca, cb.position(), cs); } - } static char[] decode(String charsetName, byte[] ba, int off, int len) @@ -193,8 +194,57 @@ class StringCoding { } static char[] decode(Charset cs, byte[] ba, int off, int len) { - StringDecoder sd = new StringDecoder(cs, cs.name()); - return sd.decode(Arrays.copyOfRange(ba, off, off + len), 0, len); + // (1)We never cache the "external" cs, the only benefit of creating + // an additional StringDe/Encoder object to wrap it is to share the + // de/encode() method. These SD/E objects are short-lifed, the young-gen + // gc should be able to take care of them well. But the best approash + // is still not to generate them if not really necessary. + // (2)The defensive copy of the input byte/char[] has a big performance + // impact, as well as the outgoing result byte/char[]. Need to do the + // optimization check of (sm==null && classLoader0==null) for both. + // (3)getClass().getClassLoader0() is expensive + // (4)There might be a timing gap in isTrusted setting. getClassLoader0() + // is only chcked (and then isTrusted gets set) when (SM==null). It is + // possible that the SM==null for now but then SM is NOT null later + // when safeTrim() is invoked...the "safe" way to do is to redundant + // check (... && (isTrusted || SM == null || getClassLoader0())) in trim + // but it then can be argued that the SM is null when the opertaion + // is started... + CharsetDecoder cd = cs.newDecoder(); + int en = scale(len, cd.maxCharsPerByte()); + char[] ca = new char[en]; + if (len == 0) + return ca; + boolean isTrusted = false; + if (System.getSecurityManager() != null) { + if (!(isTrusted = (cs.getClass().getClassLoader0() == null))) { + ba = Arrays.copyOfRange(ba, off, off + len); + off = 0; + } + } + if (cd instanceof ArrayDecoder) { + int clen = ((ArrayDecoder)cd).decode(ba, off, len, ca); + return safeTrim(ca, clen, cs, isTrusted); + } else { + cd.onMalformedInput(CodingErrorAction.REPLACE) + .onUnmappableCharacter(CodingErrorAction.REPLACE) + .reset(); + ByteBuffer bb = ByteBuffer.wrap(ba, off, len); + CharBuffer cb = CharBuffer.wrap(ca); + try { + CoderResult cr = cd.decode(bb, cb, true); + if (!cr.isUnderflow()) + cr.throwException(); + cr = cd.flush(cb); + if (!cr.isUnderflow()) + cr.throwException(); + } catch (CharacterCodingException x) { + // Substitution is always enabled, + // so this shouldn't happen + throw new Error(x); + } + return safeTrim(ca, cb.position(), cs, isTrusted); + } } static char[] decode(byte[] ba, int off, int len) { @@ -218,14 +268,12 @@ class StringCoding { } } - - - // -- Encoding -- private static class StringEncoder { private Charset cs; private CharsetEncoder ce; private final String requestedCharsetName; + private final boolean isTrusted; private StringEncoder(Charset cs, String rcn) { this.requestedCharsetName = rcn; @@ -233,6 +281,7 @@ class StringCoding { this.ce = cs.newEncoder() .onMalformedInput(CodingErrorAction.REPLACE) .onUnmappableCharacter(CodingErrorAction.REPLACE); + this.isTrusted = (cs.getClass().getClassLoader0() == null); } String charsetName() { @@ -250,23 +299,27 @@ class StringCoding { byte[] ba = new byte[en]; if (len == 0) return ba; - - ce.reset(); - ByteBuffer bb = ByteBuffer.wrap(ba); - CharBuffer cb = CharBuffer.wrap(ca, off, len); - try { - CoderResult cr = ce.encode(cb, bb, true); - if (!cr.isUnderflow()) - cr.throwException(); - cr = ce.flush(bb); - if (!cr.isUnderflow()) - cr.throwException(); - } catch (CharacterCodingException x) { - // Substitution is always enabled, - // so this shouldn't happen - throw new Error(x); + if (ce instanceof ArrayEncoder) { + int blen = ((ArrayEncoder)ce).encode(ca, off, len, ba); + return safeTrim(ba, blen, cs, isTrusted); + } else { + ce.reset(); + ByteBuffer bb = ByteBuffer.wrap(ba); + CharBuffer cb = CharBuffer.wrap(ca, off, len); + try { + CoderResult cr = ce.encode(cb, bb, true); + if (!cr.isUnderflow()) + cr.throwException(); + cr = ce.flush(bb); + if (!cr.isUnderflow()) + cr.throwException(); + } catch (CharacterCodingException x) { + // Substitution is always enabled, + // so this shouldn't happen + throw new Error(x); + } + return safeTrim(ba, bb.position(), cs, isTrusted); } - return safeTrim(ba, bb.position(), cs); } } @@ -291,8 +344,39 @@ class StringCoding { } static byte[] encode(Charset cs, char[] ca, int off, int len) { - StringEncoder se = new StringEncoder(cs, cs.name()); - return se.encode(Arrays.copyOfRange(ca, off, off + len), 0, len); + CharsetEncoder ce = cs.newEncoder(); + int en = scale(len, ce.maxBytesPerChar()); + byte[] ba = new byte[en]; + if (len == 0) + return ba; + boolean isTrusted = false; + if (System.getSecurityManager() != null) { + if (!(isTrusted = (cs.getClass().getClassLoader0() == null))) { + ca = Arrays.copyOfRange(ca, off, off + len); + off = 0; + } + } + if (ce instanceof ArrayEncoder) { + int blen = ((ArrayEncoder)ce).encode(ca, off, len, ba); + return safeTrim(ba, blen, cs, isTrusted); + } else { + ce.onMalformedInput(CodingErrorAction.REPLACE) + .onUnmappableCharacter(CodingErrorAction.REPLACE) + .reset(); + ByteBuffer bb = ByteBuffer.wrap(ba); + CharBuffer cb = CharBuffer.wrap(ca, off, len); + try { + CoderResult cr = ce.encode(cb, bb, true); + if (!cr.isUnderflow()) + cr.throwException(); + cr = ce.flush(bb); + if (!cr.isUnderflow()) + cr.throwException(); + } catch (CharacterCodingException x) { + throw new Error(x); + } + return safeTrim(ba, bb.position(), cs, isTrusted); + } } static byte[] encode(char[] ca, int off, int len) { diff --git a/jdk/src/share/classes/sun/nio/cs/ArrayDecoder.java b/jdk/src/share/classes/sun/nio/cs/ArrayDecoder.java new file mode 100644 index 00000000000..daff5ec39d1 --- /dev/null +++ b/jdk/src/share/classes/sun/nio/cs/ArrayDecoder.java @@ -0,0 +1,35 @@ +/* + * Copyright 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. 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. + */ + +package sun.nio.cs; + +/* + * FastPath byte[]->char[] decoder, REPLACE on malformed or + * unmappable input. + */ + +public interface ArrayDecoder { + int decode(byte[] src, int off, int len, char[] dst); +} diff --git a/jdk/src/share/classes/sun/nio/cs/ArrayEncoder.java b/jdk/src/share/classes/sun/nio/cs/ArrayEncoder.java new file mode 100644 index 00000000000..1eb4726f70b --- /dev/null +++ b/jdk/src/share/classes/sun/nio/cs/ArrayEncoder.java @@ -0,0 +1,35 @@ +/* + * Copyright 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. 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. + */ + +package sun.nio.cs; + +/* + * FastPath char[]->byte[] encoder, REPLACE on malformed input or + * unmappable input. + */ + +public interface ArrayEncoder { + int encode(char[] src, int off, int len, byte[] dst); +} diff --git a/jdk/src/share/classes/sun/nio/cs/ISO_8859_1.java b/jdk/src/share/classes/sun/nio/cs/ISO_8859_1.java index ad27a1507ac..7eb3b5b8a83 100644 --- a/jdk/src/share/classes/sun/nio/cs/ISO_8859_1.java +++ b/jdk/src/share/classes/sun/nio/cs/ISO_8859_1.java @@ -23,9 +23,6 @@ * have any questions. */ -/* - */ - package sun.nio.cs; import java.nio.ByteBuffer; @@ -34,10 +31,7 @@ import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import java.nio.charset.CharsetEncoder; import java.nio.charset.CoderResult; -import java.nio.charset.CharacterCodingException; -import java.nio.charset.MalformedInputException; -import java.nio.charset.UnmappableCharacterException; - +import java.util.Arrays; class ISO_8859_1 extends Charset @@ -65,8 +59,8 @@ class ISO_8859_1 return new Encoder(this); } - private static class Decoder extends CharsetDecoder { - + private static class Decoder extends CharsetDecoder + implements ArrayDecoder { private Decoder(Charset cs) { super(cs, 1.0f, 1.0f); } @@ -127,10 +121,18 @@ class ISO_8859_1 return decodeBufferLoop(src, dst); } + public int decode(byte[] src, int sp, int len, char[] dst) { + if (len > dst.length) + len = dst.length; + int dp = 0; + while (dp < len) + dst[dp++] = (char)(src[sp++] & 0xff); + return dp; + } } - private static class Encoder extends CharsetEncoder { - + private static class Encoder extends CharsetEncoder + implements ArrayEncoder { private Encoder(Charset cs) { super(cs, 1.0f, 1.0f); } @@ -139,6 +141,10 @@ class ISO_8859_1 return c <= '\u00FF'; } + public boolean isLegalReplacement(byte[] repl) { + return (repl.length == 1); // we accept any byte value + } + private final Surrogate.Parser sgp = new Surrogate.Parser(); private CoderResult encodeArrayLoop(CharBuffer src, @@ -208,5 +214,31 @@ class ISO_8859_1 return encodeBufferLoop(src, dst); } + private byte repl = (byte)'?'; + protected void implReplaceWith(byte[] newReplacement) { + repl = newReplacement[0]; + } + + public int encode(char[] src, int sp, int len, byte[] dst) { + int dp = 0; + int sl = sp + Math.min(len, dst.length); + while (sp < sl) { + char c = src[sp++]; + if (c <= '\u00FF') { + dst[dp++] = (byte)c; + continue; + } + if (Surrogate.isHigh(c) && sp < sl && + Surrogate.isLow(src[sp])) { + if (len > dst.length) { + sl++; + len--; + } + sp++; + } + dst[dp++] = repl; + } + return dp; + } } } diff --git a/jdk/src/share/classes/sun/nio/cs/SingleByte.java b/jdk/src/share/classes/sun/nio/cs/SingleByte.java index fdbf4e3c643..9b0531eebd9 100644 --- a/jdk/src/share/classes/sun/nio/cs/SingleByte.java +++ b/jdk/src/share/classes/sun/nio/cs/SingleByte.java @@ -32,6 +32,7 @@ import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import java.nio.charset.CharsetEncoder; import java.nio.charset.CoderResult; +import java.util.Arrays; import static sun.nio.cs.CharsetMapping.*; public class SingleByte @@ -45,7 +46,8 @@ public class SingleByte return cr; } - public static class Decoder extends CharsetDecoder { + final public static class Decoder extends CharsetDecoder + implements ArrayDecoder { private final char[] b2c; public Decoder(Charset cs, char[] b2c) { @@ -108,9 +110,29 @@ public class SingleByte private final char decode(int b) { return b2c[b + 128]; } + + private char repl = '\uFFFD'; + protected void implReplaceWith(String newReplacement) { + repl = newReplacement.charAt(0); + } + + public int decode(byte[] src, int sp, int len, char[] dst) { + if (len > dst.length) + len = dst.length; + int dp = 0; + while (dp < len) { + dst[dp] = decode(src[sp++]); + if (dst[dp] == UNMAPPABLE_DECODING) { + dst[dp] = repl; + } + dp++; + } + return dp; + } } - public static class Encoder extends CharsetEncoder { + final public static class Encoder extends CharsetEncoder + implements ArrayEncoder { private Surrogate.Parser sgp; private final char[] c2b; private final char[] c2bIndex; @@ -125,6 +147,11 @@ public class SingleByte return encode(c) != UNMAPPABLE_ENCODING; } + public boolean isLegalReplacement(byte[] repl) { + return ((repl.length == 1 && repl[0] == (byte)'?') || + super.isLegalReplacement(repl)); + } + private CoderResult encodeArrayLoop(CharBuffer src, ByteBuffer dst) { char[] sa = src.array(); int sp = src.arrayOffset() + src.position(); @@ -200,6 +227,34 @@ public class SingleByte return UNMAPPABLE_ENCODING; return c2b[index + (ch & 0xff)]; } + + private byte repl = (byte)'?'; + protected void implReplaceWith(byte[] newReplacement) { + repl = newReplacement[0]; + } + + public int encode(char[] src, int sp, int len, byte[] dst) { + int dp = 0; + int sl = sp + Math.min(len, dst.length); + while (sp < sl) { + char c = src[sp++]; + int b = encode(c); + if (b != UNMAPPABLE_ENCODING) { + dst[dp++] = (byte)b; + continue; + } + if (Surrogate.isHigh(c) && sp < sl && + Surrogate.isLow(src[sp])) { + if (len > dst.length) { + sl++; + len--; + } + sp++; + } + dst[dp++] = repl; + } + return dp; + } } // init the c2b and c2bIndex tables from b2c. diff --git a/jdk/src/share/classes/sun/nio/cs/US_ASCII.java b/jdk/src/share/classes/sun/nio/cs/US_ASCII.java index d22fa64e352..fa718450768 100644 --- a/jdk/src/share/classes/sun/nio/cs/US_ASCII.java +++ b/jdk/src/share/classes/sun/nio/cs/US_ASCII.java @@ -31,10 +31,7 @@ import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import java.nio.charset.CharsetEncoder; import java.nio.charset.CoderResult; -import java.nio.charset.CharacterCodingException; -import java.nio.charset.MalformedInputException; -import java.nio.charset.UnmappableCharacterException; - +import java.util.Arrays; public class US_ASCII extends Charset @@ -61,7 +58,8 @@ public class US_ASCII return new Encoder(this); } - private static class Decoder extends CharsetDecoder { + private static class Decoder extends CharsetDecoder + implements ArrayDecoder { private Decoder(Charset cs) { super(cs, 1.0f, 1.0f); @@ -131,9 +129,27 @@ public class US_ASCII return decodeBufferLoop(src, dst); } + private char repl = '\uFFFD'; + protected void implReplaceWith(String newReplacement) { + repl = newReplacement.charAt(0); + } + + public int decode(byte[] src, int sp, int len, char[] dst) { + int dp = 0; + len = Math.min(len, dst.length); + while (dp < len) { + byte b = src[sp++]; + if (b >= 0) + dst[dp++] = (char)b; + else + dst[dp++] = repl; + } + return dp; + } } - private static class Encoder extends CharsetEncoder { + private static class Encoder extends CharsetEncoder + implements ArrayEncoder { private Encoder(Charset cs) { super(cs, 1.0f, 1.0f); @@ -143,8 +159,11 @@ public class US_ASCII return c < 0x80; } - private final Surrogate.Parser sgp = new Surrogate.Parser(); + public boolean isLegalReplacement(byte[] repl) { + return (repl.length == 1 && repl[0] >= 0); + } + private final Surrogate.Parser sgp = new Surrogate.Parser(); private CoderResult encodeArrayLoop(CharBuffer src, ByteBuffer dst) { @@ -213,6 +232,32 @@ public class US_ASCII return encodeBufferLoop(src, dst); } + private byte repl = (byte)'?'; + protected void implReplaceWith(byte[] newReplacement) { + repl = newReplacement[0]; + } + + public int encode(char[] src, int sp, int len, byte[] dst) { + int dp = 0; + int sl = sp + Math.min(len, dst.length); + while (sp < sl) { + char c = src[sp++]; + if (c < 0x80) { + dst[dp++] = (byte)c; + continue; + } + if (Surrogate.isHigh(c) && sp < sl && + Surrogate.isLow(src[sp])) { + if (len > dst.length) { + sl++; + len--; + } + sp++; + } + dst[dp++] = repl; + } + return dp; + } } } diff --git a/jdk/test/sun/nio/cs/FindEncoderBugs.java b/jdk/test/sun/nio/cs/FindEncoderBugs.java index 0f4c406d453..54bc5b268a0 100644 --- a/jdk/test/sun/nio/cs/FindEncoderBugs.java +++ b/jdk/test/sun/nio/cs/FindEncoderBugs.java @@ -526,4 +526,3 @@ public class FindEncoderBugs { System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed); if (failed > 0) throw new AssertionError("Some tests failed");} } - diff --git a/jdk/test/sun/nio/cs/StrCodingBenchmark.java b/jdk/test/sun/nio/cs/StrCodingBenchmark.java new file mode 100644 index 00000000000..73256eb2b43 --- /dev/null +++ b/jdk/test/sun/nio/cs/StrCodingBenchmark.java @@ -0,0 +1,200 @@ +/* + * Copyright (c) 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. + */ + +import java.util.*; +import java.nio.*; +import java.nio.charset.*; +import java.util.concurrent.*; +import java.util.regex.Pattern; + +/** + * Usage: java StringCodingBenchmark + * [-Diterations=N] [-Dsize=N] [-Dsubsize=N] [-Dmaxchar=N] + * [-Dfilter=REGEXP] [-DSecurityManager=true] + */ +public class StrCodingBenchmark { + abstract static class Job { + private final String name; + public Job(String name) { this.name = name; } + public String name() { return name; } + public abstract void work() throws Throwable; + } + + private static void collectAllGarbage() { + final java.util.concurrent.CountDownLatch drained + = new java.util.concurrent.CountDownLatch(1); + try { + System.gc(); // enqueue finalizable objects + new Object() { protected void finalize() { + drained.countDown(); }}; + System.gc(); // enqueue detector + drained.await(); // wait for finalizer queue to drain + System.gc(); // cleanup finalized objects + } catch (InterruptedException e) { throw new Error(e); } + } + + /** + * Runs each job for long enough that all the runtime compilers + * have had plenty of time to warm up, i.e. get around to + * compiling everything worth compiling. + * Returns array of average times per job per run. + */ + public static long[] time0(Job ... jobs) throws Throwable { + //final long warmupNanos = 10L * 1000L * 1000L * 1000L; + final long warmupNanos = 100L * 100L; + long[] nanoss = new long[jobs.length]; + for (int i = 0; i < jobs.length; i++) { + collectAllGarbage(); + long t0 = System.nanoTime(); + long t; + int j = 0; + do { jobs[i].work(); j++; } + while ((t = System.nanoTime() - t0) < warmupNanos); + nanoss[i] = t/j; + } + return nanoss; + } + + public static void time(Job ... jobs) throws Throwable { + + long[] warmup = time0(jobs); // Warm up run + long[] nanoss = time0(jobs); // Real timing run + long[] milliss = new long[jobs.length]; + double[] ratios = new double[jobs.length]; + + final String nameHeader = "Method"; + final String millisHeader = "Millis"; + final String ratioHeader = "Ratio"; + + int nameWidth = nameHeader.length(); + int millisWidth = millisHeader.length(); + int ratioWidth = ratioHeader.length(); + + for (int i = 0; i < jobs.length; i++) { + nameWidth = Math.max(nameWidth, jobs[i].name().length()); + + milliss[i] = nanoss[i]/(1000L * 1000L); + millisWidth = Math.max(millisWidth, + String.format("%d", milliss[i]).length()); + + ratios[i] = (double) nanoss[i] / (double) nanoss[0]; + ratioWidth = Math.max(ratioWidth, + String.format("%.3f", ratios[i]).length()); + } + String format = String.format("%%-%ds %%%dd %n", + nameWidth, millisWidth); + String headerFormat = String.format("%%-%ds %%%ds%n", + nameWidth, millisWidth); + System.out.printf(headerFormat, "Method", "Millis"); + + // Print out absolute and relative times, calibrated against first job + for (int i = 0; i < jobs.length; i++) + System.out.printf(format, jobs[i].name(), milliss[i], ratios[i]); + } + + public static Job[] filter(Pattern filter, Job[] jobs) { + if (filter == null) return jobs; + Job[] newJobs = new Job[jobs.length]; + int n = 0; + for (Job job : jobs) + if (filter.matcher(job.name()).find()) + newJobs[n++] = job; + // Arrays.copyOf not available in JDK 5 + Job[] ret = new Job[n]; + System.arraycopy(newJobs, 0, ret, 0, n); + return ret; + } + + static class PermissiveSecurityManger extends SecurityManager { + @Override public void checkPermission(java.security.Permission p) { + } + } + + public static void main(String[] args) throws Throwable { + final int itrs = Integer.getInteger("iterations", 100000); + final int size = Integer.getInteger("size", 2048); + final int subsize = Integer.getInteger("subsize", 128); + final int maxchar = Integer.getInteger("maxchar", 128); + final String regex = System.getProperty("filter"); + final Pattern filter = (regex == null) ? null : Pattern.compile(regex); + final boolean useSecurityManager = Boolean.getBoolean("SecurityManager"); + if (useSecurityManager) + System.setSecurityManager(new PermissiveSecurityManger()); + final Random rnd = new Random(); + + for (Charset charset: Charset.availableCharsets().values()) { + if (!("ISO-8859-1".equals(charset.name()) || + "US-ASCII".equals(charset.name()) || + charset.newDecoder() instanceof sun.nio.cs.SingleByte.Decoder)) + continue; + final String csn = charset.name(); + final Charset cs = charset; + final StringBuilder sb = new StringBuilder(); + { + final CharsetEncoder enc = cs.newEncoder(); + for (int i = 0; i < size; ) { + char c = (char) rnd.nextInt(maxchar); + if (enc.canEncode(c)) { + sb.append(c); + i++; + } + } + } + final String string = sb.toString(); + final byte[] bytes = string.getBytes(cs); + + System.out.printf("%n--------%s---------%n", csn); + for (int sz = 4; sz <= 2048; sz *= 2) { + System.out.printf(" [len=%d]%n", sz); + final byte[] bs = Arrays.copyOf(bytes, sz); + final String str = new String(bs, csn); + Job[] jobs = { + new Job("String decode: csn") { + public void work() throws Throwable { + for (int i = 0; i < itrs; i++) + new String(bs, csn); + }}, + + new Job("String decode: cs") { + public void work() throws Throwable { + for (int i = 0; i < itrs; i++) + new String(bs, cs); + }}, + + new Job("String encode: csn") { + public void work() throws Throwable { + for (int i = 0; i < itrs; i++) + str.getBytes(csn); + }}, + + new Job("String encode: cs") { + public void work() throws Throwable { + for (int i = 0; i < itrs; i++) + str.getBytes(cs); + }}, + }; + time(filter(filter, jobs)); + } + } + } +} diff --git a/jdk/test/sun/nio/cs/TestStringCoding.java b/jdk/test/sun/nio/cs/TestStringCoding.java new file mode 100644 index 00000000000..8d0c8f94f24 --- /dev/null +++ b/jdk/test/sun/nio/cs/TestStringCoding.java @@ -0,0 +1,151 @@ +/* + * Copyright 2000-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. 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 6636323 6636319 + @summary Test if StringCoding and NIO result have the same de/encoding result + * @run main/timeout=2000 TestStringCoding + */ + +import java.util.*; +import java.nio.*; +import java.nio.charset.*; + +public class TestStringCoding { + public static void main(String[] args) throws Throwable { + + for (Boolean hasSM: new boolean[] { false, true }) { + if (hasSM) + System.setSecurityManager(new PermissiveSecurityManger()); + for (Charset cs: Charset.availableCharsets().values()) { + if ("ISO-2022-CN".equals(cs.name()) || + "x-COMPOUND_TEXT".equals(cs.name()) || + "x-JISAutoDetect".equals(cs.name())) + continue; + System.out.printf("Testing(sm=%b) " + cs.name() + "....", hasSM); + // full bmp first + char[] bmpCA = new char[0x10000]; + for (int i = 0; i < 0x10000; i++) { + bmpCA[i] = (char)i; + } + byte[] sbBA = new byte[0x100]; + for (int i = 0; i < 0x100; i++) { + sbBA[i] = (byte)i; + } + test(cs, bmpCA, sbBA); + // "randomed" sizes + Random rnd = new Random(); + for (int i = 0; i < 10; i++) { + int clen = rnd.nextInt(0x10000); + int blen = rnd.nextInt(0x100); + //System.out.printf(" blen=%d, clen=%d%n", blen, clen); + test(cs, Arrays.copyOf(bmpCA, clen), Arrays.copyOf(sbBA, blen)); + //add a pair of surrogates + int pos = clen / 2; + if ((pos + 1) < blen) { + bmpCA[pos] = '\uD800'; + bmpCA[pos+1] = '\uDC00'; + } + test(cs, Arrays.copyOf(bmpCA, clen), Arrays.copyOf(sbBA, blen)); + } + System.out.println("done!"); + } + } + } + + static void test(Charset cs, char[] bmpCA, byte[] sbBA) throws Throwable { + String bmpStr = new String(bmpCA); + CharsetDecoder dec = cs.newDecoder() + .onMalformedInput(CodingErrorAction.REPLACE) + .onUnmappableCharacter(CodingErrorAction.REPLACE); + CharsetEncoder enc = cs.newEncoder() + .onMalformedInput(CodingErrorAction.REPLACE) + .onUnmappableCharacter(CodingErrorAction.REPLACE); + + //getBytes(csn); + byte[] baSC = bmpStr.getBytes(cs.name()); + ByteBuffer bf = enc.reset().encode(CharBuffer.wrap(bmpCA)); + byte[] baNIO = new byte[bf.limit()]; + bf.get(baNIO, 0, baNIO.length); + if (!Arrays.equals(baSC, baNIO)) + throw new RuntimeException("getBytes(csn) failed -> " + cs.name()); + + //getBytes(cs); + baSC = bmpStr.getBytes(cs); + if (!Arrays.equals(baSC, baNIO)) + throw new RuntimeException("getBytes(cs) failed -> " + cs.name()); + + //new String(csn); + String strSC = new String(sbBA, cs.name()); + String strNIO = dec.reset().decode(ByteBuffer.wrap(sbBA)).toString(); + if(!strNIO.equals(strSC)) + throw new RuntimeException("new String(csn) failed -> " + cs.name()); + + //new String(cs); + strSC = new String(sbBA, cs); + if (!strNIO.equals(strSC)) + throw new RuntimeException("new String(cs) failed -> " + cs.name()); + + //encode unmappable surrogates + if (enc instanceof sun.nio.cs.ArrayEncoder && + cs.contains(Charset.forName("ASCII"))) { + enc.replaceWith(new byte[] { (byte)'A'}); + sun.nio.cs.ArrayEncoder cae = (sun.nio.cs.ArrayEncoder)enc; + + String str = "ab\uD800\uDC00\uD800\uDC00cd"; + byte[] ba = new byte[str.length() - 2]; + int n = cae.encode(str.toCharArray(), 0, str.length(), ba); + if (n != 6 || !"abAAcd".equals(new String(ba, cs.name()))) + throw new RuntimeException("encode1(surrogates) failed -> " + + cs.name()); + + ba = new byte[str.length()]; + n = cae.encode(str.toCharArray(), 0, str.length(), ba); + if (n != 6 || !"abAAcd".equals(new String(ba, 0, n, + cs.name()))) + throw new RuntimeException("encode2(surrogates) failed -> " + + cs.name()); + str = "ab\uD800B\uDC00Bcd"; + ba = new byte[str.length()]; + n = cae.encode(str.toCharArray(), 0, str.length(), ba); + if (n != 8 || !"abABABcd".equals(new String(ba, 0, n, + cs.name()))) + throw new RuntimeException("encode3(surrogates) failed -> " + + cs.name()); + + ba = new byte[str.length() - 1]; + n = cae.encode(str.toCharArray(), 0, str.length(), ba); + if (n != 7 || !"abABABc".equals(new String(ba, 0, n, + cs.name()))) + throw new RuntimeException("encode4(surrogates) failed -> " + + cs.name()); + } + + } + + static class PermissiveSecurityManger extends SecurityManager { + @Override public void checkPermission(java.security.Permission p) {} + } +} From 4db0a48b104dab588360861e4fbb3c21c94d826e Mon Sep 17 00:00:00 2001 From: Phil Race Date: Mon, 23 Mar 2009 10:40:54 -0700 Subject: [PATCH 169/292] 6745225: Memory leak while drawing Attributed String Reviewed-by: jgodinez, dougfelt --- .../classes/sun/font/FileFontStrike.java | 23 ++++- .../share/classes/sun/font/GlyphLayout.java | 2 + .../awt/font/LineBreakMeasurer/FRCTest.java | 90 +++++++++++++++++++ 3 files changed, 111 insertions(+), 4 deletions(-) create mode 100644 jdk/test/java/awt/font/LineBreakMeasurer/FRCTest.java diff --git a/jdk/src/share/classes/sun/font/FileFontStrike.java b/jdk/src/share/classes/sun/font/FileFontStrike.java index 4628016a216..11dff8a20c1 100644 --- a/jdk/src/share/classes/sun/font/FileFontStrike.java +++ b/jdk/src/share/classes/sun/font/FileFontStrike.java @@ -26,6 +26,7 @@ package sun.font; import java.lang.ref.SoftReference; +import java.lang.ref.WeakReference; import java.awt.Font; import java.awt.GraphicsEnvironment; import java.awt.Rectangle; @@ -842,15 +843,29 @@ public class FileFontStrike extends PhysicalStrike { return fileFont.getGlyphOutlineBounds(pScalerContext, glyphCode); } - private ConcurrentHashMap outlineMap; + private + WeakReference> outlineMapRef; GeneralPath getGlyphOutline(int glyphCode, float x, float y) { - if (outlineMap == null) { - outlineMap = new ConcurrentHashMap(); + + GeneralPath gp = null; + ConcurrentHashMap outlineMap = null; + + if (outlineMapRef != null) { + outlineMap = outlineMapRef.get(); + if (outlineMap != null) { + gp = (GeneralPath)outlineMap.get(glyphCode); + } } - GeneralPath gp = (GeneralPath)outlineMap.get(glyphCode); + if (gp == null) { gp = fileFont.getGlyphOutline(pScalerContext, glyphCode, 0, 0); + if (outlineMap == null) { + outlineMap = new ConcurrentHashMap(); + outlineMapRef = + new WeakReference + >(outlineMap); + } outlineMap.put(glyphCode, gp); } gp = (GeneralPath)gp.clone(); // mutable! diff --git a/jdk/src/share/classes/sun/font/GlyphLayout.java b/jdk/src/share/classes/sun/font/GlyphLayout.java index 18ebec85a02..91162cb1c57 100644 --- a/jdk/src/share/classes/sun/font/GlyphLayout.java +++ b/jdk/src/share/classes/sun/font/GlyphLayout.java @@ -338,6 +338,8 @@ public final class GlyphLayout { cache = new ConcurrentHashMap(10); cacheRef = new SoftReference>(cache); + } else if (cache.size() >= 512) { + cache.clear(); } cache.put(key, res); } diff --git a/jdk/test/java/awt/font/LineBreakMeasurer/FRCTest.java b/jdk/test/java/awt/font/LineBreakMeasurer/FRCTest.java new file mode 100644 index 00000000000..d65037e2ec3 --- /dev/null +++ b/jdk/test/java/awt/font/LineBreakMeasurer/FRCTest.java @@ -0,0 +1,90 @@ +/* + * Copyright 2008-9 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 6448405 6519513 6745225 + * @summary static HashMap cache in LineBreakMeasurer can grow wihout bounds + * @run main/othervm/timeout=600 -client -Xms16m -Xmx16m FRCTest + */ +import java.awt.*; +import java.awt.image.*; +import java.awt.font.*; +import java.awt.geom.*; +import java.text.*; +import java.util.Hashtable; + +public class FRCTest { + + static AttributedString vanGogh = new AttributedString( + "Many people believe that Vincent van Gogh painted his best works " + + "during the two-year period he spent in Provence. Here is where he " + + "painted The Starry Night--which some consider to be his greatest " + + "work of all. However, as his artistic brilliance reached new " + + "heights in Provence, his physical and mental health plummeted. ", + new Hashtable()); + + public static void main(String[] args) { + + // First test the behaviour of Graphics2D.getFontRenderContext(); + BufferedImage bi = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB); + Graphics2D g2d = bi.createGraphics(); + AffineTransform g2dTx = new AffineTransform(2,0,2,0,1,1); + g2d.setTransform(g2dTx); + AffineTransform frcTx = g2d.getFontRenderContext().getTransform(); + AffineTransform frcExpected = new AffineTransform(2,0,2,0,0,0); + if (!frcTx.equals(frcExpected)) { + throw new RuntimeException("FRC Tx may have translate?"); + } + + // Now test that using different translates with LBM is OK + // This test doesn't prove a lot since showing a leak really + // requires a basher test that can run for a long time. + for (int x=0;x<100;x++) { + for (int y=0;y<100;y++) { + AttributedCharacterIterator aci = vanGogh.getIterator(); + AffineTransform tx = AffineTransform.getTranslateInstance(x, y); + FontRenderContext frc = new FontRenderContext(tx, false, false); + LineBreakMeasurer lbm = new LineBreakMeasurer(aci, frc); + lbm.setPosition(aci.getBeginIndex()); + while (lbm.getPosition() < aci.getEndIndex()) { + lbm.nextLayout(100f); + } + } + } + + for (int x=0;x<25;x++) { + for (int y=0;y<25;y++) { + AttributedCharacterIterator aci = vanGogh.getIterator(); + double rot = Math.random()*.4*Math.PI - .2*Math.PI; + AffineTransform tx = AffineTransform.getRotateInstance(rot); + FontRenderContext frc = new FontRenderContext(tx, false, false); + LineBreakMeasurer lbm = new LineBreakMeasurer(aci, frc); + lbm.setPosition(aci.getBeginIndex()); + while (lbm.getPosition() < aci.getEndIndex()) { + lbm.nextLayout(100f); + } + } + } + } +} From 1cafadfd3e83bae47284d0a3b43b8df592976461 Mon Sep 17 00:00:00 2001 From: Tom Rodriguez Date: Mon, 23 Mar 2009 13:58:58 -0700 Subject: [PATCH 170/292] 6805522: Server VM fails with assertion (block1->start() != block2->start(),"successors have unique bcis") Reviewed-by: kvn --- hotspot/src/share/vm/ci/ciTypeFlow.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/hotspot/src/share/vm/ci/ciTypeFlow.cpp b/hotspot/src/share/vm/ci/ciTypeFlow.cpp index 51f49132b61..9bf831ef9f3 100644 --- a/hotspot/src/share/vm/ci/ciTypeFlow.cpp +++ b/hotspot/src/share/vm/ci/ciTypeFlow.cpp @@ -2237,7 +2237,6 @@ ciTypeFlow::Block* ciTypeFlow::clone_loop_head(Loop* lp, StateVector* temp_vecto for (SuccIter iter(tail); !iter.done(); iter.next()) { if (iter.succ() == head) { iter.set_succ(clone); - break; } } flow_block(tail, temp_vector, temp_set); From 283deccd890a1e0f002c63b0bd956e715f0a1ac2 Mon Sep 17 00:00:00 2001 From: Andrew John Hughes Date: Mon, 23 Mar 2009 17:43:15 -0700 Subject: [PATCH 171/292] 6695776: corba jscheme jar files in repository could be built from source Forward port of changes from the 6-open train. Reviewed-by: darcy, ohair, tbell --- corba/make/com/sun/corba/se/sources/Makefile | 10 +- corba/make/sun/rmi/corbalogsources/Makefile | 49 +- corba/make/tools/Makefile | 3 +- corba/make/tools/logutil/Makefile | 43 ++ .../se/logutil/IndentingPrintWriter.java | 15 +- .../com/sun/tools/corba/se/logutil/Input.java | 211 ++++++ .../sun/tools/corba/se/logutil/InputCode.java | 116 +++ .../corba/se/logutil/InputException.java | 94 +++ .../com/sun/tools/corba/se/logutil/MC.java | 559 +++++++++++++++ .../tools/corba/se/logutil/lib/jscheme.jar | Bin 382167 -> 0 bytes .../corba/se/logutil/lib/jschemelogutil.jar | Bin 2451 -> 0 bytes .../com/sun/tools/corba/se/logutil/scripts/mc | 2 - .../sun/tools/corba/se/logutil/scripts/mc.scm | 662 ------------------ .../sun/tools/corba/se/logutil/scripts/run | 2 - 14 files changed, 1059 insertions(+), 707 deletions(-) create mode 100644 corba/make/tools/logutil/Makefile create mode 100644 corba/src/share/classes/com/sun/tools/corba/se/logutil/Input.java create mode 100644 corba/src/share/classes/com/sun/tools/corba/se/logutil/InputCode.java create mode 100644 corba/src/share/classes/com/sun/tools/corba/se/logutil/InputException.java create mode 100644 corba/src/share/classes/com/sun/tools/corba/se/logutil/MC.java delete mode 100644 corba/src/share/classes/com/sun/tools/corba/se/logutil/lib/jscheme.jar delete mode 100644 corba/src/share/classes/com/sun/tools/corba/se/logutil/lib/jschemelogutil.jar delete mode 100644 corba/src/share/classes/com/sun/tools/corba/se/logutil/scripts/mc delete mode 100644 corba/src/share/classes/com/sun/tools/corba/se/logutil/scripts/mc.scm delete mode 100644 corba/src/share/classes/com/sun/tools/corba/se/logutil/scripts/run diff --git a/corba/make/com/sun/corba/se/sources/Makefile b/corba/make/com/sun/corba/se/sources/Makefile index 164a4e65a93..9d945a29343 100644 --- a/corba/make/com/sun/corba/se/sources/Makefile +++ b/corba/make/com/sun/corba/se/sources/Makefile @@ -46,8 +46,6 @@ CORBA_JMK_DIRECTORY=$(TOPDIR)/make/com/sun/corba/minclude/ include $(CORBA_JMK_DIRECTORY)com_sun_corba_se_PortableActivationIDL.jmk include $(CORBA_JMK_DIRECTORY)com_sun_corba_se_impl_logging.jmk -FILES_java += com/sun/corba/se/org/omg/CORBA/ORB.java - # # Dirs # @@ -80,11 +78,11 @@ ORBUTIL.MC = $(SRC_DIR)/com/sun/corba/se/spi/logging/data/ORBUtil.mc POA.MC = $(SRC_DIR)/com/sun/corba/se/spi/logging/data/POA.mc UTIL.MC = $(SRC_DIR)/com/sun/corba/se/spi/logging/data/Util.mc -MC_GENERATE_CLASS = $(SRC_DIR)/com/sun/tools/corba/se/logutil/scripts/mc.scm -main main make-class -MC_GENERATE_LOG_RB = $(SRC_DIR)/com/sun/tools/corba/se/logutil/scripts/mc.scm -main main make-resource +MC_GENERATE_CLASS = make-class +MC_GENERATE_LOG_RB = make-resource -JSCHEME_GENERATE_CLASS = $(BOOT_JAVA_CMD) jscheme.REPL $(MC_GENERATE_CLASS) -JSCHEME_GENERATE_LOG_RB = $(BOOT_JAVA_CMD) jscheme.REPL $(MC_GENERATE_LOG_RB) +JSCHEME_GENERATE_CLASS = $(BOOT_JAVA_CMD) com.sun.tools.corba.se.logutil.MC $(MC_GENERATE_CLASS) +JSCHEME_GENERATE_LOG_RB = $(BOOT_JAVA_CMD) com.sun.tools.corba.se.logutil.MC $(MC_GENERATE_LOG_RB) # diff --git a/corba/make/sun/rmi/corbalogsources/Makefile b/corba/make/sun/rmi/corbalogsources/Makefile index a7b995c1c51..0859c5ab2a9 100644 --- a/corba/make/sun/rmi/corbalogsources/Makefile +++ b/corba/make/sun/rmi/corbalogsources/Makefile @@ -1,5 +1,5 @@ # -# Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2003-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 @@ -75,15 +75,14 @@ ORBUTIL.MC = $(SRC_DIR)/com/sun/corba/se/spi/logging/data/ORBUtil.mc POA.MC = $(SRC_DIR)/com/sun/corba/se/spi/logging/data/POA.mc UTIL.MC = $(SRC_DIR)/com/sun/corba/se/spi/logging/data/Util.mc -MC_GENERATE_CLASS = $(SRC_DIR)/com/sun/tools/corba/se/logutil/scripts/mc.scm -main main make-class -MC_GENERATE_LOG_RB = $(SRC_DIR)/com/sun/tools/corba/se/logutil/scripts/mc.scm -main main make-resource +MC_GENERATE_CLASS = make-class +MC_GENERATE_LOG_RB = make-resource -JSCHEME_LIB_DIRECTORY=$(SRC_DIR)/com/sun/tools/corba/se/logutil/lib -JSCHEME_CLASSPATH=$(JSCHEME_LIB_DIRECTORY)/jscheme.jar$(CLASSPATH_SEPARATOR)$(JSCHEME_LIB_DIRECTORY)/jschemelogutil.jar -JSCHEME_GENERATE_CLASS = $(BOOT_JAVA_CMD) \ - -cp "$(JSCHEME_CLASSPATH)" jscheme.REPL $(MC_GENERATE_CLASS) -JSCHEME_GENERATE_LOG_RB = $(BOOT_JAVA_CMD) \ - -cp "$(JSCHEME_CLASSPATH)" jscheme.REPL $(MC_GENERATE_LOG_RB) +MC_CLASSPATH=$(BUILDTOOLJARDIR)/MC.jar +MCJ_GENERATE_CLASS = $(BOOT_JAVA_CMD) \ + -cp "$(MC_CLASSPATH)" com.sun.tools.corba.se.logutil.MC $(MC_GENERATE_CLASS) +MCJ_GENERATE_LOG_RB = $(BOOT_JAVA_CMD) \ + -cp "$(MC_CLASSPATH)" com.sun.tools.corba.se.logutil.MC $(MC_GENERATE_LOG_RB) # @@ -104,28 +103,28 @@ $(LOG_GENDIRECTORY): $(MKDIR) -p $(LOG_GENDIRECTORY) $(LOG_GENDIRECTORY)/ActivationSystemException.java : $(ACTIVATION.MC) - $(JSCHEME_GENERATE_CLASS) $(ACTIVATION.MC) $(LOG_GENDIRECTORY) + $(MCJ_GENERATE_CLASS) $(ACTIVATION.MC) $(LOG_GENDIRECTORY) $(LOG_GENDIRECTORY)/IORSystemException.java : $(IOR.MC) - $(JSCHEME_GENERATE_CLASS) $(IOR.MC) $(LOG_GENDIRECTORY) + $(MCJ_GENERATE_CLASS) $(IOR.MC) $(LOG_GENDIRECTORY) $(LOG_GENDIRECTORY)/InterceptorsSystemException.java : $(INTERCEPTORS.MC) - $(JSCHEME_GENERATE_CLASS) $(INTERCEPTORS.MC) $(LOG_GENDIRECTORY) + $(MCJ_GENERATE_CLASS) $(INTERCEPTORS.MC) $(LOG_GENDIRECTORY) $(LOG_GENDIRECTORY)/NamingSystemException.java : $(NAMING.MC) - $(JSCHEME_GENERATE_CLASS) $(NAMING.MC) $(LOG_GENDIRECTORY) + $(MCJ_GENERATE_CLASS) $(NAMING.MC) $(LOG_GENDIRECTORY) $(LOG_GENDIRECTORY)/OMGSystemException.java : $(OMG.MC) - $(JSCHEME_GENERATE_CLASS) $(OMG.MC) $(LOG_GENDIRECTORY) + $(MCJ_GENERATE_CLASS) $(OMG.MC) $(LOG_GENDIRECTORY) $(LOG_GENDIRECTORY)/ORBUtilSystemException.java : $(ORBUTIL.MC) - $(JSCHEME_GENERATE_CLASS) $(ORBUTIL.MC) $(LOG_GENDIRECTORY) + $(MCJ_GENERATE_CLASS) $(ORBUTIL.MC) $(LOG_GENDIRECTORY) $(LOG_GENDIRECTORY)/POASystemException.java : $(POA.MC) - $(JSCHEME_GENERATE_CLASS) $(POA.MC) $(LOG_GENDIRECTORY) + $(MCJ_GENERATE_CLASS) $(POA.MC) $(LOG_GENDIRECTORY) $(LOG_GENDIRECTORY)/UtilSystemException.java : $(UTIL.MC) - $(JSCHEME_GENERATE_CLASS) $(UTIL.MC) $(LOG_GENDIRECTORY) + $(MCJ_GENERATE_CLASS) $(UTIL.MC) $(LOG_GENDIRECTORY) logresource.generate: $(LOG_GENDIRECTORY)/LogStrings.properties @@ -142,28 +141,28 @@ $(LOG_GENDIRECTORY)/LogStrings.properties: \ $(CAT) $(LOG_GENDIRECTORY)/*.resource > $(LOG_GENDIRECTORY)/LogStrings.properties $(LOG_GENDIRECTORY)/ActivationSystemException.resource : $(ACTIVATION.MC) - $(JSCHEME_GENERATE_LOG_RB) $(ACTIVATION.MC) $(LOG_GENDIRECTORY) + $(MCJ_GENERATE_LOG_RB) $(ACTIVATION.MC) $(LOG_GENDIRECTORY) $(LOG_GENDIRECTORY)/IORSystemException.resource : $(IOR.MC) - $(JSCHEME_GENERATE_LOG_RB) $(IOR.MC) $(LOG_GENDIRECTORY) + $(MCJ_GENERATE_LOG_RB) $(IOR.MC) $(LOG_GENDIRECTORY) $(LOG_GENDIRECTORY)/InterceptorsSystemException.resource : $(INTERCEPTORS.MC) - $(JSCHEME_GENERATE_LOG_RB) $(INTERCEPTORS.MC) $(LOG_GENDIRECTORY) + $(MCJ_GENERATE_LOG_RB) $(INTERCEPTORS.MC) $(LOG_GENDIRECTORY) $(LOG_GENDIRECTORY)/NamingSystemException.resource : $(NAMING.MC) - $(JSCHEME_GENERATE_LOG_RB) $(NAMING.MC) $(LOG_GENDIRECTORY) + $(MCJ_GENERATE_LOG_RB) $(NAMING.MC) $(LOG_GENDIRECTORY) $(LOG_GENDIRECTORY)/OMGSystemException.resource : $(OMG.MC) - $(JSCHEME_GENERATE_LOG_RB) $(OMG.MC) $(LOG_GENDIRECTORY) + $(MCJ_GENERATE_LOG_RB) $(OMG.MC) $(LOG_GENDIRECTORY) $(LOG_GENDIRECTORY)/ORBUtilSystemException.resource : $(ORBUTIL.MC) - $(JSCHEME_GENERATE_LOG_RB) $(ORBUTIL.MC) $(LOG_GENDIRECTORY) + $(MCJ_GENERATE_LOG_RB) $(ORBUTIL.MC) $(LOG_GENDIRECTORY) $(LOG_GENDIRECTORY)/POASystemException.resource : $(POA.MC) - $(JSCHEME_GENERATE_LOG_RB) $(POA.MC) $(LOG_GENDIRECTORY) + $(MCJ_GENERATE_LOG_RB) $(POA.MC) $(LOG_GENDIRECTORY) $(LOG_GENDIRECTORY)/UtilSystemException.resource : $(UTIL.MC) - $(JSCHEME_GENERATE_LOG_RB) $(UTIL.MC) $(LOG_GENDIRECTORY) + $(MCJ_GENERATE_LOG_RB) $(UTIL.MC) $(LOG_GENDIRECTORY) # diff --git a/corba/make/tools/Makefile b/corba/make/tools/Makefile index 489c7b2f269..f0d95363b84 100644 --- a/corba/make/tools/Makefile +++ b/corba/make/tools/Makefile @@ -1,5 +1,5 @@ # -# Copyright 1998-2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1998-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 @@ -33,6 +33,7 @@ include $(BUILDDIR)/common/Defs.gmk SUBDIRS = \ strip_properties \ idlj \ + logutil \ all build clean clobber:: $(SUBDIRS-loop) diff --git a/corba/make/tools/logutil/Makefile b/corba/make/tools/logutil/Makefile new file mode 100644 index 00000000000..2e19867f8d4 --- /dev/null +++ b/corba/make/tools/logutil/Makefile @@ -0,0 +1,43 @@ +# +# Copyright 2008 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. +# + +# +# Makefile for building the idlj tool +# + +BUILDDIR = ../.. +PACKAGE = com.sun.tools.corba.se.logutil +PRODUCT = tools +PROGRAM = MC +include $(BUILDDIR)/common/Defs.gmk + +BUILDTOOL_SOURCE_ROOT = $(SHARE_SRC)/classes +BUILDTOOL_MAIN = $(PKGDIR)/MC.java + +# +# Build tool jar rules. +# +include $(BUILDDIR)/common/BuildToolJar.gmk + diff --git a/corba/src/share/classes/com/sun/tools/corba/se/logutil/IndentingPrintWriter.java b/corba/src/share/classes/com/sun/tools/corba/se/logutil/IndentingPrintWriter.java index d8b31fc0f77..e618a7401fa 100644 --- a/corba/src/share/classes/com/sun/tools/corba/se/logutil/IndentingPrintWriter.java +++ b/corba/src/share/classes/com/sun/tools/corba/se/logutil/IndentingPrintWriter.java @@ -1,5 +1,5 @@ /* - * Copyright 2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-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 @@ -30,7 +30,6 @@ import java.io.Writer ; import java.io.OutputStream ; import java.io.BufferedWriter ; import java.io.OutputStreamWriter ; -import jsint.Pair ; import java.util.StringTokenizer ; public class IndentingPrintWriter extends PrintWriter { @@ -38,22 +37,20 @@ public class IndentingPrintWriter extends PrintWriter { private int indentWidth = 4 ; private String indentString = "" ; - public void printMsg( String msg, Pair data ) + public void printMsg( String msg, Object... data ) { // System.out.println( "printMsg called with msg=" + msg + " data=" + data ) ; StringTokenizer st = new StringTokenizer( msg, "@", true ) ; StringBuffer result = new StringBuffer() ; - Object head = data.first ; - Pair tail = (Pair)data.rest ; String token = null ; + int pos = 0; while (st.hasMoreTokens()) { token = st.nextToken() ; if (token.equals("@")) { - if (head != null) { - result.append( head ) ; - head = tail.first ; - tail = (Pair)tail.rest ; + if (pos < data.length) { + result.append( data[pos] ); + ++pos; } else { throw new Error( "List too short for message" ) ; } diff --git a/corba/src/share/classes/com/sun/tools/corba/se/logutil/Input.java b/corba/src/share/classes/com/sun/tools/corba/se/logutil/Input.java new file mode 100644 index 00000000000..5431f0c7a17 --- /dev/null +++ b/corba/src/share/classes/com/sun/tools/corba/se/logutil/Input.java @@ -0,0 +1,211 @@ +/* + * Copyright 2008 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. + */ + +package com.sun.tools.corba.se.logutil; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.InputStreamReader; +import java.io.IOException; + +import java.util.LinkedList; +import java.util.Queue; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class Input { + + /** + * The name of the package this class will inhabit. + */ + private String packageName; + + /** + * The name of the generated class. + */ + private String className; + + /** + * The name of the group of exceptions handled by the class. + */ + private String groupName; + + /** + * The group of exceptions. + */ + private Queue exceptions; + + /** + * Represents the current state of parsing the input. + */ + private enum State + { + OUTER, + IN_CLASS, + IN_EXCEPTION_LIST + }; + + /** + * Regular expression to match each code line. + */ + private static final Pattern EXCEPTION_INFO_REGEX = + Pattern.compile("(\\w+)\\s*(\\d+)\\s*(\\w+)"); + + /** + * Parses the specified file to create a new {@link Input} + * object. + * + * @param filename the file to parse. + * @throws FileNotFoundException if the file can't be found. + * @throws IOException if an I/O error occurs. + */ + public Input(final String filename) + throws FileNotFoundException, IOException { + BufferedReader r = + new BufferedReader(new InputStreamReader(new FileInputStream(filename))); + State state = State.OUTER; + InputException current = null; + exceptions = new LinkedList(); + String line; + while ((line = r.readLine()) != null) { + // Skip ; comments + if (line.startsWith(";")) + continue; + + int index = line.indexOf("("); + if (index == -1) + continue; + + switch (state) { + case OUTER: + state = State.IN_CLASS; + String[] classInfo = line.substring(index).split(" "); + packageName = classInfo[0].substring(2, classInfo[0].length() - 1); + className = classInfo[1].substring(1, classInfo[1].length() - 1); + groupName = classInfo[2]; + break; + case IN_CLASS: + state = State.IN_EXCEPTION_LIST; + break; + case IN_EXCEPTION_LIST: + boolean inQuote = false; + boolean inCode = false; + boolean end = false; + int start = index + 1; + Queue lines = new LinkedList(); + for (int a = start; a < line.length(); ++a) { + if (line.charAt(a) == '(' && !inCode && !inQuote) { + if (current == null) + current = + new InputException(line.substring(start, a).trim()); + start = a + 1; + inCode = true; + } + if (line.charAt(a) == '"') + inQuote = !inQuote; + if (line.charAt(a) == ')' && !inQuote) { + if (inCode) { + lines.offer(line.substring(start, a)); + inCode = false; + } else + end = true; + } + if (!end && a == line.length() - 1) + line += r.readLine(); + } + for (String l : lines) { + int stringStart = l.indexOf("\"") + 1; + int stringEnd = l.indexOf("\"", stringStart); + Matcher matcher = EXCEPTION_INFO_REGEX.matcher(l.substring(0, stringStart)); + if (matcher.find()) + current.add(new InputCode(matcher.group(1), + Integer.parseInt(matcher.group(2)), + matcher.group(3), + l.substring(stringStart, stringEnd))); + } + exceptions.offer(current); + current = null; + break; + } + } + } + + /** + * Returns the name of this group of exceptions. + * + * @return the name of this group of exceptions. + */ + public String getGroupName() + { + return groupName; + } + + /** + * Returns the name of the package this class will go in. + * + * @return the name of the package. + */ + public String getPackageName() + { + return packageName; + } + + /** + * Returns the name of the generated class. + * + * @return the name of the class. + */ + public String getClassName() + { + return className; + } + + /** + * Returns the exceptions contained in this class. + * + * @return the exceptions. + */ + public Queue getExceptions() { + return exceptions; + } + + /** + * Returns a textual representation of this input. + * + * @return a textual representation. + */ + public String toString() { + return getClass().getName() + + "[packageName=" + packageName + + ",className=" + className + + ",groupName=" + groupName + + ",exceptions=" + exceptions + + "]"; + } + +} diff --git a/corba/src/share/classes/com/sun/tools/corba/se/logutil/InputCode.java b/corba/src/share/classes/com/sun/tools/corba/se/logutil/InputCode.java new file mode 100644 index 00000000000..810a449f486 --- /dev/null +++ b/corba/src/share/classes/com/sun/tools/corba/se/logutil/InputCode.java @@ -0,0 +1,116 @@ +/* + * Copyright 2008 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. + */ +package com.sun.tools.corba.se.logutil; + +public class InputCode { + + /** + * The name of this code. + */ + private final String name; + + /** + * The code. + */ + private final int code; + + /** + * The log level for this code. + */ + private final String logLevel; + + /** + * The error message for this code. + */ + private final String message; + + /** + * Creates a new error code with the specified name, code, + * log level and error message. + * + * @param name the name of the new code. + * @param code the code itself. + * @param logLevel the level of severity of this error. + * @param message the error message for this code. + */ + public InputCode(final String name, final int code, + final String logLevel, final String message) { + this.name = name; + this.code = code; + this.logLevel = logLevel; + this.message = message; + } + + /** + * Returns the name of this code. + * + * @return the name of the code. + */ + public String getName() { + return name; + } + + /** + * Returns the code. + * + * @return the code. + */ + public int getCode() { + return code; + } + + /** + * Returns the severity of this code. + * + * @return the log level severity of the code. + */ + public String getLogLevel() { + return logLevel; + } + + /** + * Returns the error message for this code. + * + * @return the error message for this code. + */ + public String getMessage() { + return message; + } + + /** + * Returns a textual representation of this code. + * + * @return a textual representation. + */ + public String toString() { + return getClass().getName() + + "[name=" + name + + ",code=" + code + + ",logLevel=" + logLevel + + ",message=" + message + + "]"; + } + +} diff --git a/corba/src/share/classes/com/sun/tools/corba/se/logutil/InputException.java b/corba/src/share/classes/com/sun/tools/corba/se/logutil/InputException.java new file mode 100644 index 00000000000..5c1f4984e57 --- /dev/null +++ b/corba/src/share/classes/com/sun/tools/corba/se/logutil/InputException.java @@ -0,0 +1,94 @@ +/* + * Copyright 2008 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. + */ +package com.sun.tools.corba.se.logutil; + +import java.util.LinkedList; +import java.util.Queue; + +public class InputException { + + /** + * The name of this exception. + */ + private final String name; + + /** + * The codes associated with this exception. + */ + private final Queue codes; + + /** + * Constructs a new {@link InputException} with the + * specified name. + * + * @param name the name of the new exception; + */ + public InputException(final String name) { + this.name = name; + codes = new LinkedList(); + } + + /** + * Adds a new code to this exception. + * + * @param c the code to add. + */ + public void add(InputCode c) + { + codes.offer(c); + } + + /** + * Returns the name of this exception. + * + * @return the exception's name. + */ + public String getName() { + return name; + } + + /** + * Returns the codes associated with this exception. + * + * @return the exception's codes. + */ + public Queue getCodes() { + return codes; + } + + /** + * Returns a textual representation of this exception. + * + * @return a textual representation. + */ + public String toString() { + return getClass().getName() + + "[name=" + name + + ",codes=" + codes + + "]"; + } + +} + diff --git a/corba/src/share/classes/com/sun/tools/corba/se/logutil/MC.java b/corba/src/share/classes/com/sun/tools/corba/se/logutil/MC.java new file mode 100644 index 00000000000..9246f70c3ab --- /dev/null +++ b/corba/src/share/classes/com/sun/tools/corba/se/logutil/MC.java @@ -0,0 +1,559 @@ +/* + * Copyright 2008 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. + */ +package com.sun.tools.corba.se.logutil; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; + +import java.util.Arrays; +import java.util.Date; +import java.util.Formatter; +import java.util.List; +import java.util.Queue; + +public class MC { + + private static final String VERSION = "1.0"; + + private static final List SUN_EXCEPTION_GROUPS = Arrays.asList(new String[] + { "SUNBASE", "ORBUTIL", "ACTIVATION", "NAMING", "INTERCEPTORS", "POA", "IOR", "UTIL" }); + + private static final List EXCEPTIONS = Arrays.asList(new String[] + { "UNKNOWN", "BAD_PARAM", "NO_MEMORY", "IMP_LIMIT", "COMM_FAILURE", "INV_OBJREF", "NO_PERMISSION", + "INTERNAL", "MARSHAL", "INITIALIZE", "NO_IMPLEMENT", "BAD_TYPECODE", "BAD_OPERATION", "NO_RESOURCES", + "NO_RESPONSE", "PERSIST_STORE", "BAD_INV_ORDER", "TRANSIENT", "FREE_MEM", "INV_IDENT", "INV_FLAG", + "INTF_REPOS", "BAD_CONTEXT", "OBJ_ADAPTER", "DATA_CONVERSION", "OBJECT_NOT_EXIST", "TRANSACTION_REQUIRED", + "TRANSACTION_ROLLEDBACK", "INVALID_TRANSACTION", "INV_POLICY", "CODESET_INCOMPATIBLE", "REBIND", + "TIMEOUT", "TRANSACTION_UNAVAILABLE", "BAD_QOS", "INVALID_ACTIVITY", "ACTIVITY_COMPLETED", + "ACTIVITY_REQUIRED" }); + + /** + * Read the minor codes from the input file and + * write out a resource file. + * + * @param inFile the file to read the codes from. + * @param outDir the directory to write the resource file to. + * @throws FileNotFoundException if the input file can not be found. + * @throws IOException if an I/O error occurs. + */ + private void makeResource(String inFile, String outDir) + throws FileNotFoundException, IOException { + writeResource(outDir, new Input(inFile)); + } + + /** + * Create a new Java source file using the specified Scheme input file, + * and writing the result to the given output directory. + * + * @param inFile the file to read the data from. + * @param outDir the directory to write the Java class to. + * @throws FileNotFoundException if the input file can not be found. + * @throws IOException if an I/O error occurs. + */ + private void makeClass(String inFile, String outDir) + throws FileNotFoundException, IOException { + writeClass(inFile, outDir, new Input(inFile)); + } + + /** + * Writes out a Java source file using the data from the given + * {@link Input} object. The result is written to {@code outDir}. + * The name of the input file is just used in the header of the + * resulting source file. + * + * @param inFile the name of the file the data was read from. + * @param outDir the directory to write the Java class to. + * @param input the parsed input data. + * @throws FileNotFoundException if the output file can't be written. + */ + private void writeClass(String inFile, String outDir, Input input) + throws FileNotFoundException { + String packageName = input.getPackageName(); + String className = input.getClassName(); + String groupName = input.getGroupName(); + Queue exceptions = input.getExceptions(); + FileOutputStream file = new FileOutputStream(outDir + File.separator + className + ".java"); + IndentingPrintWriter pw = new IndentingPrintWriter(file); + + writeClassHeader(inFile, groupName, pw); + pw.printMsg("package @ ;", packageName); + pw.println(); + pw.println("import java.util.logging.Logger ;"); + pw.println("import java.util.logging.Level ;"); + pw.println(); + pw.println("import org.omg.CORBA.OMGVMCID ;"); + pw.println( "import com.sun.corba.se.impl.util.SUNVMCID ;"); + pw.println( "import org.omg.CORBA.CompletionStatus ;"); + pw.println( "import org.omg.CORBA.SystemException ;"); + pw.println(); + pw.println( "import com.sun.corba.se.spi.orb.ORB ;"); + pw.println(); + pw.println( "import com.sun.corba.se.spi.logging.LogWrapperFactory;"); + pw.println(); + pw.println( "import com.sun.corba.se.spi.logging.LogWrapperBase;"); + pw.println(); + writeImports(exceptions, pw); + pw.println(); + pw.indent(); + pw.printMsg("public class @ extends LogWrapperBase {", className); + pw.println(); + pw.printMsg("public @( Logger logger )", className); + pw.indent(); + pw.println( "{"); + pw.undent(); + pw.println( "super( logger ) ;"); + pw.println( "}"); + pw.println(); + pw.flush(); + writeFactoryMethod(className, groupName, pw); + writeExceptions(groupName, exceptions, className, pw); + pw.undent(); + pw.println( ); + pw.println( "}"); + pw.flush(); + pw.close(); + } + + /** + * Writes out the header of a Java source file. + * + * @param inFile the input file the file was generated from. + * @param groupName the group of exceptions the Java source file is for. + * @param pw the print writer used to write the output. + */ + private void writeClassHeader(String inFile, String groupName, + IndentingPrintWriter pw) { + if (groupName.equals("OMG")) + pw.println("// Log wrapper class for standard exceptions"); + else + pw.printMsg("// Log wrapper class for Sun private system exceptions in group @", + groupName); + pw.println("//"); + pw.printMsg("// Generated by MC.java version @, DO NOT EDIT BY HAND!", VERSION); + pw.printMsg("// Generated from input file @ on @", inFile, new Date()); + pw.println(); + } + + /** + * Write out the import list for the exceptions. + * + * @param groups the exceptions that were parsed. + * @param pw the {@link IndentingPrintWriter} for writing to the file. + */ + private void writeImports(Queue exceptions, + IndentingPrintWriter pw) { + if (exceptions == null) + return; + for (InputException e : exceptions) + pw.println("import org.omg.CORBA." + e.getName() + " ;"); + } + + /** + * Write out the factory method for this group of exceptions. + * + * @param className the name of the generated class. + * @param groupName the name of this group of exceptions. + * @param pw the {@link IndentingPrintWriter} for writing to the file. + */ + private void writeFactoryMethod(String className, String groupName, + IndentingPrintWriter pw) { + pw.indent(); + pw.println( "private static LogWrapperFactory factory = new LogWrapperFactory() {"); + pw.println( "public LogWrapperBase create( Logger logger )" ); + pw.indent(); + pw.println( "{"); + pw.undent(); + pw.printMsg("return new @( logger ) ;", className); + pw.undent(); + pw.println( "}" ); + pw.println( "} ;" ); + pw.println(); + pw.printMsg("public static @ get( ORB orb, String logDomain )", className); + pw.indent(); + pw.println( "{"); + pw.indent(); + pw.printMsg( "@ wrapper = ", className); + pw.indent(); + pw.printMsg( "(@) orb.getLogWrapper( logDomain, ", className); + pw.undent(); + pw.undent(); + pw.printMsg( "\"@\", factory ) ;", groupName); + pw.undent(); + pw.println( "return wrapper ;" ); + pw.println( "} " ); + pw.println(); + pw.printMsg( "public static @ get( String logDomain )", className); + pw.indent(); + pw.println( "{"); + pw.indent(); + pw.printMsg( "@ wrapper = ", className); + pw.indent(); + pw.printMsg( "(@) ORB.staticGetLogWrapper( logDomain, ", className); + pw.undent(); + pw.undent(); + pw.printMsg( "\"@\", factory ) ;", groupName); + pw.undent(); + pw.println( "return wrapper ;" ); + pw.println( "} " ); + pw.println(); + } + + /** + * Writes out the exceptions themselves. + * + * @param groupName the name of this group of exceptions. + * @param exceptions the exceptions to write out. + * @param className the name of the generated class. + * @param pw the {@link IndentingPrintWriter} for writing to the file. + */ + private void writeExceptions(String groupName, Queue exceptions, + String className, IndentingPrintWriter pw) { + for (InputException e : exceptions) { + pw.println("///////////////////////////////////////////////////////////"); + pw.printMsg("// @", e.getName()); + pw.println("///////////////////////////////////////////////////////////"); + pw.println(); + for (InputCode c : e.getCodes()) + writeMethods(groupName, e.getName(), c.getName(), c.getCode(), + c.getLogLevel(), className, StringUtil.countArgs(c.getMessage()), pw); + pw.flush(); + } + } + + /** + * Writes out the methods for a particular error. + * + * @param groupName the name of this group of exceptions. + * @param exceptionName the name of this particular exception. + * @param errorName the name of this particular error. + * @param code the minor code for this particular error. + * @param ident the name of the error in mixed-case identifier form. + * @param level the level at which to place log messages. + * @param className the name of the class for this group of exceptions. + * @param numParams the number of parameters the detail message takes. + * @param pw the print writer for writing to the file. + */ + private void writeMethods(String groupName, String exceptionName, String errorName, + int code, String level, String className, int numParams, + IndentingPrintWriter pw) { + String ident = StringUtil.toMixedCase(errorName); + pw.printMsg("public static final int @ = @ ;", errorName, getBase(groupName, code)); + pw.println(); + pw.flush(); + writeMethodStatusCause(groupName, exceptionName, errorName, ident, level, + numParams, className, pw); + pw.println(); + pw.flush(); + writeMethodStatus(exceptionName, ident, numParams, pw); + pw.println(); + pw.flush(); + writeMethodCause(exceptionName, ident, numParams, pw); + pw.println(); + pw.flush(); + writeMethodNoArgs(exceptionName, ident, numParams, pw); + pw.println(); + pw.flush(); + } + + /** + * Writes out a method for an error that takes a + * {@link org.omg.CORBA.CompletionStatus} and a cause. + * + * @param groupName the name of this group of exceptions. + * @param exceptionName the name of this particular exception. + * @param errorName the name of this particular error. + * @param ident the name of the error in mixed-case identifier form. + * @param logLevel the level at which to place log messages. + * @param numParams the number of parameters the detail message takes. + * @param className the name of the class for this group of exceptions. + * @param pw the print writer for writing to the file. + */ + private void writeMethodStatusCause(String groupName, String exceptionName, + String errorName, String ident, + String logLevel, int numParams, + String className, IndentingPrintWriter pw) { + pw.indent(); + pw.printMsg( "public @ @( CompletionStatus cs, Throwable t@) {", exceptionName, + ident, makeDeclArgs(true, numParams)); + pw.printMsg( "@ exc = new @( @, cs ) ;", exceptionName, exceptionName, errorName); + pw.indent(); + pw.println( "if (t != null)" ); + pw.undent(); + pw.println( "exc.initCause( t ) ;" ); + pw.println(); + pw.indent(); + pw.printMsg( "if (logger.isLoggable( Level.@ )) {", logLevel); + if (numParams > 0) { + pw.printMsg( "Object[] parameters = new Object[@] ;", numParams); + for (int a = 0; a < numParams; ++a) + pw.printMsg("parameters[@] = arg@ ;", a, a); + } else + pw.println( "Object[] parameters = null ;"); + pw.indent(); + pw.printMsg( "doLog( Level.@, \"@.@\",", logLevel, groupName, ident); + pw.undent(); + pw.undent(); + pw.printMsg( "parameters, @.class, exc ) ;", className); + pw.println( "}"); + pw.println(); + + pw.undent(); + pw.println( "return exc ;"); + pw.println( "}"); + } + + /** + * Writes out a method for an error that takes a + * {@link org.omg.CORBA.CompletionStatus}. + * + * @param exceptionName the name of this particular exception. + * @param ident the name of the error in mixed-case identifier form. + * @param numParams the number of parameters the detail message takes. + * @param pw the print writer for writing to the file. + */ + private void writeMethodStatus(String exceptionName, String ident, + int numParams, IndentingPrintWriter pw) { + pw.indent(); + pw.printMsg("public @ @( CompletionStatus cs@) {", exceptionName, + ident, makeDeclArgs(true, numParams)); + pw.undent(); + pw.printMsg("return @( cs, null@ ) ;", ident, makeCallArgs(true, numParams)); + pw.println("}"); + } + + /** + * Writes out a method for an error that takes a cause. + * + * @param exceptionName the name of this particular exception. + * @param ident the name of the error in mixed-case identifier form. + * @param numParams the number of parameters the detail message takes. + * @param pw the print writer for writing to the file. + */ + private void writeMethodCause(String exceptionName, String ident, + int numParams, IndentingPrintWriter pw) { + pw.indent(); + pw.printMsg("public @ @( Throwable t@) {", exceptionName, ident, + makeDeclArgs(true, numParams)); + pw.undent(); + pw.printMsg("return @( CompletionStatus.COMPLETED_NO, t@ ) ;", ident, + makeCallArgs(true, numParams)); + pw.println("}"); + } + + /** + * Writes out a method for an error that takes no arguments. + * + * @param exceptionName the name of this particular exception. + * @param ident the name of the error in mixed-case identifier form. + * @param numParams the number of parameters the detail message takes. + * @param pw the print writer for writing to the file. + */ + private void writeMethodNoArgs(String exceptionName, String ident, + int numParams, IndentingPrintWriter pw) { + + pw.indent(); + pw.printMsg("public @ @( @) {", exceptionName, ident, + makeDeclArgs(false, numParams)); + pw.undent(); + pw.printMsg("return @( CompletionStatus.COMPLETED_NO, null@ ) ;", + ident, makeCallArgs(true, numParams)); + pw.println("}"); + } + + /** + * Returns a list of comma-separated arguments with type declarations. + * + * @param leadingComma true if the list should start with a comma. + * @param numArgs the number of arguments to generate. + * @return the generated string. + */ + private String makeDeclArgs(boolean leadingComma, int numArgs) { + return makeArgString("Object arg", leadingComma, numArgs); + } + + /** + * Returns a list of comma-separated arguments without type declarations. + * + * @param leadingComma true if the list should start with a comma. + * @param numArgs the number of arguments to generate. + * @return the generated string. + */ + private String makeCallArgs(boolean leadingComma, int numArgs) { + return makeArgString("arg", leadingComma, numArgs); + } + + /** + * Returns a list of comma-separated arguments. + * + * @param prefixString the string with which to prefix each argument. + * @param leadingComma true if the list should start with a comma. + * @param numArgs the number of arguments to generate. + * @return the generated string. + */ + private String makeArgString(String prefixString, boolean leadingComma, + int numArgs) { + if (numArgs == 0) + return " "; + if (numArgs == 1) { + if (leadingComma) + return ", " + prefixString + (numArgs - 1); + else + return " " + prefixString + (numArgs - 1); + } + return makeArgString(prefixString, leadingComma, numArgs - 1) + + ", " + prefixString + (numArgs - 1); + } + + /** + * Returns the {@link String} containing the calculation of the + * error code. + * + * @param groupName the group of exception to which the code belongs. + * @param code the minor code number representing the exception within the group. + * @return the unique error code. + */ + private String getBase(String groupName, int code) { + if (groupName.equals("OMG")) + return "OMGVMCID.value + " + code; + else + return "SUNVMCID.value + " + (code + getSunBaseNumber(groupName)); + } + + /** + * Returns the base number for Sun-specific exceptions. + * + * @return the base number. + */ + private int getSunBaseNumber(String groupName) { + return 200 * SUN_EXCEPTION_GROUPS.indexOf(groupName); + } + + /** + * Writes out a resource file using the data from the given + * {@link Input} object. The result is written to {@code outDir}. + * + * @param outDir the directory to write the Java class to. + * @param input the parsed input data. + * @throws FileNotFoundException if the output file can't be written. + */ + private void writeResource(String outDir, Input input) + throws FileNotFoundException { + FileOutputStream file = new FileOutputStream(outDir + File.separator + + input.getClassName() + ".resource"); + IndentingPrintWriter pw = new IndentingPrintWriter(file); + String groupName = input.getGroupName(); + for (InputException e : input.getExceptions()) { + String exName = e.getName(); + for (InputCode c : e.getCodes()) { + String ident = StringUtil.toMixedCase(c.getName()); + pw.printMsg("@.@=\"@: (@) @\"", groupName, ident, + getMessageID(groupName, exName, c.getCode()), exName, c.getMessage()); + } + pw.flush(); + } + pw.close(); + } + + /** + * Returns the message ID corresponding to the given group name, + * exception name and error code. + * + * @param groupName the name of the group of exceptions. + * @param exception the name of the particular exception. + * @param code an error code from the given exception. + * @return the message ID. + */ + private String getMessageID(String groupName, String exceptionName, int code) { + if (groupName.equals("OMG")) + return getStandardMessageID(exceptionName, code); + else + return getSunMessageID(groupName, exceptionName, code); + } + + /** + * Returns the standard (OMG) message ID corresponding to the given + * exception name and error code. + * + * @param exceptionName the name of the particular exception. + * @param code an error code from the given exception. + * @return the message ID. + */ + private String getStandardMessageID(String exceptionName, int code) { + return new Formatter().format("IOP%s0%04d", getExceptionID(exceptionName), + code).toString(); + } + + /** + * Returns the Sun message ID corresponding to the given group name, + * exception name and error code. + * + * @param groupName the name of the group of exceptions. + * @param exceptionName the name of the particular exception. + * @param code an error code from the given exception. + * @return the message ID. + */ + private String getSunMessageID(String groupName, String exceptionName, int code) { + return new Formatter().format("IOP%s1%04d", getExceptionID(exceptionName), + getSunBaseNumber(groupName) + code).toString(); + } + + /** + * Returns the exception ID corresponding to the given exception name. + * + * @param exceptionName the name of the particular exception. + * @return the message ID. + */ + private String getExceptionID(String exceptionName) { + return new Formatter().format("%03d", EXCEPTIONS.indexOf(exceptionName)).toString(); + } + + /** + * Entry point for running the generator from the command + * line. Users can specify either "make-class" or "make-resource" + * as the first argument to generate the specified type of file. + * + * @param args the command-line arguments. + * @throws FileNotFoundException if the input file can not be found. + * @throws IOException if an I/O error occurs. + */ + public static void main(String[] args) + throws FileNotFoundException, IOException + { + if (args.length < 3) + { + System.err.println("(make-class|make-resource) "); + System.exit(-1); + } + if (args[0].equals("make-class")) + new MC().makeClass(args[1], args[2]); + else if (args[0].equals("make-resource")) + new MC().makeResource(args[1], args[2]); + else + System.err.println("Invalid command: " + args[0]); + } + +} diff --git a/corba/src/share/classes/com/sun/tools/corba/se/logutil/lib/jscheme.jar b/corba/src/share/classes/com/sun/tools/corba/se/logutil/lib/jscheme.jar deleted file mode 100644 index 5a2a0f1f44dff2c8bb40f08e382cb361852a1408..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 382167 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 z zG1;0wC6r?xwY9fz#UIJ&4a=!qYDd~dKU-Shc#~X>HW>2gUfN#RHp(yk-gs!pCUhX_ z=TOEQ&LbMjq%MUR8K-Z1k%`3Y$j0n23FaJwmw9FHq5L69MekVSez`FkZ;z^l^ry|a z;r7HM^M&kl{KAeY3`_Pl6kfmWK%Thxwb0Sq48ODYNQf$vGLJW2Z4elTp6qDdH_Oly zp`7`d7j%&!~1?+fy= ziLWs$X>8*OHKY!U!F-j4OOQ5c4>k4i8WzQ{+XGni@YZ9{LASMP9!y{Q<(9~D;bNZH%|K})3kxM163Rvh<0F^9&ky}lb1 zt0i#mD*4BhN|Vu*lVmg66mJnt5QEn8e_(;ZZ-p_Uq};o^jxFb=1irEGb?I=6(uTTs z@f61~I(|*z3zl>CzW1C1*{;8!V!LiP-=iHLmN4I=5DNow!!5u^%~A~ z?^=!13E));Xw?kX-eVNbXZep{7GVgBaPhq0xcsA@=>#vD8jU$&{sBQ%yp zV{&{iMV!m{9P*Lj68}m4fCWxzb7W+(iRj|I>~-aQMjbnlfx-dgW$T^!R(ai1BXEXZ ziRm>ZC)+L0Wjz{hzRsPZlkBwZ))@b( z|BtNt+`?!IsDcdm9LYY)e4^}2Ug#_3G9FG$OeC5gmhA}?0yBSicJ(^W$0EsOrc92N;#$o~SMPi};iK)j<~u8692dtsbFHAbOO=6ltbLNzNN*&nX9*3rkTW*U z79T!RWeIp1WIf9_i8qdUlSO%r&=;4um~yL5*{i6wPwd>#k|YkzrXMg}8P#v>@3QVg zo~n;_S@*2=%a0o`OXlJCAw}c0V?UJ?J}jor@iH;;Cq)g}?Q&SRaQ{accPa2rJRAA> zP(1rUx9HuAlfpquBw_H~9%W0hTI2}Y#g~!%ON=m{<8%LgRA2if)9@UZ{2Ui!bJP3l ze~{b=k7$-XO;`~!tVo}+p_O-{(>cB@_WXehY-b&4&%&mt2kZ8=G+xQg_mIM0gXVngl>41?2}qbH>rD;@Z~xu-(SmLZ*^m*53M0 z<|4VqI=tbj4bs(Bf+?Mzosgo6?8!0qMcXbsOucK9dgBT!T`f3{q*@dA`%aaf*ev37S_tuN zm)4%cCbNTq3$ikI@m7K&B^u z0w${H{9cKtNqq$Wdw{X=^-!J(m6~;u_8Gg-ehg}PyrA^xA~kOD{)9?Qt;2ODZb4h% zIjk)AO3xk?m2RC*c>2iH>gccczU2q&J4oSzmqOXlFW02=Gab?3eTuhSo~zgSzkU}! zmn@Nm5sHz^`F84t5t_88Jq1{US?FYaJEy`38$abuq@j<405@a4#97a$T&252Ca~%fRH$rPq9w{`*^Hu ztS>|Mg%Jily_B?4go8le&cYXghd+IV$0J!I3fos}dN3l-E(pCKAML*16u!rWRIib9v@`?8Jh56d1!zwx;)1hL|sO=NGje2Aas?zL{{I z$9z0>2U)cD1j${D#?RSr{GO+=`WuGosl@s8s<283FJ1xZwXw$ZZt+m#UAu*ZOAgW8 zeB|@OL)9mclgO4pZhbuc_~Wiz%6eEv4NKsxD05Rwx|0+`cc!@@|EgqO#n0qEpV%=@ zrc;93`)h+UkuFotsuqE5XgdE!T)z$#cX6J&l~T%i5<~?%T8<$D%gH0Py;8=DNvDM_jbP-1ifcdI4Ux6O(8GUg{GQJa;FHRfO5u=1E5! z^Ckk?YM}-8ekENAFhS)FyqvgKQdrCh5{~>w~P1eKwQ~CbJHKRgQ+W$35t|H{m zHZMBjbT<*2{NgXjCZjyxYu*UDv&61XM z(j^+0lYdEDInBN;IL)*Dnj5hFrJimZ*9A0ed;m_Ton7JuR?Rp;428A@%xeeTJ3sw7 z2eUJ8<8S;)pNabQYnjt-$bG?$Wm|V+KmEFfl9$5la`5(>wbF2*rYUcxIa%zv>2xr! z{yD|3+*7uwXHtxbodooWn;1S>#_ccaUdA7*3TW{%Oo6R7eDfvRu%FH>H_|SRkX9pu zEF<(Hmk=4g{zAF55b=K%x&2xrH2)xjdc&<9*AJ(vkN@*9)ivyeb+M?lUkfq{+7`*; zHyrkimQBAnIj%gr@aj~MxoGOe@C|<(RUJRC^dq1gH|kMwWK+({74@L{nX%Du`DcDzXMIhF zb&bYo-)V-mCS0Dgc+X-Yj(MctiaJe!!5MKl7BipQ&R&N2sJ}hx>pAzo4sz4{M>}O* zgY6sh_U1or@05$*P0Uu)c$z*e6^zXrx~K~c-w(^X(&r+43uRJv7x?H~@h=<|ENbI2 z*llTBIkV#CpUr=xx*l_)&|If@7mo~bEn7K-LKoU|n;-dM3+?&$gUJ_5KE1xJ3l#F= z-vVHdjzq5aRr7JnC2wl-Pdk_#ky)SAc@qoVTW~+dC-CGzyL|i7H+}Ramvi{f2$o{)C+pbs zTsO^Ce>yBa3-LMG`%222+bN`N=h>I!6%0LUD~kP=W8}Z>o~(_jv`_W2AYIrb(We!X zcRkwx(F&>Y9KT&^so&e=f5Yz{w>rk%yCOkCxxy*9&TX4Fz;nN?`-EDOL^1bW&fB*z z{BTs)C*a|5ntcCP*eutFd^fI`#KlR{?KX zg{88-rP|JT*=T<8M1D%14Bm}oAhz5mSwp2CT->%&DGf%tsdv7b%#RdU^Sb6QvXC&&D5+e~;6dDd;wBJyIL+ROT*MHagFiT?e35Dl4qX z_{is>w6lZurItX%LU%}}`nUb5ZObLmQ>Gt^nJL0mP%QX zCx_y-;#Z|I4$k&bVEgC@=9j%hBQzVPz_d{VGk%|N<$Lv*52p^=ardxm3>iF(yP*VChNL8em|`*eln_cQaRspUsy9~ z`eIWaC4q1n&X_`hA4z~yj8b&L!vRY#$aWry1}q8Rs+(zwU8Q$7Mh@*LIZ4gMlSM-Z ztf=T%xsj(N7>dpujn1_*BFuS=op3BOjNBU}=HJmQyra>^pjklIhgc2EU`wTxeRdru zL_f^4j}xl+e=X$0v^>|OUSS+(-t5Ojl2L&3{uf)qT!+9;V>C7L@710`J3&c<)Boy&OBPM;Qt>;6=}N`jmat;Fiq1 z`q^8{_B=ly>?I*ra%o^Wzw)YbChhbBW%87?+D4I&l?uWIe4rbYNM~2x1`Fdw1(Ibc z^ICaS%O92tsolArL6Qq#l$)buXOi(+x})V!XX#G*LcN&Tn&ULL(zd267wJy;LcQeK zo(YzV>92Wr=}yW*y~x>`t28$(5$_b4&hQ19;jgkQjL9|MsODFhJ@tu5fjRNIr7tw= zmVVTw80#x-FzpLSNwiOwefLuyd}{yu)LxpmSgh&3#tH*;rzvhR>1rhvP$Q!BRVAvw z-ctG>q^>_L(mqMQN0)01(8#?B$)SB_;-RRH*=UuFOlFZyunW0KQ#cp5>$7pmW#|k| zW>e)R0?Zy;AGQ0vtAVr@sqpPm`Z_A30=KxP7&er!^?cW2Tlsfmok0Uu$4vpUgkd3K zr71slb2<5_qib*G^uvnhJx@rdWe1N%{UE-?|ire~j?Mz7K zrqwQ`Gw>T~jz_emGl*Qd=ErZ-#^?vt zaCjbNCY??RR^|oQrKOqHmQo6aawdD3Aa2b)mUAy{(aQX+rEV_S%HP3DzE0YYTf_{m z#lae6Jk`TrgB`(35Kh_(c5#@5aWhu5r4QTDbEowAi<37IQqJB(hK;|Dz7lCy9VlV6 z%?5=Au0jw5qwBV7!z-jZweB8lOHs@$C>*BQ{3HQubYs&)3eH_0co+e7rieWf^Cl#NSnjp;rwUKcUDJ4HEKDAE3JSH(_>OV`X|q$~ z{gZ`F6C*2wg3^CVPrTK3e(c!}wD<~aqfsU3J(#mDTr7B+=K8g>Y`}KId>8(nk6ICO z=d`9!$hk|3jrk0%!*2p0{JhdM2p23}cPu(#iAjo%_Ylp3&X{)=+XIp)AFkgj2g9wC zMa{rKONC9vvt5se(y(Ga^y-athzrD)H9p|S&WdJ5(9Jwcfq|*6ySeV8;Ra8iqx(OA z?iHK)1R0sTz&+h$!(Wz4=pu=|->1hFZUTL!WtOpxEr=u>bD@c-mP>a~QW5{602eqU zYjpLuTVmo6SFxB))zpom<+T&Z_v6)z|$;)|zNZiEn zfl{}~^=A~5DjZklYewk_Owk3I{vwI4NBsPxv*QEp%ahWGP%y07{;3#{!r%?8#AI)hJ|aur3Ue13F`QrFkXCkRnwpLF5h z#%IWn@&9y)W+c(17rC(b@$w zW%XeeU7;%)FhkuaR9R{p4YyZ61U*TPrNTmZJ-akm|MjmM1%z+ zRI1j>a)QEmcKbZ%=}Xn#Lq8 zf*-?q>>~rAn1i9>-!w4LE*pjEoeR(NtVA?hSJ!LN*gA+((w_Q+N)_URy<}h?KAAZA z1Zl8+35v2J`l3t;yX`9Bw<6F<`uzOkzaiLW#5A`ldl^fLw9062KKfT5_;lv=a4@}CFDz6VXlOUhx9O&OwE(6j&K*O8(hs8042st?2{9;=_xD?5}IaM%01FB*LPvVK>g7gvB&S;61JaAI=|@=m1Zv2BlRi@Ro2jF=x`G zO#vp|0Fy}JgXa^D>CrfUj(AL3P>owyj9c1`&2sBp{0fTh4B}Zksh3o<8dfsupHR-; zkYf1!%M2Yu%X6d2G$&IUG`Ej7S%-O9hItcT=R0+mwg$V$GkpA4~Q5oRrfoLUoum2WW5g zlk6}S1_YZBn$Frhghe=?EjTK2qW`s;=1pWtR;6ywSbW2M!V(@f&Xwj@H z7~YhYVy<&8TJ6+1l|R7J3jKFd_P~#LO;0{qfN^^=?C4_mJIAp5sD7CeT~#pxUme%y zp=5234FLz27J97|=k&kx15MKhmLJ!2I;`}$Wi%Zgv9*y?s5-&8QE1~GlkC}?n8-IB z(dg92=SF9y6{^0~V`)_qvSte;)ofLbvw^+ggcr0PLi1+r(SMbaSXao|3R%h%Zu0it z<&7bcdoze)kC-z9PW~C$fLW6>4E`$s5lRy^7Gb)-b`)!ftYQ7dV@L;R$MfRYjvYqH zkH8d0V#NVFv{%C>r?BlT5BO)tJqwbZCFpWdt9_<)r;o8nwz!Jc2)p^{rZyX8 zenOfG+_UfblAk29Y~CEj?}0|=CRS#u0gd%&W4`J)RYS&X71Gs|W<5ZT+*H1n z;c)*JjzivN$xgh*s-@$2?LFG1@x@78181A)#9d8e{hcZmC$Vfb>q(=ovq@Zc?v~*( zAk8`ET0$Rb)BrTE1S4yTBgSNLZ!3<50lcs1Od!GB!+a!e8GAW278(I?rh7W@XPV6S#<0 z0K4rb?F6F#c5nAK&jV69UcHuirDQIEx-bSBweSjXf8K>NN!b?)1U{X?Wu^{J8~^e7pbcc=E+qX=;}$xhE8;NtR}rRF#a?FV<_mWtoo(V zI|NOpPdV(L|1ZhJzqO%v`1~q9`&!$Kv8#vYeuAzCDzl~EY&rz&a3JM)U3auz(2E1> zerlDxy`=-a#SD5;ccmpvMuUWH?9V=Ymyv864japEri^aS>d-}|SXU3dQ=&a;`|2aO z<*9c(`&~8ZyDw8>K#vXUMr-)wy)9*?56}MhTt&fuwq)kMp8FB@sRb`?cbn}KaV^#` zXXv835d~A~bgUJZGb3LmYsyz~TTQFyI0u(6Y}e4r}?IouPO~-6w^1=o zqk=!9h!7_TlSY{LUogmW>V*(=SyV-)92`SeTit``ZH=M>8J7X7S1>d9{O#k zn2v;18tJCJi5IGCEEyq@h?oMfyIih7EZOL!3PZj+sQe%A*785_XwG z8sLaIk{d*ox?fbD;agncNi51CR?WG{Ao{JC{z7TO-k-3GYOx5n2x1JNa5(bg$-9yA z(Ny7bB!mB#M`6ozhbtn_YzwzW1dLNEe7k1YU z(*y0(h4Od0JW694@nIbN2UJmkKWh1rfh6wJ&jiMg#iCmO?>O5Aa-pw{V;-Npk%pA; z{ZSZ!I1G?%bAU;QNW-B+|Kci|G_2x49(J}j&$$6NKrxBZO32Isyv!1r;<9s z(IDi(o?{3#-w(zgxkx6M>39dfTUg5vzF;Z8FjW0JSk#iLH3>G?@Bf>BM`$u@Hq4~v zldWO>vt0tn1Ru_Til#$P-ZGQ4q8m9x=w2pE1X3xEg|Cz)a{lpBgi_&>0e3);KF&j# zWS_3g$ejPyr+z|JBKtFq_C2h8j-y1jH(>`%bQmTHPqmnY6?sGIG9SXOJj_ot6j=8? zf>aeSNPov&=nXAL@VC@0W(waqT9Jmy-Dao%jt%c|Da0kx#XbOW7yc=n4~2MBm_=1U zIbs1ei9!M5K&G|t!o)DILE=6r6tR3gc9CB`d%)a4@Ph+3&KG8$q5f%rGSztfVW6Gk5LABq0#UGu8PbgilNTv z+>geXtQo3gEQX8J+)1PYU21kXEaW{K)D>I7f}|2Hei$MA?*}<+Dk_tCMh8@hSk>^y zHCxUaeemHlt=U-qp|(6P=R8i*!Xd zAn$5O6Y@PV0eEaYT)>Bksv)x$A-3oyEF#$zWDYqMc;VP{A9iGoK1#<+^~|C(J+=O* z>qAs|B^7-Kuk2E8q|J+SL6eZwgfe}L2#Z7nFbYv3=X->uD!|y3x@9ddjY5J&F?2WT zdjvgAgt-azhh-2j9{}>eiJ0f4PLWoTkIR1=g9gFVM1-ROd>*tyfz1FAIZnhlC$)Y` zK^nc73J4nH_4TMJb;Vkq$BzhL1R{ulle$G(g`Y}HWeOUkK@(BV3UFV`TVa&A=|Yrn z#RGH}QJ0Jz@i0K&(Kfaau*kybGYCw|d#ruCEI#Sk*$!}!#e2kn?ln(PN#VXgZTGzxl> z0(}$yXiWB}H<5k)RAzaaBG58=*c&AS4D5r{vcg-pO$f6#@v~E5%%jXb9W;39{{ZK& z*i;5@wK(bh2SX3+SL@yc%8A;faiJL#!2&8xl(%uy`v-!xM3SoztoE}F!Jk>vq^BY0 zM`J~-a8j7Ujh+LsQ~pGv-10eV3L4|29F6fdXLqRuiCC6Sr{-JO2NeVZK;SqLmz>nH zaw_ym`Du1R1z7+PDNY0qC$(K-fhN5e%RID%DNO{$w8rrtnV-jhFn}Q+x?LDA&Yxci z5&dgJ7*%rX{a!}w~}=* z&)h4KS>OMW{0xM^;NU(E)i_Qa=k?82C`C?mdvOZbMR$J5pwZKNl58OyJgTCQ{z&5Z zQB@s>SdLHEP_BJ9T5jb)pSZ^+AG4Q^Pn7`Qe1v!y{_lif6lZJBKDM=>H!HVGjtb}g2bp#;-AkxQP#KbA_?;hxE* zHRWdhMQh5#97lV=&HS78fajX~2dzUM^bfnEJ^}UefdFmw_8^GnawjU7Q`KTHm{8?n zBiLW|_>eQ>XuUhi|U@gA*{>hVjyajiv?h?@sOSK*nSZ1 z^l4YP>pu9=Xc@~m@m$zUke z+C~G+X>@n{02L-qhO{9Q_-T^K-aOa*A-UYl*#m#@(?oW*@Y7^=u#hH896}(RX>o7i_4r0(Iv28^h?Ks@K@xMOYl8{XbE`o)QVYP zoT#nvS0s})@JEY}5BrcJ2$8xZW+wuC0qESJrc}jv1Td+4E54ppEuyld7D^bFtST2-W&A*MPhJGFwX+}Y>URJ zx4=hycIF_K23Px8W~D*syUxD3QRY)dfe}0vjgx&5K3sFZMHyHKVdMpLhf`od{<~Bm z0%tV+6LLgow+{wq@m@rYZo!KDPe!%<97P_vS>|PD!1ukk&;lc#E!BNR<>weu_rUQ- zz;`ksrTXfcH~ISP8r}RAeHdmYR^T@q=>I3y4?(o#M*XvB3-LnlIPfI?Q;M>I?o z5O(Uo1~TGJD&p1+V+G_c_N6L#l!G7hL?7NRrJXky@nx|4S;2xysW zi|`)dS$hUNlc{57cibY3T`d$Gv+VHQly1@;!Z{_qe7HB}q?KSxb(FKp@KSk|vjBc; zS-U0#8LB=SVKCH+v-zl?BbT<=U3CInRUdsWMsgzpf*Q5hU3P-B2c_kFOb`z5x@l4x z4x>uuE^5tOam%dVQ@pIWA9=8F}Y&+_yuEe<|(Q zgA}W*n+GviryQmTz&e=;*##1GsQQS6*#T0IXCil13B1&FOT>sGCR~q297B)Yj>0!<2;`%ZS>OVG{Gu;Gzaxi5pjfVdeEI z2WwoAwe9oIB*$4sO|n#0p;dJsQBiSl|4g!3GqOPZ`> zshtn3^vx9W=REc0oDnBzgLkr^O)88Bur+7I2+Cr#m8*kd)YX26U&_=~P^Cggp{uO7e*Dp)hxj0)HyVCE+{FJ;~y_)FNYuXXKmFkiB~7H}()JbS47>|Z@tGoE1YYQk8M_e@~##Cb%6 zaS0?jdVm=UFg?r}CGZz5;ZMvNCXJ~N|D)U*7uTx+y7Xf|wJGst-;#(6HobGD!G9O5 zKR%L*)faCUC~`u_D-P8db}h@Q)_Ss$@Wl9dfB5wjs~Y^2eQ#cH;^E+sztF%cJsd9` zE^E6jufw&!!L4zK{_Avo3YH*xBjhPdtTs}aUxwc=j-{(+ma!9_ssl?~3fMxU=uDy*{kzii3rqVZld9EA)-`{d6j*WlYkVlHK zTPl@&Al*4dkGl0wJ2<*7lASb3QQ@W0_3DYQPFqD_kI{=^uQ9C>848e9*oQC1{7#dktsX|pV}WKwh&kBB~5j}?NZT7nG5(`LvR#sswl|(DNobT&d9?G_ zzL-NiQ@?_uDC(^MdBQ}TykCeq2ufWh5D|pzR}6qm{+rk4M3tm`DlAj1a;(chUFh=5 zNtUba#|ca;jaYsHD=sZvVtxfHdIb$ae#b58f^x$Sp()#fYKs_wDba!&k_g0sTH8+^ zq({1=y!u-Rc9ojGpgdt`>0c?r`5fzzwt4tXLA2M*>ktI_Bqj}L+4&4Erk_{P-FYyG zp(BQn_n|j4SUF)IaZnIOG~OMUp?#Ft@H$4^=b@$B-}t}#hp9L~4)@Vu!yIWv=Ngi} zK_{vN(WD`&v3#4aW1sAcU`D7M#IHioTERXvrqldQV8r4UMzKPavcs$yU~I^t7}Cs* ztUrtq7ky?Z&=8N(I#}5Tqd)Rq2ZbCEL)5SF2JUpjZ8I`ohu#~c_XKg?pKHXVAJqEe z`@hOD2jTC1BF*ghs&oTJ&AdKkOM$TquiNO&G(IIQ0Za>u4&nsg49W+0+ITS)%ha}u zc<~e~BX_Dg;Cob-2i>iZvVOV`Ks^vVi3lKKE&kbQ@B;VK=nXMgh;;bzj;!lU@^(lI z@88C%?6?tiToKFo6WyirrC|9164NnyKzx~7-c4axeObP!CM0dg3-!Im2C;+F*m2p7 zerGL=Lhs7Rav4T*_<<(HIlEs+Z)?xChNwP4vaX@T=tniR#{67e2WB6xHdL2XWngnt zXI;z^?3v|MUBEw-%}Uq4*Jj2QO}t=*rqXK>TSU%fN}!xAZOf9G5uPnn%ly*r;F{NY zS$9nO8sT}>#YoK>$$5!yus{>jHOmF}za>RugA2a%T0Ky}8WHzOc9hsU4)=l{epn~n zj@qTwQ`0LU{y|Nc@j8QJRwrGIJMwV&5lp%e%7J>Z?^RbhZJv)X-9M8 z6h5pYHl_NRcTPq(q9KY)vbITI_@8Zm_GBNG+SU?dtOY>Vrb;xE|JGy91UMWEO9gvQ zErV;lGj=flh?RNsZfhuEO+MTYUF7(+&EIif-tvcg^A|eSnuGUTq=&u=IA8xVry#tq z8WhW6@K{NVB=SPqmdY7?`tnooJLCy7@c4+9;`iVFsgFhYNVx-N&zp0PIXJ(m>ap|} zrT0eg*OsTwwx_*L*S0UD|8)!~a#O}*^_BnQJUhDA18e)om1@_aUP!N}LBCMfUv(v z5!$T%r74PSG7O0hk=l&;fnL_47!NH4OwW{51@`v9jH~RSd_U=|ZFh>AhpqIqy{{E!EzD)&n*S~V|e>*xqI_iSks zJ!rj8r}Oc7H@1Vlt!;&Eex|p(A5QXo@~}ByZty?9=fj8u@%OBcX|UyHFRo}+CoZz| zqO)sU1=}ob|Ds=#Mj`%+jaX~V^k-;}hA-A-bNpT9rIpO83zoQ`mrRBZ#LQN39e{7i zF@)GyEgP&P*EyNyfjnAUrGzPJyvu^kwCuYp@5cuw!!I3a!;&!SFU6~g}U5r!a%n` zq(E=D%f?0sa%40YG?`u!Zt=xI$VYU3;cMc4)Gx`wFU>#sYuNrmcJtoiIb+CJzWNu) zWIw5E@_seQUMi1_ZJamIeBOWIQtRE14?EpBr^Yr1Jw#Td-8bDEkjq{IRNiOC z1c7*P+T}0x*}l6bpC-9zK8JnjAG+oS+^fASsrOHGe6MS8-YZ;+{}^6lF5fb@y|dr* z2CaF!Y6kImyUGXu@^%#tcJjgyY%cFW5C|^pkY%$G2+r~>x0g6)POG`(R5*7|yJqvb zTrPNKOzZJp72mmJn{O-gs~u_ax}SBmW7_3&OD1xtDQXCu!%3uhzGJsUO!n4kIl z&PHB*mQnP`I68ha;Uh9T8pPq|WQVrGvmSKygRbJ%k8S2O)-%u$?5*645TNbz|T(AeEGjez6|R=Y@XHAluRQXV(VUS>1-5b_K-wD;9zM{Y&~`frz30 zLdLN}?RL^kf68>X3^V&nI4!i25#K;hj~gtkaT%&$O2mNfA3U^pZJfUt%8#Az_|VO! zlExMeVh=@Qi#>;CLeW{OM8B2)HoZ6mU%vV_M{xM2h=VtJgBp zmvP=(FG}n|DWYf+I~4TEfKwsR13W7FXuwMgBv!1uNGP!j`cTln2f%y%T8RJ>N?c$9i9=gYvxosZujtVJ?>Xr_8We=8QXCcu6I71=UoJ_lp}^=5&Ab$m zmUaV~rk2^Q{aTBtV6K^KZ0~u9d|?~PjC8&dG#ENGYw93Tdl`ff+mPAmi|@-Xfyq76 zzfNyU7?!Yqt6Ccu18`;op-m1ju`*MU%gwN95yg@h3j=yOI(ADA9U!lwr#U>88A) zn48dz8HE7x#E608>B>wR#BN}+7ijJ}LSh?Z=MsbD;y)@E=mMAjH`Z0EwW!7VWU}3o zNnX*^52{HC)a*m$p=qLc%5sS!?3Mip*;m%L<{!h_{%jY(<9-J^aEKkp;->zBJwF3< zM~h(gp!gBE>?f~nyb<)gi@}6kMz|5oU>#9cGrIeeW|4N1zLgl{a11zB`$) z>{y4J_$qkwcMn<|LZ@Ie$iWJZDWqI#v+z17nZSb-RAW zI@hb!M=*mxRJSsWg6VtsX3`2S@vzg8kru zA&`-<5pc4wid5HV^pu*SbxC^1bhKO#L;BZ-D`jL9oz`=WWiv#R*I z{73V%;Pm}R>Izh&d8b(F;{|hP3$v#BIgB1bgk9l%=GWW}PU1HZ9{hg4t zC|yd|VExFDM5?9X-;eo~7(J~aqErKjHP9`>~FncD`CM6=z3kiv_xaQb9V314cb z_OM?fr@>!e;ZO3Xq;0m-zp;kI{lwskeXuX+h{SBrx1?C}X;Yx1o98wIttz|qQ$)dp zKg6Ui0g=V5nb}M(EZO^{Sk4LbZY*CKUvMtQ>3==LBXg&_AtUvC;0(qMb?Nb^`@70H z!Z!2IiKx;Sv}xDLW}fNuJyyYCkLrgPX@;VcniEdD`4 zySwJsqkc3XHwqp6*0J(|LlH1+#q!=3YoOq#jlaC~GawSVr z&+$ylA_YPj@faJxnB~2Mv*?bdVx>@u+TLT>u99+jZAim}C6D9^CdhlgYJ6hQxZs(d zo*k`<3r$>weAJo~Z7NH(f+LYwhjL%aI#aw{IO+E8ZZ?yjpAx?UVMCM2t}50%o1cl) zPCRNd(Jn8wJoI~81@syN& z-0=feQ;%(W`hO$1gU8K!x3IO7%{8{><^y6z&}s zU6qz7jbc+()4SS7D4eKqf&NJt^t3dgKf9g!?ifv#y8VKN+*CzY+MR=`DpP zp&to!la$N+1YhW*xx-4;P^b9vJ}D2mNY-=zUVl3FH=2}XoS_7oN~hv9qs58@zM*HO zf1DZ%S4aq32W^-mkVj=akZ04Wh_+FhkBUg0;ncZZ2t%4uLtB6)|o&}t}hSXbd=+w|M zZuO~a1=*5w5pUg%;T5ae>Fw>y1%}>?5ibY!1Fco7H#Is;v*^l;F_<>AW6FaQNe~(W z28nifsKF(}bDtP*%t>Gd5U6q9peFD?A|9|59(s-7=EdmGu7$2yWnqeuM0;q96s0=i zYGs}~lI*3QOOotmo?E_F^3OF%S2E8%Nkr1m`AI}F&-F>U($7jXLdmymG(xGj2sED* z2dS!l6bH+yeq;x&s(w@ly~S_(<3xxuG_i5=vWyfZG@>P=UKLe;P4!Y;!>ag91r(O_ z8aCyY=8GreSk(moB)GOFbr+wLnHsFtq-ni^>nJ|Y=(Mo|@5^EITJxyt`#G>Ebx3}H^%!7T43!fVp7<1u3DVobIoeM5nG zXISpUR#7A<)>(0nNI6kflUjrGB&Ne;T_BdUz1wHE`uEikw6z~X>w;2Eo_LJn}2%J_l@?6QR_mNmK zkxAJYMEYg@EFd!;Dol$TPdrjHiZe1Shr#9`Y;{&A@U6R|sr~>iQdOcfQDKQYi35rA zYZJ~Ienq_83iCOFb&5@cjvM~OLbahGp3>A(RtqRI+-o!=JtfAt~_~j@sRj%Bs$s*{GFtn;7Xj|}G_Z6xQC3bF9gR)CT z0p)sHfs1>t;_(^JxAzox(a$0IVhG>1?1=Xgqq1zXjA|FoWCe(NELvL;Y1F;_4wyX7 z+ER4r0-Yc?IF=`B6Qa<2S|vV29#}EtKADo=$6*3sW(D(&4ppnzo6a-&?UYB(2Oi~Z zrM=^d==_SYccVXX`5Phy9s_&u^u>*O33P;@hK0EFe|Y@ZI~cKM&_BCg`?c)pVLN!n z+SRhxj9!a(-2qk0*>yQk2~oSX?Fw1DHK%)UPQ|aa%^WZY6@$X9x=kHW2z3aLPc}p5 zP}Qdfc?dU&#jUvQ5r7VfdA`hR1jJh>e1zXNJNXH%FLzTB_mLg_lR-b)gJTCHUeIp9 znob{U&lO6auPC?EF<)sdmN`8yZd*N&22u^K1T{;NIolArUp`O^vJvhOWs-s#Eu}#m zWeeK)mzx3~{V!fkSZhO6b}^Q!Ftnxr@pi&>F@jPb>6gMt6BB7-9rEUmGn*4>nNj zb&YxPi^9J+`fxFWn{5anSG_ENN20%N1I*k=n#gyf^zaQ#G$U%4ac(4rL&q_0sP8(C zKtJXACjIeQ*AaM)jDEmO+6Sq3HMS98j{Po$Dqk&Q$26Y_==Vp7SPV)kf*HPzqZ`r- z4Ek+WE;D6e_;_+tnr^8P3sW{?7daBX$c3on_RD$pQ=zTn&)|!hMPGY6EMu@QHd}0; zX<$D7NoPMwSlEhu{|s|m$P{ojuy@tUo)6~H&dMKNjInDJ$}3dR$kegG2|Go-c~Eu7 zz?<&v#Dsz}1|9>bM&aND;?k_9-w<_=D3H^Ny$@B)N1^dc);RX&d@Q=ct zY2{7BqDRnzhlEuZ=E+gplgGiZ2S$W#VUN5-S}~kK{#q>wat~KJv*LfmmCC1KaRn61 z5kc#~(j07n!TROVv8fR(7HPv&z4<%GDL68>_@M zRY>hV?X|vvtimu{5`@z*3{0%^C~o+VkOq(Vh9_tFY|B8-a30uh}TST*oRd`0~wXw;B&#r zX1rVzW9C64QaVWbX&bg=hh9ox{b>_4 zfsT8Tg1!L#J)Ck(#<^>Ze{skw<*#9ym63q_BX=9T^`@Kv2yAOI#p~@?KWzfeP zy0$P}!KpWI%J+oLfwjNPiQUMi=VXc17~@Ourq<~VuH_9Jm>#h9fd- z_)~d)NBb&Ue$mei7se2n|z&=#}!l7P+*<_ay`#j&n z57z4U41qK1m=yFGUzBMmkFgtfmI%3tMc0fN0qM6W$WN+ zoAnd8PQW8Oem^LsURL)A>1B`zXVr3UqZ-cL)_aHiInyHt zm>2^QRazcbV=jlwPiXvLunH$+2_Z$Ly9k|uf!dgdQxNf6^f;trJpQ+-v^WJ?J-E}e z*7nXKbI@`>{U)sWEyqmX@&GPjFtvT?-7_ybiw*`$CV=IL8ptUNET9D9Q%O($+e2x5 zA3@E}>%9fgXSL3slA;h!b+!hgyz#MCTNS0nv;H5C|QXF_0YO@I@_UtP?NkV=o zLVifSa2=KxE)+GyA3DVUL4-Olhsq|3=A39cbbgM@vW!EX-jb5t!l*Ohs@IA+_A@`c zDj=aMKB44{cjx8(reWQ|&#Zk%eL%@D3|Re5x9r~2Q|1GXHF~JXd zZ!5#kQx+YM>m4?wKSd4$p&0&!*nifpu63~H-J{)|=og;mZTmGuQT}l?OX6IQtYu2W znRip7&)#|H-`N!OeWVIJ(R(Mg6w_fa#VqHNrbK<69mWrLlcs`ntFiglfN3=hA!yYA*=Bfd zH662zhQ`IDALTSUH6=FbSq-Z5Ne`{0);h>0)eYpgK%Yk{x5qDob>vCXR zas-1wnMIv){(LThG2LEu-_y<3#R+7~mN#}&MLo>7Bie)C$BCqV?VO+2Ic6^xt5X^c z{IeBUI-qIx_u^44`43hLISl_4FkCF5RafEYr-y0?JI5{BeV)r)1RUopbf@-LEK!Yi zdvvGbCze`>X{S~=&z9FzQH@T2ilRThopBZSGVk8F z>Pzon{^bqEeM2^KApYQ0pv3O&wwAWl{gAMIAlm6?BbLTH!8<$I^)->vV-Z zJ_)o$64KldM#gUK;m(qAY#N{3c%K6V&Tk0K@k6C5*LzKmKaC0Q2MGix)n8~6wAyAZ z@;ZJ-T*gjZMi=}GuHpz^yE3uWYpCcBt!Qeim@0TqY~z2ZkPi9!&c++vKC$AfOEu zxh2yO^&BK{uAvF`dL4bhX%TDy6m{pb3Fb3GSdaET_LC=At6%P3x&0<60O{WU?r|h? z99(!!&yRT3S9p!eKdia~#|g+8T730RLH<)Gb4{NK|EJ#bnx8HdYXvQ5qQa8}!I7ym zV`N3YCqQ7p-t5nf&MMZMjNP8n-Rv8k{%G&s9Xnp_%=vn)r$=PUpH@q#H>>Kntty3s z*Jg~jGB-+pNu8;!xzi_e?ZV-ipTpCb-f9n@;Qxh3P~>vSHnG2b`^*3B{|S$b1%=Xo zMMVDZ@&ANJZ0wy~o&HaFB>KnMPdo|0rvh4o5g!0H_LerfIVEnUpe$KbM=qWgmm0o! z?&Y`vv5tK;I`ey=rp`m>);r9;^+Qr${gKDZs*r3KTPL*iQXvnOyV>RX$W@Qo=iAw% z5DJLmt!xit-A0^_lDwT_tVnTRfIzLSdgooz;z>B+L=x>?IU%+{2?-gQW8a0{NOFY! z@;Gg91XpmDIkzt`rc-mlK}ib6j`F%(H??TgmjL-%3p`hj%|Lp~KvoDDow;bT0a|Sk zUd(1yYt>BpkTXibnA?8EdeA+EEBGXuO+2J~Y$oL|wN?ukzp1@;jWJd*!xe5ss17yD zP_0(W!GOLmTB{|E0V^e>(~$lsWauDG(r?y*!4oNs#eRcU z#&T=LWRoUYPb5zwHi~a_j6?O?DK%^(UKk<8>z8f<=6^q!a z9YTDm+&oP}Gr~z7^Vtk*;s;lA>NQ;a7}B0OVJ`{~L-9+& zMe;PY`IGhGwdEzvB3rbzHSnou?Su6pwlVf~g*!SiBW;T7fDw0(fg8XwPtOSQkk_Q6 z!X^jIPDc!l24J!UH_fkAV!pwg-Qb1Mwd+R$4e%KDq_+Qc0jh>t1r4{v><}}h46(hi zOEsL`O0ZX`Ik5iVYFLaugngwK5&3cT?y!RzMPI=NE;01ij@7YrsH>STUF*UvHSv$g zwarQ^NSq8(kspFq=Ptgnp%ufHh#?BKvorn{__gi$zd3dk4xZ5X~D|s-j$sdSECl6uxJflPk+1fA*?E#nb z*yI`ci3$lU+TN_MhUw>or0Mwr;%uq^P$o#fHY7 zFps^RwVqE@a?;jh5K)^GsSBD)Z;*XH#l6suEdG7F$(_v^>k0mcAKtSfcH0?wx4Jd+ zgrLpp>perk(;PYfK{9sY5?qxlXei9oF%#y@EhqR2rv-1X%(t|5 z54uRobwBd|O-i~e4j@f<7?>QSe@#mN&e@W`rYC!MJ0}lz2{Vfi9&Tn9R?^-URxTcP z&QAZNZ{xKegEVZ&0+q9GXrkr}w80dQ$_=&T5t%yBakv8M0aT2fkqxzWpx&Fs`a z<1QYiRJ>AkD_voNQG`Xx2q-0v19*2LnFkg=R*Kc#^?6Lw&?ytJiPoM9NC-2XC zoi`+DCGOHAiTq`x<)!r{Nm$~Sh%nhUeb5E1d9R|269mrhs=fV{2T_?s>k1J~u!Pe^ zys=I2hS@)Er}Lup?hNS+OpHlD@eA)7K|M_5CR*pbn8y7}Yj=^6&RbTL*R1#(i}mPr zo#$i?fjYuH^yC}hZ6I-AGzGFsT{&p$o7R(Vzsi{g|2h^*(66CvCqvvXfhR-k;a^QE z?^1zl?X^@@W@5&K{=Ht?{9EGjy;|pKp+7TIGV7IP*rlU1W-`))qr?R&=;1 zS$%|ZM{%;apL6>)Dt0bs&f8s8LzuI&6q#*>4WuYYdu<0;aG2u7y-`O{hH%gCefrs|El%OtMJ zIMyfATAzsd(T(Dj5+jwoD9-h{UDZ(iM6#h>W9_FZ*XI}_xGxODX)OrtvgI1*LS((e zDS(YXbG4=)LTHmy6o=!Gvl&z6zj!>sa+1Nd7jAt?Fxbb9icT1I)g8tK6%`W(RA*f4 zhfWyNZAy%EC6u|!3_6m5&*Bm~-^{oY?0M|C$b6&Dn!3G%dqVz3B8ah-w9LA%JMcYb zX5n7rT$apvyE!x|Zo-Dn-|8)kT`75f3@sTVovwbV&(WBo;_}S&FARe!RoUdk;*mCW zS5e6%Uw^@uaPYu(UV^KO)4d~+od!}3!5J;Rf8$m-?&+a7=IQS{?w6viIzdrLW6Y!A zOJr{oZ~24dDs*V-j~AJ&t75_1#zvb3mN`yF`F=Xjw4|31s~fG37i`WKjc?Wl+xp9s zTt?0QdD{&zvvWi;yhes-p0xNC;<@j?P|esaHVsvPN8gtfe-`FR{lF2rT5oOM$eb7j zeDv-255xPlXgZWNf~O*~MnD>)MAWC73ZLpo=yf|oM$qLs9g&!XHzoY3?g{ehX)MCU;p^6kSV~2R2Jr1+`H<-ksDmbwsVA?`x*4I(!0j%h=Mwaox&I(sO3n zVfn)a@e2HM1ydd>>%j-cH{bf6Dk)o=BV@Q%G+S6evE>X0h67FR(R-ux4`T9(qrwaQ zQtO7fPD>G{JZT3QA36`no%r+7i^?&6Ut|2Kv7@Y8os>nL@QWzV$j|`p8>u0x3osPC ziR`gjS~G3rz_4s*jV6xz?69k|NT=_xeL!i)ZTkEBio?W;gQr7GZuILW!(raD4S{)8 z1&%1IA@n(ekx;+sLB2cDt160Tdhe!zCvDNT83c;Mj#jMo&&hPDpkGz>*eY_DD0>%4 z7M1yID79G-9DA8C)bfeKTD(D{@x>FWRNnh&dycrdgi&l+tG0pUOw{q>z|>ZIpVRa# zkL=+Ynw_cTi&0!DNqEorX?}R5kfC@T@)N8WQsS`ncmbY?;(MlNIyR|Y6#K!1d4iDi z<-O_A?Jq1t$`jj^r@u&BJy^`EJYp1wsk)5%T4xaMx>nqmDWe61bNZFttQ(q!wFc^$ zr|N~K+!fO1VI)5kKkl8eEU9cG82+*cu7>H03Prm{s~*3D6U|1OG8W(-;D5 z!L+d3LQkxImUZOOx8xn6m(|QcG#;nu@Ov}ll}A03Z*!w1Yfq%%-?WGaMxnJ+qXtFs z4=C-z>JWH_sD7@>7VKv4NTJi&UvEi#S=(HrzL$xJ_wiVl&29UD?I-J8%pGgLZaCb} zOlRBuh;f5GrN!5}bMS$bAtgE9fgLD8kp-gq38Hzb{8Rxeg1kNOV{i> zpzbBJ)g^;b*&_v^nXq+~+Wwlpo>;#_=-ko7ry|7PZclF9U(5^(q?P;&Kxv8JBdMLm z2?7Hkc^K7`EQTSWft_nZF+XecwBx78oZ;P&9kG2WWvxuHM<>p3m}HMLb*^huDz@s( zQ-{!{^L)*=igqf$xer)csdjSaQXmPmdgd7}6`+LzD;3>5)k zU@|cOb+pg;whtQ5zr8Lp(eCjhJ;h#ieyCq&s2vZMhgbVX-)&2t&LBIaRmw97`)MaqyL6;xkz_T zuf)TAn(X#FM@;$ZC=2ugVkM2nJ-jyfG%7MO_k9J(8L=zxDjl0G)VsW4IW<)&ToRwe z#CzS3O1ra>{Py!$mNwyb5q7t8qS@@a*5?))uBkFZ7seCeBug$1+e#0Zuis1y;L7d# z?5zn~-R7w)KkNtn;~q5}c2c#kum6t-_CNIi*?;Q+RX1k~E6e|LI_9XNfYK+9H}+xS z+!^~D^)g#C(B-tUK-Xp4ULTmNZa`F1AnU#fE1UvijZxiw2aq%NK0WVRGc!kvEu5G( z+vmDM`Z9_W-`Yf_dB2Hef<*0iEd4aTmO*a-CYPcTR?0Q`Xu4wTfd)2bH|#AyNIwi} zJ}ApX8B`n!nfEPz1jG$Cz#})7j?h>OSb>m53jS;*ShatJwesX&h5V{ zz9a>eK5?vJ8=n>`q>Hm>z8N=F91*v<_Y&sw(ezF&4lA?@Rh_8FCKF*45KOBawkjE@ zDdyu!=DiB|Bx$!^cHyokx>XO}*W z(S|$}+4wCNZq?$jpjaCzHi2Z-4oNQQG1+k8*>cx&j_h|HHJg7uD!~Fbc~CT?-K9tL zz=EhsD>-u4J6s918C^s@#lD2dUd)1|LUok z{}!wN-BbUqFn3HgaK?FuH~gnb;fK}N(lmt%?;3v7!qNxZc+4zfis>u~#pZ+l#@t!j zV-`KcYYV#~Q=W6UyTUk|G-JHiyFCQjHhyIO89x}$P;7Cz1{NVkcG z9Pr^lgb5h7I3>U?h&^%qFb>aBhimYt9anGCgd!aSWg}Nfm(F$G?446(a^_4C&dqW5 z%6P?V!|D7JNl*D=;uPyvOy*#h(@44sJZDn(rO9c`%rclU7F zueg%V>SlEs)pS?IF|sDPzGiFq8+e91{fYy)(z28q71Via5Bd*xdf3rYixNU%?rnO% zXp~#~li&5VayMr#Dk+#6?05td(Y1ei-{0UbR2+N2nB5@551kvH{Scrp=A7bWQV=VlLP$*^DklOF zx^t1NB)hr8(eC60d%}i^dWZtN8iF1=n;S8kY2IYOW#a=eK|MnVA+KSd0bnaQvaR&z zXK(p$Ld0y_G2)kkuJ+!9r^pVB2tssKl*18`fg=u`r@!m-gii&18#MvwI_6~u8b&vO#9rIju#TCZ$MeJ`efkjemwI7nS|^{(gPin)DuzUYlE*IMRG*eU zvzRO@eDz7t>0~UAtyska9lU{7=aDs&QRfw@jZOG+-=&DB^0yxFs8!-StJYYtv?H)o zkt26mzw2i&$lNIb$FUsqAnGw>G?2&-(Nf>z7=bS;(cJ zI`)$5?0lbX6HxfO+!=ZIv9gwWRo%0Wos{`dX%)#2mgj6~ygRDbis{*uA_L2r#1bO)^=zUr)Tn;<&H(|Ib zp!G;Zp%k=bXnihrP4k`D@OW^`FCVTuXoW5M0l-1(f(8R z#`>4+EwAy<+})BMYeKq!KO6*y3ilZn2WfFSgYHeT75^v1nwjJnSP7J(X%<+*V(VaR zJ~p9tG_{|v>HDEo>o;{z3$Z_q=qy3&mzJ5Howoe2nte~%k2zjnr zK_F}Xk9l1FBan1gXQGqs?Avq;vL16Ntnl|X3iC^jY)J=lvrC5T;bmcCWzl@7ib~@R zBgT1if(_cmxmLoXgFs%t8CetJ;kj@&p+}c(0WAA@I<-SWqfh1pvtn=MHZPokOI$_W z!QIyoI{&cTiGvLO>9~{xXJQbr?l;H@YUr;p+~(O;Sm+_kg6+;etxD=ZI*nxumT^Sa z5@`qz7`Ym#&pm33+~!diuKo~*~GsNb67sb^evhX~s84%Q6lY78h1;aIT76G?XW z1COxVB2qMx-I^paS$BSDmWAEW=3@JK2+Ca`dO|C7`yAyh@c6O7)oSP@0m8p{jvH#! zgevk%%_y3;x<|+hE3_h@M{&C6?fh_zIkS5=4$2M6sf|@wRv|rXLINfTzWE@nb<{X; zKaj8vLX@KW`SUpu`ids^IbyYL0+Uc({j82$Cu%amzQcx`AoFyy2gUmQeV&dzs@SMA2r^RXS-E2A(C)Y+v?WceE!J8oMa_UhVU`XliMZPDa}(j zaFmptq;lt{<#?$ELk>3$8Bf5~)!IA6&#aREF5xJpM2oT(8lPQb_2UGNK&~tDcR-t( z!*dKf28uk_V}C^wPU>xKE{Zv28|ZxdXOGKw*yvU~Km6Yl4#o(5Z17j)AN(4Vu-BC! z$Xor!^UJ|8HO0a^Za1>i?8v!L$;`(u6AC7%A68OGD*2Z4EQFISx|oN(!3pP+q}ybN zOG(k(xugw37EhCqb5xsw^;S(wh*_xdpXTE+XMq`wr=mj zB2#1S&elOnahr*BwL|$l^DOHQWq?*0!ybzMd?iIFJ00oM!T|4G_D9C2wE?kZGb};SXWT#Eg3`bHmIvN1{z+pH>@fGa`=da&Mrofiyn+3JjHr$N z=*!7>9NR*1C3eD3nIFxfh=Ujd8a^YVU;7x_i)6e$z^C7F^rUPCYBsxcZ%I z{nLj=lLR0EJ)?H=`PXbV*6Yn?bz@jC-je)RjWABI@UQ`IOI@-N;qA37=??`b!2H_X9x^Yt>&LUw0Z&^oR~5tA#;@gDLk`L= z!M74)Z5Y1k)7i^!f3gZ)S13EfdUD_C#Mjam`q`zw=;bnaa^CD97<{9EkRL5?){a_L+(`Z zFV}swEMGm8-Nqs<2K^>{L}u+0)6tmRlKlZE6W335%cPaH8Irq{nl|r&HVsUgM$+4f z(TsKDy2iW!%g*n5{L1wFB-4`lVsg}|3al6DzGzjyR9RJuRi@WOyT7Se`Y_~3!~-^{ z&thkN*uRKP`gtp$RN?#gLjC+-6th@VzzF9C8s%C@h~ZFklj&fb2RJ6(db*@OI}|z1 z_iX31*>=q-wOVnO620B^$F|v1n`nC8xX4j1ne2wlL%}dwA&ToP-vbVC zkXU%aJ=NAfUfxAlw@WjysicdGS653gwAb=aut?TGTb$@i)|lzgNhR#>p0 z=#<`9Q<|`99~j+gm(EJFw9A{HCCNUWl$Lc1$@K{+K5&q2!!)Kp*X8%RfpV zS`a2n`yf|T_fGw|^W5rVV9Y+_&#&?ug*r43c12~b97gqdr=xzvcS*h=>(31^xl z+#SEhdIPQQT^&9yPFPgMQ4rjD{_uv|wi&srhS)To(+!C+ZBL;-&AEN9P%z7m>v=mp zRU+c|m?_LJyEL)wKoq0~&7a8oE->@pFPZOQh2yby*d~SE;W{q|N7eitW)myxQ0ipHP_Ry@u`Q1Y?QJgyCysxZY=^W~l=7 z0Q$|z5n*rg9maNdCYP-39CGs?lSH8|bX>xyu#uX)4)KIsL(n1d5GBY2gcVW)k%97=;<^aA0A1)^2wnK=iQ0kf zgzcE^6y7l2Sl&q9Z@l5X@x0NzNxcEyINm7U#NLSB1a}l?q-VlsfHSHyoHMR7lryF? z;xoZB#51}xf-}A|j5D?~@-xvh*fYvA>@&_Y2j(&`1Cs^j2H^(o28aPe z0008iOtDqbQeZeuIqTtdQBnY7!Mox_^#BGSQ*bKeoj9#3f+id052QddD2Q~*8a^;#K ziZM5A_5f0(h&tHj2q68E*#G~cl49o@we1NM(-mW7m|_$54b}^TlPIF_B%H|^B>nCl z9@Bpi&g2rpFMP&|=|2p&aS6c`KBLBb8h{hKgs=w{Cjd8N z!f3mNdf7OEH@$S6z}sG6r`JOjr`s(rXQ$guFB7NRZLgsH3qTuCyyyFIND{lNAJ)#; z>STm}#EMT+otqHF1+Nokq<`*;~&eEwgS}gbCY*> z4|i7F9~4?5_cr?vz@gX*?hpQLV6hg$AF|%pK*003Ck%81z94$R*v@0=^MwCGyN40O zf^m3@1cCud1j87SuISp@%!ULBD$NIWP1#nPGu%%&vfu<5CBTnD z(x;zr`)D4pUjb{uC*qg|^wX&O=vS~0fM=Micq~B~q;9HkHf)I?q(biSX}EB${IAocJVX2_&{I3SNVE+CjH z0zn+mYm9&pK?EQS5IG1IgbhLl5rGgu_#ku;83+!93ql2vfPf%E5GIJC9i|9i^SP9kHEY8O9K3h`9>0inI#9ina<^MR9<4g5!g2g9F2W0bp1# zTy}_GuwTey@M8!t7#I>292Fu9GY+5}2NVv6&@mnlKJL}{fLpRG1E59 z6UYH4;XPPAgp&0^g>^a8OMSQUNQ>-OHAn%359GapE)rsbh50$tQ_A~9+{yY$Vv7ZuIpPEa&WC0lZr3zP>iHwzlmXuTOu|EKG*<%mB7h zgxK3G*mz`hvYAzER??YduClv8O8w0x->1+|c#fnqi`d8Ey&wN3Uj{E+{LW%(K>;e+ zI|B`~r0m;Fo_}gTh@9wC}!=vSGil|Y-gT7`+ zi9-$~3Y4Uy!PtJToO;m`Y6FAohEnYreS?~8UtBqJV~GsMcgzV0n>sT35ss=d_M!tw zIXAFT!-J63V?PEQqzC)pKMHNZY_hvAy2Cy)Vc@+C0-AE71g zm85E{PxQqY%G#c)+tFGHx~xw&s_E3#o93*9zuQ5eonDQko+xqh(LuAMD0f%*oll0O z2tGW7!{X#)gRV)#?yi8HkA^w$K3s%l;(4Qkc1dOKu82FChB*j6e1xydLmA5E>_uOa zxrR`);q7oD+ae+bqqNEyhMN$=rNh*>ZgI&PvOQrIVvytLz_^VY9z<7#|8aHYt&a?b zNvu)>$5Yqhzu1iEN27)@Q`hbR2z00QySm#MX`Be!Oi7PM5RU4CpYiK^0XI63 z7nEfa*hgm5p#MLVrszzsU%XfV_@ElXTMi-Cgdn0;zx%7u)_t}0Y=>$WYL7ikzytbS$z_(B*n-i~1 zC!G_oZ71-_4b(~H#ikv4VtGQ~Mpz{d zc0Q45kHs$#O6{C$k6p+Y3hU(Vh)vBG%I?&??Qri9O6+`e0gHkg*4=M+*~UM0ih(hq zY%HJr-hvw@-3eU@tAyLaJ2_9xBlg%f*%rZ0jNpc^?&K zjuSq(s>7gvO>5O?!l-(CwPkgXX;LJk^LIxqevTglxFOITbMFLuRV2An*7er*guH*v zg6tM_Le37j?WA|Pl{(2ASo_@JhXPjFJ+WIIM41o?>(tHfuyMV0ILYf@bMNpY2T$#t zAgp#LbrQPXnx7c=ttoW)5rNtFPViT|lRI?;P8JgU;s+(F($fgoS!)?S>WwqSndsCR z$u0R$R)=Py(i12)>Mn-ITvQ&~`dqKt>M4y+?TcNo6Z3;t``&Ll7#a{X5$ee3sCKzn z>S@{eTn8V_%#MB{xYViBwQKnD$!bPx2G(lkf)?%zt3Cm9EnS`J!r|-%?I1orx z5lCB0S|Gm4P+fXNCpB$wG}a=O0F|w>qPCWyjABrMSw5B#vyJ6n8e zsw(_bg7#3+j?q`Dui>ExjL*q23k0}YgQ@sdR?Nk_9&N7Yv%2RO()b^=2Sz{0S6MJK zI2}*H1nQ56=;BGA(3Z|L#?Yo9l^UsQ8OaHL?x|vCd}_W}W(lCCaUNK#E@7yBGSaTC zmGamf)%E%K6{#w=okBM2C;dxPb#rCbpOR2@||NvIPCkIm{tEX*{{n$P-s9mMD^jK|=sq5Ler zk&vCN?JnNpukFTGq2dwHZe`Lo(pNMBtvoFvTV|3l1yZ|{B|6PPrCTCK<L5g(i~^ zQ|dp}CZ)-B>LWT8J5`z&T1@v$ss5?*J@T~wP!mIIA3voVTVgFg5RNReCD$0yTr;ZI7?tRE zzHjmRWPePx@Kd_7C06qTVZ|cb|80Zq@vj3~?HXsPJn-98Jwvn`j1rIFvkR@tci#6* z@swTup6??49x4NE!z)=9$YM3YEE3?WmjZ zo}`rema8j@lILwMoiSn7%NEk=-6X+TqRQuOw~Vy@R8mdZmoSeWnZqaG!GDPvX6gJr zgv$2|$&}8Rp%G?>V7_6lO6?@Q&K_LYL8@`>E<(z4U2;0 z2#3T*Mr)n`M+-a8Sah{9c=mx);tgs(m00SfX|gS*=^+p4>fbDkUn~xE)ivZQc@#eK zRRB6lm^eP&;O=U<@#aEXzErJRf?2aly!ISLy1qIaeFWGZyQAXFzAjpD^Nb16-Zp1d!}IKn zm4UIQwmgUJcEGXQSKA*v`?G0fq(-x7Y*RhQxh2wpzNS~KZ*)t>kalxP zNm8UL?b`1dZnLwBZ`_SKeKqI!_*MLKOAfrm45{cY(w;nsO0J2W=C_%youJ(cDHOx4v?^4;B5>S^cZQ-cCO)PJT{ zSu|Lan=wS-A11xqtI*Fl5n@7R0ZbRrXfpLgFgH*}e|MCUa-ybkBfsgM}|IbWzaplhvQjWyb_7+%b z*+bDkk)-Bh#EQ~xuv;P%%e8!^YG$eJQ_0n;uA+bP$jny?7o}}rw@fCKBX~;HppG4o+G+L&ABDvPsd zDGs~aI&PoWLaLUil(ce}gVobF%;P^vhhVp1u5qn0yG~hp)!f*^!S3Oeo2TzT)&C6T zvbnLjgWZFx3lHD_7U6~2Lc6@oDLC`9gTYXzHCEfOpH_0->%@IuD{GZfbqLrI)L}KXRW)Z-Fi&| z)?n#a%Nco#+s_vn$G^+o1*T>M@kmQgzi83w3*y}Al0jg{dqwu3C$GeZt;uAYb6v3N zcfRYp>#8<%4FWT~9*r={!#6Vg~;hfWmOKg zzpd7_@v3c*cMAlrR4rNt5wYjLZe%l8shlt9w^h;@vtTU3dC;Si%N(nrYfM(`h!An0 zVPZl-VZ`-KII8cZS`zNXc$=TIS*^x%%{cc^zPP@NiO$__%e8L(1%Wzqz4yv!D#B99 z)9y!bM{``YI4$q>SG~HLtcX2RUr=l9O4Z~|E>_J|GmqS@(EJY}TLS@{m5=j6WWUET zNvu$&LC8P*R?Ly-5ov$%S{ zs!lZ#gT==gmoo|Z)$WNkJTGT3e`J`=4DIGoyGF>1Rt`|SBRlLow z&x^8@xa)rx+7v7sG93IrVND@_V5eZG;Mif<0qn5saCIJYT0h_+&oBWFe;GV!vSN!r@$5!1)_kRJbH zRUGtV-{gPU)W11Zrg8XlpoqS*l6zoA5-=iT(m0bIy07r=s`TxHI#vKvCGT0lFEVvFAFX&n)EoGY+t3N-X``xO!92fFNk zca{D2K?&=bE;p3^-WY<%;t|vy%^3L7&Lf9*bZ^>q(m3VoQO@R z>Ju^IUwDi5*fcB$@z0R-4d1Xo&0F#)dEkk`Qx_+xUCg87yRff>uI+3JxF$UbIOUbiT?; zdWTCM1iMnoZcK5&FVn3qu?BbBn9jm{6LJtSz{do4hahnv zWS}U@25!8o`%7iLwBN!78o|4~4fflBE)7Cd3)o$dp;4!acf5%8uJ`zXMlr&_;DAuB z7>V$!L+ifgdi3Wt;3}~HL=rxWmI7mC+vOBHtMd2*whbH`g(n4dXXqGQ$nOx6knCWC z;CKif6a%UZC5IYA1EH|ccTh7ZHdGDDSpYB2`?Fle5Bm(HinfaW3J${*OddxCKL$@g zUg08$Bcw+4$@LbQOQhZZl@a5;L8--Oqn_)oF_50^_l2ii8y$3(pjy2T?3QDMz#q)`HlZqSq7X0!h)Tff%qD z2pDh}vZFO2+ON@!FimQU_!`_W@gXwed`Sr5pGL7EpCD?G8HfYS=8*tI*p$MQ%>~Ux z*aZ+wX`PRh6E3v^IClLgd}QJJ19m@rY#XNB>@Q`-66{P^z+4YJ$&E3|{YNhNAG`xB z2k|#ph`1?M66y}@Jp_x!m)J$n1<{30SO&H~_!9)l6a>SKn?kqC@x+n!r z&81x@P_EBbA9wI(HUPGt9x5w6>bBLwy-B=*-h|%l4!!Y66T*{{n|}hA0|{TqaG#2q zU%{&F>$$;F1$(CA%8Soq3{z6rf8e0~_0OU>c3Cc>X6ry(tzkU|sz7*u(pE9W3cc=; zHr*&+OtJnG`eu_-8c~GS@Z-d}-$UUoV!W9&K9R>$(3#cW;amjwowhwGmW z9K9JnT?k6JX^g|ElWai1wHzx2;*{+zL1eqrtyp3gI&x@fI`ta{8IM5$zEa?_R? zTlxjvlvB3zQFd*vW-0qhRaTkxpy-m#fMboe}i}qceMz#TmyVoXs39lW0ip#H~5d!9)BFOl0*}Q&j zw0w0iADLUnmc0{a5bb?f1A+r6`CF%g=TgZ4_9qHKYFM(y3{L;J_$Dz z$@I*se>k51*faQZ;j)DC$aw1oR`T2iw9NKHnN~z;natvY^*hVeqrMJ=O;g#&Ll+ME zi6;xKqP=I!F-%N`dmYene@0LXQ-(OMrXrgFmZ=|Tc`1eJSpYWl3H=D>r9qcwTcYOR zb@w!rY~9dZJG4oUxt&lVdq2R`XYN88k&^)iQ5m%6yPTpZ~?&NGmbqSsabtOX%ZTwBtL zFcdivSQC)6x?2D_A5{|Lm~-qK3OlhppPIi*#iDOSWJG8JBXIk?g32t*aFbLz9>y>` z`)*)pIDB<*I84GLjzivC(*IVbZIl|K2)`@#q78f^X|B)h9OI=FGcJy&z*!#A) z+(CZMYPL+?Fm`^9Z4LsV4;85$dnk=v*|w}3%ezyGscR<2*wm!tH$U9urnF~>yAm zzxh^q7Xo7%6~>)>>;9{Qvny;9nxjvW_GJ0yMH$qds4riVg9b7qZ>5ivJTD(f4B$SQ zyYSHOu3s?;L?^;Hk(~?D4L71!{9_f-#GMyqrN3>bJCj@lvQ`#-s0%liF4=Kd#RR%M zyn!58z(mEt=7=KxJ)pFJ8IBKegw(+#JOe;`sL-6LA%WNJctuHUeEBA?97y+mfF_%E zUGs!R`Wv$1;rK{o9r-ZU97ubAfTEjRX>7J#CWkn4*AOB18EY6xQI;U$CLzFuKMOF4 z-W2rI=*nchtvNo#nGtWn(FqK0;vlgx#V&SL|N@h=Zi45@QL zuGQw8gT~VQ@0TiP!|a*P%or&KPx3Mj(+V>Kve20@`F31-I#>SYn_gH9UpACZoV_)(mX-6t_b2LcB(h5n^ z3c~3JdXw@iUtguYN$jd7-={ur;NCLpHYIBhG$fPa_c$k@t@F!9o@9qX0^FIH+_7?! zPfYu6Q#NMz6iG}{n&@mCF%A}EpH}8mbcSM>(^ArFi#cMM7Iy|l&6!j5L!|N5LoQHw zVs-V^^uA(Hm=~Pr3^JXM@V{JzJQbM)4AlizIp0fOpaun)ylCGVj5EqEq>POhEzFn4 z+FO#bv9U7u>&)y9D!Ah8S0|V?)DJ!BGn158qj=R|KY!_wVO=XR{WWgKjT?`$ZlR;4 zO>RKln^GHB!&FmV2>HRgTbZ7^qbWOsS0k^Zx>6md^-Hz5NKbI?d6L@gY>%qwZouG+ zQ^Se+B5x1WL68GUy22{6;4M(Q0=$7r~RQUYX9zZo9Z(=MnNL zW#oDMK>@~YQuBX)<`lZtk=5TcMLw~iSFzp(l!diQIl9MxRqGTr}w!L@0z1xM&rBnhqbpDLxqFt@{Q=s&y(!*+jv;Xj_=L@bY1GZ)$sGY96 z);{risd6)EKl82-w~kBy{4nOu0$;W*>hQX$R8K;0$Rb)RlfP@)?26Ea?`0f0&o4ZC zAC)VJ^7}$5ZT%>qH(kCzx|h3&OTSTOtmPt>+*2^ch_dr3IKr=Gjt+_ba^_D*Wl1a^vX zTkO7PTCY4vGJ|yp!47AQFkffU7jH%-BTJoYps`1g`9Y;RX}k{JZy=@9M`40FqVTkN zuLPKvIF$Ge+I{tx)Qd&=`#l-bjvSVLS^3IY`h^ridSM+k)VoaH-QAgR+_s->$cza3 zQWaLRePM!^!WgW$Re2Ik-ADZsemC+#)X6ai*LgdJmoG9;k4=!HOm~zm_MI<19z@YK zeNQVQoD~l}n8nKPP$S*0zf=w@WQ~|O6z&~qX*VF5EL0q_4k{#P2<SR~JZzcCZ?I%(*fl@>u=m!gA&-dBxV%vgGi(17xrJ(@ z?Cdu5lP67D=VwEtJSMg^$nch@a1V^4CE;N%LA+`RO(Fb~SX~|B9adqX^&TP3XMG zb$~O1uO*Hu-2nqL2kf*>fJ5GfyUG_v~iR2^4|tE_1Dg z@jGmCFf?*LZ7Ed~qeXams(oe5u3%6~$y4n9_y~>;SX2`ILEc=6F~w4h*4HUJv6UKM z^-&G>w@#WPGxT(Ss2)FOMgT|(T@X3pm21#W&d+=`1Q<^8#J1)Hzr361>2Zp8K*8@2 zk|Rw)1U+w7AN@_Kx*8_(6h4h|6RSPFMSE)b*ztm9f#LL}+^18T$17B^oP%im3P3g} z^G(CJBjr5lO@ujmFjU<)dn*y>o4+*&^v&IB1o{?kT?3!8wxWSgd0S(^r<^T5R==5Z zepbJ^a~xLW^f^0gBlxxvDqQyJ*;QD)W7W4^kcZ6z8zySXp+|Lgl@@5M!nO-?Fml%G@tRtwVclVg z1wU&mctHY|0lb>5X@vUJ9hO=ESnt7tUts<~?8*NpsDjHHY%8b;TLVUoJLf@j>&VNu zh*|q>n+xN~9W@mMjbLwq%F{JpU~<6Y{4I0VclDnqogG=}fXWljCD5t5w2CcERx4XU z1=s>`bi%m;dQk_Lf!zYx#+^Z|*Hg}ZtT^M&*-$iFk{Rb1XfF_IO)}+N4OOT!D6uGp z!s-kvERvz0>ORlah{Frg;fXK{QPwTR!p56v(AAbA<$r3ND?#{ z3<-eB*h1o=GGIsqwBHtz2JHt!enJ^-A+bbzB9!FArcFqt}U zO;~@Ow*idNRaB(7GIR3W#s^8_^H>H&PF-hC&5a!#5M3g|@9yY*9&0*$r9hn}m7uA) zO7LwE)Y0}93Uxd z+?*e{SweyL>FML)1_ewPXr@ZM4F{7a0|M$q~Mw(~Se}g^WiOc_AlZmYW z|4)~VPa>A6xe$414hXk@ndSZkUhf zgP{J&*>RO(N+J=XgBr#_f2xz(E0W8`plK8BU^zrXlD8P)ARdBzr( z{cWj9TbVWdEOOEi-y>8-&8(&`7*(7W_p5OCqqIg4IvIw@pPKFa`{9xqCMLS0m@K6M zYkZ6hc?&xG!>)feLdDfgpX3@nsQiw*Kc{NSE0yVsn^wpTV`Y$v7&5vCDchk0el0RS z5u@C@l$T|+o_yPv(3NS!v8AyW@LM@|q|C`y{qcYmgzi`Hm2pNQh{o;2Olf;{BxR*H zWtjn7+t7y=M@~zZZcl2!tL8qnovIhU;!zE~;H%ZHXH6J6b=1Qw^rR~)ja0NQKl~^7 z*Cn52CwY1(iS=S{p^i77aIZbNKHIdu{Y#iTPVLoo_2F$he>Jv8ZInl~@>|gy`d)K8 zOaiaZTlI`?Cr+AKXKw>fiZ9-&$7K?UfMz#P&%Es5S~I!AW!DrDAnR4>u4aGEdzOMH z;RG(0kNlBva_9Tl+_NKnaR=097H9Ba3|oiUK)U2Hrt?lrYXEuvMr#JVeDnCD2UWAo zfT+|l#JMu|dn!D5vmy3A1s=WWOLxt0=364=7h*u?%sNm{*NE0kxp@}@qvKD5>pG)u zUNP|hf{Qrc$9-bZk+1k^fYtnKkmBpHfOFw*;cz(WCL5gxRx{b4+R@z!!}W{i{sB>m zV=3p#xbKPZ{!KB)Yu4t>!N;%1RDG|e-@i;Wz;`YmaHF0JG+=jrJ%Gi)9}5?7{vMMm z?m*alyGa-u9;2^(Ozm7cNFjdAUDh3XNV}j_lWOiUNEs_i|6T41dPujRQ<(1>o*aRh<3pPIwF2uTg+>sxRgUdK~Y`z-wp}&rUgU(+J2F9YvOVbm{ z5h_4s`#usWu*Dd#=&>{_IyajqZ(4z`6#>0 z&i00><-r)GGn|hyS7QM2rTx&&fr^{LSUR%ZRhgv&sm+0g8`wY$#bxCrU+OkDV1Wqv z>_K=pHtT+`?#$DFQ%NUtHQp(=bbLQJA+q5YOTHk9R9N)wl!)3UMG`uj6FsilkUa?t zrZ~RhA$l{w_oizxs_~$9DhEVd|~j9 zsr{5rZ0;>%RTTNc(4UFLim3aQk{k0`kNIr9WBcGtC2 zsYGov2#ZH;t9`F%xJ7%u;-Haq)V6wS3SkQw|NH-KzWD#25jeQ2JhO_`m%lne`$GSpT5)j6wioDW)!_^PS)<|ni7_bhrnjX_Fh6hj4fQI=EQj5T}a z3060w7Ti8WwR#<&7VK8t?6CDVn>&Q(MONGGs8+k}I!@#oew3Ycbm+|cb~MgEb>Pgu z>|nK{(OZA*1E?xG(P&^c%NEJ|I}bt3 zpSTyikhh1pHBG^Hm6pM`j>f_F{55nBJgjl`qC-d~;YB2ma3AuO@GO#4IO_A!*;DlV z+o!Sl&?m=vxu?weL30b0vlHXOH?I!sei#>`k=Ak#bY+lOkBwruT3Vrb)wsNRTxd2o z9D5gGyn}XSPK3fx{q8lMJD%Qb`0M*Bg;!`*3a{x8YyNP#3+l~$dR01~;Ey;g`4e-v z|L5$Gw5Dk8&8Q{WE25f%SBbR;ujgvW22xgt=X)G5>@4}wD9syDD6JY}>6eK;Lzf9X zf7$0mJ|6k2%u|?4onU(RA7eap9b-QX@=g7GqO8ffUNmvfT#jFMY_!Cgr&#!9E=pDN zy*BvB{}Asx`uAzdUP?OHZIfuSsELY&%3|$;#?`AU9=#E(!`?%^)`-Wk3iGiA@chM9 z_95!M^;M1!?e{^k^me;Um{B#mW#yty&D`O^{J|CLq0+tb6*kqt%GR%i@7^fiGovl2 zPD2kRj0VKkH5U543GV|=y2ZBcYgxVVmWC3m#ym;x)2Mnn{*}%rJ{VsS0MdL$qD@v$ z@fR8&c&;b_sXk-u#(-0Wh3E&CEBwx=$6-gy&Qm2jvd+}Up%bglGnx652e~UWB-MRf zXV24mW$n=e#T7sD_t8K7dBB50_}R(laHQSs%?UIUX^$!{2E!KA=J?Q%rivdP3MPoOdWpf1jvLym@*#d#FY=yuUwL`oWH9=sBf)Vf9tr0lwmRRWR_E?xc##k6W zwp&3RRp;WXz}xK1vcK7@Wi;7Gv#KU~-IC*^YzE)}YrDt~tYvCB<-9=Gn!b>VS=|ZP zqQ+%oU#JMUjo4BNH@7_0v`vfps)ivnq&_jpM2XO)T)etc>mzpE6(Q#*TBx3eWFW7W zrv6k95Zod#ok9~;V;QzluDAXH+#oQOLN{8w9Tr{=S;qiVIhFH*;MT0TWaU1+>9fA; zMqt0Q-)=uV;XtO0YU~f}x@u=7^|Eai1mV}^@6SRB@H6$pd--SIpXJtTKG-INb(UGM z)k0evw6-z8flC7{9;x~S4rJi`r3s;dBU7yw(Q=l?Os%7BU@4qt_HRAoo8zh*r?-z` znQaEd0JgyjOVMu)cpbfAJhfr#!BnYb?U|;Lsd_OZv+=i$`rjRmzqat^C-WwV|1<8T z`a>d31*{G_wxl>|C@9vQLag;MfTfSlq`ASCB81l=Gs7uTE2(7*LKT?v0!i;DKNjW; zhZfGy3lBE;fjsZVxSvc^kUkN94TVVWjn(-nKmRkw^}Wu@Gso?{&df8%wY|>HGsmqx zzaM9g8+)DOH;vbqfbkoT%gbm|B)JMws?QHc1!=mmx-iw*bK`M#8BKz$$ao5m^z%?b z()V=+7b4X+R;Q*qr*E#$FF_2gm*>IdHLbeBZs5Q+tqjjn@fBdQ=K(dOl;ZsP(jn2s_Gp{F(R$k1TkT}GY_}S>YPUGIVnmu-Ga}M0pWV*z=m2bZ5Ux9S zJ5)yI&8W|R>rmrxCTeAW>0@U9y#9nAe9BuN@W8cx*>07clP#-$5r{0L_kjtLcQ*Hl zv8?}5znt-P1Hv^c6=9e4$BPZO)(D;4to=h%pBMdU00L-SiU_jTcU)L5^EiBUAS!I> zV@ze{V-7O&F$I{|S2qGPQSA@Hjrk8sjr|cy9F{&rB7Ju>o{uru*ghKvpS(Msa_Swk zc28gg_&&F$L5?9smst2#x6&axK4#suKHSf(Mi$>MqzZ{ zY4-k`7&!HUpjRv=~Fk6t_GhT z)yGJR1*Jzy%e?6HqW6d~X7xeI-pzZCr}DgcE4w=6C%(T(`=8FJ(#@}O;V8Lq3#Y9V zior!X?^-q0V~Ja2^ziA8K)X8!X1NNRF%78*+5C7sdgc)N-xj*@48M15sYcag&Pypy z4#y4yN41JBVCVT~;o@0%*m@SiBV1AwGL{mNdh9lrf1VAc5iSQY8B24*sZ0FH+fbiA z2d1U|X93acz@)$3Jfb*uw3I$_)T-$6ZZ$Jw=^AP1usr2*zXpJfh>D6fQXy;MJ(+vW zkC&@k+OZi+V@N%RY@$h*`z=7NK{osn-f=hPys>i}}hDaT1RHfbpdyFmr$}y)Bkt4tQtpB+58~CyVK)MnoJ3fPlCE4 zhdB&thr4b&r3EwwLzS>scMcHk^+v1Q@o$7lC$o6Ezin_~&PfN}7dC)r@E5NU%7MPd zh2ohE68E|iYtW)^+7fGhmPtmX!;`toGL~x@LmY66WP}^oO}t4-EOSS-oNk{fKddwR zb4uwq|2JLLj+z3k+25i|zx@sBGE7^jGMhnQQSkBCR*c@ANO~v&K0n0VJ^*;h@E&rn zL@E}FZXo23lRHi$(n%Lhuo08B>bqTM6*t#CCt#?)f4b-&%qJxs;d$cz%x}_7g@SbO zsWiMOP9Z}RS1(N}V{LtnyXPZ{`L?qGE^e6{J`Krtqe^WrS`>>f7USd38K4rr1DgWF zJKtvi;@QQ-jj*IMyxl71`ycRZHBZJD0_U9kwEET6`X$sZy#JI+rxWJMDa_8>^nVXE1PIb|PVgf{~p*14lVl`7%h=am@aW%%I6MgD_ znf$m@%fx>unK&yzR`t!s@S$l$Qe-$qE*tno@}8Gf_aO`Vq8KQmvq^=SH%MFQD{|eM zCntda&NRp7%&o4oNHQ_Gq8|}{*O+QYo(n89j41`m*>0bYuH?~;S}PH}FxP4W8F0FE zxm!zp^o687Snu6>xm2esSnob*wq@qBh#%4auh5ux9A2lfd~mJQLCBz~z$)UUwf<@y zq^NG|bcRWAs>jz4NlxEviy5a^;WRw|Fh#Gz6$sZwO3qBX%-0Q>=XeEQLJ}EDaJVyy z9JpK3{xo3%2nmiE%7J8Qh5NpQC*JZb_9hbP?DN(;2PpM@r2j#hte$TMV8(l0mNP3X zZ04iV^7w^&wjsi*Y$?(xac@7xAAw{5r7jZHRUM8!pNz)R&H}=bU*(?$Q-qiFXsql= zRp4dA97CfVL(1GkD<<*f6A1#;)$jF>5BD>s#D2NVMhD|-5*z=AT`SF|+KM~dd(aG# zqoO>Y$q0nIq*7b+xlU(AW$S)r<*cwFsP6h-dQnG zWKmklXm{==zbeP?aA1S(>`n`c9?Xu4;*BV=7D)XgQ(Jf=c_p&?DZ9joM+=ctT(YC2 zwXEUSZ`(LU0d`cU7pDMw^-&zGw7glTL@s5@1zW2WI2yN@lS8DuHY-SE96H`r5+t_|`s@jMzy!{7 zE(eymqsrW+sETc>gXfrUHV`+4I?=0xh?{avU(xml%ef7H#aqPrIT%z3x+4}$=o_%< zAQI1UkGL@ki^jXl?+-aa<(8%li;nqIZA*@J^`K+cgB59A#Mjv8f~M{ThGeUUorBmBf5=dJ1!FHDjweVW>8y{M~X~ z6}Fz^EX~1)ka;@u7+rygur4Es@5M3O7{hATrbQct%4bA75y;`!efIFd`pc4Vv<1U# zEBt-a+T!q$0=8o=x3i++@J83A43f(5m!XaapH)6P8yPOOF0#Ou_AW|?6>eW8oJ+ZT z?Uo0qXV}O?3YfR{3gV-a)iWxtxurr&HykobHy$o&&A$~8ctzKJ&s4(piOn*MnWz}B z=3lVBZkjkYoRtm&^w(l(&n~}tn~vz*^~^w}-;&6ztrZ6_e7Gdn7v?S)Aiw! zX&Ezj1C=68x52RN);@2%($0Lh5+zWY?0-NSm{F#mP1E`{+b>ClgHL^)g_hgo!%{YS@R>q*}uQd|eaetm&SyIPS-kW2x1>Vl!j+l8mD-irtD3qqA>!mK zbk4YFYyK*0dw(>q(R;-8x{zkccS79o;^%tmjlKH;`(AUJbFBp}D||DEoIN_KeKF^s zLZ2uTUA5tiMPZyw`NaF=%@8jc(#$(_4JuhvRi1C!nZCBnNVax?B#g!kUZUU{|MhPT znF1*kG*M>#p*UeZX*i(=1Jl#JG4^ycMtshhIJ8E@H;Z;ock-|NX9`@FvlDMQDj zo-E%-bThYDuu5N(^1A8h{NrUmynBdysQcs60XNiG_TwEZcJQRqx_Pt<^^9+)&1hH* z-ND~(!M3b8Fg9Yav0`~bq-P#592GP>RKD46$tD?fW7k*%Wj8y3`&^dEkba|X-A|Rn zZXk6xA1RmROp-A-#}u*ipkun=IsQ4UG1rRJwxxn53e5sPU6(o2*M@-9Eg`$ePxILh z+TtWQ{1zhc_%l_FzQ+B`b?L*q4?BD&VvWpX`wc^$Vc(aSE;4+pyeug+48kulE|Ny} zJhSxrLXHV$O=kgb`yubKN0?uJ^yid=_v$jQeW;wK^Gk zAI)@iwY;o1n*WEdi=i1$$n;oU=Xg^0Wltr8|CV+yTYN9OATQW?NwvDB&kEg87wwUSEd8Zxzw6&tFNsv=n_{(MY}In@~ zI1<~DV|b?z*sfll+rt^#HYdM5y-aJgByTqK8g=209A@!Y1H(71e6`~)w|+YsQM~(E zK16*IN8HdMxC%~BS%3|Y%`f(hEv_5FBnnC73vWq$ERvgo$Wj+bM-7!kT_YW9?hU#$ zJY8r{xEaqo7V&R!*4w$QOIK_F)8k!kUv146Tn?hE9Bl*s@FQgA*;%_{o*95u{NRp` z{5R=eKZQp;!UCxzUB7_W8gw@+#Q?fv(NJ9_y`xlER}D=*tGw{>z!Ynp%!U?}zHTs1PkI zDFbbp9=vB}BqLdx9b&P9S6)aK)|3+!QuyrB78T+`7N)Bv(}Vr&vPThPuZCARO>&kc zM7uJt+A}0XtIhYJx+E&3``PP=gwsdfGqfNe@#wj=H@FbxKKr?jZ|7yaF~GPW0B5Ae zu6{)kQy#7uaWSvRbLy_!lyuugZ}-L1rmMu}w;nGRS82gZ>Coum5}OG1uDkYZNHN0* zFx|i}K+6VCXokwfEv0@@(=UM61`k7hBsD=}F2^#?(SCpRuhiJhS44y!R;Be+;s=kS zCT@WGySoVCOUCW0!!NVCEX(gx)7`KrBfLhyZn}YYrF@XYv^EKOfzJs`=J|^0RQwP8 zL!S06UHlqKt6fp=R&9830KdmKS(V}%d6ZV*(^rKBgY45vV*07kzYg@)U}_8P4OSmK z*;@HI*obcT+Sl@cp7 zp#u`Dl69MP^v+@FK#)~w_sPc(*5%COK#i=Kf-m|=E&oa7?_BJvK0y)$yRTWsgEg~M ziobx&4YJ0Dn|yR1i;ciqmK#t;%)+|rE>Vp4orzmcm1>U?jZRg^mm;Hb?;TMm9nS)2 zfQd9Wl?roNhBraL3w?Lf8=_L7aQgW`tv+v1L_Tsmw@lQpzBs)y^nm+^%-k?5~ZQk@mgo|ubbLlYKGaPBWgJaIR-(lIEGOXUk zAJ20c^?r3!P`jRn5){-}RGZbl2bl@2#228aNLOZ8j9uZ=QRGTw!mhcjJ-OlvP`R@y3vCMqh^t`$4Tih9U$2kE&KpKn)(l`-9mfThGy zeQj7y6*T-aQ!yT951-pwX{0)8NPI8ro@!9cN5}}!miIZzF2B6JJpMOum*Gs6FKIM% zl$$`TImdL~Pf+b!elVDBg@ha1%idmq5NzT2&P$;d)&0Z6qL$*;Qw&;UbJiL=r5|h- zr+w*4dWzCRlJ6>HE#0c_Kjj`<_;b;rO~@8q+7Gv|tf6?v3BFu4SN_AFqIQ~ot3B24 zHF!$&9ROY36lS=^ex`i4*iT}FLAO2eCKVzQLoTs}g{2~e5Kk|Wnkz3hFN1U9vd8-z z8$!;hu`R9n4bcK}5Dcqqf?@S74&zgOB9gkWAQVzm3@>HWVLXUg|89D2N~4s=UY5{b z6R)W!G#s$V# zy7H(JuHm~6t68})OiDP#DZClp@3Ye8?^v7}xwc$i&FYK`Wl(SOdso|`k~EZK$r7GYY?rNe7aRbvq*2j1?f*Op_?%YoDmo2p!e{TI?f_hH%b^Rp zcd%3beTz*SX8E~hw#>8&P}h|u>`lQobc#$MG#>9RuZ?OSF-c80HP4w(grU1Kw&+S`&@vqebq%ixtHmiEC6cgrRjiEaWMu*1zXPX}}!K@9z z`Nqamnh;?(mfuOd(z}&Id1z|-&4^UT1l{Ux4EXY9YWJ+k_sG_e0?7s3coZqgU%S|G z@yO?Krc3qVNU#)5P4f}ZkMmI!51mbZU(QVrG?TwfWS+Ra(|?2cRqyAcXz(h88Ak=| z1^_H;=7AxvY#_8Vx6C}4V*{SV4*bBCta>;O;~-I9bP6l;>w_+@K9hYs1&T~v^Gpe$ zOjwHrXu#46G(>0)ipje6l|FflcrN?A;z!nAIi~@3S|8Wj)$1mDP9}7kWNC2^lV4t* zaYR(mASx{;4tpv&!y*@ZrH_i#zV{=i_B$dkmnCO>h_tTTHJ5SB4VID9pyi1-CHJw* z>dVo;@1oV+0C6^M!iRvTgQ$hEIC=J}?1jpziG@nWBCQjUhwJCuS!u&m*n98=vhJGV zoB9X+&cYHe555<|+@g@6K&c*!(Dx`PFW<^Xy{mcuQC>Rq6|LS!3|eYx+OIi3VAvdg zV&i^Lhsbi#Fk!GT<AOm6t;7rW+b?P6%{^Oj7Xm}#?w zR!mb?v$)Ao=CeJb$v?(4{A1ACcjWw}HJJw}IJAr2Ui-a}glNQ}xFFuopo<(FKV!6? zFtkn=H`Wb9mCoN4D@Mt!hepl<`Q*WR2A9-@JF8gE>KHGT<@~vr@7#2!sr%piIc{~F zAyu21U7Mln*+Z;~38~Tv`XZKFz?@Hw*Q?qNLIn9AwH%U@5>m75=Rwc)a)O_x%7>8O zR5(vYSCKILW(&?VmD}&F?lB&?@^7OmtkK$}D#;{Qetp1#y~1i7s?`7bs|O_7(pa|0 z{oqG!hq>zF9dhL)n+@KM$M`2(j6$zY`Ll#sE89#SYnmZnFeM>2)V;8-n<<~p_hbI2 z`CMaLL|;978l>esT=V-yXN44Dt$9ZRM>QfNV zA2)KhcK-cJ=Bfgu1Z;Mz_UJ&nqhD_n_uH&p2 z{tSv*<8O7bysq>h7UmtdE=ix-S#{a#1kPie$m!^-2a^JpIIE6p*Kn0$*UYcK;@RCM zr5=Zp=%wN+!q*9X-Gr@;DS5XlkI8_`TBilxg{7mFT03(k7q&Bc^$W(0=Ra3NzEk9S zep=-W6P|F?jX4R5d1lEcYWt$Lx(UzPZBz;S)_3#LTMF>gO7lPBocrI$iKnwq8}gT< z9T*)u-yD&N{|H^0+>rE5+vE<9eyD7n+{iEKw=xfDyb}DA;C{nucR0Z_V{O>A+CqC5 zMDjSmjN1hytg0uEuhpJL6ct%*vAQdTI1Qbu8!j`i{^3PnBjfDhhhY{X)!NzXnt`^n zDMC&q;C0Qpp5lT~I%MklboTmm{yI;D9=S}}y4?fXI?uC~yKdh1If`4`$@$4&;HXGI zPcyC1l(64T#px#!uDe_$uv{$Q^K5u@4CDS0c7aJ?Wj(y^X-cq@c{7U6GAhe5I-k^g z*2gjmI7<)JOd~25n0og1P;ugWbTJ#rTOZC@9}d?eM|LuginEL!Xr|?JhU155rTMK3 ze<~9AR4i~{N?7=i2#-3Yp&nz{fx=_?Wrsl5vPRksjqT&#t3 zwQ8O{+yd4n+K#Z5@ZRS*zxOk`xgD5&=vU8eL%nF!$D0IjC=>V=vy6WJXc}!;wqv8f z{)Os5D#>i761;6wo?ck*9yPnjW1o#z*cMi&Pn5b~-1ZGC2^rFot!2llrhm&PlY!&0 zwWGPhXHENK+$+R1k0k$g`~kNn-g2QBSZVV_ELN10=FL(L+bol zpWW;^&Wyl@`Y)==Id1Hv+}Mc64LGuzvs6k?I*M9x`8?G&e|lQ2?0Eg`TME-KISyuN zh~+#H|1j6SIY_qpQDk>{1TcFvbV19zy0TDiHI3X zdPwN(b}ulMYMi2>W*0|)`MYw+daivjxylz*{qO1IYB>6Ole~gr>fWy6oKDB53n}u?p*Bg z>ll>BQv{U3rgG(>&D7ja*+HBpDc=;CGW)}^Q%6T-dQ6r?-)Jm-SuFa>G0&$yhijim zR%hrCa_DTetLzM{H#1jEkm=@PI!b1-j#lRpMSj5REtS!D+y4cBNisb^E&8{fyv=)T z4bzqL{f+~hbYkuv(-89{MT?|Y7WUk(T=8?}OqGMG+A%boZ0GOJ7@7GgNV4tw2p^2F zra#PGDkx;hnmjOk82;NY8`woa^n;hqZoFOf+smGql)zO>Wuhlj0i=~#um0KDq1Ny7 zs`&8d!twdIV$G@YVbrhpC0;*t&^o=9&Er=kUpg?ZX8kF-WGdUpT4=V$Qe>k48q1E1 zdg=-rEJx3#_W;xM&Dw)PCnp&{OyoRXfoOT^HQ@IT z!57~QBmJpJ{XP&^SW+F%;m^brFwgw+<}XSYL%{s=LrtJ`F$c`EPNF7#@eIWM{_Ml! z&-6K9{?pH!K@{5OsZ~&%U?}UpG(Em}J!1^G^nti&lDHm<)I;br*m^@?D&OC_KPJ?O z@4SsMeO|?kGh(@BtFVbBB>e4O{(|mj{r)Ad|8^hxfD!8Y;mjXXKjQaCywuB2Oy=_k z5?J>exb%CvI$k41Tq9;G>+YQgisIjJuvVQ{v;k}BnaUSSUv6Atu} zWmFSW;@_BTg+^xb_WO$GMzkMdRH=&V47JX8bLnRKH8iQxi^W>R|E%DvANgdrwF5M( zaROSdz6$wF&t0nNPsu2;(w1fK=7uR#$w=MFa!vGq%NC2$V_|ykGMuEX*!u-X`Vy}Z zh3i9L+8V~0OXpv!Znlrrn}P)l?a}Emmtut5k#P~2PH%!P;%P<)a2<`&b?_?r$4K7s zN9S9v)tjVZs@u^`loAI3@UX^1j8rB|RoFVRZn(r?<}1I(0#ExF?jCTTBvmqT)>IHY zTgZqBnuq4`s{=JP*G$X%29w}wm7Io5MSDQtqA#gtUFWNWqe}4tAF;Z6_JHgw{x!jS z^&~6M+l!;pHT!!nUB^{)#-pz{eI2L{ON}`w_wJk3Ctt1?uCtu4+VMbNaY{OV%9nQh zyu*u+XVg{%gN7?jbpt#83moYEhv($nX=- zkXCFZ0JmMf(m6E%3$GJ}rL-B2OHcbaPPJD%8zBH~>l?{E*w@(@X}RNF!9o1gJ9l#n z$NT*Eh5INvG^^>$O(5+Pds)A$msY-xy_egsQyjDxZE4}1Gl;&Enr>Hgzsz#joEJZM zk<#1#T?b_szvSn(T{HTYUM*IF7;15C@qZtB`7d2Sx<|LnMUca{>%7gh1 z{C?L>=ge6|PZUh!%uLLX=uht~rOTib)PCMw1*&+t3Um7x^gw(*fTh|3M^8v3%bj(0 z;rZeaC=E-tj(PY9WNnITliMT9I{L_kgFYTvNm((Ct|UdDp3q-eZTpVwllSZ3`Cp4Xu7^m_|ZMzm&jMC{YF z!W&g~2%+uJ*jIZ9%4JOd7XXA@F^=&sCWH$SOERrssm`7((QYp0O~)=dcy6jGZWKlt zo0yw&uFs@l^h*c^cFUO1x`>EMv8pS~P>X~}L)S@?g~kNzA-ZP~B(B34W@!Xb5}k40 zmfR5%oicqiu=hpf+sTtALwB`7RAF}n2|PE%Zue?6e4s9VYZHOnbv-Hv0n z$<3iGCbN8|u^*M$t#^x&me~1KvLkAJGqtGB``yfMzpsc*&;<1@4v$esxVA8d(7Nmw zD#7<|6%cKg5segZMqY(pdh_;u7?^URd0Qrjc#a{;iGsO{_&Nf;%i$HxJDSljYIA(_ zM%?u@^e&TEYeeD(Rnw}bO$74%33SUmlWXWSLD(LwlWP^p?gHJq${`=h&174|RM1bB z>-t&f&Q$YTjlFL7X3~rvT|&**3m7PV_E@B@;?tg$@koB|!t)U7Vp4WFOZhFXb@!r2 zQ2u9c%*)WI$?T_wl*R9`pkh7|#waa?!~&`{BlmK0_pd@rp3ichi)AmKLJv7pX6|(%7nr{CXG~l&l67k z++I2Rkd60MaG@)WC!SY=#`f5D^G9Z`nwU*H(UGIC?di}D4N_xf5^yQg+C9I0ZKGzdSv=^etSV;cGljB5@ z>9G}>BG!KX#jLW$SS4&o9_?Uun(#^!6QE`8L!CxXKf{Ue{Bk{$uXv+g%?Bw25lx z=&q)M3Sf70^>fZ|cv4jeDF0=Tni^OW2oDnwlg=m4-1RahDMu>+i&mlV9_E&z5$bpu z}TQ&7Jym5Nl$m`1Io?KBjx)o_10^`XE{k#&AD#L>} z_wDRQP!QXimqM`1y9t9&l>)dgYngwcNrg1BM14>vXU;I9-_wdT!rDt9aA!aVc)ih$ zR}hJDBR;b{uoe=(xxBo^JtG^cUnY8wyX`Xe@t8I5TSy)k6qlLSSW7nyV}ndsC@c!> zAV4jGCRm}t|KQ)U7CnvSm$L!07wUj#$Nd3~&xdA3b5q_4;u~kw;tqQN*P5oV7}JcJ zHWdTe)1}nHYEf#0xmB^OY^Hnk2;IIxWggQA#wD#R>W1{N+Bdw3DLiJSchaNx4G?A{ zT4UA~UMVfMhTA2DA9O@3TxJxYUSXx$s(c&LZ}}MIQW^w{uRC~{Gm)gr+)7Q`liWQ! z7ptDXkOg`$2rerLu%J_@rH~( z@UQgXjdw=@Dw!ebUun6XLF$~DNNtWA_Tr>5 zKSY}oL)$)jaccah97@K;V7DY*nlv4_dmzL(bBA@gW_~j`p{59^A zl>U!SXE_Vrk}_gi9E$@R2~Y(s6UOycNtd@ofU44%I2+yrJuWAnTz@1!;D3+K;rAqY>XdU;J=SCz65I}Ze8cn!Z5)k)ixfcerh|dnYq!F!6L2IEEF`flr9^YkNhRL^QWVVbw7cG7ZqxmTpNM5pN>`uc(2-%|?R$q?o2 z$J-tQnjS2?o<|1UcLBJ75Ni3PFKsjdH)<$qeJG~Ixa$SzIq`3MFlc&IXhS9$aKQn% zjgq(|47dk@xQjY!6OvnUyGm>Folui}Dlz)~Xw0E~W03GFTm!~&9pDJ#zTRaB0tWp~ zqma~UoB)2xwf7`q^=9F1+k=Ok?Y-f%$SP@15J^dIwEI-tebErx(sk?e#``6Rlz-4* zX?Hw9A-ICVb$1b!*AOkc;lOZrLkRoPfYCVRfM@ty`mdRaci;XXNGMvEejZ>v{JR74 zpR7)AKc3V>korgD-C7naNOk^Acmt2x=NipW{m^eKl~!rj2Rr(&XSk1RHs5IddE{R`H@ji(q$l0y1v9PcGOfo9YY z_49Gb?_FPFmKLytg$IT8KVNdvW-}s%Yd;WJRldHcMkDd*(kbS*mmUI zI;2}vM!*qH@b&*-?k$7jin?u4k~Gq|yF=p+!6mr6yEg9H5Fnv(cXtWy9^4yuf(3Vi z1_&hBz;eptTA`5s=aIVtg&{@H3tt*PzHO*gCbyV6kw5vL`^P* z8LLd0hD4QsR1^suGL%4Kf!f-?Z!ka-m%^Mt?+J*339@f_Z}DIux% z%_{`iDuf5QW{L^#vW2|={$P-XOP#qYP!g-O=1iqpAY4cGT@|_%fZTO~;WZnG)?ub) zTO{6wBc5M2OQCtJ8ZsMNBmuLV)u%pI#Qmp;{G5s@2x9W=LU=Ag`e%szEE3wo7Sd`z zJB51;7tTf))=KBFaxT5n)_3>4$)CzgjdGSghRV%k(tM=dp z%YaJp%Dwv8u7snm=NT`ppr+RMloZ%AyJwC zr>nH=?Lb6R;9kASavs0QQb{b}5jC^JnLr5KDkph(E)RT!bp%~zDvJqsPl z3!YuQVe2{+csC(J@8zvmxN0709X`B>ex5;w&*%+Nwh8A^)L{vK9{aQxHeTRQ!t@~) zBbEJVLyd^R{~zD%!|kO8YWOq71SohZH&L95i&jWtZ-R;|WsZtVDgO(jR9^I5eeaP+ zWJ@j zm;?70yNVH%hyNW`ZEM!`e_{nMaG3Bw(BqZz+!AXlcJ2kY%5M&Lin?(>1YcWiAU&6w zv*-4P^Py1`=mz+;Obn-2h{aE$zkXa_@)LEji-?&ACt^|khK}{@%($+vyz9cFoHhiq zY>p=!*Svq{f+lzOBLrd7Z+7&N@b(XHSkGoD$I?1->F4zUK^LKw{VAyCCi+!s8_v%^ z-jYdeoz5N6%cVjkUSE4{5s&)>`|=eK+iQNofuv>fT`X=zC5mk#DDg8sp<+s;V2iWx z1QF7PFj$_H=PcM&<_sFMxp&VEcnB7M^S`k2rxaN`qorJr;}uOHCv$1EArv()7cH*; zjX2*S@7_FYm4vFh6aTYRDG62l^MXb9?)(k`>qW6HBN*xOQyu4bD^#yv4XZo72r#mA zzKQy0kd=gTRn&!I&RowKt`o>2Bf_Nk>kx1S9@)gT=8>;(UqVp_& zhGV@WU%X2^Frd({4h@O6r8pUq7zkC6Sd297$0u; z;*7HbGv6v*@nQILDRHJy#Oas`LA?R?Mqs`s98_eG z?5dVII9x=SU!?8?203)r^HQKZXV)E0+v@06+RyBW&sJQk&? z7x8etK+?t_sTvCSJG8hCy^xN)BIkngOC)uQXy`vWSz~I64JGw9wZ#O?yK9DWMS)W; ztW%Y!j_9Hb{36~6Xh%+Q4@g2pP8~yi(I>PVt+=3eyPR3N9L9M1hnC zf^$M9h`W)*mufmrv ze2eXm4eITWSOh>!z7bi&T4GcCHCsqU-8jo}GC>Zv=hPNn@8M;n z&p*U%nim^S#KNrwbP0<2x1%6Y&Bq(lFW(*0uZ#`b9(+;=$S_X9n+MLZ&AiDp&9GTM zvd%e0kbCd zGidh+j=>8-x$lVDP0Y7LB8+#hiV3Ir@8cg#!wg>ZXV=9r{>}eU{lgB`f8jHWd{tig zWhy?^qCo)3n|(i1Y_RQ{QTb?x42=LtNCIRx=eq)O^k# z@O&kxpZ-D=_ph!G{*}*l>Lv|jlLi3_qDJ) z?MVDlVsYZz>E7ZQlK09Ufin9C!B+7Db_pUj6^$CEJwT(tx9{Eg2NmO2u1AOoMN|CI zuo&a~f=NT(`+-Z5P}R6@X9en-p8MuEoe5W>Q0H~wn$#(;yzlv z0b}#3b{A?2;nFqJsfG;c?M?2Z6_|h3mKykShVMx89xE#K85jQ86}PUk0{~fHMP^a` zgAUb1XOS!6Zz*J}Yi))5=eM}NZhmvtwf*8U2As~^Ll{A6X zVx%@!!ki|{ktLCrb)>4*Vkk&7Rb6*PQ(k6652~<|yK|eWj*&)4SzM;St50-i6)Dbj zI_&(aB-5?G>p^s96B*6r7Y6D{nEQkPk&_A5p9T@3f!li7i_KZw^killh7h@kry*<; zwg5$c#^S{4V`Czb8TX!~Ifk@$>S6-DT?e9A>qr+Xp0K66q?nP$AvvO0o5&NctUgHX zxGlA!QSw|g%XLi*UBi$MmtQ2PCwbdd8u!hl^T(2sLFHoi=D^C3 zc)eX+efNeTCw=#(bxrWtAhxvC*aWsTcnpSpU^O;_eE??c!^RlbFi$IIP^@54*H4S8 zAChd;N&(qVXb>w3Q!5VZ6@|r&G)SefY{0P3tt$8xV-mhS>hJpMGxcK^gHPV25rPy? zSgxTgsaBEKjVb-u+~5jaMaRT%^DGU@Y2)=n@AR1_un`BvXekvB82Z1MP%5SBGU)py zlv-81e`bG84MtLx9wbX`7GhdR`BRL96&8+q7WhGX_>(rCBoPO=BI_lc`Zu>U)}1+8 zZ$~@bVE0GVdr^x5`;nseL2UNKw3x_W;_->TRe}rbNf_dT{1!hg&DqEAFMV`P;ZSo{ zz7VvaSzaJK&Hl*Z-rN3B_^5%0Nb&E6}@5< zr3oaEN|_!O%mg3ju!xXL^^R!-Q~t~4LY!ki_4rEZJ*F{8Sxc!H3vG{L`G~$-*| zQ8lKqKpCi)mId$T#il{?QpWkZ5b|m_{>p=c6yz|jaYI@AZ8EQ&+!72pLf?g1RY+rs z#X;MHSXxkb>G=(q$tIG8t6JEqL}tbp!Cu??PM-Q?zFvc#`nmkNhQ>cMg?|B!b!-Cn zJUXh`a;kFKs+ecS=fPfkeCSJHuOt0IFMScn4uTqYYCPepPBsV7%xU3-fwW~RWnj1r zjW}t^wG5_9(zmi;ep*G5U`QuRLp|nEqs>cPy+d&~%Leq@{g}ojr68?h0Q8t);=cZA zuW^wtLNw)Dpm>*T+CRkWKz(A&p>Xg?CZ#C#c}m_C^*nmy3w@IpCI!lCN1W7vMB$6gO`(ql9C7PJQ7yI_3RBwk;{>%ChqYn2n znK;7L!G1tX78BwFr~!Y_m}ak-XP8%KK?E0kv4`1=R>(@{r>DOGfrkbQYo#wY&7n>wwBWNgAO?~lr!DY=>BOs;Pm6DEJ?V>1_~&>k>GE+`D#%XK6{B;_B- zm6Lj$=aV!V!O#-(oet z-3+4~`t7Ms_wKSw`ouoET40{(N2c!0bXSzup|-f=UanK@{OVbbQB?vL{g#d#qOKx& zjhgblI>5<4ueA*wdqA40IBNe%w-ZBtdnr}B%Hy?j>DybM(~2eE>Mqf$0*R$@eI1id zZM6XMJpQUr8N$NXIzhI+5SG8b)Xv|oXd`^vT^NOR#K8zb85%}Lj0f7^Ag^ur%t<4L zw*_m|TfM)uLB3vii>JuhA)YJwHX5LVhuqXfp@r&5qr1raw<2tZj7Fw3xvp@V)9-uK zKj}m(kK*{;QM$BeoW^EyVJ>$+ffmlWh`+wqyjTDI&=|BKgsns35CAItD5#iG=>1c-jrm%H6k=Ur;FJqE0h1?k2&W|{%4o5zk z2#s;UIYQy;F~i)-r*X1|H-z+C>(mQGD7t=4c&`?gY>3y0OW($5WvAk-I~wz9^}b^G z<4rlSF8W`eM-vefW3na8_>qRwUFx@7`*xZ&B)%~`t!!KTtD3c*6TGC^f9kG%$W&RK z&wO66uY#N84eutYa(<{qqjJ8ZWvOz0poOE-a-^lHa=xd(<)K2ht%aiEwXLP7 z;Emy?o7fsO1jqueTiKTl&A<0rB`Lzf3Ff) zkbv?U&SE}lyBTG(sM9rlVx#ScRfbr3OOiugG9N7TODDFONu1(S5XG^Ka_ed>E)y+o9cH5B#h4a_5k>nE zL6Bu*R)hFhMv--Sl8QFBR)1*)QFcnqiTwyZ$TBReL3<3MKeh7ms>?23l;vMqnM(FL z=Gmhtp8ZX5*7~BEf>EV2IN1i*{a3Hh@wsk^uXd_6ecem7#`8tj!Wh;;*!M~O#H z?Xn%JpD6Y_qO)-K!D$dU;mG_@X9(u)prjcCIYRNZD+CxHq7T7k=_@uTB1duAyRHYS zhU7x9Ne7a50C~tqSDp{=dr_CKSRQ~gVPaRLxZy{I5)e`Mz0h(7lMsd7;qvz;(8@h< zIe8$;$6;o5!!BZx(B&c%2pMq%UqK>2iE^KSt>9+J;V!E!=Vp}7&N&0g<)`&4wq}e= z@ynfnV;<43qQl{{c>aVNeX?^-{-`uhqACOQ4Kb=aaH6r7FdJ8We{|h`0#~OepmT)S zV9k~EPjb_NjqCJwu^wpnj>{FHKbq>u){gF#R~P2%*Yv$?2w6`k-=66en?Ff!^rhOO z*p;t8fhqOZUJ&6HHTFyL(84Py0XIoXxCBm~CR7fgAvtPD+#ZvlLe(Q1i^3NQkh4ir z@JlYT!eo@mqaPlV(tu7-B0?G4JbH6lrAFcRbCw0{%%X80@5 z1yX(-b17*Jktbu!Tudh2=d9qcqfDiYEpac2)JkoxH=?g$X_G5GK)1_=D>0T3_T?&s zJ4x84%f&`co(A40)&fED_aW~4Cn4h{x)NUV^yVBV=^Rj0IYQMu`T zcHiK0wcjf1bNk$__sK3RDxj^FT*mEIV+OT>Kl(uit%~qjtF^etcAYwA8RvdMnXTFI zI_rUqn2j5ZuA|;8xvn52l@8t#}K)Z@njzJ{yZ;>D-#@7oBgI z6E`cyx(V{B3L_B1?6&7neM}Oh%9!o!gR=&z~*CF8Eo1T}ZY)!6Qo1UDq|% zXW32Jz0FhE%g4L>jC?2SJnuZ~$mG=Ec=N*G>}9rPGGMG_{<+wp2GNK_n6WlCkFM4s z554wM>W_Qx4%wl}Y3{MfPVTwMp7E~9 z<;M2r@y5>PnaJtpp~%tZ+it?mU)=|y$21o-JzpQ&>lz

UthMOiAwfddM#*0wgzl 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≪t`{T+x9Zlh|Fj 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 z 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 P;9xF2HUQwnAL{Dgsf6*5 diff --git a/corba/src/share/classes/com/sun/tools/corba/se/logutil/scripts/mc b/corba/src/share/classes/com/sun/tools/corba/se/logutil/scripts/mc deleted file mode 100644 index 16df63d031f..00000000000 --- a/corba/src/share/classes/com/sun/tools/corba/se/logutil/scripts/mc +++ /dev/null @@ -1,2 +0,0 @@ -#! /bin/sh -java -cp lib/jscheme.jar:lib/util.jar jscheme.REPL mc.scm -main main $@ diff --git a/corba/src/share/classes/com/sun/tools/corba/se/logutil/scripts/mc.scm b/corba/src/share/classes/com/sun/tools/corba/se/logutil/scripts/mc.scm deleted file mode 100644 index 3e9b51409ec..00000000000 --- a/corba/src/share/classes/com/sun/tools/corba/se/logutil/scripts/mc.scm +++ /dev/null @@ -1,662 +0,0 @@ -; Scheme program to produce CORBA standard exceptions class -; requires Jscheme Java extensions -; Makes use of some custom Java classes also - -(import "com.sun.tools.corba.se.logutil.IndentingPrintWriter" ) -(import "com.sun.tools.corba.se.logutil.StringUtil" ) -(import "java.io.FileOutputStream") - -(define version-string "1.3") - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Utility functions -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -; reload this file (convenience definition) -(define (reload) (load "mc.scm")) - -; Simple little function to report an error -(define (error msg) - (throw (Error. msg))) - -; some debug support -(define debug #f) - -(define (dprint msg) - (if debug - (.println System.out$ msg))) - -; Replace dprint with noprint to avoid seeing messages when debug is #t -(define (noprint msg) ()) - -; Helper function present so that a scheme method taking strings as args -; can be easily run from a command line. -; arg: vector containing argument strings. Element 0 is the function name -; to execute -(define (main arg) - (let* - ( - (arg-list (vector->list arg)) - (function-symbol (string->symbol (car arg-list))) - (args (cdr arg-list))) - (apply (eval function-symbol) args))) - -; Returns the position of key in lst, numbering from 0. key is matched using eqv? -(define (get-list-position key lst) - (letrec - ( - (helper (lambda (k l accum) - (cond - ((null? l) (error (string-append "Could not find " k))) - ((eqv? k (car l)) accum) - (else (helper k (cdr l) (+ accum 1))) )))) - (begin - (noprint (string-append "get-list-position called with key " key " lst " lst )) - (helper key lst 0)))) - -; Return a string representing number in decimal padded to length with leading 0s. -(define (pad-number-string number length) - (let* - ( - (number-string (number->string number)) - (pad-length (- length (string-length number-string))) - ) - (string-append (make-string pad-length #\0) number-string))) - -; Read an S-expression from a file that contains all of the data. -; -; The S-expression used for minor codes must have the structure -; (package-name class-name exception-group-name -; (exception -; (name value level explanation) -; ... -; ) -; ... -; ) -(define (read-file fname) - (read (open-input-file fname))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Functions for handling major system exceptions and exception groups -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -; Function to find the base ID given an exception group name. Result is a function that -; maps the minor code into the Java expression for that minor code's actual value. -(define (get-base group-name) - (if (eqv? group-name 'OMG) - (lambda (minor-code) - (string-append "OMGVMCID.value + " (number->string minor-code))) - (let ; bind base-number outside the lambda so it is only evaluated once - ( - (base-number (get-sun-base-number group-name))) - (lambda (minor-code) - (string-append "SUNVMCID.value + " (number->string (+ base-number minor-code))))))) - -; Function to get a base value for the group-name -(define (get-sun-base-number group-name) - (let* - ( - (lst (list 'SUNBASE 'ORBUTIL 'ACTIVATION 'NAMING 'INTERCEPTORS 'POA 'IOR 'UTIL)) - (subsystem-size 200)) - (* subsystem-size (get-list-position group-name lst)))) - -; Function to get a 3 digit number for a system exception -(define (get-exception-id exception-name) - (let - ( - (lst (list 'UNKNOWN 'BAD_PARAM 'NO_MEMORY 'IMP_LIMIT 'COMM_FAILURE 'INV_OBJREF 'NO_PERMISSION - 'INTERNAL 'MARSHAL 'INITIALIZE 'NO_IMPLEMENT 'BAD_TYPECODE 'BAD_OPERATION 'NO_RESOURCES - 'NO_RESPONSE 'PERSIST_STORE 'BAD_INV_ORDER 'TRANSIENT 'FREE_MEM 'INV_IDENT 'INV_FLAG - 'INTF_REPOS 'BAD_CONTEXT 'OBJ_ADAPTER 'DATA_CONVERSION 'OBJECT_NOT_EXIST 'TRANSACTION_REQUIRED - 'TRANSACTION_ROLLEDBACK 'INVALID_TRANSACTION 'INV_POLICY 'CODESET_INCOMPATIBLE 'REBIND - 'TIMEOUT 'TRANSACTION_UNAVAILABLE 'BAD_QOS 'INVALID_ACTIVITY 'ACTIVITY_COMPLETED - 'ACTIVITY_REQUIRED ))) - (pad-number-string (get-list-position exception-name lst) 3))) - -; Return the message id string for any system exception -; -(define (get-message-id exception-type group-name minor) - (if (eqv? group-name 'OMG) - (get-standard-message-id exception-type minor) - (get-sun-message-id exception-type group-name minor))) - -; Return the message id string for a particular standard exception -; -(define (get-standard-message-id exception-type minor) - (string-append - "IOP" - (get-exception-id exception-type) - "0" - (pad-number-string (number->string minor) 4))) - -; Return the sun message id for this exception-type, group-name, and minor code. -(define (get-sun-message-id exception-type group-name minor) - (string-append - "IOP" - (get-exception-id exception-type) - "1" - (pad-number-string (+ (get-sun-base-number group-name) minor) 4))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; visitor framework for the input file format -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(define (visit-top obj func1) - (let* - ( - (package (car obj)) - (class (cadr obj)) - (group (caddr obj)) - (func2 (func1 package class group)) - (exceptions (cadddr obj))) - (visit-exceptions exceptions func2))) - -; visit the elements of an arbitrary list -; lst: the list to visit -; func: the function to apply to each element of lst -; next-level the function on lst element and func that visits the next level -(define (visit-list lst func next-level) - (if (null? (cdr lst)) - (next-level #t (car lst) func) - (begin - (next-level #f (car lst) func) - (visit-list (cdr lst) func next-level)))) - -(define (visit-exceptions exceptions func2) - (visit-list exceptions func2 (lambda (last-flag element func) (visit-exception last-flag element func)))) - -(define (visit-exception last-flag exception func2) - (let* - ( - (major (car exception)) - (minor-codes (cdr exception)) - (func3 (func2 last-flag major))) - (visit-minor-codes minor-codes func3))) - -(define (visit-minor-codes minor-codes func3) - (visit-list minor-codes func3 (lambda (last-flag element func) (visit-minor-code last-flag element func)))) - -(define (visit-minor-code last-flag minor-code func3) - (let* - ( - (name (car minor-code)) - (minor (cadr minor-code)) - (level (caddr minor-code)) - (msg (cadddr minor-code))) - (func3 last-flag name minor level msg))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; The visitors -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -; A simple visitor that just echoes the input for test purposes -(define (simple-visitor package class group) - (let* - ( - (pw (IndentingPrintWriter. System.out$))) - (begin - (.indent pw) - (.printMsg pw "package=@ class=@ group=@" (list package class group)) - (.flush pw) - (lambda (last-flag major) - (begin - (.indent pw) - (.printMsg pw "major=@" (list major)) - (.flush pw) - (lambda (last-flag name minor level message) - (begin - (if last-flag (.undent pw)) - (.printMsg pw "name=@ minor=@ level=@ message=@" (list name minor level message)) - (.flush pw)))))))) - -; Function that returns a visitor that writes out the resource file in the form: -; id="MSGID: explanation" -; outdir: Output directory -(define (resource-visitor outdir) - (lambda (package class group) - (let* - ( - (file-name (string-append outdir java.io.File.separator$ class ".resource")) - (pw (IndentingPrintWriter. (FileOutputStream. file-name)))) - (begin - (dprint (string-append "package= " package " class=" class " group=" group " file-name=" file-name)) - (lambda (last-flag1 major) - (begin - ; (dprint (string-append "last-flag1=" last-flag1 " major=" major)) - (lambda (last-flag2 name minor level message) - (begin - ; (dprint (string-append "last-flag2=" last-flag2 " name=" name - ; " minor=" minor " level=" level " message=" message)) - (let* - ( - (msgid (get-message-id major group minor)) - (ident (StringUtil.toMixedCase (symbol->string name)))) - (begin - ; (dprint (string-append "msgid=" msgid " ident=" ident)) - (.printMsg pw "@.@=\"@: (@) @\"" (list group ident msgid major message)) - (.flush pw) - (if (and last-flag1 last-flag2) - (begin - ; (dprint "closing file") - (.close pw))))))))))))) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Top-level functions for creating the products. All have names of the form make-xxx -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -; Read the minor codes from the infile and write out a resource file. -(define (make-resource infile outdir) - (tryCatch - (visit-top (read-file infile) (resource-visitor outdir)) - (lambda (exc) - (begin - (.println System.out$ (string-append "make-resource failed with exception " (.toString exc))) - (System.exit 1))))) - -; Read the minor codes from the infile and write a Java implementation to -; handle them to outfile under outdir -(define (make-class infile outdir) - (tryCatch - (write-class infile outdir (read-file infile)) - (lambda (exc) - (begin - (.println System.out$ (string-append "make-class failed with exception " (.toString exc))) - (System.exit 1))))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; The original make-class implementation (this should be replaced by two visitors) -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -; Write out the Java source code for the StandardExceptions class -; outdir: Output directory to write the generated files -; obj: the data from the input file -(define (write-class infile outdir obj) - (let* - ( - (package-name (car obj)) - (class-name (cadr obj)) - (exception-group-name (caddr obj)) - (exceptions (cadddr obj)) - (file (FileOutputStream. (string-append outdir java.io.File.separator$ class-name ".java"))) - (pw (IndentingPrintWriter. file)) - ) - (begin - (write-class-header infile package-name class-name exception-group-name pw) - (.printMsg pw "package @ ;" - (list package-name)) - (.println pw) - (.println pw "import java.util.logging.Logger ;") - (.println pw "import java.util.logging.Level ;") - (.println pw) - (.println pw "import org.omg.CORBA.OMGVMCID ;") - (.println pw "import com.sun.corba.se.impl.util.SUNVMCID ;") - (.println pw "import org.omg.CORBA.CompletionStatus ;") - (.println pw "import org.omg.CORBA.SystemException ;") - (.println pw) - (.println pw "import com.sun.corba.se.spi.orb.ORB ;") - (.println pw) - (.println pw "import com.sun.corba.se.spi.logging.LogWrapperFactory;") - (.println pw) - (.println pw "import com.sun.corba.se.spi.logging.LogWrapperBase;") - (.println pw) - (write-imports exceptions pw) - (.println pw) - (.indent pw) - (.printMsg pw "public class @ extends LogWrapperBase {" - (list class-name)) - (.println pw) - (.printMsg pw "public @( Logger logger )" - (list class-name)) - (.indent pw) - (.println pw "{") - (.undent pw) - (.println pw "super( logger ) ;") - (.println pw "}") - (.println pw) - (.flush pw) - (write-factory-method class-name exception-group-name pw) - (write-exceptions exception-group-name exceptions (get-base exception-group-name) class-name pw) - (.undent pw) - (.println pw ) - (.println pw "}") - (.flush pw) - (.close pw) - ))) - -; Write out the header for the resource file -(define (write-class-header infile package class group pw) - (begin - (if (eqv? group 'OMG) - (.println pw "// Log wrapper class for standard exceptions") - (.printMsg pw "// Log wrapper class for Sun private system exceptions in group @" (list group))) - (.println pw "//") - (.printMsg pw "// Generated by mc.scm version @, DO NOT EDIT BY HAND!" (list version-string)) - (.printMsg pw "// Generated from input file @ on @" (list infile (java.util.Date.))) - (.println pw))) - -(define (write-factory-method class-name exception-group-name pw) - (begin - (.indent pw) - (.println pw "private static LogWrapperFactory factory = new LogWrapperFactory() {") - (.println pw "public LogWrapperBase create( Logger logger )" ) - (.indent pw) - (.println pw "{") - (.undent pw) - (.printMsg pw "return new @( logger ) ;" (list class-name)) - (.undent pw) - (.println pw "}" ) - (.println pw "} ;" ) - (.println pw) - (.printMsg pw "public static @ get( ORB orb, String logDomain )" (list class-name)) - (.indent pw) - (.println pw "{") - (.indent pw) - (.printMsg pw "@ wrapper = " - (list class-name)) - (.indent pw) - (.printMsg pw "(@) orb.getLogWrapper( logDomain, " - (list class-name)) - (.undent pw) - (.undent pw) - (.printMsg pw "\"@\", factory ) ;" - (list exception-group-name)) - (.undent pw) - (.println pw "return wrapper ;" ) - (.println pw "} " ) - (.println pw) - (.printMsg pw "public static @ get( String logDomain )" (list class-name)) - (.indent pw) - (.println pw "{") - (.indent pw) - (.printMsg pw "@ wrapper = " - (list class-name)) - (.indent pw) - (.printMsg pw "(@) ORB.staticGetLogWrapper( logDomain, " - (list class-name)) - (.undent pw) - (.undent pw) - (.printMsg pw "\"@\", factory ) ;" - (list exception-group-name)) - (.undent pw) - (.println pw "return wrapper ;" ) - (.println pw "} " ) - (.println pw))) - -; Write out the import list for the exceptions listed in obj -; obj: the data from the input file -; pw: an IndentingPrintWriter for the output file -(define (write-imports obj pw) - (if (null? obj) - () - (let - ( - (exception (caar obj)) - ) - (begin - (.print pw "import org.omg.CORBA.") - (.print pw exception) - (.println pw " ;") - (write-imports (cdr obj) pw) - )))) - -; Write out the list of exceptions starting with the first one -; obj: the data from the input file -; base: the lambda that returns the string defining the minor code value -; pw: an IndentingPrintWriter for the output file -(define (write-exceptions group-name obj base class-name pw) - (if (null? obj) - () - (let* - ( - (record (car obj)) - (exception (car record)) - (minor-codes (cdr record)) - ) - (begin - (write-exception group-name exception minor-codes base class-name pw) - (write-exceptions group-name (cdr obj) base class-name pw) - )))) - -; Write out a single exception -; exception: the CORBA SystemException type -; base: the base for the minor code value -; minor-codes: a list of minor code data for each minor exception type -; pw: an IndentingPrintWriter for the output file -(define (write-exception group-name exception minor-codes base class-name pw) - (begin - (.println pw "///////////////////////////////////////////////////////////") - (.printMsg pw "// @" (list exception)) - (.println pw "///////////////////////////////////////////////////////////") - (.println pw) - (write-methods group-name exception minor-codes base class-name pw) - (.flush pw))) - -; Write all of the methods for a single exception -; exception: the CORBA SystemException type -; base: the base for the minor code value -; minor-codes: a list of minor code data for each minor exception type -; pw: an IndentingPrintWriter for the output file -(define (write-methods group-name exception minor-codes base class-name pw) - (if (null? minor-codes) - () - (begin - (write-method group-name exception (car minor-codes) base class-name pw) - (write-methods group-name exception (cdr minor-codes) base class-name pw) - ))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Code that writes out the Java methods for exception handling -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -; Write the methods for a single minor code within an exception -; exception: the CORBA SystemException type -; minor-code: minor code data for one minor exception type -; (name value level explanation) -; base: the base for the minor code value -; pw: an IndentingPrintWriter for the output file -(define (write-method group-name exception minor-code base class-name pw) - (let* - ( - (x (symbol->string (car minor-code))) - (ident (cons x (StringUtil.toMixedCase x))) - (value (cadr minor-code)) - (level (symbol->string (caddr minor-code))) - (explanation (cadddr minor-code)) - (num-params (StringUtil.countArgs explanation))) - (begin - (.printMsg pw "public static final int @ = @ ;" - (list x (base value))) - (.println pw ) - (.flush pw ) - (write-method-status-cause group-name exception ident level num-params class-name pw) - (.println pw) - (.flush pw) - (write-method-status exception ident level num-params pw) - (.println pw) - (.flush pw) - (write-method-cause exception ident level num-params pw) - (.println pw) - (.flush pw) - (write-method-no-args exception ident level num-params pw) - (.println pw) - (.flush pw)))) - -; Construct a string of the form arg1, ..., argn where n is num-params -(define (make-arg-string fixed leading-comma-flag num-args) - (let - ( - (helper (lambda (lcf n) - (let* - ( - (numstr (number->string (- n 1)))) - (if (or lcf (> n 1)) - (string-append ", " fixed numstr) - (string-append " " fixed numstr)))))) - (cond - ((eqv? num-args 0) " ") - ((eqv? num-args 1) (helper leading-comma-flag 1)) - (else (string-append - (make-arg-string fixed leading-comma-flag (- num-args 1)) - (helper leading-comma-flag num-args )))))) - -(define (make-decl-args leading-comma-flag num-args) - (make-arg-string "Object arg" leading-comma-flag num-args)) - -(define (make-call-args leading-comma-flag num-args) - (make-arg-string "arg" leading-comma-flag num-args)) - -; make-xxx-args patterns: -; leading-comma-flag #t -; -; 0 " " -; 1 ", arg0" -; 2 ", arg0, arg1" -; 3 ", arg0, arg1, arg2" -; -; 0 " " -; 1 ", Object arg0" -; 2 ", Object arg0, Object arg1" -; 3 ", Object arg0, Object arg1, Object arg2" -; -; leading-comma-flag #f -; -; 0 " " -; 1 " arg0" -; 2 " arg0, arg1" -; 3 " arg0, arg1, arg2" -; -; 0 " " -; 1 " Object arg0" -; 2 " Object arg0, Object arg1" -; 3 " Object arg0, Object arg1, Object arg2" - -(define (emit-assignments num pw) - (let - ( - (helper - (lambda (n) - (.printMsg pw "parameters[@] = arg@ ;" (list n n))))) - (if (= num 1) - (helper (- num 1)) - (begin - (emit-assignments (- num 1) pw) - (helper (- num 1)))))) - -; Write a method for an exception that takes a CompletionStatus and a cause -; exception: the CORBA system exception type -; id: the identifier for this exception in the form ( ident . mixed-case-ident ) -; level: the logging level -; num-params: number of parameters in the explanation string, which determines -; how many argn parameters we need -; pw: the indenting print writer we are using -(define (write-method-status-cause group-name exception id level num-params class-name pw) - (let* - ( - (ident (car id)) - (ident-mc (cdr id))) - (begin - (.indent pw) - (.printMsg pw "public @ @( CompletionStatus cs, Throwable t@) {" - (list exception ident-mc (make-decl-args #t num-params))) - (.printMsg pw "@ exc = new @( @, cs ) ;" - (list exception exception ident )) - - (.indent pw) - (.println pw "if (t != null)" ) - (.undent pw) - (.println pw "exc.initCause( t ) ;" ) - (.println pw) - - (.indent pw) - (.printMsg pw "if (logger.isLoggable( Level.@ )) {" - (list level)) - - (if (> num-params 0) - (begin - (.printMsg pw "Object[] parameters = new Object[@] ;" - (list (number->string num-params))) - (emit-assignments num-params pw) - ) - (begin - (.println pw "Object[] parameters = null ;" - ))) - - (.indent pw) - (.printMsg pw "doLog( Level.@, \"@.@\"," (list level group-name ident-mc)) - (.undent pw) - (.undent pw) - (.printMsg pw "parameters, @.class, exc ) ;" (list class-name)) - (.println pw "}") - (.println pw) - - (.undent pw) - (.println pw "return exc ;") - - (.println pw "}")))) - -; Write a method for an exception that takes a CompletionStatus. The cause is null. -; -; exception: the CORBA system exception type -; id: the identifier for this exception in the form ( ident . mixed-case-ident ) -; level: the logging level -; num-params: number of parameters in the explanation string, which determines -; how many argn parameters we need -; pw: the indenting print writer we are using -(define (write-method-status exception id level num-params pw) - (let* - ( - (ident-mc (cdr id))) - (begin - (.indent pw) - (.printMsg pw "public @ @( CompletionStatus cs@) {" - (list exception ident-mc (make-decl-args #t num-params))) - (.undent pw) - (.printMsg pw "return @( cs, null@ ) ;" - (list ident-mc (make-call-args #t num-params))) - (.println pw "}")))) - -; Write a method for an exception that takes a cause. The status is COMPLETED_NO. -; -; exception: the CORBA system exception type -; id: the identifier for this exception in the form ( ident . mixed-case-ident ) -; level: the logging level -; num-params: number of parameters in the explanation string, which determines -; how many argn parameters we need -; pw: the indenting print writer we are using -(define (write-method-cause exception id level num-params pw) - (let* - ( - (ident-mc (cdr id))) - (begin - (.indent pw) - (.printMsg pw "public @ @( Throwable t@) {" - (list exception ident-mc (make-decl-args #t num-params))) - (.undent pw) - (.printMsg pw "return @( CompletionStatus.COMPLETED_NO, t@ ) ;" - (list ident-mc (make-call-args #t num-params))) - (.println pw "}")))) - -; Write a method for an exception that takes no arguments. This is COMPLETED_NO and -; a null cause. -; -; exception: the CORBA system exception type -; id: the identifier for this exception in the form ( ident . mixed-case-ident ) -; level: the logging level -; num-params: number of parameters in the explanation string, which determines -; how many argn parameters we need -; pw: the indenting print writer we are using -(define (write-method-no-args exception id level num-params pw) - (let* - ( - (ident-mc (cdr id))) - (begin - (.indent pw) - (.printMsg pw "public @ @( @) {" - (list exception ident-mc (make-decl-args #f num-params))) - (.undent pw) - (.printMsg pw "return @( CompletionStatus.COMPLETED_NO, null@ ) ;" - (list ident-mc (make-call-args #t num-params))) - (.println pw "}")))) - -;;; end of file diff --git a/corba/src/share/classes/com/sun/tools/corba/se/logutil/scripts/run b/corba/src/share/classes/com/sun/tools/corba/se/logutil/scripts/run deleted file mode 100644 index 81efed3479a..00000000000 --- a/corba/src/share/classes/com/sun/tools/corba/se/logutil/scripts/run +++ /dev/null @@ -1,2 +0,0 @@ -#! /bin/sh -java -cp ${CLASSPATH}:lib/jscheme.jar:lib/util.jar jscheme.REPL mc.scm From 7c23bf37369efee6c51fd68aa24ecfea107bc424 Mon Sep 17 00:00:00 2001 From: Andrew John Hughes Date: Mon, 23 Mar 2009 17:43:53 -0700 Subject: [PATCH 172/292] 6695776: corba jscheme jar files in repository could be built from source Forward port of changes from the 6-open train. Reviewed-by: darcy, ohair, tbell --- jdk/THIRD_PARTY_README | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/jdk/THIRD_PARTY_README b/jdk/THIRD_PARTY_README index 9f4d7e5087a..690890548f2 100644 --- a/jdk/THIRD_PARTY_README +++ b/jdk/THIRD_PARTY_README @@ -61,6 +61,28 @@ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +%% This notice is provided with respect to littlecms, which may be included with this software: + +Little cms +Copyright (C) 1998-2004 Marti Maria + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. %% This notice is provided with respect to zlib 1.1.3, which may be included with this software: Acknowledgments: @@ -115,16 +137,6 @@ COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR CONSEQ The name and trademarks of copyright holders may NOT be used in advertising or publicity pertaining to the software without specific, written prior permission. Title to copyright in this software and any associated documentation will at all times remain with copyright holders. ____________________________________ This formulation of W3C's notice and license became active on August 14 1998 so as to improve compatibility with GPL. This version ensures that W3C software licensing terms are no more restrictive than GPL and consequently W3C software may be distributed in GPL packages. See the older formulation for the policy prior to this date. Please see our Copyright FAQ for common questions about using materials from our site, including specific terms and conditions for packages like libwww, Amaya, and Jigsaw. Other questions about this notice can be directed to site-policy@w3.org. -  -%% This notice is provided with respect to jscheme.jar, which may be included with this software: -Software License Agreement -Copyright © 1998-2002 by Peter Norvig. -Permission is granted to anyone to use this software, in source or object code form, on any computer system, and to modify, compile, decompile, run, and redistribute it to anyone else, subject to the following restrictions: -1.The author makes no warranty of any kind, either expressed or implied, about the suitability of this software for any purpose. -2.The author accepts no liability of any kind for damages or other consequences of the use of this software, even if they arise from defects in the software. -3.The origin of this software must not be misrepresented, either by explicit claim or by omission. -4.Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. Altered versions may be distributed in packages under other licenses (such as the GNU license). -If you find this software useful, it would be nice if you let me (peter@norvig.com) know about it, and nicer still if you send me modifications that you are willing to share. However, you are not required to do so. %% This notice is provided with respect to PC/SC Lite for Suse Linux v. 1.1.1, which may be included with this software: From 7d94fdb066380613add05e6b0874660a112d2680 Mon Sep 17 00:00:00 2001 From: Alan Bateman Date: Tue, 24 Mar 2009 14:03:46 +0000 Subject: [PATCH 173/292] 6819886: System.getProperty("os.name") reports Vista on Windows 7 Reviewed-by: sherman --- jdk/src/windows/native/java/lang/java_props_md.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/jdk/src/windows/native/java/lang/java_props_md.c b/jdk/src/windows/native/java/lang/java_props_md.c index f75721f9f71..b15a9bafac0 100644 --- a/jdk/src/windows/native/java/lang/java_props_md.c +++ b/jdk/src/windows/native/java/lang/java_props_md.c @@ -717,6 +717,7 @@ GetJavaProperties(JNIEnv* env) * Windows Vista family 6 0 * Windows 2008 6 0 * where ((&ver.wServicePackMinor) + 2) = 1 + * Windows 7 6 1 * * This mapping will presumably be augmented as new Windows * versions are released. @@ -773,13 +774,18 @@ GetJavaProperties(JNIEnv* env) * and Windows Vista are identical, you must also test * whether the wProductType member is VER_NT_WORKSTATION. * If wProductType is VER_NT_WORKSTATION, the operating - * system is Windows Vista; otherwise, it is Windows + * system is Windows Vista or 7; otherwise, it is Windows * Server 2008." */ - if (ver.wProductType == VER_NT_WORKSTATION) - sprops.os_name = "Windows Vista"; - else + if (ver.wProductType == VER_NT_WORKSTATION) { + switch (ver.dwMinorVersion) { + case 0: sprops.os_name = "Windows Vista"; break; + case 1: sprops.os_name = "Windows 7"; break; + default: sprops.os_name = "Windows NT (unknown)"; + } + } else { sprops.os_name = "Windows Server 2008"; + } } else { sprops.os_name = "Windows NT (unknown)"; } From a2b46bd320752bffdec24c95c775dd5609233d03 Mon Sep 17 00:00:00 2001 From: Alan Bateman Date: Tue, 24 Mar 2009 14:05:44 +0000 Subject: [PATCH 174/292] 6807702: Integer.valueOf cache should be configurable Reviewed-by: darcy --- jdk/src/share/classes/java/lang/Integer.java | 73 ++++++++++++++++---- jdk/src/share/classes/java/lang/Long.java | 8 +-- jdk/src/share/classes/java/lang/System.java | 7 ++ jdk/test/java/lang/Integer/ValueOf.java | 55 +++++++++++++++ 4 files changed, 124 insertions(+), 19 deletions(-) create mode 100644 jdk/test/java/lang/Integer/ValueOf.java diff --git a/jdk/src/share/classes/java/lang/Integer.java b/jdk/src/share/classes/java/lang/Integer.java index f984f177275..50863dd7e9f 100644 --- a/jdk/src/share/classes/java/lang/Integer.java +++ b/jdk/src/share/classes/java/lang/Integer.java @@ -25,6 +25,8 @@ package java.lang; +import java.util.Properties; + /** * The {@code Integer} class wraps a value of the primitive type * {@code int} in an object. An object of type {@code Integer} @@ -442,6 +444,12 @@ public final class Integer extends Number implements Comparable { public static int parseInt(String s, int radix) throws NumberFormatException { + /* + * WARNING: This method may be invoked early during VM initialization + * before IntegerCache is initialized. Care must be taken to not use + * the valueOf method. + */ + if (s == null) { throw new NumberFormatException("null"); } @@ -545,7 +553,7 @@ public final class Integer extends Number implements Comparable { * does not contain a parsable {@code int}. */ public static Integer valueOf(String s, int radix) throws NumberFormatException { - return new Integer(parseInt(s,radix)); + return Integer.valueOf(parseInt(s,radix)); } /** @@ -570,20 +578,56 @@ public final class Integer extends Number implements Comparable { * @exception NumberFormatException if the string cannot be parsed * as an integer. */ - public static Integer valueOf(String s) throws NumberFormatException - { - return new Integer(parseInt(s, 10)); + public static Integer valueOf(String s) throws NumberFormatException { + return Integer.valueOf(parseInt(s, 10)); + } + + /** + * Cache to support the object identity semantics of autoboxing for values between + * -128 and 127 (inclusive) as required by JLS. + * + * The cache is initialized on first usage. During VM initialization the + * getAndRemoveCacheProperties method may be used to get and remove any system + * properites that configure the cache size. At this time, the size of the + * cache may be controlled by the -XX:AutoBoxCacheMax= option. + */ + + // value of java.lang.Integer.IntegerCache.high property (obtained during VM init) + private static String integerCacheHighPropValue; + + static void getAndRemoveCacheProperties() { + if (!sun.misc.VM.isBooted()) { + Properties props = System.getProperties(); + integerCacheHighPropValue = + (String)props.remove("java.lang.Integer.IntegerCache.high"); + if (integerCacheHighPropValue != null) + System.setProperties(props); // remove from system props + } } private static class IntegerCache { - private IntegerCache(){} - - static final Integer cache[] = new Integer[-(-128) + 127 + 1]; + static final int low = -128; + static final int high; + static final Integer cache[]; static { - for(int i = 0; i < cache.length; i++) - cache[i] = new Integer(i - 128); + // high value may be configured by property + int h = 127; + if (integerCacheHighPropValue != null) { + int i = parseInt(integerCacheHighPropValue); + i = Math.max(i, 127); + // Maximum array size is Integer.MAX_VALUE + h = Math.min(i, Integer.MAX_VALUE - (-low)); + } + high = h; + + cache = new Integer[(high - low) + 1]; + int j = low; + for(int k = 0; k < cache.length; k++) + cache[k] = new Integer(j++); } + + private IntegerCache() {} } /** @@ -599,10 +643,9 @@ public final class Integer extends Number implements Comparable { * @since 1.5 */ public static Integer valueOf(int i) { - final int offset = 128; - if (i >= -128 && i <= 127) { // must cache - return IntegerCache.cache[i + offset]; - } + assert IntegerCache.high >= 127; + if (i >= IntegerCache.low && i <= IntegerCache.high) + return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); } @@ -806,7 +849,7 @@ public final class Integer extends Number implements Comparable { */ public static Integer getInteger(String nm, int val) { Integer result = getInteger(nm, null); - return (result == null) ? new Integer(val) : result; + return (result == null) ? Integer.valueOf(val) : result; } /** @@ -938,7 +981,7 @@ public final class Integer extends Number implements Comparable { try { result = Integer.valueOf(nm.substring(index), radix); - result = negative ? new Integer(-result.intValue()) : result; + result = negative ? Integer.valueOf(-result.intValue()) : result; } catch (NumberFormatException e) { // If number is Integer.MIN_VALUE, we'll end up here. The next line // handles this case, and causes any genuine format error to be diff --git a/jdk/src/share/classes/java/lang/Long.java b/jdk/src/share/classes/java/lang/Long.java index 62400a9b967..c632d5df2d9 100644 --- a/jdk/src/share/classes/java/lang/Long.java +++ b/jdk/src/share/classes/java/lang/Long.java @@ -510,7 +510,7 @@ public final class Long extends Number implements Comparable { * contain a parsable {@code long}. */ public static Long valueOf(String s, int radix) throws NumberFormatException { - return new Long(parseLong(s, radix)); + return Long.valueOf(parseLong(s, radix)); } /** @@ -537,7 +537,7 @@ public final class Long extends Number implements Comparable { */ public static Long valueOf(String s) throws NumberFormatException { - return new Long(parseLong(s, 10)); + return Long.valueOf(parseLong(s, 10)); } private static class LongCache { @@ -650,7 +650,7 @@ public final class Long extends Number implements Comparable { try { result = Long.valueOf(nm.substring(index), radix); - result = negative ? new Long(-result.longValue()) : result; + result = negative ? Long.valueOf(-result.longValue()) : result; } catch (NumberFormatException e) { // If number is Long.MIN_VALUE, we'll end up here. The next line // handles this case, and causes any genuine format error to be @@ -869,7 +869,7 @@ public final class Long extends Number implements Comparable { */ public static Long getLong(String nm, long val) { Long result = Long.getLong(nm, null); - return (result == null) ? new Long(val) : result; + return (result == null) ? Long.valueOf(val) : result; } /** diff --git a/jdk/src/share/classes/java/lang/System.java b/jdk/src/share/classes/java/lang/System.java index 68958dd0898..6c539b28e1c 100644 --- a/jdk/src/share/classes/java/lang/System.java +++ b/jdk/src/share/classes/java/lang/System.java @@ -1105,6 +1105,13 @@ public final class System { props = new Properties(); initProperties(props); sun.misc.Version.init(); + + // Gets and removes system properties that configure the Integer + // cache used to support the object identity semantics of autoboxing. + // At this time, the size of the cache may be controlled by the + // -XX:AutoBoxCacheMax= option. + Integer.getAndRemoveCacheProperties(); + FileInputStream fdIn = new FileInputStream(FileDescriptor.in); FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out); FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err); diff --git a/jdk/test/java/lang/Integer/ValueOf.java b/jdk/test/java/lang/Integer/ValueOf.java new file mode 100644 index 00000000000..c6f47f571ee --- /dev/null +++ b/jdk/test/java/lang/Integer/ValueOf.java @@ -0,0 +1,55 @@ +/* + * Copyright 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 6807702 + * @summary Basic test for Integer.valueOf + * @run main ValueOf + * @run main/othervm -esa -XX:+AggressiveOpts ValueOf + */ + +public class ValueOf { + + // test Integer.valueOf over this range (inclusive) + private static final int TEST_LOW = -1024; + private static final int TEST_HIGH = 24576; + + public static void main(String[] args) { + int i = TEST_LOW; + while (i <= TEST_HIGH) { + // check that valueOf stores i + if (Integer.valueOf(i).intValue() != i) + throw new RuntimeException(); + + // check that the same object is returned for integral values + // in the range -128 to 127 (inclusive) + if (i >= -128 && i <= 127) { + if (Integer.valueOf(i) != Integer.valueOf(i)) + throw new RuntimeException(); + } + + i++; + } + } +} From 4654daefa2d38ce94e19b41e98512c7b97a49998 Mon Sep 17 00:00:00 2001 From: Andreas Frischknecth Date: Tue, 24 Mar 2009 14:08:37 +0000 Subject: [PATCH 175/292] 6819689: File.lastModified can return bogus value for remote file accessed as it is being deleted [win] Reviewed-by: sherman --- jdk/src/windows/native/java/io/WinNTFileSystem_md.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/jdk/src/windows/native/java/io/WinNTFileSystem_md.c b/jdk/src/windows/native/java/io/WinNTFileSystem_md.c index 13d4c7e919b..f4cc691115b 100644 --- a/jdk/src/windows/native/java/io/WinNTFileSystem_md.c +++ b/jdk/src/windows/native/java/io/WinNTFileSystem_md.c @@ -309,12 +309,13 @@ Java_java_io_WinNTFileSystem_getLastModifiedTime(JNIEnv *env, jobject this, /* No template file */ NULL); if (h != INVALID_HANDLE_VALUE) { - GetFileTime(h, NULL, NULL, &t); + if (GetFileTime(h, NULL, NULL, &t)) { + modTime.LowPart = (DWORD) t.dwLowDateTime; + modTime.HighPart = (LONG) t.dwHighDateTime; + rv = modTime.QuadPart / 10000; + rv -= 11644473600000; + } CloseHandle(h); - modTime.LowPart = (DWORD) t.dwLowDateTime; - modTime.HighPart = (LONG) t.dwHighDateTime; - rv = modTime.QuadPart / 10000; - rv -= 11644473600000; } free(pathbuf); return rv; From 6af949fe241694ec2d050bce54802e3983151ecc Mon Sep 17 00:00:00 2001 From: Alan Bateman Date: Tue, 24 Mar 2009 14:10:38 +0000 Subject: [PATCH 176/292] 6621689: (dc spec) DatagramChannel.receive when channel is not bound is not specified Reviewed-by: sherman --- .../java/nio/channels/DatagramChannel.java | 15 ++- .../sun/nio/ch/DatagramChannelImpl.java | 8 +- .../channels/DatagramChannel/NotBound.java | 115 +++++++++++++++--- 3 files changed, 114 insertions(+), 24 deletions(-) diff --git a/jdk/src/share/classes/java/nio/channels/DatagramChannel.java b/jdk/src/share/classes/java/nio/channels/DatagramChannel.java index c7bd3df8b83..cbf402f5933 100644 --- a/jdk/src/share/classes/java/nio/channels/DatagramChannel.java +++ b/jdk/src/share/classes/java/nio/channels/DatagramChannel.java @@ -261,7 +261,10 @@ public abstract class DatagramChannel * *

This method may be invoked at any time. It will not have any effect * on read or write operations that are already in progress at the moment - * that it is invoked.

+ * that it is invoked. If this channel's socket is not bound then this method + * will first cause the socket to be bound to an address that is assigned + * automatically, as if invoking the {@link #bind bind} method with a + * parameter of {@code null}.

* * @param remote * The remote address to which this channel is to be connected @@ -356,7 +359,10 @@ public abstract class DatagramChannel *

This method may be invoked at any time. If another thread has * already initiated a read operation upon this channel, however, then an * invocation of this method will block until the first operation is - * complete.

+ * complete. If this channel's socket is not bound then this method will + * first cause the socket to be bound to an address that is assigned + * automatically, as if invoking the {@link #bind bind} method with a + * parameter of {@code null}.

* * @param dst * The buffer into which the datagram is to be transferred @@ -413,7 +419,10 @@ public abstract class DatagramChannel *

This method may be invoked at any time. If another thread has * already initiated a write operation upon this channel, however, then an * invocation of this method will block until the first operation is - * complete.

+ * complete. If this channel's socket is not bound then this method will + * first cause the socket to be bound to an address that is assigned + * automatically, as if by invoking the {@link #bind bind) method with a + * parameter of {@code null}.

* * @param src * The buffer containing the datagram to be sent diff --git a/jdk/src/share/classes/sun/nio/ch/DatagramChannelImpl.java b/jdk/src/share/classes/sun/nio/ch/DatagramChannelImpl.java index e5ec5e0632d..57b35c9bc20 100644 --- a/jdk/src/share/classes/sun/nio/ch/DatagramChannelImpl.java +++ b/jdk/src/share/classes/sun/nio/ch/DatagramChannelImpl.java @@ -313,11 +313,9 @@ class DatagramChannelImpl throw new NullPointerException(); synchronized (readLock) { ensureOpen(); - // If socket is not bound then behave as if nothing received - // Will be fixed by 6621699 - if (localAddress() == null) { - return null; - } + // Socket was not bound before attempting receive + if (localAddress() == null) + bind(null); int n = 0; ByteBuffer bb = null; try { diff --git a/jdk/test/java/nio/channels/DatagramChannel/NotBound.java b/jdk/test/java/nio/channels/DatagramChannel/NotBound.java index 9a58fe64d18..d9fbd7b5efa 100644 --- a/jdk/test/java/nio/channels/DatagramChannel/NotBound.java +++ b/jdk/test/java/nio/channels/DatagramChannel/NotBound.java @@ -22,27 +22,110 @@ */ /* @test - * @bug 4512723 - * @summary Unit test for datagram-socket-channel adaptors + * @bug 4512723 6621689 + * @summary Test that connect/send/receive with unbound DatagramChannel causes + * the channel's socket to be bound to a local address */ import java.net.*; -import java.nio.*; -import java.nio.channels.*; +import java.nio.ByteBuffer; +import java.nio.channels.DatagramChannel; +import java.io.IOException; -class NotBound { - public static void main(String[] args) throws Exception { - test1(false); - test1(true); +public class NotBound { + + static void checkBound(DatagramChannel dc) throws IOException { + if (dc.getLocalAddress() == null) + throw new RuntimeException("Not bound??"); } - static void test1(boolean blocking) throws Exception { - ByteBuffer bb = ByteBuffer.allocateDirect(256); - DatagramChannel dc1 = DatagramChannel.open(); - dc1.configureBlocking(false); - SocketAddress isa = dc1.receive(bb); - if (isa != null) - throw new Exception("Unbound dc returned non-null"); - dc1.close(); + // starts a thread to send a datagram to the given channel once the channel + // is bound to a local address + static void wakeupWhenBound(final DatagramChannel dc) { + Runnable wakeupTask = new Runnable() { + public void run() { + try { + // poll for local address + InetSocketAddress local; + do { + Thread.sleep(50); + local = (InetSocketAddress)dc.getLocalAddress(); + } while (local == null); + + // send message to channel to wakeup receiver + DatagramChannel sender = DatagramChannel.open(); + try { + ByteBuffer bb = ByteBuffer.wrap("hello".getBytes()); + InetAddress lh = InetAddress.getLocalHost(); + SocketAddress target = + new InetSocketAddress(lh, local.getPort()); + sender.send(bb, target); + } finally { + sender.close(); + } + + } catch (Exception x) { + x.printStackTrace(); + } + }}; + new Thread(wakeupTask).start(); + } + + public static void main(String[] args) throws IOException { + DatagramChannel dc; + + // connect + dc = DatagramChannel.open(); + try { + DatagramChannel peer = DatagramChannel.open() + .bind(new InetSocketAddress(0)); + int peerPort = ((InetSocketAddress)(peer.getLocalAddress())).getPort(); + try { + dc.connect(new InetSocketAddress(InetAddress.getLocalHost(), peerPort)); + checkBound(dc); + } finally { + peer.close(); + } + } finally { + dc.close(); + } + + // send + dc = DatagramChannel.open(); + try { + ByteBuffer bb = ByteBuffer.wrap("ignore this".getBytes()); + SocketAddress target = + new InetSocketAddress(InetAddress.getLocalHost(), 5000); + dc.send(bb, target); + checkBound(dc); + } finally { + dc.close(); + } + + // receive (blocking) + dc = DatagramChannel.open(); + try { + ByteBuffer bb = ByteBuffer.allocateDirect(128); + wakeupWhenBound(dc); + SocketAddress sender = dc.receive(bb); + if (sender == null) + throw new RuntimeException("Sender should not be null"); + checkBound(dc); + } finally { + dc.close(); + } + + // receive (non-blocking) + dc = DatagramChannel.open(); + try { + dc.configureBlocking(false); + ByteBuffer bb = ByteBuffer.allocateDirect(128); + SocketAddress sender = dc.receive(bb); + if (sender != null) + throw new RuntimeException("Sender should be null"); + checkBound(dc); + } finally { + dc.close(); + } } } From 312ee333acdc5cabd6493f7c91e80ff0163e3f84 Mon Sep 17 00:00:00 2001 From: Phil Race Date: Tue, 24 Mar 2009 09:14:02 -0700 Subject: [PATCH 177/292] 6821031: Upgrade OpenJDK's LittleCMS version to 1.18 Reviewed-by: bae, igor --- .../share/native/sun/java2d/cmm/lcms/LCMS.c | 8 +- .../native/sun/java2d/cmm/lcms/cmscam02.c | 23 +- .../native/sun/java2d/cmm/lcms/cmscam97.c | 8 +- .../native/sun/java2d/cmm/lcms/cmscgats.c | 790 +++++++++++---- .../native/sun/java2d/cmm/lcms/cmscnvrt.c | 7 +- .../share/native/sun/java2d/cmm/lcms/cmserr.c | 9 +- .../native/sun/java2d/cmm/lcms/cmsgamma.c | 47 +- .../share/native/sun/java2d/cmm/lcms/cmsgmt.c | 38 +- .../native/sun/java2d/cmm/lcms/cmsintrp.c | 21 +- .../share/native/sun/java2d/cmm/lcms/cmsio0.c | 130 ++- .../share/native/sun/java2d/cmm/lcms/cmsio1.c | 938 ++++++++++-------- .../share/native/sun/java2d/cmm/lcms/cmslut.c | 112 ++- .../native/sun/java2d/cmm/lcms/cmsmatsh.c | 29 +- .../native/sun/java2d/cmm/lcms/cmsmtrx.c | 46 +- .../native/sun/java2d/cmm/lcms/cmsnamed.c | 24 +- .../native/sun/java2d/cmm/lcms/cmspack.c | 113 ++- .../share/native/sun/java2d/cmm/lcms/cmspcs.c | 6 +- .../share/native/sun/java2d/cmm/lcms/cmsps2.c | 141 +-- .../native/sun/java2d/cmm/lcms/cmssamp.c | 47 +- .../native/sun/java2d/cmm/lcms/cmsvirt.c | 52 +- .../native/sun/java2d/cmm/lcms/cmswtpnt.c | 54 +- .../native/sun/java2d/cmm/lcms/cmsxform.c | 127 ++- .../share/native/sun/java2d/cmm/lcms/icc34.h | 5 + .../share/native/sun/java2d/cmm/lcms/lcms.h | 380 +++---- 24 files changed, 1962 insertions(+), 1193 deletions(-) diff --git a/jdk/src/share/native/sun/java2d/cmm/lcms/LCMS.c b/jdk/src/share/native/sun/java2d/cmm/lcms/LCMS.c index 404ab2e686d..42a5cc23f30 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/LCMS.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/LCMS.c @@ -374,6 +374,10 @@ JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_getTagData return; } +// Modify data for a tag in a profile +LCMSBOOL LCMSEXPORT _cmsModifyTagData(cmsHPROFILE hProfile, + icTagSignature sig, void *data, size_t size); + /* * Class: sun_java2d_cmm_lcms_LCMS * Method: setTagData @@ -561,10 +565,10 @@ JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_initLCMS PF_ID_fID = (*env)->GetFieldID (env, Pf, "ID", "J"); } -BOOL _cmsModifyTagData(cmsHPROFILE hProfile, icTagSignature sig, +LCMSBOOL _cmsModifyTagData(cmsHPROFILE hProfile, icTagSignature sig, void *data, size_t size) { - BOOL isNew; + LCMSBOOL isNew; int i, idx, delta, count; LPBYTE padChars[3] = {0, 0, 0}; LPBYTE beforeBuf, afterBuf, ptr; diff --git a/jdk/src/share/native/sun/java2d/cmm/lcms/cmscam02.c b/jdk/src/share/native/sun/java2d/cmm/lcms/cmscam02.c index 9aa971cb878..c560470c499 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmscam02.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmscam02.c @@ -29,7 +29,7 @@ // // // Little cms -// Copyright (C) 1998-2006 Marti Maria +// Copyright (C) 1998-2007 Marti Maria // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -51,7 +51,7 @@ -// CIECAM 02 appearance model +// CIECAM 02 appearance model. Many thanks to Jordi Vilar for the debugging. #include "lcms.h" @@ -196,6 +196,10 @@ CAM02COLOR NonlinearCompression(CAM02COLOR clr, LPcmsCIECAM02 pMod) clr.RGBpa[i] = (400.0 * temp) / (temp + 27.13) + 0.1; } } + + clr.A = (((2.0 * clr.RGBpa[0]) + clr.RGBpa[1] + + (clr.RGBpa[2] / 20.0)) - 0.305) * pMod->Nbb; + return clr; } @@ -249,9 +253,6 @@ CAM02COLOR ComputeCorrelates(CAM02COLOR clr, LPcmsCIECAM02 pMod) clr.H = 300 + ((100*((clr.h - 237.53)/1.2)) / temp); } - clr.A = (((2.0 * clr.RGBpa[0]) + clr.RGBpa[1] + - (clr.RGBpa[2] / 20.0)) - 0.305) * pMod->Nbb; - clr.J = 100.0 * pow((clr.A / pMod->adoptedWhite.A), (pMod->c * pMod->z)); @@ -395,7 +396,7 @@ LCMSHANDLE LCMSEXPORT cmsCIECAM02Init(LPcmsViewingConditions pVC) LPcmsCIECAM02 lpMod; - if((lpMod = (LPcmsCIECAM02) malloc(sizeof(cmsCIECAM02))) == NULL) { + if((lpMod = (LPcmsCIECAM02) _cmsMalloc(sizeof(cmsCIECAM02))) == NULL) { return (LCMSHANDLE) NULL; } @@ -449,14 +450,19 @@ LCMSHANDLE LCMSEXPORT cmsCIECAM02Init(LPcmsViewingConditions pVC) lpMod -> z = compute_z(lpMod); lpMod -> Nbb = computeNbb(lpMod); lpMod -> FL = computeFL(lpMod); + + if (lpMod -> D == D_CALCULATE || + lpMod -> D == D_CALCULATE_DISCOUNT) { + lpMod -> D = computeD(lpMod); + } + lpMod -> Ncb = lpMod -> Nbb; lpMod -> adoptedWhite = XYZtoCAT02(lpMod -> adoptedWhite); lpMod -> adoptedWhite = ChromaticAdaptation(lpMod -> adoptedWhite, lpMod); lpMod -> adoptedWhite = CAT02toHPE(lpMod -> adoptedWhite); lpMod -> adoptedWhite = NonlinearCompression(lpMod -> adoptedWhite, lpMod); - lpMod -> adoptedWhite = ComputeCorrelates(lpMod -> adoptedWhite, lpMod); return (LCMSHANDLE) lpMod; @@ -465,7 +471,7 @@ LCMSHANDLE LCMSEXPORT cmsCIECAM02Init(LPcmsViewingConditions pVC) void LCMSEXPORT cmsCIECAM02Done(LCMSHANDLE hModel) { LPcmsCIECAM02 lpMod = (LPcmsCIECAM02) (LPSTR) hModel; - if (lpMod) free(lpMod); + if (lpMod) _cmsFree(lpMod); } @@ -510,3 +516,4 @@ void LCMSEXPORT cmsCIECAM02Reverse(LCMSHANDLE hModel, LPcmsJCh pIn, LPcmsCIEXYZ pOut ->Z = clr.XYZ[2]; } + diff --git a/jdk/src/share/native/sun/java2d/cmm/lcms/cmscam97.c b/jdk/src/share/native/sun/java2d/cmm/lcms/cmscam97.c index a49a3e6dc0e..5c70ff458b7 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmscam97.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmscam97.c @@ -29,7 +29,7 @@ // // // Little cms -// Copyright (C) 1998-2006 Marti Maria +// Copyright (C) 1998-2007 Marti Maria // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -174,7 +174,7 @@ typedef struct { LCMSAPI void LCMSEXPORT cmsCIECAM97sDone(LCMSHANDLE hModel) { LPcmsCIECAM97s lpMod = (LPcmsCIECAM97s) (LPSTR) hModel; - if (lpMod) free(lpMod); + if (lpMod) _cmsFree(lpMod); } // Partial discounting for adaptation degree computation @@ -331,7 +331,7 @@ LCMSAPI LCMSHANDLE LCMSEXPORT cmsCIECAM97sInit(LPcmsViewingConditions pVC) LPcmsCIECAM97s lpMod; VEC3 tmp; - if((lpMod = (LPcmsCIECAM97s) malloc(sizeof(cmsCIECAM97s))) == NULL) { + if((lpMod = (LPcmsCIECAM97s) _cmsMalloc(sizeof(cmsCIECAM97s))) == NULL) { return (LCMSHANDLE) NULL; } @@ -449,7 +449,7 @@ LCMSAPI LCMSHANDLE LCMSEXPORT cmsCIECAM97sInit(LPcmsViewingConditions pVC) // RGB_subw = [MlamRigg][WP/YWp] #ifdef USE_CIECAM97s2 - MAT3eval(&lpMod -> RGB_subw, &lpMod -> MlamRigg, (LPVEC3) &lpMod -> WP); + MAT3eval(&lpMod -> RGB_subw, &lpMod -> MlamRigg, &lpMod -> WP); #else VEC3divK(&tmp, (LPVEC3) &lpMod -> WP, lpMod->WP.Y); MAT3eval(&lpMod -> RGB_subw, &lpMod -> MlamRigg, &tmp); diff --git a/jdk/src/share/native/sun/java2d/cmm/lcms/cmscgats.c b/jdk/src/share/native/sun/java2d/cmm/lcms/cmscgats.c index 2b486437a77..9f26b854476 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmscgats.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmscgats.c @@ -29,7 +29,7 @@ // // // Little cms -// Copyright (C) 1998-2006 Marti Maria +// Copyright (C) 1998-2007 Marti Maria // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -65,22 +65,25 @@ LCMSAPI int LCMSEXPORT cmsIT8SetTable(LCMSHANDLE IT8, int nTable); // Persistence LCMSAPI LCMSHANDLE LCMSEXPORT cmsIT8LoadFromFile(const char* cFileName); LCMSAPI LCMSHANDLE LCMSEXPORT cmsIT8LoadFromMem(void *Ptr, size_t len); -LCMSAPI BOOL LCMSEXPORT cmsIT8SaveToFile(LCMSHANDLE IT8, const char* cFileName); +LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SaveToFile(LCMSHANDLE IT8, const char* cFileName); // Properties LCMSAPI const char* LCMSEXPORT cmsIT8GetSheetType(LCMSHANDLE hIT8); -LCMSAPI BOOL LCMSEXPORT cmsIT8SetSheetType(LCMSHANDLE hIT8, const char* Type); +LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetSheetType(LCMSHANDLE hIT8, const char* Type); -LCMSAPI BOOL LCMSEXPORT cmsIT8SetComment(LCMSHANDLE hIT8, const char* cComment); +LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetComment(LCMSHANDLE hIT8, const char* cComment); -LCMSAPI BOOL LCMSEXPORT cmsIT8SetPropertyStr(LCMSHANDLE hIT8, const char* cProp, const char *Str); -LCMSAPI BOOL LCMSEXPORT cmsIT8SetPropertyDbl(LCMSHANDLE hIT8, const char* cProp, double Val); -LCMSAPI BOOL LCMSEXPORT cmsIT8SetPropertyHex(LCMSHANDLE hIT8, const char* cProp, int Val); -LCMSAPI BOOL LCMSEXPORT cmsIT8SetPropertyUncooked(LCMSHANDLE hIT8, const char* Key, const char* Buffer); +LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetPropertyStr(LCMSHANDLE hIT8, const char* cProp, const char *Str); +LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetPropertyDbl(LCMSHANDLE hIT8, const char* cProp, double Val); +LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetPropertyHex(LCMSHANDLE hIT8, const char* cProp, int Val); +LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetPropertyMulti(LCMSHANDLE hIT8, const char* cProp, const char* cSubProp, const char *Val); +LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetPropertyUncooked(LCMSHANDLE hIT8, const char* Key, const char* Buffer); LCMSAPI const char* LCMSEXPORT cmsIT8GetProperty(LCMSHANDLE hIT8, const char* cProp); LCMSAPI double LCMSEXPORT cmsIT8GetPropertyDbl(LCMSHANDLE hIT8, const char* cProp); -LCMSAPI int LCMSEXPORT cmsIT8EnumProperties(LCMSHANDLE IT8, char ***PropertyNames); +LCMSAPI const char* LCMSEXPORT cmsIT8GetPropertyMulti(LCMSHANDLE hIT8, const char* cProp, const char *cSubProp); +LCMSAPI int LCMSEXPORT cmsIT8EnumProperties(LCMSHANDLE IT8, const char ***PropertyNames); +LCMSAPI int LCMSEXPORT cmsIT8EnumPropertyMulti(LCMSHANDLE hIT8, const char* cProp, const char*** SubpropertyNames); // Datasets @@ -89,10 +92,10 @@ LCMSAPI const char* LCMSEXPORT cmsIT8GetPatchName(LCMSHANDLE hIT8, int nPatc LCMSAPI const char* LCMSEXPORT cmsIT8GetDataRowCol(LCMSHANDLE IT8, int row, int col); LCMSAPI double LCMSEXPORT cmsIT8GetDataRowColDbl(LCMSHANDLE IT8, int col, int row); -LCMSAPI BOOL LCMSEXPORT cmsIT8SetDataRowCol(LCMSHANDLE hIT8, int row, int col, +LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetDataRowCol(LCMSHANDLE hIT8, int row, int col, const char* Val); -LCMSAPI BOOL LCMSEXPORT cmsIT8SetDataRowColDbl(LCMSHANDLE hIT8, int row, int col, +LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetDataRowColDbl(LCMSHANDLE hIT8, int row, int col, double Val); LCMSAPI const char* LCMSEXPORT cmsIT8GetData(LCMSHANDLE IT8, const char* cPatch, const char* cSample); @@ -100,15 +103,15 @@ LCMSAPI const char* LCMSEXPORT cmsIT8GetData(LCMSHANDLE IT8, const char* cPa LCMSAPI double LCMSEXPORT cmsIT8GetDataDbl(LCMSHANDLE IT8, const char* cPatch, const char* cSample); -LCMSAPI BOOL LCMSEXPORT cmsIT8SetData(LCMSHANDLE IT8, const char* cPatch, +LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetData(LCMSHANDLE IT8, const char* cPatch, const char* cSample, const char *Val); -LCMSAPI BOOL LCMSEXPORT cmsIT8SetDataDbl(LCMSHANDLE hIT8, const char* cPatch, +LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetDataDbl(LCMSHANDLE hIT8, const char* cPatch, const char* cSample, double Val); -LCMSAPI BOOL LCMSEXPORT cmsIT8SetDataFormat(LCMSHANDLE IT8, int n, const char *Sample); +LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetDataFormat(LCMSHANDLE IT8, int n, const char *Sample); LCMSAPI int LCMSEXPORT cmsIT8EnumDataFormat(LCMSHANDLE IT8, char ***SampleNames); LCMSAPI void LCMSEXPORT cmsIT8DefineDblFormat(LCMSHANDLE IT8, const char* Formatter); @@ -126,7 +129,7 @@ LCMSAPI int LCMSEXPORT cmsIT8SetTableByLabel(LCMSHANDLE hIT8, const // #define STRICT_CGATS 1 #define MAXID 128 // Max lenght of identifier -#define MAXSTR 255 // Max lenght of string +#define MAXSTR 1024 // Max lenght of string #define MAXTABLES 255 // Max Number of tables in a single stream #define MAXINCLUDE 20 // Max number of nested includes @@ -137,6 +140,9 @@ LCMSAPI int LCMSEXPORT cmsIT8SetTableByLabel(LCMSHANDLE hIT8, const #ifndef NON_WINDOWS #include +#define DIR_CHAR '\\' +#else +#define DIR_CHAR '/' #endif // Symbols @@ -160,6 +166,7 @@ typedef enum { SEND_DATA, SEND_DATA_FORMAT, SKEYWORD, + SDATA_FORMAT_ID, SINCLUDE } SYMBOL; @@ -171,7 +178,8 @@ typedef enum { WRITE_UNCOOKED, WRITE_STRINGIFY, WRITE_HEXADECIMAL, - WRITE_BINARY + WRITE_BINARY, + WRITE_PAIR } WRITEMODE; @@ -181,6 +189,8 @@ typedef struct _KeyVal { struct _KeyVal* Next; char* Keyword; // Name of variable + struct _KeyVal* NextSubkey; // If key is a dictionary, points to the next item + char* Subkey; // If key is a dictionary, points to the subkey name char* Value; // Points to value WRITEMODE WriteAs; // How to write the value @@ -220,7 +230,12 @@ typedef struct _Table { } TABLE, *LPTABLE; +// File stream being parsed +typedef struct _FileContext { + char FileName[MAX_PATH]; // File name if being readed from file + FILE* Stream; // File stream or NULL if holded in memory + } FILECTX, *LPFILECTX; // This struct hold all information about an openened // IT8 handler. Only one dataset is allowed. @@ -257,9 +272,9 @@ typedef struct { char* Source; // Points to loc. being parsed int lineno; // line counter for error reporting - char FileName[MAX_PATH]; // File name if being readed from file - FILE* Stream[MAXINCLUDE]; // File stream or NULL if holded in memory + LPFILECTX FileStack[MAXINCLUDE]; // Stack of files being parsed int IncludeSP; // Include Stack Pointer + char* MemoryBlock; // The stream if holded in memory char DoubleFormatter[MAXID]; // Printf-like 'double' formatter @@ -270,14 +285,14 @@ typedef struct { typedef struct { - FILE* stream; // For save-to-file behaviour + FILE* stream; // For save-to-file behaviour - LPBYTE Base; - LPBYTE Ptr; // For save-to-mem behaviour - size_t Used; - size_t Max; + LPBYTE Base; + LPBYTE Ptr; // For save-to-mem behaviour + size_t Used; + size_t Max; - } SAVESTREAM, FAR* LPSAVESTREAM; + } SAVESTREAM, FAR* LPSAVESTREAM; // ------------------------------------------------------ IT8 parsing routines @@ -298,59 +313,104 @@ static const KEYWORD TabKeys[] = { {".INCLUDE", SINCLUDE}, {"BEGIN_DATA", SBEGIN_DATA }, {"BEGIN_DATA_FORMAT", SBEGIN_DATA_FORMAT }, + {"DATA_FORMAT_IDENTIFIER", SDATA_FORMAT_ID}, {"END_DATA", SEND_DATA}, {"END_DATA_FORMAT", SEND_DATA_FORMAT}, {"KEYWORD", SKEYWORD} - }; #define NUMKEYS (sizeof(TabKeys)/sizeof(KEYWORD)) // Predefined properties -static const char* PredefinedProperties[] = { +// A property +typedef struct { + const char *id; + WRITEMODE as; + } PROPERTY; - "NUMBER_OF_FIELDS", // Required - NUMBER OF FIELDS - "NUMBER_OF_SETS", // Required - NUMBER OF SETS - "ORIGINATOR", // Required - Identifies the specific system, organization or individual that created the data file. - "FILE_DESCRIPTOR", // Required - Describes the purpose or contents of the data file. - "CREATED", // Required - Indicates date of creation of the data file. - "DESCRIPTOR", // Required - Describes the purpose or contents of the data file. - "DIFFUSE_GEOMETRY", // The diffuse geometry used. Allowed values are "sphere" or "opal". - "MANUFACTURER", - "MANUFACTURE", // Some broken Fuji targets does store this value - "PROD_DATE", // Identifies year and month of production of the target in the form yyyy:mm. - "SERIAL", // Uniquely identifies individual physical target. +static PROPERTY PredefinedProperties[] = { - "MATERIAL", // Identifies the material on which the target was produced using a code + {"NUMBER_OF_FIELDS", WRITE_UNCOOKED}, // Required - NUMBER OF FIELDS + {"NUMBER_OF_SETS", WRITE_UNCOOKED}, // Required - NUMBER OF SETS + {"ORIGINATOR", WRITE_STRINGIFY}, // Required - Identifies the specific system, organization or individual that created the data file. + {"FILE_DESCRIPTOR", WRITE_STRINGIFY}, // Required - Describes the purpose or contents of the data file. + {"CREATED", WRITE_STRINGIFY}, // Required - Indicates date of creation of the data file. + {"DESCRIPTOR", WRITE_STRINGIFY}, // Required - Describes the purpose or contents of the data file. + {"DIFFUSE_GEOMETRY", WRITE_STRINGIFY}, // The diffuse geometry used. Allowed values are "sphere" or "opal". + {"MANUFACTURER", WRITE_STRINGIFY}, + {"MANUFACTURE", WRITE_STRINGIFY}, // Some broken Fuji targets does store this value + {"PROD_DATE", WRITE_STRINGIFY}, // Identifies year and month of production of the target in the form yyyy:mm. + {"SERIAL", WRITE_STRINGIFY}, // Uniquely identifies individual physical target. + + {"MATERIAL", WRITE_STRINGIFY}, // Identifies the material on which the target was produced using a code // uniquely identifying th e material. This is intend ed to be used for IT8.7 // physical targets only (i.e . IT8.7/1 a nd IT8.7/2). - "INSTRUMENTATION", // Used to report the specific instrumentation used (manufacturer and + {"INSTRUMENTATION", WRITE_STRINGIFY}, // Used to report the specific instrumentation used (manufacturer and // model number) to generate the data reported. This data will often // provide more information about the particular data collected than an // extensive list of specific details. This is particularly important for // spectral data or data derived from spectrophotometry. - "MEASUREMENT_SOURCE", // Illumination used for spectral measurements. This data helps provide + {"MEASUREMENT_SOURCE", WRITE_STRINGIFY}, // Illumination used for spectral measurements. This data helps provide // a guide to the potential for issues of paper fluorescence, etc. - "PRINT_CONDITIONS", // Used to define the characteristics of the printed sheet being reported. + {"PRINT_CONDITIONS", WRITE_STRINGIFY}, // Used to define the characteristics of the printed sheet being reported. // Where standard conditions have been defined (e.g., SWOP at nominal) // named conditions may suffice. Otherwise, detailed information is // needed. - "SAMPLE_BACKING", // Identifies the backing material used behind the sample during - // measurement. Allowed values are “black”, “white”, or "na". + {"SAMPLE_BACKING", WRITE_STRINGIFY}, // Identifies the backing material used behind the sample during + // measurement. Allowed values are “black”, “white”, or {"na". - "CHISQ_DOF" // Degrees of freedom associated with the Chi squared statistic + {"CHISQ_DOF", WRITE_STRINGIFY}, // Degrees of freedom associated with the Chi squared statistic + +// new in recent specs: + {"MEASUREMENT_GEOMETRY", WRITE_STRINGIFY}, // The type of measurement, either reflection or transmission, should be indicated + // along with details of the geometry and the aperture size and shape. For example, + // for transmission measurements it is important to identify 0/diffuse, diffuse/0, + // opal or integrating sphere, etc. For reflection it is important to identify 0/45, + // 45/0, sphere (specular included or excluded), etc. + + {"FILTER", WRITE_STRINGIFY}, // Identifies the use of physical filter(s) during measurement. Typically used to + // denote the use of filters such as none, D65, Red, Green or Blue. + + {"POLARIZATION", WRITE_STRINGIFY}, // Identifies the use of a physical polarization filter during measurement. Allowed + // values are {"yes”, “white”, “none” or “na”. + + {"WEIGHTING_FUNCTION", WRITE_PAIR}, // Indicates such functions as: the CIE standard observer functions used in the + // calculation of various data parameters (2 degree and 10 degree), CIE standard + // illuminant functions used in the calculation of various data parameters (e.g., D50, + // D65, etc.), density status response, etc. If used there shall be at least one + // name-value pair following the WEIGHTING_FUNCTION tag/keyword. The first attribute + // in the set shall be {"name" and shall identify the particular parameter used. + // The second shall be {"value" and shall provide the value associated with that name. + // For ASCII data, a string containing the Name and Value attribute pairs shall follow + // the weighting function keyword. A semi-colon separates attribute pairs from each + // other and within the attribute the name and value are separated by a comma. + + {"COMPUTATIONAL_PARAMETER", WRITE_PAIR}, // Parameter that is used in computing a value from measured data. Name is the name + // of the calculation, parameter is the name of the parameter used in the calculation + // and value is the value of the parameter. + + {"TARGET_TYPE", WRITE_STRINGIFY}, // The type of target being measured, e.g. IT8.7/1, IT8.7/3, user defined, etc. + + {"COLORANT", WRITE_STRINGIFY}, // Identifies the colorant(s) used in creating the target. + + {"TABLE_DESCRIPTOR", WRITE_STRINGIFY}, // Describes the purpose or contents of a data table. + + {"TABLE_NAME", WRITE_STRINGIFY} // Provides a short name for a data table. }; -#define NUMPREDEFINEDPROPS (sizeof(PredefinedProperties)/sizeof(char *)) +#define NUMPREDEFINEDPROPS (sizeof(PredefinedProperties)/sizeof(PROPERTY)) // Predefined sample types on dataset static const char* PredefinedSampleID[] = { + "SAMPLE_ID", // Identifies sample that data represents + "STRING", // Identifies label, or other non-machine readable value. + // Value must begin and end with a " symbol "CMYK_C", // Cyan component of CMYK data expressed as a percentage "CMYK_M", // Magenta component of CMYK data expressed as a percentage @@ -378,7 +438,7 @@ static const char* PredefinedSampleID[] = { "LAB_B", // b* component of Lab data "LAB_C", // C*ab component of Lab data "LAB_H", // hab component of Lab data - "LAB_DE" // CIE dE + "LAB_DE", // CIE dE "LAB_DE_94", // CIE dE using CIE 94 "LAB_DE_CMC", // dE using CMC "LAB_DE_2000", // CIE dE using CIE DE 2000 @@ -388,7 +448,7 @@ static const char* PredefinedSampleID[] = { "STDEV_Y", // Standard deviation of Y (tristimulus data) "STDEV_Z", // Standard deviation of Z (tristimulus data) "STDEV_L", // Standard deviation of L* - "STDEV_A" // Standard deviation of a* + "STDEV_A", // Standard deviation of a* "STDEV_B", // Standard deviation of b* "STDEV_DE", // Standard deviation of CIE dE "CHI_SQD_PAR"}; // The average of the standard deviations of L*, a* and b*. It is @@ -397,57 +457,120 @@ static const char* PredefinedSampleID[] = { #define NUMPREDEFINEDSAMPLEID (sizeof(PredefinedSampleID)/sizeof(char *)) +//Forward declaration of some internal functions +static +void* AllocChunk(LPIT8 it8, size_t size); + // Checks if c is a separator static -BOOL isseparator(int c) +LCMSBOOL isseparator(int c) { return (c == ' ') || (c == '\t') || (c == '\r'); } // Checks whatever if c is a valid identifier char - static -BOOL ismiddle(int c) +LCMSBOOL ismiddle(int c) { return (!isseparator(c) && (c != '#') && (c !='\"') && (c != '\'') && (c > 32) && (c < 127)); } // Checks whatsever if c is a valid identifier middle char. static -BOOL isidchar(int c) +LCMSBOOL isidchar(int c) { return isalnum(c) || ismiddle(c); } // Checks whatsever if c is a valid identifier first char. static -BOOL isfirstidchar(int c) +LCMSBOOL isfirstidchar(int c) { return !isdigit(c) && ismiddle(c); } +// checks whether the supplied path looks like an absolute path +// NOTE: this function doesn't checks if the path exists or even if it's legal +static +LCMSBOOL isabsolutepath(const char *path) +{ + if(path == NULL) + return FALSE; + + if(path[0] == DIR_CHAR) + return TRUE; + +#ifndef NON_WINDOWS + if(isalpha(path[0]) && path[1] == ':') + return TRUE; +#endif + return FALSE; +} + +// Makes a file path based on a given reference path +// NOTE: buffer is assumed to point to at least MAX_PATH bytes +// NOTE: both relPath and basePath are assumed to be no more than MAX_PATH characters long (including the null terminator!) +// NOTE: this function doesn't check if the path exists or even if it's legal +static +LCMSBOOL _cmsMakePath(const char *relPath, const char *basePath, char *buffer) +{ + if (!isabsolutepath(relPath)) { + + char *tail; + + strncpy(buffer, basePath, MAX_PATH-1); + tail = strrchr(buffer, DIR_CHAR); + if (tail != NULL) { + + size_t len = tail - buffer; + strncpy(tail + 1, relPath, MAX_PATH - len -1); + // TODO: if combined path is longer than MAX_PATH, this should return FALSE! + return TRUE; + } + } + strncpy(buffer, relPath, MAX_PATH - 1); + buffer[MAX_PATH-1] = 0; + return TRUE; +} + + +// Make sure no exploit is being even tried static -BOOL SynError(LPIT8 it8, const char *Txt, ...) +const char* NoMeta(const char* str) +{ + if (strchr(str, '%') != NULL) + return "**** CORRUPTED FORMAT STRING ***"; + + return str; +} + + +// Syntax error +static +LCMSBOOL SynError(LPIT8 it8, const char *Txt, ...) { char Buffer[256], ErrMsg[1024]; va_list args; va_start(args, Txt); - vsprintf(Buffer, Txt, args); + vsnprintf(Buffer, 255, Txt, args); + Buffer[255] = 0; va_end(args); - sprintf(ErrMsg, "%s: Line %d, %s", it8->FileName, it8->lineno, Buffer); + snprintf(ErrMsg, 1023, "%s: Line %d, %s", it8->FileStack[it8 ->IncludeSP]->FileName, it8->lineno, Buffer); + ErrMsg[1023] = 0; it8->sy = SSYNERROR; - cmsSignalError(LCMS_ERRC_ABORTED, ErrMsg); + cmsSignalError(LCMS_ERRC_ABORTED, "%s", ErrMsg); return FALSE; } +// Check if current symbol is same as specified. issue an error else. static -BOOL Check(LPIT8 it8, SYMBOL sy, const char* Err) +LCMSBOOL Check(LPIT8 it8, SYMBOL sy, const char* Err) { if (it8 -> sy != sy) - return SynError(it8, Err); + return SynError(it8, NoMeta(Err)); return TRUE; } @@ -457,15 +580,15 @@ BOOL Check(LPIT8 it8, SYMBOL sy, const char* Err) static void NextCh(LPIT8 it8) { - if (it8 -> Stream[it8 ->IncludeSP]) { + if (it8 -> FileStack[it8 ->IncludeSP]->Stream) { - it8 ->ch = fgetc(it8 ->Stream[it8 ->IncludeSP]); + it8 ->ch = fgetc(it8 ->FileStack[it8 ->IncludeSP]->Stream); - if (feof(it8 -> Stream[it8 ->IncludeSP])) { + if (feof(it8 -> FileStack[it8 ->IncludeSP]->Stream)) { if (it8 ->IncludeSP > 0) { - fclose(it8 ->Stream[it8->IncludeSP--]); + fclose(it8 ->FileStack[it8->IncludeSP--]->Stream); it8 -> ch = ' '; // Whitespace to be ignored } else @@ -476,7 +599,6 @@ void NextCh(LPIT8 it8) } else { - it8->ch = *it8->Source; if (it8->ch) it8->Source++; } @@ -799,18 +921,39 @@ void InSymbol(LPIT8 it8) if (it8 -> sy == SINCLUDE) { - FILE* IncludeFile; + LPFILECTX FileNest; + + if(it8 -> IncludeSP >= (MAXINCLUDE-1)) + { + SynError(it8, "Too many recursion levels"); + return; + } InSymbol(it8); if (!Check(it8, SSTRING, "Filename expected")) return; - IncludeFile = fopen(it8 -> str, "rt"); - if (IncludeFile == NULL) { - SynError(it8, "File %s not found", it8 ->str); - return; + FileNest = it8 -> FileStack[it8 -> IncludeSP + 1]; + if(FileNest == NULL) + { + FileNest = it8 ->FileStack[it8 -> IncludeSP + 1] = (LPFILECTX)AllocChunk(it8, sizeof(FILECTX)); + //if(FileNest == NULL) + // TODO: how to manage out-of-memory conditions? } - it8 -> Stream[++it8 -> IncludeSP] = IncludeFile; + if(_cmsMakePath(it8->str, it8->FileStack[it8->IncludeSP]->FileName, FileNest->FileName) == FALSE) + { + SynError(it8, "File path too long"); + return; + } + + FileNest->Stream = fopen(FileNest->FileName, "rt"); + if (FileNest->Stream == NULL) { + + SynError(it8, "File %s not found", FileNest->FileName); + return; + } + it8->IncludeSP++; + it8 ->ch = ' '; InSymbol(it8); } @@ -819,7 +962,7 @@ void InSymbol(LPIT8 it8) // Checks end of line separator static -BOOL CheckEOLN(LPIT8 it8) +LCMSBOOL CheckEOLN(LPIT8 it8) { if (!Check(it8, SEOLN, "Expected separator")) return FALSE; while (it8 -> sy == SEOLN) @@ -850,21 +993,26 @@ void SkipEOLN(LPIT8 it8) // Returns a string holding current value static -BOOL GetVal(LPIT8 it8, char* Buffer, const char* ErrorTitle) +LCMSBOOL GetVal(LPIT8 it8, char* Buffer, size_t max, const char* ErrorTitle) { switch (it8->sy) { - case SIDENT: strncpy(Buffer, it8->id, MAXID-1); break; - case SINUM: sprintf(Buffer, "%d", it8 -> inum); break; - case SDNUM: sprintf(Buffer, it8->DoubleFormatter, it8 -> dnum); break; - case SSTRING: strncpy(Buffer, it8->str, MAXSTR-1); break; + case SIDENT: strncpy(Buffer, it8->id, max); + Buffer[max-1]=0; + break; + case SINUM: snprintf(Buffer, max, "%d", it8 -> inum); break; + case SDNUM: snprintf(Buffer, max, it8->DoubleFormatter, it8 -> dnum); break; + case SSTRING: strncpy(Buffer, it8->str, max); + Buffer[max-1] = 0; + break; default: - return SynError(it8, ErrorTitle); + return SynError(it8, "%s", ErrorTitle); } - return TRUE; + Buffer[max] = 0; + return TRUE; } // ---------------------------------------------------------- Table @@ -872,7 +1020,13 @@ BOOL GetVal(LPIT8 it8, char* Buffer, const char* ErrorTitle) static LPTABLE GetTable(LPIT8 it8) { - return it8 ->Tab + it8 ->nTable; + if ((it8 -> nTable >= it8 ->TablesCount) || (it8 -> nTable < 0)) { + + SynError(it8, "Table %d out of sequence", it8 -> nTable); + return it8 -> Tab; + } + + return it8 ->Tab + it8 ->nTable; } // ---------------------------------------------------------- Memory management @@ -896,15 +1050,15 @@ void LCMSEXPORT cmsIT8Free(LCMSHANDLE hIT8) for (p = it8->MemorySink; p != NULL; p = n) { n = p->Next; - if (p->Ptr) free(p->Ptr); - free(p); + if (p->Ptr) _cmsFree(p->Ptr); + _cmsFree(p); } } if (it8->MemoryBlock) - free(it8->MemoryBlock); + _cmsFree(it8->MemoryBlock); - free(it8); + _cmsFree(it8); } @@ -913,16 +1067,16 @@ static void* AllocBigBlock(LPIT8 it8, size_t size) { LPOWNEDMEM ptr1; - void* ptr = malloc(size); + void* ptr = _cmsMalloc(size); if (ptr) { ZeroMemory(ptr, size); - ptr1 = (LPOWNEDMEM) malloc(sizeof(OWNEDMEM)); + ptr1 = (LPOWNEDMEM) _cmsMalloc(sizeof(OWNEDMEM)); if (ptr1 == NULL) { - free(ptr); + _cmsFree(ptr); return NULL; } @@ -986,8 +1140,9 @@ char *AllocString(LPIT8 it8, const char* str) // Searches through linked list static -BOOL IsAvailableOnList(LPKEYVALUE p, const char* Key, LPKEYVALUE* LastPtr) +LCMSBOOL IsAvailableOnList(LPKEYVALUE p, const char* Key, const char* Subkey, LPKEYVALUE* LastPtr) { + if (LastPtr) *LastPtr = p; for (; p != NULL; p = p->Next) { @@ -996,8 +1151,22 @@ BOOL IsAvailableOnList(LPKEYVALUE p, const char* Key, LPKEYVALUE* LastPtr) if (*Key != '#') { // Comments are ignored if (stricmp(Key, p->Keyword) == 0) - return TRUE; + break; } + } + + if (p == NULL) + return FALSE; + + if (Subkey == 0) + return TRUE; + + for (; p != NULL; p = p->NextSubkey) { + + if (LastPtr) *LastPtr = p; + + if (stricmp(Subkey, p->Subkey) == 0) + return TRUE; } return FALSE; @@ -1007,35 +1176,55 @@ BOOL IsAvailableOnList(LPKEYVALUE p, const char* Key, LPKEYVALUE* LastPtr) // Add a property into a linked list static -BOOL AddToList(LPIT8 it8, LPKEYVALUE* Head, const char *Key, const char* xValue, WRITEMODE WriteAs) +LPKEYVALUE AddToList(LPIT8 it8, LPKEYVALUE* Head, const char *Key, const char *Subkey, const char* xValue, WRITEMODE WriteAs) { LPKEYVALUE p; - LPKEYVALUE last; - // Check if property is already in list (this is an error) - if (IsAvailableOnList(*Head, Key, &last)) { + if (IsAvailableOnList(*Head, Key, Subkey, &p)) { - // This may work for editing properties + // This may work for editing properties - last->Value = AllocString(it8, xValue); - last->WriteAs = WriteAs; - return TRUE; - - // return SynError(it8, "duplicate key <%s>", Key); + // return SynError(it8, "duplicate key <%s>", Key); } + else { + LPKEYVALUE last = p; - // Allocate the container + // Allocate the container p = (LPKEYVALUE) AllocChunk(it8, sizeof(KEYVALUE)); if (p == NULL) { - return SynError(it8, "AddToList: out of memory"); + SynError(it8, "AddToList: out of memory"); + return NULL; } // Store name and value p->Keyword = AllocString(it8, Key); + p->Subkey = (Subkey == NULL) ? NULL : AllocString(it8, Subkey); + // Keep the container in our list + if (*Head == NULL) + *Head = p; + else + { + if(Subkey != 0 && last != 0) { + last->NextSubkey = p; + + // If Subkey is not null, then last is the last property with the same key, + // but not necessarily is the last property in the list, so we need to move + // to the actual list end + while(last->Next != 0) + last = last->Next; + } + last->Next = p; + } + + p->Next = NULL; + p->NextSubkey = NULL; + } + + p->WriteAs = WriteAs; if (xValue != NULL) { p->Value = AllocString(it8, xValue); @@ -1044,29 +1233,20 @@ BOOL AddToList(LPIT8 it8, LPKEYVALUE* Head, const char *Key, const char* xValue, p->Value = NULL; } - p->Next = NULL; - p->WriteAs = WriteAs; - - // Keep the container in our list - if (*Head == NULL) - *Head = p; - else - last->Next = p; - - return TRUE; + return p; } static -BOOL AddAvailableProperty(LPIT8 it8, const char* Key) +LPKEYVALUE AddAvailableProperty(LPIT8 it8, const char* Key, WRITEMODE as) { - return AddToList(it8, &it8->ValidKeywords, Key, NULL, WRITE_UNCOOKED); + return AddToList(it8, &it8->ValidKeywords, Key, NULL, NULL, as); } static -BOOL AddAvailableSampleID(LPIT8 it8, const char* Key) +LPKEYVALUE AddAvailableSampleID(LPIT8 it8, const char* Key) { - return AddToList(it8, &it8->ValidSampleID, Key, NULL, WRITE_UNCOOKED); + return AddToList(it8, &it8->ValidSampleID, Key, NULL, NULL, WRITE_UNCOOKED); } @@ -1122,8 +1302,6 @@ LCMSHANDLE LCMSEXPORT cmsIT8Alloc(void) AllocTable(it8); it8->MemoryBlock = NULL; - it8->Stream[0] = NULL; - it8->IncludeSP = 0; it8->MemorySink = NULL; it8 ->nTable = 0; @@ -1141,6 +1319,8 @@ LCMSHANDLE LCMSEXPORT cmsIT8Alloc(void) it8 -> inum = 0; it8 -> dnum = 0.0; + it8->FileStack[0] = (LPFILECTX)AllocChunk(it8, sizeof(FILECTX)); + it8->IncludeSP = 0; it8 -> lineno = 1; strcpy(it8->DoubleFormatter, DEFAULT_DBL_FORMAT); @@ -1149,7 +1329,7 @@ LCMSHANDLE LCMSEXPORT cmsIT8Alloc(void) // Initialize predefined properties & data for (i=0; i < NUMPREDEFINEDPROPS; i++) - AddAvailableProperty(it8, PredefinedProperties[i]); + AddAvailableProperty(it8, PredefinedProperties[i].id, PredefinedProperties[i].as); for (i=0; i < NUMPREDEFINEDSAMPLEID; i++) AddAvailableSampleID(it8, PredefinedSampleID[i]); @@ -1167,65 +1347,72 @@ const char* LCMSEXPORT cmsIT8GetSheetType(LCMSHANDLE hIT8) } -BOOL LCMSEXPORT cmsIT8SetSheetType(LCMSHANDLE hIT8, const char* Type) +LCMSBOOL LCMSEXPORT cmsIT8SetSheetType(LCMSHANDLE hIT8, const char* Type) { LPIT8 it8 = (LPIT8) hIT8; strncpy(it8 ->SheetType, Type, MAXSTR-1); + it8 ->SheetType[MAXSTR-1] = 0; return TRUE; } -BOOL LCMSEXPORT cmsIT8SetComment(LCMSHANDLE hIT8, const char* Val) +LCMSBOOL LCMSEXPORT cmsIT8SetComment(LCMSHANDLE hIT8, const char* Val) { LPIT8 it8 = (LPIT8) hIT8; if (!Val) return FALSE; if (!*Val) return FALSE; - return AddToList(it8, &GetTable(it8)->HeaderList, "# ", Val, WRITE_UNCOOKED); + return AddToList(it8, &GetTable(it8)->HeaderList, "# ", NULL, Val, WRITE_UNCOOKED) != NULL; } // Sets a property -BOOL LCMSEXPORT cmsIT8SetPropertyStr(LCMSHANDLE hIT8, const char* Key, const char *Val) +LCMSBOOL LCMSEXPORT cmsIT8SetPropertyStr(LCMSHANDLE hIT8, const char* Key, const char *Val) { LPIT8 it8 = (LPIT8) hIT8; if (!Val) return FALSE; if (!*Val) return FALSE; - return AddToList(it8, &GetTable(it8)->HeaderList, Key, Val, WRITE_STRINGIFY); + return AddToList(it8, &GetTable(it8)->HeaderList, Key, NULL, Val, WRITE_STRINGIFY) != NULL; } -BOOL LCMSEXPORT cmsIT8SetPropertyDbl(LCMSHANDLE hIT8, const char* cProp, double Val) +LCMSBOOL LCMSEXPORT cmsIT8SetPropertyDbl(LCMSHANDLE hIT8, const char* cProp, double Val) { LPIT8 it8 = (LPIT8) hIT8; char Buffer[1024]; sprintf(Buffer, it8->DoubleFormatter, Val); - return AddToList(it8, &GetTable(it8)->HeaderList, cProp, Buffer, WRITE_UNCOOKED); + return AddToList(it8, &GetTable(it8)->HeaderList, cProp, NULL, Buffer, WRITE_UNCOOKED) != NULL; } -BOOL LCMSEXPORT cmsIT8SetPropertyHex(LCMSHANDLE hIT8, const char* cProp, int Val) +LCMSBOOL LCMSEXPORT cmsIT8SetPropertyHex(LCMSHANDLE hIT8, const char* cProp, int Val) { LPIT8 it8 = (LPIT8) hIT8; char Buffer[1024]; sprintf(Buffer, "%d", Val); - return AddToList(it8, &GetTable(it8)->HeaderList, cProp, Buffer, WRITE_HEXADECIMAL); + return AddToList(it8, &GetTable(it8)->HeaderList, cProp, NULL, Buffer, WRITE_HEXADECIMAL) != NULL; } -BOOL LCMSEXPORT cmsIT8SetPropertyUncooked(LCMSHANDLE hIT8, const char* Key, const char* Buffer) +LCMSBOOL LCMSEXPORT cmsIT8SetPropertyUncooked(LCMSHANDLE hIT8, const char* Key, const char* Buffer) { LPIT8 it8 = (LPIT8) hIT8; - return AddToList(it8, &GetTable(it8)->HeaderList, Key, Buffer, WRITE_UNCOOKED); + return AddToList(it8, &GetTable(it8)->HeaderList, Key, NULL, Buffer, WRITE_UNCOOKED) != NULL; } +LCMSBOOL LCMSEXPORT cmsIT8SetPropertyMulti(LCMSHANDLE hIT8, const char* Key, const char* SubKey, const char *Buffer) +{ + LPIT8 it8 = (LPIT8) hIT8; + + return AddToList(it8, &GetTable(it8)->HeaderList, Key, SubKey, Buffer, WRITE_PAIR) != NULL; +} // Gets a property const char* LCMSEXPORT cmsIT8GetProperty(LCMSHANDLE hIT8, const char* Key) @@ -1233,7 +1420,7 @@ const char* LCMSEXPORT cmsIT8GetProperty(LCMSHANDLE hIT8, const char* Key) LPIT8 it8 = (LPIT8) hIT8; LPKEYVALUE p; - if (IsAvailableOnList(GetTable(it8) -> HeaderList, Key, &p)) + if (IsAvailableOnList(GetTable(it8) -> HeaderList, Key, NULL, &p)) { return p -> Value; } @@ -1249,6 +1436,18 @@ double LCMSEXPORT cmsIT8GetPropertyDbl(LCMSHANDLE hIT8, const char* cProp) else return 0.0; } +const char* LCMSEXPORT cmsIT8GetPropertyMulti(LCMSHANDLE hIT8, const char* Key, const char *SubKey) +{ + LPIT8 it8 = (LPIT8) hIT8; + LPKEYVALUE p; + + if (IsAvailableOnList(GetTable(it8) -> HeaderList, Key, SubKey, &p)) + { + return p -> Value; + } + return NULL; +} + // ----------------------------------------------------------------- Datasets @@ -1287,10 +1486,17 @@ const char *GetDataFormat(LPIT8 it8, int n) } static -BOOL SetDataFormat(LPIT8 it8, int n, const char *label) +LCMSBOOL SetDataFormat(LPIT8 it8, int n, const char *label) { LPTABLE t = GetTable(it8); +#ifdef STRICT_CGATS + if (!IsAvailableOnList(it8-> ValidSampleID, label, NULL, NULL)) { + SynError(it8, "Invalid data format '%s'.", label); + return FALSE; + } +#endif + if (!t->DataFormat) AllocateDataFormat(it8); @@ -1308,7 +1514,7 @@ BOOL SetDataFormat(LPIT8 it8, int n, const char *label) } -BOOL LCMSEXPORT cmsIT8SetDataFormat(LCMSHANDLE h, int n, const char *Sample) +LCMSBOOL LCMSEXPORT cmsIT8SetDataFormat(LCMSHANDLE h, int n, const char *Sample) { LPIT8 it8 = (LPIT8) h; return SetDataFormat(it8, n, Sample); @@ -1348,7 +1554,7 @@ char* GetData(LPIT8 it8, int nSet, int nField) } static -BOOL SetData(LPIT8 it8, int nSet, int nField, const char *Val) +LCMSBOOL SetData(LPIT8 it8, int nSet, int nField, const char *Val) { LPTABLE t = GetTable(it8); @@ -1383,42 +1589,43 @@ static void WriteStr(LPSAVESTREAM f, const char *str) { - size_t len; + size_t len; - if (str == NULL) - str = " "; + if (str == NULL) + str = " "; - // Lenghth to write - len = strlen(str); + // Lenghth to write + len = strlen(str); f ->Used += len; - if (f ->stream) { // Should I write it to a file? + if (f ->stream) { // Should I write it to a file? - fwrite(str, 1, len, f->stream); + fwrite(str, 1, len, f->stream); + + } + else { // Or to a memory block? + + + if (f ->Base) { // Am I just counting the bytes? + + if (f ->Used > f ->Max) { + + cmsSignalError(LCMS_ERRC_ABORTED, "Write to memory overflows in CGATS parser"); + return; + } + + CopyMemory(f ->Ptr, str, len); + f->Ptr += len; } - else { // Or to a memory block? - - if (f ->Base) { // Am I just counting the bytes? - - if (f ->Used > f ->Max) { - - cmsSignalError(LCMS_ERRC_ABORTED, "Write to memory overflows in CGATS parser"); - return; - } - - CopyMemory(f ->Ptr, str, len); - f->Ptr += len; - - } - - } + } } -// +// Write formatted + static void Writef(LPSAVESTREAM f, const char* frm, ...) { @@ -1426,7 +1633,8 @@ void Writef(LPSAVESTREAM f, const char* frm, ...) va_list args; va_start(args, frm); - vsprintf(Buffer, frm, args); + vsnprintf(Buffer, 4095, frm, args); + Buffer[4095] = 0; WriteStr(f, Buffer); va_end(args); @@ -1450,7 +1658,7 @@ void WriteHeader(LPIT8 it8, LPSAVESTREAM fp) for (Pt = p ->Value; *Pt; Pt++) { - Writef(fp, "%c", *Pt); + Writef(fp, "%c", *Pt); if (*Pt == '\n') { WriteStr(fp, "# "); @@ -1462,7 +1670,7 @@ void WriteHeader(LPIT8 it8, LPSAVESTREAM fp) } - if (!IsAvailableOnList(it8-> ValidKeywords, p->Keyword, NULL)) { + if (!IsAvailableOnList(it8-> ValidKeywords, p->Keyword, NULL, NULL)) { #ifdef STRICT_CGATS WriteStr(fp, "KEYWORD\t\""); @@ -1470,7 +1678,7 @@ void WriteHeader(LPIT8 it8, LPSAVESTREAM fp) WriteStr(fp, "\"\n"); #endif - AddAvailableProperty(it8, p->Keyword); + AddAvailableProperty(it8, p->Keyword, WRITE_UNCOOKED); } @@ -1495,6 +1703,10 @@ void WriteHeader(LPIT8 it8, LPSAVESTREAM fp) Writef(fp, "\t0x%B", atoi(p ->Value)); break; + case WRITE_PAIR: + Writef(fp, "\t\"%s,%s\"", p->Subkey, p->Value); + break; + default: SynError(it8, "Unknown write mode %d", p ->WriteAs); return; } @@ -1573,13 +1785,13 @@ void WriteData(LPSAVESTREAM fp, LPIT8 it8) // Saves whole file -BOOL LCMSEXPORT cmsIT8SaveToFile(LCMSHANDLE hIT8, const char* cFileName) +LCMSBOOL LCMSEXPORT cmsIT8SaveToFile(LCMSHANDLE hIT8, const char* cFileName) { SAVESTREAM sd; int i; LPIT8 it8 = (LPIT8) hIT8; - ZeroMemory(&sd, sizeof(SAVESTREAM)); + ZeroMemory(&sd, sizeof(SAVESTREAM)); sd.stream = fopen(cFileName, "wt"); if (!sd.stream) return FALSE; @@ -1594,31 +1806,31 @@ BOOL LCMSEXPORT cmsIT8SaveToFile(LCMSHANDLE hIT8, const char* cFileName) WriteData(&sd, it8); } - fclose(sd.stream); + fclose(sd.stream); return TRUE; } // Saves to memory -BOOL LCMSEXPORT cmsIT8SaveToMem(LCMSHANDLE hIT8, void *MemPtr, size_t* BytesNeeded) +LCMSBOOL LCMSEXPORT cmsIT8SaveToMem(LCMSHANDLE hIT8, void *MemPtr, size_t* BytesNeeded) { SAVESTREAM sd; int i; LPIT8 it8 = (LPIT8) hIT8; - ZeroMemory(&sd, sizeof(SAVESTREAM)); + ZeroMemory(&sd, sizeof(SAVESTREAM)); sd.stream = NULL; - sd.Base = (LPBYTE) MemPtr; - sd.Ptr = sd.Base; + sd.Base = (LPBYTE) MemPtr; + sd.Ptr = sd.Base; - sd.Used = 0; + sd.Used = 0; - if (sd.Base) - sd.Max = *BytesNeeded; // Write to memory? - else - sd.Max = 0; // Just counting the needed bytes + if (sd.Base) + sd.Max = *BytesNeeded; // Write to memory? + else + sd.Max = 0; // Just counting the needed bytes WriteStr(&sd, it8->SheetType); WriteStr(&sd, "\n"); @@ -1630,12 +1842,12 @@ BOOL LCMSEXPORT cmsIT8SaveToMem(LCMSHANDLE hIT8, void *MemPtr, size_t* BytesNeed WriteData(&sd, it8); } - sd.Used++; // The \0 at the very end + sd.Used++; // The \0 at the very end - if (sd.Base) - sd.Ptr = 0; + if (sd.Base) + sd.Ptr = 0; - *BytesNeeded = sd.Used; + *BytesNeeded = sd.Used; return TRUE; } @@ -1644,7 +1856,7 @@ BOOL LCMSEXPORT cmsIT8SaveToMem(LCMSHANDLE hIT8, void *MemPtr, size_t* BytesNeed // -------------------------------------------------------------- Higer level parsing static -BOOL DataFormatSection(LPIT8 it8) +LCMSBOOL DataFormatSection(LPIT8 it8) { int iField = 0; LPTABLE t = GetTable(it8); @@ -1685,16 +1897,19 @@ BOOL DataFormatSection(LPIT8 it8) static -BOOL DataSection (LPIT8 it8) +LCMSBOOL DataSection (LPIT8 it8) { int iField = 0; int iSet = 0; - char Buffer[256]; + char Buffer[MAXSTR]; LPTABLE t = GetTable(it8); InSymbol(it8); // Eats "BEGIN_DATA" CheckEOLN(it8); + if (!t->Data) + AllocateDataSet(it8); + while (it8->sy != SEND_DATA && it8->sy != SEOF) { if (iField >= t -> nSamples) { @@ -1705,7 +1920,7 @@ BOOL DataSection (LPIT8 it8) if (it8->sy != SEND_DATA && it8->sy != SEOF) { - if (!GetVal(it8, Buffer, "Sample data expected")) + if (!GetVal(it8, Buffer, 255, "Sample data expected")) return FALSE; if (!SetData(it8, iSet, iField, Buffer)) @@ -1734,10 +1949,11 @@ BOOL DataSection (LPIT8 it8) static -BOOL HeaderSection(LPIT8 it8) +LCMSBOOL HeaderSection(LPIT8 it8) { char VarName[MAXID]; char Buffer[MAXSTR]; + LPKEYVALUE Key; while (it8->sy != SEOF && it8->sy != SSYNERROR && @@ -1749,30 +1965,79 @@ BOOL HeaderSection(LPIT8 it8) case SKEYWORD: InSymbol(it8); - if (!GetVal(it8, Buffer, "Keyword expected")) return FALSE; - if (!AddAvailableProperty(it8, Buffer)) return FALSE; + if (!GetVal(it8, Buffer, MAXSTR-1, "Keyword expected")) return FALSE; + if (!AddAvailableProperty(it8, Buffer, WRITE_UNCOOKED)) return FALSE; + InSymbol(it8); + break; + + + case SDATA_FORMAT_ID: + InSymbol(it8); + if (!GetVal(it8, Buffer, MAXSTR-1, "Keyword expected")) return FALSE; + if (!AddAvailableSampleID(it8, Buffer)) return FALSE; InSymbol(it8); break; case SIDENT: strncpy(VarName, it8->id, MAXID-1); + VarName[MAXID-1] = 0; - if (!IsAvailableOnList(it8-> ValidKeywords, VarName, NULL)) { + if (!IsAvailableOnList(it8-> ValidKeywords, VarName, NULL, &Key)) { #ifdef STRICT_CGATS return SynError(it8, "Undefined keyword '%s'", VarName); #else - if (!AddAvailableProperty(it8, VarName)) return FALSE; + Key = AddAvailableProperty(it8, VarName, WRITE_UNCOOKED); + if (Key == NULL) return FALSE; #endif } InSymbol(it8); - if (!GetVal(it8, Buffer, "Property data expected")) return FALSE; + if (!GetVal(it8, Buffer, MAXSTR-1, "Property data expected")) return FALSE; + if(Key->WriteAs != WRITE_PAIR) { + AddToList(it8, &GetTable(it8)->HeaderList, VarName, NULL, Buffer, + (it8->sy == SSTRING) ? WRITE_STRINGIFY : WRITE_UNCOOKED); + } + else { + const char *Subkey; + char *Nextkey; + if (it8->sy != SSTRING) + return SynError(it8, "Invalid value '%s' for property '%s'.", Buffer, VarName); - AddToList(it8, &GetTable(it8)->HeaderList, VarName, Buffer, - (it8->sy == SSTRING) ? WRITE_STRINGIFY : WRITE_UNCOOKED); + // chop the string as a list of "subkey, value" pairs, using ';' as a separator + for(Subkey = Buffer; Subkey != NULL; Subkey = Nextkey) + { + char *Value, *temp; + + // identify token pair boundary + Nextkey = (char*) strchr(Subkey, ';'); + if(Nextkey) + *Nextkey++ = '\0'; + + // for each pair, split the subkey and the value + Value = (char*) strrchr(Subkey, ','); + if(Value == NULL) + return SynError(it8, "Invalid value for property '%s'.", VarName); + + // gobble the spaces before the coma, and the coma itself + temp = Value++; + do *temp-- = '\0'; while(temp >= Subkey && *temp == ' '); + + // gobble any space at the right + temp = Value + strlen(Value) - 1; + while(*temp == ' ') *temp-- = '\0'; + + // trim the strings from the left + Subkey += strspn(Subkey, " "); + Value += strspn(Value, " "); + + if(Subkey[0] == 0 || Value[0] == 0) + return SynError(it8, "Invalid value for property '%s'.", VarName); + AddToList(it8, &GetTable(it8)->HeaderList, VarName, Subkey, Value, WRITE_PAIR); + } + } InSymbol(it8); break; @@ -1793,22 +2058,23 @@ BOOL HeaderSection(LPIT8 it8) static -BOOL ParseIT8(LPIT8 it8) +LCMSBOOL ParseIT8(LPIT8 it8, LCMSBOOL nosheet) { - char* SheetTypePtr; + char* SheetTypePtr = it8 ->SheetType; + + if (nosheet == 0) { // First line is a very special case. while (isseparator(it8->ch)) NextCh(it8); - SheetTypePtr = it8 ->SheetType; - while (it8->ch != '\r' && it8 ->ch != '\n' && it8->ch != '\t' && it8 -> ch != -1) { *SheetTypePtr++= (char) it8 ->ch; NextCh(it8); } + } *SheetTypePtr = 0; InSymbol(it8); @@ -1869,6 +2135,12 @@ void CookPointers(LPIT8 it8) for (idField = 0; idField < t -> nSamples; idField++) { + if (t ->DataFormat == NULL) { + SynError(it8, "Undefined DATA_FORMAT"); + return; + + } + Fld = t->DataFormat[idField]; if (!Fld) continue; @@ -1884,6 +2156,7 @@ void CookPointers(LPIT8 it8) char Buffer[256]; strncpy(Buffer, Data, 255); + Buffer[255] = 0; if (strlen(Buffer) <= strlen(Data)) strcpy(Data, Buffer); @@ -1916,7 +2189,7 @@ void CookPointers(LPIT8 it8) LPTABLE Table = it8 ->Tab + k; LPKEYVALUE p; - if (IsAvailableOnList(Table->HeaderList, Label, &p)) { + if (IsAvailableOnList(Table->HeaderList, Label, NULL, &p)) { // Available, keep type and table char Buffer[256]; @@ -1924,7 +2197,7 @@ void CookPointers(LPIT8 it8) char *Type = p ->Value; int nTable = k; - sprintf(Buffer, "%s %d %s", Label, nTable, Type ); + snprintf(Buffer, 255, "%s %d %s", Label, nTable, Type ); SetData(it8, i, idField, Buffer); } @@ -1948,8 +2221,9 @@ void CookPointers(LPIT8 it8) // that should be something like some printable characters plus a \n static -BOOL IsMyBlock(LPBYTE Buffer, size_t n) +int IsMyBlock(LPBYTE Buffer, size_t n) { + int cols = 1, space = 0, quot = 0; size_t i; if (n < 10) return FALSE; // Too small @@ -1959,9 +2233,26 @@ BOOL IsMyBlock(LPBYTE Buffer, size_t n) for (i = 1; i < n; i++) { - if (Buffer[i] == '\n' || Buffer[i] == '\r' || Buffer[i] == '\t') return TRUE; - if (Buffer[i] < 32) return FALSE; - + switch(Buffer[i]) + { + case '\n': + case '\r': + return quot == 1 || cols > 2 ? 0 : cols; + case '\t': + case ' ': + if(!quot && !space) + space = 1; + break; + case '\"': + quot = !quot; + break; + default: + if (Buffer[i] < 32) return 0; + if (Buffer[i] > 127) return 0; + cols += space; + space = 0; + break; + } } return FALSE; @@ -1970,7 +2261,7 @@ BOOL IsMyBlock(LPBYTE Buffer, size_t n) static -BOOL IsMyFile(const char* FileName) +int IsMyFile(const char* FileName) { FILE *fp; size_t Size; @@ -1998,21 +2289,22 @@ LCMSHANDLE LCMSEXPORT cmsIT8LoadFromMem(void *Ptr, size_t len) LCMSHANDLE hIT8; LPIT8 it8; - if (!IsMyBlock((LPBYTE) Ptr, len)) return NULL; + int type = IsMyBlock((LPBYTE) Ptr, len); + if (type == 0) return NULL; hIT8 = cmsIT8Alloc(); if (!hIT8) return NULL; it8 = (LPIT8) hIT8; - it8 ->MemoryBlock = (char*) malloc(len + 1); + it8 ->MemoryBlock = (char*) _cmsMalloc(len + 1); strncpy(it8 ->MemoryBlock, (const char*) Ptr, len); it8 ->MemoryBlock[len] = 0; - strncpy(it8->FileName, "", MAX_PATH-1); + strncpy(it8->FileStack[0]->FileName, "", MAX_PATH-1); it8-> Source = it8 -> MemoryBlock; - if (!ParseIT8(it8)) { + if (!ParseIT8(it8, type-1)) { cmsIT8Free(hIT8); return FALSE; @@ -2021,7 +2313,7 @@ LCMSHANDLE LCMSEXPORT cmsIT8LoadFromMem(void *Ptr, size_t len) CookPointers(it8); it8 ->nTable = 0; - free(it8->MemoryBlock); + _cmsFree(it8->MemoryBlock); it8 -> MemoryBlock = NULL; return hIT8; @@ -2036,26 +2328,28 @@ LCMSHANDLE LCMSEXPORT cmsIT8LoadFromFile(const char* cFileName) LCMSHANDLE hIT8; LPIT8 it8; - if (!IsMyFile(cFileName)) return NULL; + int type = IsMyFile(cFileName); + if (type == 0) return NULL; hIT8 = cmsIT8Alloc(); it8 = (LPIT8) hIT8; if (!hIT8) return NULL; - it8 ->Stream[0] = fopen(cFileName, "rt"); + it8 ->FileStack[0]->Stream = fopen(cFileName, "rt"); - if (!it8 ->Stream[0]) { + if (!it8 ->FileStack[0]->Stream) { cmsIT8Free(hIT8); return NULL; } - strncpy(it8->FileName, cFileName, MAX_PATH-1); + strncpy(it8->FileStack[0]->FileName, cFileName, MAX_PATH-1); + it8->FileStack[0]->FileName[MAX_PATH-1] = 0; - if (!ParseIT8(it8)) { + if (!ParseIT8(it8, type-1)) { - fclose(it8 ->Stream[0]); + fclose(it8 ->FileStack[0]->Stream); cmsIT8Free(hIT8); return NULL; } @@ -2063,7 +2357,7 @@ LCMSHANDLE LCMSEXPORT cmsIT8LoadFromFile(const char* cFileName) CookPointers(it8); it8 ->nTable = 0; - fclose(it8 ->Stream[0]); + fclose(it8 ->FileStack[0]->Stream); return hIT8; } @@ -2078,12 +2372,12 @@ int LCMSEXPORT cmsIT8EnumDataFormat(LCMSHANDLE hIT8, char ***SampleNames) } -int LCMSEXPORT cmsIT8EnumProperties(LCMSHANDLE hIT8, char ***PropertyNames) +int LCMSEXPORT cmsIT8EnumProperties(LCMSHANDLE hIT8, const char ***PropertyNames) { LPIT8 it8 = (LPIT8) hIT8; LPKEYVALUE p; int n; - char **Props; + const char **Props; LPTABLE t = GetTable(it8); // Pass#1 - count properties @@ -2094,7 +2388,7 @@ int LCMSEXPORT cmsIT8EnumProperties(LCMSHANDLE hIT8, char ***PropertyNames) } - Props = (char **) AllocChunk(it8, sizeof(char *) * n); + Props = (const char **) AllocChunk(it8, sizeof(char *) * n); // Pass#2 - Fill pointers n = 0; @@ -2106,6 +2400,41 @@ int LCMSEXPORT cmsIT8EnumProperties(LCMSHANDLE hIT8, char ***PropertyNames) return n; } +int LCMSEXPORT cmsIT8EnumPropertyMulti(LCMSHANDLE hIT8, const char* cProp, const char ***SubpropertyNames) +{ + LPIT8 it8 = (LPIT8) hIT8; + LPKEYVALUE p, tmp; + int n; + const char **Props; + LPTABLE t = GetTable(it8); + + if(!IsAvailableOnList(t->HeaderList, cProp, NULL, &p)) { + *SubpropertyNames = 0; + return 0; + } + + // Pass#1 - count properties + + n = 0; + for (tmp = p; tmp != NULL; tmp = tmp->NextSubkey) { + if(tmp->Subkey != NULL) + n++; + } + + + Props = (const char **) AllocChunk(it8, sizeof(char *) * n); + + // Pass#2 - Fill pointers + n = 0; + for (tmp = p; tmp != NULL; tmp = tmp->NextSubkey) { + if(tmp->Subkey != NULL) + Props[n++] = p ->Subkey; + } + + *SubpropertyNames = Props; + return n; +} + static int LocatePatch(LPIT8 it8, const char* cPatch) { @@ -2201,7 +2530,7 @@ double LCMSEXPORT cmsIT8GetDataRowColDbl(LCMSHANDLE hIT8, int row, int col) } -BOOL LCMSEXPORT cmsIT8SetDataRowCol(LCMSHANDLE hIT8, int row, int col, const char* Val) +LCMSBOOL LCMSEXPORT cmsIT8SetDataRowCol(LCMSHANDLE hIT8, int row, int col, const char* Val) { LPIT8 it8 = (LPIT8) hIT8; @@ -2209,7 +2538,7 @@ BOOL LCMSEXPORT cmsIT8SetDataRowCol(LCMSHANDLE hIT8, int row, int col, const cha } -BOOL LCMSEXPORT cmsIT8SetDataRowColDbl(LCMSHANDLE hIT8, int row, int col, double Val) +LCMSBOOL LCMSEXPORT cmsIT8SetDataRowColDbl(LCMSHANDLE hIT8, int row, int col, double Val) { LPIT8 it8 = (LPIT8) hIT8; char Buff[256]; @@ -2260,7 +2589,7 @@ double LCMSEXPORT cmsIT8GetDataDbl(LCMSHANDLE it8, const char* cPatch, const cha -BOOL LCMSEXPORT cmsIT8SetData(LCMSHANDLE hIT8, const char* cPatch, +LCMSBOOL LCMSEXPORT cmsIT8SetData(LCMSHANDLE hIT8, const char* cPatch, const char* cSample, const char *Val) { @@ -2305,18 +2634,19 @@ BOOL LCMSEXPORT cmsIT8SetData(LCMSHANDLE hIT8, const char* cPatch, } -BOOL LCMSEXPORT cmsIT8SetDataDbl(LCMSHANDLE hIT8, const char* cPatch, +LCMSBOOL LCMSEXPORT cmsIT8SetDataDbl(LCMSHANDLE hIT8, const char* cPatch, const char* cSample, double Val) { LPIT8 it8 = (LPIT8) hIT8; char Buff[256]; - sprintf(Buff, it8->DoubleFormatter, Val); + snprintf(Buff, 255, it8->DoubleFormatter, Val); return cmsIT8SetData(hIT8, cPatch, cSample, Buff); } +// Buffer should get MAXSTR at least const char* LCMSEXPORT cmsIT8GetPatchName(LCMSHANDLE hIT8, int nPatch, char* buffer) { @@ -2327,10 +2657,16 @@ const char* LCMSEXPORT cmsIT8GetPatchName(LCMSHANDLE hIT8, int nPatch, char* buf if (!Data) return NULL; if (!buffer) return Data; - strcpy(buffer, Data); + strncpy(buffer, Data, MAXSTR-1); + buffer[MAXSTR-1] = 0; return buffer; } +int LCMSEXPORT cmsIT8GetPatchByName(LCMSHANDLE hIT8, const char *cPatch) +{ + return LocatePatch((LPIT8)hIT8, cPatch); +} + int LCMSEXPORT cmsIT8TableCount(LCMSHANDLE hIT8) { LPIT8 it8 = (LPIT8) hIT8; @@ -2356,7 +2692,7 @@ int LCMSEXPORT cmsIT8SetTableByLabel(LCMSHANDLE hIT8, const char* cSet, const ch cLabelFld = cmsIT8GetData(hIT8, cSet, cField); if (!cLabelFld) return -1; - if (sscanf(cLabelFld, "%s %d %s", Label, &nTable, Type) != 3) + if (sscanf(cLabelFld, "%255s %d %255s", Label, &nTable, Type) != 3) return -1; if (ExpectedType != NULL && *ExpectedType == 0) @@ -2371,6 +2707,19 @@ int LCMSEXPORT cmsIT8SetTableByLabel(LCMSHANDLE hIT8, const char* cSet, const ch } +LCMSBOOL LCMSEXPORT cmsIT8SetIndexColumn(LCMSHANDLE hIT8, const char* cSample) +{ + LPIT8 it8 = (LPIT8) hIT8; + + int pos = LocateSample(it8, cSample); + if(pos == -1) + return FALSE; + + it8->Tab[it8->nTable].SampleID = pos; + return TRUE; +} + + void LCMSEXPORT cmsIT8DefineDblFormat(LCMSHANDLE hIT8, const char* Formatter) { LPIT8 it8 = (LPIT8) hIT8; @@ -2380,3 +2729,4 @@ void LCMSEXPORT cmsIT8DefineDblFormat(LCMSHANDLE hIT8, const char* Formatter) else strcpy(it8->DoubleFormatter, Formatter); } + diff --git a/jdk/src/share/native/sun/java2d/cmm/lcms/cmscnvrt.c b/jdk/src/share/native/sun/java2d/cmm/lcms/cmscnvrt.c index 81579bc4f11..4d56b3ef465 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmscnvrt.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmscnvrt.c @@ -29,7 +29,7 @@ // // // Little cms -// Copyright (C) 1998-2006 Marti Maria +// Copyright (C) 1998-2007 Marti Maria // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -256,7 +256,7 @@ void ComputeBlackPointCompensationFactors(LPcmsCIEXYZ BlackPointIn, // Return TRUE if both m and of are empy -- "m" being identity and "of" being 0 static -BOOL IdentityParameters(LPWMAT3 m, LPWVEC3 of) +LCMSBOOL IdentityParameters(LPWMAT3 m, LPWVEC3 of) { WVEC3 wv0; @@ -661,3 +661,6 @@ int cmsChooseCnvrt(int Absolute, return rc; } + + + diff --git a/jdk/src/share/native/sun/java2d/cmm/lcms/cmserr.c b/jdk/src/share/native/sun/java2d/cmm/lcms/cmserr.c index 016d0c4c669..a8947d4aee9 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmserr.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmserr.c @@ -29,7 +29,7 @@ // // // Little cms -// Copyright (C) 1998-2006 Marti Maria +// Copyright (C) 1998-2007 Marti Maria // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -57,6 +57,7 @@ // errors. void cdecl cmsSignalError(int ErrorCode, const char *ErrorText, ...); + int LCMSEXPORT cmsErrorAction(int lAbort); void LCMSEXPORT cmsSetErrorHandler(cmsErrorHandlerFunction Fn); @@ -96,7 +97,7 @@ void cmsSignalError(int ErrorCode, const char *ErrorText, ...) char Buffer[1024]; - vsprintf(Buffer, ErrorText, args); + vsnprintf(Buffer, 1023, ErrorText, args); va_end(args); if (UserErrorHandler(ErrorCode, Buffer)) { @@ -118,8 +119,8 @@ void cmsSignalError(int ErrorCode, const char *ErrorText, ...) char Buffer1[1024]; char Buffer2[256]; - sprintf(Buffer1, "Error #%x; ", ErrorCode); - vsprintf(Buffer2, ErrorText, args); + snprintf(Buffer1, 767, "Error #%x; ", ErrorCode); + vsnprintf(Buffer2, 255, ErrorText, args); strcat(Buffer1, Buffer2); MessageBox(NULL, Buffer1, "Little cms", MB_OK|MB_ICONSTOP|MB_TASKMODAL); diff --git a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsgamma.c b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsgamma.c index 1b223c61342..7d134389dff 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsgamma.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsgamma.c @@ -29,7 +29,7 @@ // // // Little cms -// Copyright (C) 1998-2006 Marti Maria +// Copyright (C) 1998-2007 Marti Maria // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -63,9 +63,9 @@ LPGAMMATABLE LCMSEXPORT cmsReverseGamma(int nResultSamples, LPGAMMATABLE InGamma LPGAMMATABLE LCMSEXPORT cmsBuildParametricGamma(int nEntries, int Type, double Params[]); LPGAMMATABLE LCMSEXPORT cmsJoinGamma(LPGAMMATABLE InGamma, LPGAMMATABLE OutGamma); LPGAMMATABLE LCMSEXPORT cmsJoinGammaEx(LPGAMMATABLE InGamma, LPGAMMATABLE OutGamma, int nPoints); -BOOL LCMSEXPORT cmsSmoothGamma(LPGAMMATABLE Tab, double lambda); +LCMSBOOL LCMSEXPORT cmsSmoothGamma(LPGAMMATABLE Tab, double lambda); -BOOL cdecl _cmsSmoothEndpoints(LPWORD Table, int nPoints); +LCMSBOOL cdecl _cmsSmoothEndpoints(LPWORD Table, int nPoints); // Sampled curves @@ -74,7 +74,7 @@ LPSAMPLEDCURVE cdecl cmsAllocSampledCurve(int nItems); void cdecl cmsFreeSampledCurve(LPSAMPLEDCURVE p); void cdecl cmsEndpointsOfSampledCurve(LPSAMPLEDCURVE p, double* Min, double* Max); void cdecl cmsClampSampledCurve(LPSAMPLEDCURVE p, double Min, double Max); -BOOL cdecl cmsSmoothSampledCurve(LPSAMPLEDCURVE Tab, double SmoothingLambda); +LCMSBOOL cdecl cmsSmoothSampledCurve(LPSAMPLEDCURVE Tab, double SmoothingLambda); void cdecl cmsRescaleSampledCurve(LPSAMPLEDCURVE p, double Min, double Max, int nPoints); LPSAMPLEDCURVE cdecl cmsJoinSampledCurves(LPSAMPLEDCURVE X, LPSAMPLEDCURVE Y, int nResultingPoints); @@ -84,7 +84,6 @@ double LCMSEXPORT cmsEstimateGammaEx(LPWORD GammaTable, int nEntries, double The // ---------------------------------------------------------------------------------------- -// #define DEBUG 1 #define MAX_KNOTS 4096 typedef float vec[MAX_KNOTS+1]; @@ -144,14 +143,14 @@ LPGAMMATABLE LCMSEXPORT cmsAllocGamma(int nEntries) LPGAMMATABLE p; size_t size; - if (nEntries > 65530) { - cmsSignalError(LCMS_ERRC_WARNING, "Couldn't create gammatable of more than 65530 entries; 65530 assumed"); - nEntries = 65530; + if (nEntries > 65530 || nEntries <= 0) { + cmsSignalError(LCMS_ERRC_ABORTED, "Couldn't create gammatable of more than 65530 entries"); + return NULL; } size = sizeof(GAMMATABLE) + (sizeof(WORD) * (nEntries-1)); - p = (LPGAMMATABLE) malloc(size); + p = (LPGAMMATABLE) _cmsMalloc(size); if (!p) return NULL; ZeroMemory(p, size); @@ -164,7 +163,7 @@ LPGAMMATABLE LCMSEXPORT cmsAllocGamma(int nEntries) void LCMSEXPORT cmsFreeGamma(LPGAMMATABLE Gamma) { - if (Gamma) free(Gamma); + if (Gamma) _cmsFree(Gamma); } @@ -278,6 +277,15 @@ LPGAMMATABLE LCMSEXPORT cmsReverseGamma(int nResultSamples, LPGAMMATABLE InGamma LPWORD InPtr; LPGAMMATABLE p; + // Try to reverse it analytically whatever possible + if (InGamma -> Seed.Type > 0 && InGamma -> Seed.Type <= 5 && + _cmsCrc32OfGammaTable(InGamma) == InGamma -> Seed.Crc32) { + + return cmsBuildParametricGamma(nResultSamples, -(InGamma -> Seed.Type), InGamma ->Seed.Params); + } + + + // Nope, reverse the table p = cmsAllocGamma(nResultSamples); if (!p) return NULL; @@ -528,7 +536,7 @@ void smooth2(vec w, vec y, vec z, float lambda, int m) // Smooths a curve sampled at regular intervals -BOOL LCMSEXPORT cmsSmoothGamma(LPGAMMATABLE Tab, double lambda) +LCMSBOOL LCMSEXPORT cmsSmoothGamma(LPGAMMATABLE Tab, double lambda) { vec w, y, z; @@ -640,13 +648,13 @@ LPSAMPLEDCURVE cmsAllocSampledCurve(int nItems) { LPSAMPLEDCURVE pOut; - pOut = (LPSAMPLEDCURVE) malloc(sizeof(SAMPLEDCURVE)); + pOut = (LPSAMPLEDCURVE) _cmsMalloc(sizeof(SAMPLEDCURVE)); if (pOut == NULL) return NULL; - if((pOut->Values = (double *) malloc(nItems * sizeof(double))) == NULL) + if((pOut->Values = (double *) _cmsMalloc(nItems * sizeof(double))) == NULL) { - free(pOut); + _cmsFree(pOut); return NULL; } @@ -659,8 +667,8 @@ LPSAMPLEDCURVE cmsAllocSampledCurve(int nItems) void cmsFreeSampledCurve(LPSAMPLEDCURVE p) { - free((LPVOID) p -> Values); - free((LPVOID) p); + _cmsFree((LPVOID) p -> Values); + _cmsFree((LPVOID) p); } @@ -731,7 +739,7 @@ void cmsClampSampledCurve(LPSAMPLEDCURVE p, double Min, double Max) // Smooths a curve sampled at regular intervals -BOOL cmsSmoothSampledCurve(LPSAMPLEDCURVE Tab, double lambda) +LCMSBOOL cmsSmoothSampledCurve(LPSAMPLEDCURVE Tab, double lambda) { vec w, y, z; int i, nItems; @@ -915,14 +923,11 @@ LPSAMPLEDCURVE cmsConvertGammaToSampledCurve(LPGAMMATABLE Gamma, int nPoints) // Smooth endpoints (used in Black/White compensation) -BOOL _cmsSmoothEndpoints(LPWORD Table, int nEntries) +LCMSBOOL _cmsSmoothEndpoints(LPWORD Table, int nEntries) { vec w, y, z; int i, Zeros, Poles; -#ifdef DEBUG - ASAVE(Table, nEntries, "nonsmt.txt"); -#endif if (cmsIsLinear(Table, nEntries)) return FALSE; // Nothing to do diff --git a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsgmt.c b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsgmt.c index 071cb4e4774..90e9181dcdb 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsgmt.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsgmt.c @@ -29,7 +29,7 @@ // // // Little cms -// Copyright (C) 1998-2006 Marti Maria +// Copyright (C) 1998-2007 Marti Maria // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -66,7 +66,7 @@ to use highlights, then it will be lost. */ -BOOL _cmsEndPointsBySpace(icColorSpaceSignature Space, WORD **White, WORD **Black, +LCMSBOOL _cmsEndPointsBySpace(icColorSpaceSignature Space, WORD **White, WORD **Black, int *nOutputs) { // Only most common spaces @@ -376,7 +376,6 @@ double LCMSEXPORT cmsCIE2000DeltaE(LPcmsCIELab Lab1, LPcmsCIELab Lab2, double bs = Lab2 ->b; double Cs = sqrt( Sqr(as) + Sqr(bs) ); - double G = 0.5 * ( 1 - sqrt(pow((C + Cs) / 2 , 7.0) / (pow((C + Cs) / 2, 7.0) + pow(25.0, 7.0) ) )); double a_p = (1 + G ) * a1; @@ -390,15 +389,21 @@ double LCMSEXPORT cmsCIE2000DeltaE(LPcmsCIELab Lab1, LPcmsCIELab Lab2, double C_ps = sqrt(Sqr(a_ps) + Sqr(b_ps)); double h_ps = atan2deg(a_ps, b_ps); - - double meanC_p =(C_p + C_ps) / 2; - double meanh_p = fabs(h_ps-h_p) <= 180 ? (h_ps + h_p)/2 : (h_ps+h_p-360)/2; + double hps_plus_hp = h_ps + h_p; + double hps_minus_hp = h_ps - h_p; + + double meanh_p = fabs(hps_minus_hp) <= 180.000001 ? (hps_plus_hp)/2 : + (hps_plus_hp) < 360 ? (hps_plus_hp + 360)/2 : + (hps_plus_hp - 360)/2; + + double delta_h = (hps_minus_hp) <= -180.000001 ? (hps_minus_hp + 360) : + (hps_minus_hp) > 180 ? (hps_minus_hp - 360) : + (hps_minus_hp); + double delta_L = (Ls - L1); + double delta_C = (C_ps - C_p ); - double delta_h = fabs(h_p - h_ps) <= 180 ? fabs(h_p - h_ps) : 360 - fabs(h_p - h_ps); - double delta_L = fabs(L1 - Ls); - double delta_C = fabs(C_p - C_ps); double delta_H =2 * sqrt(C_ps*C_p) * sin(RADIANES(delta_h) / 2); @@ -1065,7 +1070,7 @@ void SlopeLimiting(WORD Table[], int nEntries) // Check for monotonicity. static -BOOL IsMonotonic(LPGAMMATABLE t) +LCMSBOOL IsMonotonic(LPGAMMATABLE t) { int n = t -> nEntries; int i, last; @@ -1088,7 +1093,7 @@ BOOL IsMonotonic(LPGAMMATABLE t) // Check for endpoints static -BOOL HasProperEndpoints(LPGAMMATABLE t) +LCMSBOOL HasProperEndpoints(LPGAMMATABLE t) { if (t ->GammaTable[0] != 0) return FALSE; if (t ->GammaTable[t ->nEntries-1] != 0xFFFF) return FALSE; @@ -1109,7 +1114,7 @@ void _cmsComputePrelinearizationTablesFromXFORM(cmsHTRANSFORM h[], int nTransfor unsigned int t, i, v; int j; WORD In[MAXCHANNELS], Out[MAXCHANNELS]; - BOOL lIsSuitable; + LCMSBOOL lIsSuitable; _LPcmsTRANSFORM InputXForm = (_LPcmsTRANSFORM) h[0]; _LPcmsTRANSFORM OutputXForm = (_LPcmsTRANSFORM) h[nTransforms-1]; @@ -1126,10 +1131,10 @@ void _cmsComputePrelinearizationTablesFromXFORM(cmsHTRANSFORM h[], int nTransfor } - // Do nothing on all but RGB to RGB transforms + // Do nothing on all but Gray/RGB to Gray/RGB transforms - if ((InputXForm ->EntryColorSpace != icSigRgbData) || - (OutputXForm->ExitColorSpace != icSigRgbData)) return; + if (((InputXForm ->EntryColorSpace != icSigRgbData) && (InputXForm ->EntryColorSpace != icSigGrayData)) || + ((OutputXForm->ExitColorSpace != icSigRgbData) && (OutputXForm->ExitColorSpace != icSigGrayData))) return; for (t = 0; t < Grid -> InputChan; t++) @@ -1169,10 +1174,13 @@ void _cmsComputePrelinearizationTablesFromXFORM(cmsHTRANSFORM h[], int nTransfor if (!HasProperEndpoints(Trans[t])) lIsSuitable = FALSE; + /* // Exclude if transfer function is not smooth enough // to be modelled as a gamma function, or the gamma is reversed + if (cmsEstimateGamma(Trans[t]) < 1.0) lIsSuitable = FALSE; + */ } diff --git a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsintrp.c b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsintrp.c index 059f23d0104..43432f37e9b 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsintrp.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsintrp.c @@ -29,7 +29,7 @@ // // // Little cms -// Copyright (C) 1998-2006 Marti Maria +// Copyright (C) 1998-2007 Marti Maria // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -282,7 +282,7 @@ void Eval8Inputs(WORD StageABC[], WORD StageLMN[], WORD LutTable[], LPL16PARAMS // Fills optimization parameters void cmsCalcCLUT16ParamsEx(int nSamples, int InputChan, int OutputChan, - BOOL lUseTetrahedral, LPL16PARAMS p) + LCMSBOOL lUseTetrahedral, LPL16PARAMS p) { int clutPoints; @@ -579,7 +579,7 @@ WORD cmsReverseLinearInterpLUT16(WORD Value, WORD LutTable[], LPL16PARAMS p) // Identify if value fall downto 0 or FFFF zone if (Value == 0) return 0; - if (Value == 0xFFFF) return 0xFFFF; + // if (Value == 0xFFFF) return 0xFFFF; // else restrict to valid zone @@ -631,7 +631,7 @@ WORD cmsReverseLinearInterpLUT16(WORD Value, WORD LutTable[], LPL16PARAMS p) a = (y1 - y0) / (x1 - x0); b = y0 - a * x0; - if (a == 0) return (WORD) x; + if (fabs(a) < 0.01) return (WORD) x; f = ((Value - b) / a); @@ -763,7 +763,7 @@ void cmsTrilinearInterp16(WORD Input[], WORD Output[], X0 = p -> opta3 * x0; X1 = X0 + (Input[0] == 0xFFFFU ? 0 : p->opta3); - Y0 = p -> opta2 * y0; + Y0 = p -> opta2 * y0; Y1 = Y0 + (Input[1] == 0xFFFFU ? 0 : p->opta2); Z0 = p -> opta1 * z0; @@ -942,7 +942,7 @@ void cmsTetrahedralInterp16(WORD Input[], X0 = p -> opta3 * x0; X1 = X0 + (Input[0] == 0xFFFFU ? 0 : p->opta3); - Y0 = p -> opta2 * y0; + Y0 = p -> opta2 * y0; Y1 = Y0 + (Input[1] == 0xFFFFU ? 0 : p->opta2); Z0 = p -> opta1 * z0; @@ -1009,11 +1009,11 @@ void cmsTetrahedralInterp16(WORD Input[], Rest = c1 * rx + c2 * ry + c3 * rz; - // There is a lot of math hidden in this expression. The rest is in fixed domain - // and the result in 0..ffff domain. So the complete expression should be - // ROUND_FIXED_TO_INT(ToFixedDomain(Rest)) But that can be optimized as (Rest + 0x7FFF) / 0xFFFF + // There is a lot of math hidden in this expression. The rest is in fixed domain + // and the result in 0..ffff domain. So the complete expression should be + // ROUND_FIXED_TO_INT(ToFixedDomain(Rest)) But that can be optimized as (Rest + 0x7FFF) / 0xFFFF - Output[OutChan] = (WORD) (c0 + ((Rest + 0x7FFF) / 0xFFFF)); + Output[OutChan] = (WORD) (c0 + ((Rest + 0x7FFF) / 0xFFFF)); } @@ -1131,3 +1131,4 @@ void cmsTetrahedralInterp8(WORD Input[], } #undef DENS + diff --git a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsio0.c b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsio0.c index d09100d653a..602a3eb943b 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsio0.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsio0.c @@ -29,7 +29,7 @@ // // // Little cms -// Copyright (C) 1998-2006 Marti Maria +// Copyright (C) 1998-2007 Marti Maria // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -62,7 +62,7 @@ typedef struct { LPBYTE Block; // Points to allocated memory size_t Size; // Size of allocated memory - int Pointer; // Points to current location + size_t Pointer; // Points to current location int FreeBlockOnClose; // As title } FILEMEM; @@ -70,18 +70,19 @@ typedef struct { static LPVOID MemoryOpen(LPBYTE Block, size_t Size, char Mode) { - FILEMEM* fm = (FILEMEM*) malloc(sizeof(FILEMEM)); + FILEMEM* fm = (FILEMEM*) _cmsMalloc(sizeof(FILEMEM)); + if (fm == NULL) return NULL; + ZeroMemory(fm, sizeof(FILEMEM)); if (Mode == 'r') { - fm ->Block = (LPBYTE) malloc(Size); + fm ->Block = (LPBYTE) _cmsMalloc(Size); if (fm ->Block == NULL) { - free(fm); + _cmsFree(fm); return NULL; } - CopyMemory(fm->Block, Block, Size); fm ->FreeBlockOnClose = TRUE; } @@ -103,13 +104,27 @@ size_t MemoryRead(LPVOID buffer, size_t size, size_t count, struct _lcms_iccprof FILEMEM* ResData = (FILEMEM*) Icc ->stream; LPBYTE Ptr; size_t len = size * count; + size_t extent = ResData -> Pointer + len; + if (len == 0) { + return 0; + } - if (ResData -> Pointer + len > ResData -> Size){ + if (len / size != count) { + cmsSignalError(LCMS_ERRC_ABORTED, "Read from memory error. Integer overflow with count / size."); + return 0; + } + + if (extent < len || extent < ResData -> Pointer) { + cmsSignalError(LCMS_ERRC_ABORTED, "Read from memory error. Integer overflow with len."); + return 0; + } + + if (ResData -> Pointer + len > ResData -> Size) { len = (ResData -> Size - ResData -> Pointer); - cmsSignalError(LCMS_ERRC_WARNING, "Read from memory error. Got %d bytes, block should be of %d bytes", len * size, count * size); - + cmsSignalError(LCMS_ERRC_ABORTED, "Read from memory error. Got %d bytes, block should be of %d bytes", len * size, count * size); + return 0; } Ptr = ResData -> Block; @@ -123,7 +138,7 @@ size_t MemoryRead(LPVOID buffer, size_t size, size_t count, struct _lcms_iccprof // SEEK_CUR is assumed static -BOOL MemorySeek(struct _lcms_iccprofile_struct* Icc, size_t offset) +LCMSBOOL MemorySeek(struct _lcms_iccprofile_struct* Icc, size_t offset) { FILEMEM* ResData = (FILEMEM*) Icc ->stream; @@ -147,10 +162,10 @@ size_t MemoryTell(struct _lcms_iccprofile_struct* Icc) } -// Writes data to memory, also keeps used space for further reference +// Writes data to memory, also keeps used space for further reference. NO CHECK IS PERFORMED static -BOOL MemoryWrite(struct _lcms_iccprofile_struct* Icc, size_t size, void *Ptr) +LCMSBOOL MemoryWrite(struct _lcms_iccprofile_struct* Icc, size_t size, void *Ptr) { FILEMEM* ResData = (FILEMEM*) Icc ->stream; @@ -167,11 +182,17 @@ BOOL MemoryWrite(struct _lcms_iccprofile_struct* Icc, size_t size, void *Ptr) static -BOOL MemoryGrow(struct _lcms_iccprofile_struct* Icc, size_t size) +LCMSBOOL MemoryGrow(struct _lcms_iccprofile_struct* Icc, size_t size) { FILEMEM* ResData = (FILEMEM*) Icc->stream; - void* newBlock = realloc(ResData->Block, ResData->Size + size); + void* newBlock = NULL; + + /* Follow same policies as functions in lcms.h */ + if (ResData->Size + size < 0) return NULL; + if (ResData->Size + size > (size_t)1024*1024*500))) return NULL; + + newBlock = realloc(ResData->Block, ResData->Size + size); if (!newBlock) { return FALSE; @@ -183,15 +204,15 @@ BOOL MemoryGrow(struct _lcms_iccprofile_struct* Icc, size_t size) static -BOOL MemoryClose(struct _lcms_iccprofile_struct* Icc) +LCMSBOOL MemoryClose(struct _lcms_iccprofile_struct* Icc) { FILEMEM* ResData = (FILEMEM*) Icc ->stream; if (ResData ->FreeBlockOnClose) { - if (ResData ->Block) free(ResData ->Block); + if (ResData ->Block) _cmsFree(ResData ->Block); } - free(ResData); + _cmsFree(ResData); return 0; } @@ -209,7 +230,7 @@ size_t FileRead(void *buffer, size_t size, size_t count, struct _lcms_iccprofile { size_t nReaded = fread(buffer, size, count, (FILE*) Icc->stream); if (nReaded != count) { - cmsSignalError(LCMS_ERRC_WARNING, "Read error. Got %d bytes, block should be of %d bytes", nReaded * size, count * size); + cmsSignalError(LCMS_ERRC_ABORTED, "Read error. Got %d bytes, block should be of %d bytes", nReaded * size, count * size); return 0; } @@ -218,7 +239,7 @@ size_t FileRead(void *buffer, size_t size, size_t count, struct _lcms_iccprofile static -BOOL FileSeek(struct _lcms_iccprofile_struct* Icc, size_t offset) +LCMSBOOL FileSeek(struct _lcms_iccprofile_struct* Icc, size_t offset) { if (fseek((FILE*) Icc ->stream, (long) offset, SEEK_SET) != 0) { @@ -240,7 +261,7 @@ size_t FileTell(struct _lcms_iccprofile_struct* Icc) static -BOOL FileWrite(struct _lcms_iccprofile_struct* Icc, size_t size, LPVOID Ptr) +LCMSBOOL FileWrite(struct _lcms_iccprofile_struct* Icc, size_t size, LPVOID Ptr) { if (size == 0) return TRUE; @@ -256,14 +277,14 @@ BOOL FileWrite(struct _lcms_iccprofile_struct* Icc, size_t size, LPVOID Ptr) static -BOOL FileGrow(struct _lcms_iccprofile_struct* Icc, size_t size) +LCMSBOOL FileGrow(struct _lcms_iccprofile_struct* Icc, size_t size) { return TRUE; } static -BOOL FileClose(struct _lcms_iccprofile_struct* Icc) +LCMSBOOL FileClose(struct _lcms_iccprofile_struct* Icc) { return fclose((FILE*) Icc ->stream); } @@ -276,7 +297,7 @@ BOOL FileClose(struct _lcms_iccprofile_struct* Icc) cmsHPROFILE _cmsCreateProfilePlaceholder(void) { - LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) malloc(sizeof(LCMSICCPROFILE)); + LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) _cmsMalloc(sizeof(LCMSICCPROFILE)); if (Icc == NULL) return NULL; // Empty values @@ -314,7 +335,7 @@ icTagSignature LCMSEXPORT cmsGetTagSignature(cmsHPROFILE hProfile, icInt32Number // Search for a specific tag in tag dictionary // Returns position or -1 if tag not found -icInt32Number _cmsSearchTag(LPLCMSICCPROFILE Profile, icTagSignature sig, BOOL lSignalError) +icInt32Number _cmsSearchTag(LPLCMSICCPROFILE Profile, icTagSignature sig, LCMSBOOL lSignalError) { icInt32Number i; @@ -335,7 +356,7 @@ icInt32Number _cmsSearchTag(LPLCMSICCPROFILE Profile, icTagSignature sig, BOOL l // Check existance -BOOL LCMSEXPORT cmsIsTag(cmsHPROFILE hProfile, icTagSignature sig) +LCMSBOOL LCMSEXPORT cmsIsTag(cmsHPROFILE hProfile, icTagSignature sig) { LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile; return _cmsSearchTag(Icc, sig, FALSE) >= 0; @@ -354,7 +375,7 @@ LPVOID _cmsInitTag(LPLCMSICCPROFILE Icc, icTagSignature sig, size_t size, const if (i >=0) { - if (Icc -> TagPtrs[i]) free(Icc -> TagPtrs[i]); + if (Icc -> TagPtrs[i]) _cmsFree(Icc -> TagPtrs[i]); } else { @@ -365,11 +386,14 @@ LPVOID _cmsInitTag(LPLCMSICCPROFILE Icc, icTagSignature sig, size_t size, const cmsSignalError(LCMS_ERRC_ABORTED, "Too many tags (%d)", MAX_TABLE_TAG); Icc ->TagCount = MAX_TABLE_TAG-1; + return NULL; } } - Ptr = malloc(size); + Ptr = _cmsMalloc(size); + if (Ptr == NULL) return NULL; + CopyMemory(Ptr, Init, size); Icc ->TagNames[i] = sig; @@ -400,6 +424,8 @@ LPLCMSICCPROFILE _cmsCreateProfileFromFilePlaceholder(const char* FileName) if (NewIcc == NULL) return NULL; strncpy(NewIcc -> PhysicalFile, FileName, MAX_PATH-1); + NewIcc -> PhysicalFile[MAX_PATH-1] = 0; + NewIcc ->stream = ICCfile; NewIcc ->Read = FileRead; @@ -502,7 +528,7 @@ void _cmsSetSaveToMemory(LPLCMSICCPROFILE Icc, LPVOID MemPtr, size_t dwSize) -BOOL LCMSEXPORT cmsTakeMediaWhitePoint(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile) +LCMSBOOL LCMSEXPORT cmsTakeMediaWhitePoint(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile) { LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) hProfile; *Dest = Icc -> MediaWhitePoint; @@ -510,14 +536,14 @@ BOOL LCMSEXPORT cmsTakeMediaWhitePoint(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile) } -BOOL LCMSEXPORT cmsTakeMediaBlackPoint(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile) +LCMSBOOL LCMSEXPORT cmsTakeMediaBlackPoint(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile) { LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) hProfile; *Dest = Icc -> MediaBlackPoint; return TRUE; } -BOOL LCMSEXPORT cmsTakeIluminant(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile) +LCMSBOOL LCMSEXPORT cmsTakeIluminant(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile) { LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) hProfile; *Dest = Icc -> Illuminant; @@ -575,7 +601,7 @@ void LCMSEXPORT cmsSetProfileID(cmsHPROFILE hProfile, LPBYTE ProfileID) } -BOOL LCMSEXPORT cmsTakeCreationDateTime(struct tm *Dest, cmsHPROFILE hProfile) +LCMSBOOL LCMSEXPORT cmsTakeCreationDateTime(struct tm *Dest, cmsHPROFILE hProfile) { LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile; CopyMemory(Dest, &Icc ->Created, sizeof(struct tm)); @@ -596,23 +622,18 @@ void LCMSEXPORT cmsSetPCS(cmsHPROFILE hProfile, icColorSpaceSignature pcs) Icc -> PCS = pcs; } - - icColorSpaceSignature LCMSEXPORT cmsGetColorSpace(cmsHPROFILE hProfile) { LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) hProfile; return Icc -> ColorSpace; } - - void LCMSEXPORT cmsSetColorSpace(cmsHPROFILE hProfile, icColorSpaceSignature sig) { LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) hProfile; Icc -> ColorSpace = sig; } - icProfileClassSignature LCMSEXPORT cmsGetDeviceClass(cmsHPROFILE hProfile) { LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) hProfile; @@ -625,7 +646,6 @@ DWORD LCMSEXPORT cmsGetProfileICCversion(cmsHPROFILE hProfile) return (DWORD) Icc -> Version; } - void LCMSEXPORT cmsSetProfileICCversion(cmsHPROFILE hProfile, DWORD Version) { LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) hProfile; @@ -664,7 +684,7 @@ LPVOID DupBlock(LPLCMSICCPROFILE Icc, LPVOID Block, size_t size) // This is tricky, since LUT structs does have pointers -BOOL LCMSEXPORT _cmsAddLUTTag(cmsHPROFILE hProfile, icTagSignature sig, const void* lut) +LCMSBOOL LCMSEXPORT _cmsAddLUTTag(cmsHPROFILE hProfile, icTagSignature sig, const void* lut) { LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile; LPLUT Orig, Stored; @@ -692,7 +712,7 @@ BOOL LCMSEXPORT _cmsAddLUTTag(cmsHPROFILE hProfile, icTagSignature sig, const vo } -BOOL LCMSEXPORT _cmsAddXYZTag(cmsHPROFILE hProfile, icTagSignature sig, const cmsCIEXYZ* XYZ) +LCMSBOOL LCMSEXPORT _cmsAddXYZTag(cmsHPROFILE hProfile, icTagSignature sig, const cmsCIEXYZ* XYZ) { LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile; @@ -701,7 +721,7 @@ BOOL LCMSEXPORT _cmsAddXYZTag(cmsHPROFILE hProfile, icTagSignature sig, const cm } -BOOL LCMSEXPORT _cmsAddTextTag(cmsHPROFILE hProfile, icTagSignature sig, const char* Text) +LCMSBOOL LCMSEXPORT _cmsAddTextTag(cmsHPROFILE hProfile, icTagSignature sig, const char* Text) { LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile; @@ -709,7 +729,7 @@ BOOL LCMSEXPORT _cmsAddTextTag(cmsHPROFILE hProfile, icTagSignature sig, const c return TRUE; } -BOOL LCMSEXPORT _cmsAddGammaTag(cmsHPROFILE hProfile, icTagSignature sig, LPGAMMATABLE TransferFunction) +LCMSBOOL LCMSEXPORT _cmsAddGammaTag(cmsHPROFILE hProfile, icTagSignature sig, LPGAMMATABLE TransferFunction) { LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile; @@ -718,7 +738,7 @@ BOOL LCMSEXPORT _cmsAddGammaTag(cmsHPROFILE hProfile, icTagSignature sig, LPGAMM } -BOOL LCMSEXPORT _cmsAddChromaticityTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsCIExyYTRIPLE Chrm) +LCMSBOOL LCMSEXPORT _cmsAddChromaticityTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsCIExyYTRIPLE Chrm) { LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile; @@ -727,7 +747,7 @@ BOOL LCMSEXPORT _cmsAddChromaticityTag(cmsHPROFILE hProfile, icTagSignature sig, } -BOOL LCMSEXPORT _cmsAddSequenceDescriptionTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsSEQ pseq) +LCMSBOOL LCMSEXPORT _cmsAddSequenceDescriptionTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsSEQ pseq) { LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile; @@ -737,28 +757,40 @@ BOOL LCMSEXPORT _cmsAddSequenceDescriptionTag(cmsHPROFILE hProfile, icTagSignatu } -BOOL LCMSEXPORT _cmsAddNamedColorTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsNAMEDCOLORLIST nc) +LCMSBOOL LCMSEXPORT _cmsAddNamedColorTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsNAMEDCOLORLIST nc) { LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile; _cmsInitTag(Icc, sig, sizeof(cmsNAMEDCOLORLIST) + (nc ->nColors - 1) * sizeof(cmsNAMEDCOLOR), nc); - return FALSE; + return TRUE; } -BOOL LCMSEXPORT _cmsAddDateTimeTag(cmsHPROFILE hProfile, icTagSignature sig, struct tm *DateTime) +LCMSBOOL LCMSEXPORT _cmsAddDateTimeTag(cmsHPROFILE hProfile, icTagSignature sig, struct tm *DateTime) { LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile; _cmsInitTag(Icc, sig, sizeof(struct tm), DateTime); - return FALSE; + return TRUE; } -BOOL LCMSEXPORT _cmsAddColorantTableTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsNAMEDCOLORLIST nc) +LCMSBOOL LCMSEXPORT _cmsAddColorantTableTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsNAMEDCOLORLIST nc) { LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile; _cmsInitTag(Icc, sig, sizeof(cmsNAMEDCOLORLIST) + (nc ->nColors - 1) * sizeof(cmsNAMEDCOLOR), nc); - return FALSE; + return TRUE; } + + +LCMSBOOL LCMSEXPORT _cmsAddChromaticAdaptationTag(cmsHPROFILE hProfile, icTagSignature sig, const cmsCIEXYZ* mat) +{ + LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile; + + _cmsInitTag(Icc, sig, 3*sizeof(cmsCIEXYZ), mat); + return TRUE; + +} + + diff --git a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsio1.c b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsio1.c index 77419f809f3..16aec6c5362 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsio1.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsio1.c @@ -29,7 +29,7 @@ // // // Little cms -// Copyright (C) 1998-2006 Marti Maria +// Copyright (C) 1998-2007 Marti Maria // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -149,6 +149,7 @@ void AdjustEndianessArray16(LPWORD p, size_t num_words) #endif + // Transports to properly encoded values - note that icc profiles does use // big endian notation. @@ -216,7 +217,8 @@ icTagTypeSignature ReadBase(LPLCMSICCPROFILE Icc) { icTagBase Base; - Icc -> Read(&Base, sizeof(icTagBase), 1, Icc); + if (Icc -> Read(&Base, sizeof(icTagBase), 1, Icc) != 1) + return (icTagTypeSignature) 0; AdjustEndianess32((LPBYTE) &Base.sig); return Base.sig; @@ -288,13 +290,15 @@ void EvalCHRM(LPcmsCIEXYZ Dest, LPMAT3 Chrm, LPcmsCIEXYZ Src) // Read profile header and validate it static -LPLCMSICCPROFILE ReadHeader(LPLCMSICCPROFILE Icc, BOOL lIsFromMemory) +LPLCMSICCPROFILE ReadHeader(LPLCMSICCPROFILE Icc, LCMSBOOL lIsFromMemory) { icTag Tag; icHeader Header; icInt32Number TagCount, i; + icUInt32Number extent; - Icc -> Read(&Header, sizeof(icHeader), 1, Icc); + if (Icc -> Read(&Header, sizeof(icHeader), 1, Icc) != 1) + goto ErrorCleanup; // Convert endian @@ -306,14 +310,13 @@ LPLCMSICCPROFILE ReadHeader(LPLCMSICCPROFILE Icc, BOOL lIsFromMemory) AdjustEndianess32((LPBYTE) &Header.pcs); AdjustEndianess32((LPBYTE) &Header.magic); AdjustEndianess32((LPBYTE) &Header.flags); - AdjustEndianess32((LPBYTE) &Header.attributes[0]); + AdjustEndianess32((LPBYTE) &Header.attributes[0]); AdjustEndianess32((LPBYTE) &Header.renderingIntent); // Validate it if (Header.magic != icMagicNumber) goto ErrorCleanup; - if (Icc ->Read(&TagCount, sizeof(icInt32Number), 1, Icc) != 1) goto ErrorCleanup; @@ -324,7 +327,7 @@ LPLCMSICCPROFILE ReadHeader(LPLCMSICCPROFILE Icc, BOOL lIsFromMemory) Icc -> PCS = Header.pcs; Icc -> RenderingIntent = (icRenderingIntent) Header.renderingIntent; Icc -> flags = Header.flags; - Icc -> attributes = Header.attributes[0]; + Icc -> attributes = Header.attributes[0]; Icc -> Illuminant.X = Convert15Fixed16(Header.illuminant.X); Icc -> Illuminant.Y = Convert15Fixed16(Header.illuminant.Y); Icc -> Illuminant.Z = Convert15Fixed16(Header.illuminant.Z); @@ -348,7 +351,7 @@ LPLCMSICCPROFILE ReadHeader(LPLCMSICCPROFILE Icc, BOOL lIsFromMemory) // Read tag directory - if (TagCount > MAX_TABLE_TAG) { + if (TagCount > MAX_TABLE_TAG || TagCount < 0) { cmsSignalError(LCMS_ERRC_ABORTED, "Too many tags (%d)", TagCount); goto ErrorCleanup; @@ -357,12 +360,18 @@ LPLCMSICCPROFILE ReadHeader(LPLCMSICCPROFILE Icc, BOOL lIsFromMemory) Icc -> TagCount = TagCount; for (i=0; i < TagCount; i++) { - Icc ->Read(&Tag, sizeof(icTag), 1, Icc); + if (Icc ->Read(&Tag, sizeof(icTag), 1, Icc) != 1) + goto ErrorCleanup; AdjustEndianess32((LPBYTE) &Tag.offset); AdjustEndianess32((LPBYTE) &Tag.size); AdjustEndianess32((LPBYTE) &Tag.sig); // Signature + // Perform some sanity check. Offset + size should fall inside file. + extent = Tag.offset + Tag.size; + if (extent > Header.size || extent < Tag.offset) + goto ErrorCleanup; + Icc -> TagNames[i] = Tag.sig; Icc -> TagOffsets[i] = Tag.offset; Icc -> TagSizes[i] = Tag.size; @@ -381,13 +390,10 @@ ErrorCleanup: cmsSignalError(LCMS_ERRC_ABORTED, "Corrupted profile: '%s'", Icc->PhysicalFile); - free(Icc); + _cmsFree(Icc); return NULL; } - - - static unsigned int uipow(unsigned int a, unsigned int b) { unsigned int rv = 1; @@ -497,7 +503,7 @@ void FixLUT8bothSides(LPLUT Lut, size_t nTabSize) // The infamous LUT 8 static -void ReadLUT8(LPLCMSICCPROFILE Icc, LPLUT NewLUT, icTagSignature sig) +LCMSBOOL ReadLUT8(LPLCMSICCPROFILE Icc, LPLUT NewLUT, icTagSignature sig) { icLut8 LUT8; LPBYTE Temp; @@ -506,7 +512,7 @@ void ReadLUT8(LPLCMSICCPROFILE Icc, LPLUT NewLUT, icTagSignature sig) unsigned int AllLinear; LPWORD PtrW; - Icc ->Read(&LUT8, sizeof(icLut8) - SIZEOF_UINT8_ALIGNED, 1, Icc); + if (Icc ->Read(&LUT8, sizeof(icLut8) - SIZEOF_UINT8_ALIGNED, 1, Icc) != 1) return FALSE; NewLUT -> wFlags = LUT_HASTL1|LUT_HASTL2|LUT_HAS3DGRID; NewLUT -> cLutPoints = LUT8.clutPoints; @@ -515,6 +521,10 @@ void ReadLUT8(LPLCMSICCPROFILE Icc, LPLUT NewLUT, icTagSignature sig) NewLUT -> InputEntries = 256; NewLUT -> OutputEntries = 256; + // Do some checking + if (!_cmsValidateLUT(NewLUT)) { + return FALSE; + } AdjustEndianess32((LPBYTE) &LUT8.e00); AdjustEndianess32((LPBYTE) &LUT8.e01); @@ -550,13 +560,24 @@ void ReadLUT8(LPLCMSICCPROFILE Icc, LPLUT NewLUT, icTagSignature sig) // Copy input tables - Temp = (LPBYTE) malloc(256); + Temp = (LPBYTE) _cmsMalloc(256); + if (Temp == NULL) return FALSE; + AllLinear = 0; for (i=0; i < NewLUT -> InputChan; i++) { - PtrW = (LPWORD) malloc(sizeof(WORD) * 256); + PtrW = (LPWORD) _cmsMalloc(sizeof(WORD) * 256); + if (PtrW == NULL) { + _cmsFree(Temp); + return FALSE; + } + NewLUT -> L1[i] = PtrW; - Icc ->Read(Temp, 1, 256, Icc); + if (Icc ->Read(Temp, 1, 256, Icc) != 256) { + _cmsFree(Temp); + return FALSE; + } + for (j=0; j < 256; j++) PtrW[j] = TO16_TAB(Temp[j]); AllLinear += cmsIsLinear(NewLUT -> L1[i], NewLUT -> InputEntries); @@ -569,7 +590,7 @@ void ReadLUT8(LPLCMSICCPROFILE Icc, LPLUT NewLUT, icTagSignature sig) NewLUT -> wFlags &= ~LUT_HASTL1; } - free(Temp); + _cmsFree(Temp); // Copy 3D CLUT @@ -578,9 +599,20 @@ void ReadLUT8(LPLCMSICCPROFILE Icc, LPLUT NewLUT, icTagSignature sig) if (nTabSize > 0) { - PtrW = (LPWORD) malloc(sizeof(WORD) * nTabSize); - Temp = (LPBYTE) malloc(nTabSize); - Icc ->Read(Temp, 1, nTabSize, Icc); + PtrW = (LPWORD) _cmsCalloc(sizeof(WORD), nTabSize); + if (PtrW == NULL) return FALSE; + + Temp = (LPBYTE) _cmsMalloc(nTabSize); + if (Temp == NULL) { + _cmsFree(PtrW); + return FALSE; + } + + if (Icc ->Read(Temp, 1, nTabSize, Icc) != nTabSize) { + _cmsFree(Temp); + _cmsFree(PtrW); + return FALSE; + } NewLUT -> T = PtrW; NewLUT -> Tsize = (unsigned int) (nTabSize * sizeof(WORD)); @@ -589,25 +621,37 @@ void ReadLUT8(LPLCMSICCPROFILE Icc, LPLUT NewLUT, icTagSignature sig) *PtrW++ = TO16_TAB(Temp[i]); } - free(Temp); + _cmsFree(Temp); } else { NewLUT ->T = NULL; NewLUT ->Tsize = 0; - NewLUT -> wFlags &= ~LUT_HAS3DGRID; + NewLUT ->wFlags &= ~LUT_HAS3DGRID; } - // Copy output tables - Temp = (LPBYTE) malloc(256); + Temp = (LPBYTE) _cmsMalloc(256); + if (Temp == NULL) { + return FALSE; + } + AllLinear = 0; for (i=0; i < NewLUT -> OutputChan; i++) { - PtrW = (LPWORD) malloc(sizeof(WORD) * 256); + PtrW = (LPWORD) _cmsMalloc(sizeof(WORD) * 256); + if (PtrW == NULL) { + _cmsFree(Temp); + return FALSE; + } + NewLUT -> L2[i] = PtrW; - Icc ->Read(Temp, 1, 256, Icc); + if (Icc ->Read(Temp, 1, 256, Icc) != 256) { + _cmsFree(Temp); + return FALSE; + } + for (j=0; j < 256; j++) PtrW[j] = TO16_TAB(Temp[j]); AllLinear += cmsIsLinear(NewLUT -> L2[i], 256); @@ -621,7 +665,7 @@ void ReadLUT8(LPLCMSICCPROFILE Icc, LPLUT NewLUT, icTagSignature sig) } - free(Temp); + _cmsFree(Temp); cmsCalcL16Params(NewLUT -> InputEntries, &NewLUT -> In16params); cmsCalcL16Params(NewLUT -> OutputEntries, &NewLUT -> Out16params); @@ -646,6 +690,15 @@ void ReadLUT8(LPLCMSICCPROFILE Icc, LPLUT NewLUT, icTagSignature sig) // some profiles does claim to do that. Poor lcms will try // to detect such condition and fix up "on the fly". + switch (sig) { + + case icSigBToA0Tag: + case icSigBToA1Tag: + case icSigBToA2Tag: + case icSigGamutTag: + case icSigPreview0Tag: + case icSigPreview1Tag: + case icSigPreview2Tag: { LPWORD WhiteLab, ExpectedWhite; WORD WhiteFixed[MAXCHANNELS], WhiteUnfixed[MAXCHANNELS]; @@ -685,9 +738,13 @@ void ReadLUT8(LPLCMSICCPROFILE Icc, LPLUT NewLUT, icTagSignature sig) } } + break; + default:; + } } + return TRUE; } @@ -696,7 +753,7 @@ void ReadLUT8(LPLCMSICCPROFILE Icc, LPLUT NewLUT, icTagSignature sig) // Case LUT 16 static -void ReadLUT16(LPLCMSICCPROFILE Icc, LPLUT NewLUT) +LCMSBOOL ReadLUT16(LPLCMSICCPROFILE Icc, LPLUT NewLUT) { icLut16 LUT16; size_t nTabSize; @@ -705,7 +762,8 @@ void ReadLUT16(LPLCMSICCPROFILE Icc, LPLUT NewLUT) LPWORD PtrW; - Icc ->Read(&LUT16, sizeof(icLut16)- SIZEOF_UINT16_ALIGNED, 1, Icc); + if (Icc ->Read(&LUT16, sizeof(icLut16)- SIZEOF_UINT16_ALIGNED, 1, Icc) != 1) + return FALSE; NewLUT -> wFlags = LUT_HASTL1 | LUT_HASTL2 | LUT_HAS3DGRID; NewLUT -> cLutPoints = LUT16.clutPoints; @@ -718,6 +776,9 @@ void ReadLUT16(LPLCMSICCPROFILE Icc, LPLUT NewLUT) NewLUT -> InputEntries = LUT16.inputEnt; NewLUT -> OutputEntries = LUT16.outputEnt; + if (!_cmsValidateLUT(NewLUT)) { + return FALSE; + } // Matrix handling @@ -754,9 +815,14 @@ void ReadLUT16(LPLCMSICCPROFILE Icc, LPLUT NewLUT) AllLinear = 0; for (i=0; i < NewLUT -> InputChan; i++) { - PtrW = (LPWORD) malloc(sizeof(WORD) * NewLUT -> InputEntries); + PtrW = (LPWORD) _cmsMalloc(sizeof(WORD) * NewLUT -> InputEntries); + if (PtrW == NULL) return FALSE; + NewLUT -> L1[i] = PtrW; - Icc ->Read(PtrW, sizeof(WORD), NewLUT -> InputEntries, Icc); + if (Icc ->Read(PtrW, sizeof(WORD), NewLUT -> InputEntries, Icc) != NewLUT -> InputEntries) { + return FALSE; + } + AdjustEndianessArray16(PtrW, NewLUT -> InputEntries); AllLinear += cmsIsLinear(NewLUT -> L1[i], NewLUT -> InputEntries); } @@ -775,12 +841,17 @@ void ReadLUT16(LPLCMSICCPROFILE Icc, LPLUT NewLUT) NewLUT->InputChan)); if (nTabSize > 0) { - PtrW = (LPWORD) malloc(sizeof(WORD) * nTabSize); + PtrW = (LPWORD) _cmsCalloc(sizeof(WORD), nTabSize); + if (PtrW == NULL) + return FALSE; NewLUT -> T = PtrW; NewLUT -> Tsize = (unsigned int) (nTabSize * sizeof(WORD)); - Icc -> Read(PtrW, sizeof(WORD), nTabSize, Icc); + if (Icc -> Read(PtrW, sizeof(WORD), nTabSize, Icc) != nTabSize) { + return FALSE; + } + AdjustEndianessArray16(NewLUT -> T, nTabSize); } else { @@ -794,9 +865,16 @@ void ReadLUT16(LPLCMSICCPROFILE Icc, LPLUT NewLUT) AllLinear = 0; for (i=0; i < NewLUT -> OutputChan; i++) { - PtrW = (LPWORD) malloc(sizeof(WORD) * NewLUT -> OutputEntries); + PtrW = (LPWORD) _cmsMalloc(sizeof(WORD) * NewLUT -> OutputEntries); + if (PtrW == NULL) { + return FALSE; + } + NewLUT -> L2[i] = PtrW; - Icc ->Read(PtrW, sizeof(WORD), NewLUT -> OutputEntries, Icc); + if (Icc ->Read(PtrW, sizeof(WORD), NewLUT -> OutputEntries, Icc) != NewLUT -> OutputEntries) { + return FALSE; + } + AdjustEndianessArray16(PtrW, NewLUT -> OutputEntries); AllLinear += cmsIsLinear(NewLUT -> L2[i], NewLUT -> OutputEntries); } @@ -814,6 +892,8 @@ void ReadLUT16(LPLCMSICCPROFILE Icc, LPLUT NewLUT) cmsCalcCLUT16Params(NewLUT -> cLutPoints, NewLUT -> InputChan, NewLUT -> OutputChan, &NewLUT -> CLut16params); + + return TRUE; } @@ -830,17 +910,15 @@ LPGAMMATABLE ReadCurve(LPLCMSICCPROFILE Icc) BaseType = ReadBase(Icc); - switch (BaseType) { - case 0x9478ee00L: // Monaco 2 profiler is BROKEN! + case ((icTagTypeSignature) 0x9478ee00): // Monaco 2 profiler is BROKEN! case icSigCurveType: - Icc ->Read(&Count, sizeof(icUInt32Number), 1, Icc); + if (Icc ->Read(&Count, sizeof(icUInt32Number), 1, Icc) != 1) return NULL; AdjustEndianess32((LPBYTE) &Count); - switch (Count) { case 0: // Linear. @@ -855,7 +933,7 @@ LPGAMMATABLE ReadCurve(LPLCMSICCPROFILE Icc) { WORD SingleGammaFixed; - Icc ->Read(&SingleGammaFixed, sizeof(WORD), 1, Icc); + if (Icc ->Read(&SingleGammaFixed, sizeof(WORD), 1, Icc) != 1) return NULL; AdjustEndianess16((LPBYTE) &SingleGammaFixed); return cmsBuildGamma(4096, Convert8Fixed8(SingleGammaFixed)); } @@ -865,10 +943,9 @@ LPGAMMATABLE ReadCurve(LPLCMSICCPROFILE Icc) NewGamma = cmsAllocGamma(Count); if (!NewGamma) return NULL; - Icc ->Read(NewGamma -> GammaTable, sizeof(WORD), Count, Icc); - + if (Icc ->Read(NewGamma -> GammaTable, sizeof(WORD), Count, Icc) != Count) + return NULL; AdjustEndianessArray16(NewGamma -> GammaTable, Count); - return NewGamma; } } @@ -885,11 +962,11 @@ LPGAMMATABLE ReadCurve(LPLCMSICCPROFILE Icc) icUInt16Number Type; int i; - Icc -> Read(&Type, sizeof(icUInt16Number), 1, Icc); - Icc -> Read(&Reserved, sizeof(icUInt16Number), 1, Icc); + if (Icc -> Read(&Type, sizeof(icUInt16Number), 1, Icc) != 1) return NULL; + if (Icc -> Read(&Reserved, sizeof(icUInt16Number), 1, Icc) != 1) return NULL; AdjustEndianess16((LPBYTE) &Type); - if (Type > 5) { + if (Type > 4) { cmsSignalError(LCMS_ERRC_ABORTED, "Unknown parametric curve type '%d' found.", Type); return NULL; @@ -900,7 +977,7 @@ LPGAMMATABLE ReadCurve(LPLCMSICCPROFILE Icc) for (i=0; i < n; i++) { Num = 0; - Icc -> Read(&Num, sizeof(icS15Fixed16Number), 1, Icc); + if (Icc -> Read(&Num, sizeof(icS15Fixed16Number), 1, Icc) != 1) return NULL; Params[i] = Convert15Fixed16(Num); } @@ -938,7 +1015,7 @@ LPGAMMATABLE ReadCurveReversed(LPLCMSICCPROFILE Icc) case 0x9478ee00L: // Monaco 2 profiler is BROKEN! case icSigCurveType: - Icc -> Read(&Count, sizeof(icUInt32Number), 1, Icc); + if (Icc -> Read(&Count, sizeof(icUInt32Number), 1, Icc) != 1) return NULL; AdjustEndianess32((LPBYTE) &Count); @@ -948,6 +1025,7 @@ LPGAMMATABLE ReadCurveReversed(LPLCMSICCPROFILE Icc) NewGamma = cmsAllocGamma(2); if (!NewGamma) return NULL; + NewGamma -> GammaTable[0] = 0; NewGamma -> GammaTable[1] = 0xFFFF; return NewGamma; @@ -955,7 +1033,7 @@ LPGAMMATABLE ReadCurveReversed(LPLCMSICCPROFILE Icc) case 1: { WORD SingleGammaFixed; - Icc -> Read(&SingleGammaFixed, sizeof(WORD), 1, Icc); + if (Icc -> Read(&SingleGammaFixed, sizeof(WORD), 1, Icc) != 1) return NULL; AdjustEndianess16((LPBYTE) &SingleGammaFixed); return cmsBuildGamma(4096, 1./Convert8Fixed8(SingleGammaFixed)); } @@ -965,7 +1043,8 @@ LPGAMMATABLE ReadCurveReversed(LPLCMSICCPROFILE Icc) NewGamma = cmsAllocGamma(Count); if (!NewGamma) return NULL; - Icc -> Read(NewGamma -> GammaTable, sizeof(WORD), Count, Icc); + if (Icc -> Read(NewGamma -> GammaTable, sizeof(WORD), Count, Icc) != Count) + return NULL; AdjustEndianessArray16(NewGamma -> GammaTable, Count); @@ -992,11 +1071,11 @@ LPGAMMATABLE ReadCurveReversed(LPLCMSICCPROFILE Icc) int i; - Icc -> Read(&Type, sizeof(icUInt16Number), 1, Icc); - Icc -> Read(&Reserved, sizeof(icUInt16Number), 1, Icc); + if (Icc -> Read(&Type, sizeof(icUInt16Number), 1, Icc) != 1) return NULL; + if (Icc -> Read(&Reserved, sizeof(icUInt16Number), 1, Icc) != 1) return NULL; AdjustEndianess16((LPBYTE) &Type); - if (Type > 5) { + if (Type > 4) { cmsSignalError(LCMS_ERRC_ABORTED, "Unknown parametric curve type '%d' found.", Type); return NULL; @@ -1006,7 +1085,7 @@ LPGAMMATABLE ReadCurveReversed(LPLCMSICCPROFILE Icc) n = ParamsByType[Type]; for (i=0; i < n; i++) { - Icc -> Read(&Num, sizeof(icS15Fixed16Number), 1, Icc); + if (Icc -> Read(&Num, sizeof(icS15Fixed16Number), 1, Icc) != 1) return NULL; Params[i] = Convert15Fixed16(Num); } @@ -1028,7 +1107,7 @@ LPGAMMATABLE ReadCurveReversed(LPLCMSICCPROFILE Icc) // V4 stuff. Read matrix for LutAtoB and LutBtoA static -BOOL ReadMatrixOffset(LPLCMSICCPROFILE Icc, size_t Offset, LPLUT NewLUT, DWORD dwFlags) +LCMSBOOL ReadMatrixOffset(LPLCMSICCPROFILE Icc, size_t Offset, LPLUT NewLUT, DWORD dwFlags) { icS15Fixed16Number All[12]; @@ -1038,7 +1117,8 @@ BOOL ReadMatrixOffset(LPLCMSICCPROFILE Icc, size_t Offset, LPLUT NewLUT, DWORD d if (Icc -> Seek(Icc, Offset)) return FALSE; - Icc ->Read(All, sizeof(icS15Fixed16Number), 12, Icc); + if (Icc ->Read(All, sizeof(icS15Fixed16Number), 12, Icc) != 12) + return FALSE; for (i=0; i < 12; i++) AdjustEndianess32((LPBYTE) &All[i]); @@ -1067,17 +1147,26 @@ BOOL ReadMatrixOffset(LPLCMSICCPROFILE Icc, size_t Offset, LPLUT NewLUT, DWORD d // V4 stuff. Read CLUT part for LutAtoB and LutBtoA static -BOOL ReadCLUT(LPLCMSICCPROFILE Icc, size_t Offset, LPLUT NewLUT) +LCMSBOOL ReadCLUT(LPLCMSICCPROFILE Icc, size_t Offset, LPLUT NewLUT) { - + unsigned int j; icCLutStruct CLUT; if (Icc -> Seek(Icc, Offset)) return FALSE; - Icc ->Read(&CLUT, sizeof(icCLutStruct), 1, Icc); + if (Icc ->Read(&CLUT, sizeof(icCLutStruct), 1, Icc) != 1) return FALSE; - cmsAlloc3DGrid(NewLUT, CLUT.gridPoints[0], NewLUT ->InputChan, - NewLUT ->OutputChan); + for (j=1; j < NewLUT ->InputChan; j++) { + if (CLUT.gridPoints[0] != CLUT.gridPoints[j]) { + cmsSignalError(LCMS_ERRC_ABORTED, "CLUT with different granulatity is currently unsupported."); + return FALSE; + } + + + } + + if (cmsAlloc3DGrid(NewLUT, CLUT.gridPoints[0], NewLUT ->InputChan, + NewLUT ->OutputChan) == NULL) return FALSE; // Precission can be 1 or 2 bytes @@ -1087,7 +1176,7 @@ BOOL ReadCLUT(LPLCMSICCPROFILE Icc, size_t Offset, LPLUT NewLUT) unsigned int i; for (i=0; i < NewLUT->Tsize / sizeof(WORD); i++) { - Icc ->Read(&v, sizeof(BYTE), 1, Icc); + if (Icc ->Read(&v, sizeof(BYTE), 1, Icc) != 1) return FALSE; NewLUT->T[i] = TO16_TAB(v); } @@ -1095,10 +1184,10 @@ BOOL ReadCLUT(LPLCMSICCPROFILE Icc, size_t Offset, LPLUT NewLUT) else if (CLUT.prec == 2) { - Icc ->Read(NewLUT ->T, sizeof(WORD), - NewLUT->Tsize / sizeof(WORD), Icc); + size_t n = NewLUT->Tsize / sizeof(WORD); - AdjustEndianessArray16(NewLUT ->T, NewLUT->Tsize / sizeof(WORD)); + if (Icc ->Read(NewLUT ->T, sizeof(WORD), n, Icc) != n) return FALSE; + AdjustEndianessArray16(NewLUT ->T, NewLUT->Tsize / sizeof(WORD)); } else { cmsSignalError(LCMS_ERRC_ABORTED, "Unknow precission of '%d'", CLUT.prec); @@ -1109,6 +1198,22 @@ BOOL ReadCLUT(LPLCMSICCPROFILE Icc, size_t Offset, LPLUT NewLUT) } +static +void ResampleCurves(LPGAMMATABLE Curves[], int nCurves) +{ + int i; + LPSAMPLEDCURVE sc; + + for (i=0; i < nCurves; i++) { + sc = cmsConvertGammaToSampledCurve(Curves[i], 4096); + cmsFreeGamma(Curves[i]); + Curves[i] = cmsConvertSampledCurveToGamma(sc, 0xFFFF); + cmsFreeSampledCurve(sc); + } + +} + + static void SkipAlignment(LPLCMSICCPROFILE Icc) { @@ -1121,7 +1226,7 @@ void SkipAlignment(LPLCMSICCPROFILE Icc) // Read a set of curves from specific offset static -BOOL ReadSetOfCurves(LPLCMSICCPROFILE Icc, size_t Offset, LPLUT NewLUT, int nLocation) +LCMSBOOL ReadSetOfCurves(LPLCMSICCPROFILE Icc, size_t Offset, LPLUT NewLUT, int nLocation) { LPGAMMATABLE Curves[MAXCHANNELS]; unsigned int i, nCurves; @@ -1134,20 +1239,41 @@ BOOL ReadSetOfCurves(LPLCMSICCPROFILE Icc, size_t Offset, LPLUT NewLUT, int nLoc else nCurves = NewLUT ->OutputChan; + ZeroMemory(Curves, sizeof(Curves)); for (i=0; i < nCurves; i++) { Curves[i] = ReadCurve(Icc); + if (Curves[i] == NULL) goto Error; SkipAlignment(Icc); + } + // March-26'08: some V4 profiles may have different sampling + // rates, in this case resample all curves to maximum + + for (i=1; i < nCurves; i++) { + if (Curves[i]->nEntries != Curves[0]->nEntries) { + ResampleCurves(Curves, nCurves); + break; + } } NewLUT = cmsAllocLinearTable(NewLUT, Curves, nLocation); + if (NewLUT == NULL) goto Error; for (i=0; i < nCurves; i++) cmsFreeGamma(Curves[i]); return TRUE; +Error: + + for (i=0; i < nCurves; i++) + if (Curves[i]) + cmsFreeGamma(Curves[i]); + + return FALSE; + + } // V4 stuff. LutAtoB type @@ -1160,22 +1286,28 @@ BOOL ReadSetOfCurves(LPLCMSICCPROFILE Icc, size_t Offset, LPLUT NewLUT, int nLoc // L2 = B curves static -BOOL ReadLUT_A2B(LPLCMSICCPROFILE Icc, LPLUT NewLUT, size_t BaseOffset, icTagSignature sig) +LCMSBOOL ReadLUT_A2B(LPLCMSICCPROFILE Icc, LPLUT NewLUT, size_t BaseOffset, icTagSignature sig) { icLutAtoB LUT16; - Icc ->Read(&LUT16, sizeof(icLutAtoB), 1, Icc); + if (Icc ->Read(&LUT16, sizeof(icLutAtoB), 1, Icc) != 1) return FALSE; NewLUT -> InputChan = LUT16.inputChan; NewLUT -> OutputChan = LUT16.outputChan; + // Validate the NewLUT here to avoid excessive number of channels + // (leading to stack-based buffer overflow in ReadSetOfCurves). + // Needs revalidation after table size is filled in. + if (!_cmsValidateLUT(NewLUT)) { + return FALSE; + } + AdjustEndianess32((LPBYTE) &LUT16.offsetB); AdjustEndianess32((LPBYTE) &LUT16.offsetMat); AdjustEndianess32((LPBYTE) &LUT16.offsetM); AdjustEndianess32((LPBYTE) &LUT16.offsetC); AdjustEndianess32((LPBYTE) &LUT16.offsetA); - if (LUT16.offsetB != 0) ReadSetOfCurves(Icc, BaseOffset + LUT16.offsetB, NewLUT, 2); @@ -1220,15 +1352,22 @@ BOOL ReadLUT_A2B(LPLCMSICCPROFILE Icc, LPLUT NewLUT, size_t BaseOffset, icTagSig // V4 stuff. LutBtoA type static -BOOL ReadLUT_B2A(LPLCMSICCPROFILE Icc, LPLUT NewLUT, size_t BaseOffset, icTagSignature sig) +LCMSBOOL ReadLUT_B2A(LPLCMSICCPROFILE Icc, LPLUT NewLUT, size_t BaseOffset, icTagSignature sig) { icLutBtoA LUT16; - Icc ->Read(&LUT16, sizeof(icLutBtoA), 1, Icc); + if (Icc ->Read(&LUT16, sizeof(icLutBtoA), 1, Icc) != 1) return FALSE; NewLUT -> InputChan = LUT16.inputChan; NewLUT -> OutputChan = LUT16.outputChan; + // Validate the NewLUT here to avoid excessive number of channels + // (leading to stack-based buffer overflow in ReadSetOfCurves). + // Needs revalidation after table size is filled in. + if (!_cmsValidateLUT(NewLUT)) { + return FALSE; + } + AdjustEndianess32((LPBYTE) &LUT16.offsetB); AdjustEndianess32((LPBYTE) &LUT16.offsetMat); AdjustEndianess32((LPBYTE) &LUT16.offsetM); @@ -1242,7 +1381,6 @@ BOOL ReadLUT_B2A(LPLCMSICCPROFILE Icc, LPLUT NewLUT, size_t BaseOffset, icTagSi if (LUT16.offsetMat != 0) ReadMatrixOffset(Icc, BaseOffset + LUT16.offsetMat, NewLUT, LUT_HASMATRIX3); - if (LUT16.offsetM != 0) ReadSetOfCurves(Icc, BaseOffset + LUT16.offsetM, NewLUT, 3); @@ -1294,7 +1432,7 @@ LPLUT LCMSEXPORT cmsReadICCLut(cmsHPROFILE hProfile, icTagSignature sig) // If is in memory, the LUT is already there, so throw a copy - if (!Icc -> stream) { + if (Icc -> TagPtrs[n]) { return cmsDupLUT((LPLUT) Icc ->TagPtrs[n]); } @@ -1308,8 +1446,8 @@ LPLUT LCMSEXPORT cmsReadICCLut(cmsHPROFILE hProfile, icTagSignature sig) NewLUT = cmsAllocLUT(); - if (!NewLUT) - { + if (!NewLUT) { + cmsSignalError(LCMS_ERRC_ABORTED, "cmsAllocLUT() failed"); return NULL; } @@ -1317,11 +1455,29 @@ LPLUT LCMSEXPORT cmsReadICCLut(cmsHPROFILE hProfile, icTagSignature sig) switch (BaseType) { - case icSigLut8Type: ReadLUT8(Icc, NewLUT, sig); break; - case icSigLut16Type: ReadLUT16(Icc, NewLUT); break; + case icSigLut8Type: if (!ReadLUT8(Icc, NewLUT, sig)) { + cmsFreeLUT(NewLUT); + return NULL; + } + break; - case icSiglutAtoBType: ReadLUT_A2B(Icc, NewLUT, offset, sig); break; - case icSiglutBtoAType: ReadLUT_B2A(Icc, NewLUT, offset, sig); break; + case icSigLut16Type: if (!ReadLUT16(Icc, NewLUT)) { + cmsFreeLUT(NewLUT); + return NULL; + } + break; + + case icSiglutAtoBType: if (!ReadLUT_A2B(Icc, NewLUT, offset, sig)) { + cmsFreeLUT(NewLUT); + return NULL; + } + break; + + case icSiglutBtoAType: if (!ReadLUT_B2A(Icc, NewLUT, offset, sig)) { + cmsFreeLUT(NewLUT); + return NULL; + } + break; default: cmsSignalError(LCMS_ERRC_ABORTED, "Bad tag signature %lx found.", BaseType); cmsFreeLUT(NewLUT); @@ -1335,16 +1491,23 @@ LPLUT LCMSEXPORT cmsReadICCLut(cmsHPROFILE hProfile, icTagSignature sig) // Sets the language & country preferences. Used only in ICC 4.0 profiles -void LCMSEXPORT cmsSetLanguage(int LanguageCode, int CountryCode) +void LCMSEXPORT cmsSetLanguage(const char LanguageCode[4], const char CountryCode[4]) { - GlobalLanguageCode = LanguageCode; - GlobalCountryCode = CountryCode; + + int LanguageCodeInt = *(int *) LanguageCode; + int CountryCodeInt = *(int *) CountryCode; + + AdjustEndianess32((LPBYTE) &LanguageCodeInt); + AdjustEndianess32((LPBYTE) &CountryCodeInt); + + GlobalLanguageCode = LanguageCodeInt; + GlobalCountryCode = CountryCodeInt; } // Some tags (e.g, 'pseq') can have text tags embedded. This function -// handles such special case. +// handles such special case. Returns -1 on error, or the number of bytes left on success. static int ReadEmbeddedTextTag(LPLCMSICCPROFILE Icc, size_t size, char* Name, size_t size_max) @@ -1353,7 +1516,6 @@ int ReadEmbeddedTextTag(LPLCMSICCPROFILE Icc, size_t size, char* Name, size_t si BaseType = ReadBase(Icc); - size -= sizeof(icTagBase); switch (BaseType) { @@ -1365,50 +1527,54 @@ int ReadEmbeddedTextTag(LPLCMSICCPROFILE Icc, size_t size, char* Name, size_t si icUInt16Number ScriptCodeCode, Dummy; icUInt8Number ScriptCodeCount; - Icc ->Read(&AsciiCount, sizeof(icUInt32Number), 1, Icc); + if (Icc ->Read(&AsciiCount, sizeof(icUInt32Number), 1, Icc) != 1) return -1; - if (size < sizeof(icUInt32Number)) return (int) size; + if (size < sizeof(icUInt32Number)) return (int) size; size -= sizeof(icUInt32Number); AdjustEndianess32((LPBYTE) &AsciiCount); Icc ->Read(Name, 1, (AsciiCount >= size_max) ? (size_max-1) : AsciiCount, Icc); - if (size < AsciiCount) return (int) size; + if (size < AsciiCount) return (int) size; size -= AsciiCount; // Skip Unicode code - Icc ->Read(&UnicodeCode, sizeof(icUInt32Number), 1, Icc); - if (size < sizeof(icUInt32Number)) return (int) size; + if (Icc ->Read(&UnicodeCode, sizeof(icUInt32Number), 1, Icc) != 1) return -1; + if (size < sizeof(icUInt32Number)) return (int) size; size -= sizeof(icUInt32Number); - Icc ->Read(&UnicodeCount, sizeof(icUInt32Number), 1, Icc); - if (size < sizeof(icUInt32Number)) return (int) size; + if (Icc ->Read(&UnicodeCount, sizeof(icUInt32Number), 1, Icc) != 1) return -1; + if (size < sizeof(icUInt32Number)) return (int) size; size -= sizeof(icUInt32Number); AdjustEndianess32((LPBYTE) &UnicodeCount); if (UnicodeCount > size) return (int) size; - for (i=0; i < UnicodeCount; i++) - Icc ->Read(&Dummy, sizeof(icUInt16Number), 1, Icc); - - size -= UnicodeCount * sizeof(icUInt16Number); + for (i=0; i < UnicodeCount; i++) { + size_t nread = Icc ->Read(&Dummy, sizeof(icUInt16Number), 1, Icc); + if (nread != 1) return (int) size; + size -= sizeof(icUInt16Number); + } // Skip ScriptCode code - Icc ->Read(&ScriptCodeCode, sizeof(icUInt16Number), 1, Icc); + if (Icc ->Read(&ScriptCodeCode, sizeof(icUInt16Number), 1, Icc) != 1) return -1; size -= sizeof(icUInt16Number); - Icc ->Read(&ScriptCodeCount, sizeof(icUInt8Number), 1, Icc); + if (Icc ->Read(&ScriptCodeCount, sizeof(icUInt8Number), 1, Icc) != 1) return -1; size -= sizeof(icUInt8Number); + // Should remain 67 bytes as filler + if (size < 67) return (int) size; - for (i=0; i < 67; i++) - Icc ->Read(&Dummy, sizeof(icUInt8Number), 1, Icc); - - size -= 67; + for (i=0; i < 67; i++) { + size_t nread = Icc ->Read(&Dummy, sizeof(icUInt8Number), 1, Icc); + if (nread != 1) return (int) size; + size --; + } } break; @@ -1425,7 +1591,7 @@ int ReadEmbeddedTextTag(LPLCMSICCPROFILE Icc, size_t size, char* Name, size_t si size = size_max - 1; } - Icc -> Read(Name, 1, size, Icc); + if (Icc -> Read(Name, 1, size, Icc) != size) return -1; for (i=0; i < Missing; i++) Icc -> Read(&Dummy, 1, 1, Icc); @@ -1445,9 +1611,9 @@ int ReadEmbeddedTextTag(LPLCMSICCPROFILE Icc, size_t size, char* Name, size_t si wchar_t* wchar = L""; - Icc ->Read(&Count, sizeof(icUInt32Number), 1, Icc); + if (Icc ->Read(&Count, sizeof(icUInt32Number), 1, Icc) != 1) return -1; AdjustEndianess32((LPBYTE) &Count); - Icc ->Read(&RecLen, sizeof(icUInt32Number), 1, Icc); + if (Icc ->Read(&RecLen, sizeof(icUInt32Number), 1, Icc) != 1) return -1; AdjustEndianess32((LPBYTE) &RecLen); if (RecLen != 12) { @@ -1458,15 +1624,15 @@ int ReadEmbeddedTextTag(LPLCMSICCPROFILE Icc, size_t size, char* Name, size_t si for (i=0; i < Count; i++) { - Icc ->Read(&Language, sizeof(icUInt16Number), 1, Icc); + if (Icc ->Read(&Language, sizeof(icUInt16Number), 1, Icc) != 1) return -1; AdjustEndianess16((LPBYTE) &Language); - Icc ->Read(&Country, sizeof(icUInt16Number), 1, Icc); + if (Icc ->Read(&Country, sizeof(icUInt16Number), 1, Icc) != 1) return -1; AdjustEndianess16((LPBYTE) &Country); - Icc ->Read(&ThisLen, sizeof(icUInt32Number), 1, Icc); + if (Icc ->Read(&ThisLen, sizeof(icUInt32Number), 1, Icc) != 1) return -1; AdjustEndianess32((LPBYTE) &ThisLen); - Icc ->Read(&ThisOffset, sizeof(icUInt32Number), 1, Icc); + if (Icc ->Read(&ThisOffset, sizeof(icUInt32Number), 1, Icc) != 1) return -1; AdjustEndianess32((LPBYTE) &ThisOffset); if (Language == GlobalLanguageCode || Offset == 0) { @@ -1492,14 +1658,18 @@ int ReadEmbeddedTextTag(LPLCMSICCPROFILE Icc, size_t size, char* Name, size_t si for (i=0; i < Offset; i++) { char Discard; - - Icc ->Read(&Discard, 1, 1, Icc); + if (Icc ->Read(&Discard, 1, 1, Icc) != 1) return -1; } - wchar = (wchar_t*) malloc(Len+2); + + // Bound len + if (Len < 0) Len = 0; + if (Len > 20*1024) Len = 20 * 1024; + + wchar = (wchar_t*) _cmsMalloc(Len*sizeof(wchar_t)+2); if (!wchar) return -1; - Icc ->Read(wchar, 1, Len, Icc); + if (Icc ->Read(wchar, 1, Len, Icc) != Len) return -1; AdjustEndianessArray16((LPWORD) wchar, Len / 2); wchar[Len / 2] = L'\0'; @@ -1509,7 +1679,7 @@ int ReadEmbeddedTextTag(LPLCMSICCPROFILE Icc, size_t size, char* Name, size_t si Name[0] = 0; // Error } - free((void*) wchar); + _cmsFree((void*) wchar); } break; @@ -1522,8 +1692,7 @@ int ReadEmbeddedTextTag(LPLCMSICCPROFILE Icc, size_t size, char* Name, size_t si } -// Take an ASCII item. Takes at most LCMS_DESC_MAX - +// Take an ASCII item. Takes at most size_max bytes int LCMSEXPORT cmsReadICCTextEx(cmsHPROFILE hProfile, icTagSignature sig, char *Name, size_t size_max) { @@ -1535,19 +1704,27 @@ int LCMSEXPORT cmsReadICCTextEx(cmsHPROFILE hProfile, icTagSignature sig, char * if (n < 0) return -1; - if (!Icc -> stream) { + size = Icc -> TagSizes[n]; + + if (Icc -> TagPtrs[n]) { + + if (size > size_max) + size = size_max; + + CopyMemory(Name, Icc -> TagPtrs[n], size); - CopyMemory(Name, Icc -> TagPtrs[n], Icc -> TagSizes[n]); return (int) Icc -> TagSizes[n]; } offset = Icc -> TagOffsets[n]; - size = Icc -> TagSizes[n]; + if (Icc -> Seek(Icc, offset)) return -1; - return ReadEmbeddedTextTag(Icc, size, Name, size_max); + if (ReadEmbeddedTextTag(Icc, size, Name, size_max) < 0) return -1; + + return size; } // Keep compatibility with older versions @@ -1561,7 +1738,7 @@ int LCMSEXPORT cmsReadICCText(cmsHPROFILE hProfile, icTagSignature sig, char *Te // Take an XYZ item static -int ReadICCXYZ(cmsHPROFILE hProfile, icTagSignature sig, LPcmsCIEXYZ Value, BOOL lIsFatal) +int ReadICCXYZ(cmsHPROFILE hProfile, icTagSignature sig, LPcmsCIEXYZ Value, LCMSBOOL lIsFatal) { LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile; icTagTypeSignature BaseType; @@ -1573,7 +1750,7 @@ int ReadICCXYZ(cmsHPROFILE hProfile, icTagSignature sig, LPcmsCIEXYZ Value, BOOL if (n < 0) return -1; - if (!Icc -> stream) { + if (Icc -> TagPtrs[n]) { CopyMemory(Value, Icc -> TagPtrs[n], Icc -> TagSizes[n]); return (int) Icc -> TagSizes[n]; @@ -1628,7 +1805,7 @@ int ReadICCXYZArray(cmsHPROFILE hProfile, icTagSignature sig, LPMAT3 v) if (n < 0) return -1; // Not found - if (!Icc -> stream) { + if (Icc -> TagPtrs[n]) { CopyMemory(v, Icc -> TagPtrs[n], Icc -> TagSizes[n]); return (int) Icc -> TagSizes[n]; @@ -1677,7 +1854,7 @@ int ReadICCXYZArray(cmsHPROFILE hProfile, icTagSignature sig, LPMAT3 v) // Primaries are to be in xyY notation -BOOL LCMSEXPORT cmsTakeColorants(LPcmsCIEXYZTRIPLE Dest, cmsHPROFILE hProfile) +LCMSBOOL LCMSEXPORT cmsTakeColorants(LPcmsCIEXYZTRIPLE Dest, cmsHPROFILE hProfile) { if (ReadICCXYZ(hProfile, icSigRedColorantTag, &Dest -> Red, TRUE) < 0) return FALSE; if (ReadICCXYZ(hProfile, icSigGreenColorantTag, &Dest -> Green, TRUE) < 0) return FALSE; @@ -1687,7 +1864,7 @@ BOOL LCMSEXPORT cmsTakeColorants(LPcmsCIEXYZTRIPLE Dest, cmsHPROFILE hProfile) } -BOOL cmsReadICCMatrixRGB2XYZ(LPMAT3 r, cmsHPROFILE hProfile) +LCMSBOOL cmsReadICCMatrixRGB2XYZ(LPMAT3 r, cmsHPROFILE hProfile) { cmsCIEXYZTRIPLE Primaries; @@ -1704,7 +1881,7 @@ BOOL cmsReadICCMatrixRGB2XYZ(LPMAT3 r, cmsHPROFILE hProfile) // Always return a suitable matrix -BOOL cmsReadChromaticAdaptationMatrix(LPMAT3 r, cmsHPROFILE hProfile) +LCMSBOOL cmsReadChromaticAdaptationMatrix(LPMAT3 r, cmsHPROFILE hProfile) { if (ReadICCXYZArray(hProfile, icSigChromaticAdaptationTag, r) < 0) { @@ -1741,7 +1918,7 @@ LPGAMMATABLE LCMSEXPORT cmsReadICCGamma(cmsHPROFILE hProfile, icTagSignature sig if (n < 0) return NULL; - if (!Icc -> stream) { + if (Icc -> TagPtrs[n]) { return cmsDupGamma((LPGAMMATABLE) Icc -> TagPtrs[n]); } @@ -1769,7 +1946,7 @@ LPGAMMATABLE LCMSEXPORT cmsReadICCGammaReversed(cmsHPROFILE hProfile, icTagSigna if (n < 0) return NULL; - if (!Icc -> stream) { + if (Icc -> TagPtrs[n]) { return cmsReverseGamma(256, (LPGAMMATABLE) Icc -> TagPtrs[n]); } @@ -1785,7 +1962,7 @@ LPGAMMATABLE LCMSEXPORT cmsReadICCGammaReversed(cmsHPROFILE hProfile, icTagSigna // Check Named color header static -BOOL CheckHeader(LPcmsNAMEDCOLORLIST v, icNamedColor2* nc2) +LCMSBOOL CheckHeader(LPcmsNAMEDCOLORLIST v, icNamedColor2* nc2) { if (v ->Prefix[0] == 0 && v ->Suffix[0] == 0 && v ->ColorantCount == 0) return TRUE; @@ -1809,13 +1986,13 @@ int cmsReadICCnamedColorList(cmsHTRANSFORM xform, cmsHPROFILE hProfile, icTagSig if (n < 0) return 0; - if (!Icc -> stream) { + if (Icc -> TagPtrs[n]) { // This replaces actual named color list. size_t size = Icc -> TagSizes[n]; if (v ->NamedColorList) cmsFreeNamedColorList(v ->NamedColorList); - v -> NamedColorList = (LPcmsNAMEDCOLORLIST) malloc(size); + v -> NamedColorList = (LPcmsNAMEDCOLORLIST) _cmsMalloc(size); CopyMemory(v -> NamedColorList, Icc ->TagPtrs[n], size); return v ->NamedColorList->nColors; } @@ -1844,7 +2021,7 @@ int cmsReadICCnamedColorList(cmsHTRANSFORM xform, cmsHPROFILE hProfile, icTagSig icNamedColor2 nc2; unsigned int i, j; - Icc -> Read(&nc2, sizeof(icNamedColor2) - SIZEOF_UINT8_ALIGNED, 1, Icc); + if (Icc -> Read(&nc2, sizeof(icNamedColor2) - SIZEOF_UINT8_ALIGNED, 1, Icc) != 1) return 0; AdjustEndianess32((LPBYTE) &nc2.vendorFlag); AdjustEndianess32((LPBYTE) &nc2.count); AdjustEndianess32((LPBYTE) &nc2.nDeviceCoords); @@ -1854,6 +2031,11 @@ int cmsReadICCnamedColorList(cmsHTRANSFORM xform, cmsHPROFILE hProfile, icTagSig return 0; } + if (nc2.nDeviceCoords > MAXCHANNELS) { + cmsSignalError(LCMS_ERRC_WARNING, "Too many device coordinates."); + return 0; + } + strncpy(v ->NamedColorList->Prefix, (const char*) nc2.prefix, 32); strncpy(v ->NamedColorList->Suffix, (const char*) nc2.suffix, 32); v ->NamedColorList->Prefix[32] = v->NamedColorList->Suffix[32] = 0; @@ -1900,7 +2082,8 @@ int cmsReadICCnamedColorList(cmsHTRANSFORM xform, cmsHPROFILE hProfile, icTagSig LPcmsNAMEDCOLORLIST LCMSEXPORT cmsReadColorantTable(cmsHPROFILE hProfile, icTagSignature sig) { - icInt32Number n, Count, i; + icInt32Number n; + icUInt32Number Count, i; size_t offset; icTagTypeSignature BaseType; LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile; @@ -1910,10 +2093,12 @@ LPcmsNAMEDCOLORLIST LCMSEXPORT cmsReadColorantTable(cmsHPROFILE hProfile, icTagS if (n < 0) return NULL; // Not found - if (!Icc -> stream) { + if (Icc -> TagPtrs[n]) { size_t size = Icc -> TagSizes[n]; - void* v = malloc(size); + void* v = _cmsMalloc(size); + + if (v == NULL) return NULL; CopyMemory(v, Icc -> TagPtrs[n], size); return (LPcmsNAMEDCOLORLIST) v; } @@ -1932,13 +2117,17 @@ LPcmsNAMEDCOLORLIST LCMSEXPORT cmsReadColorantTable(cmsHPROFILE hProfile, icTagS } - Icc ->Read(&Count, sizeof(icUInt32Number), 1, Icc); + if (Icc ->Read(&Count, sizeof(icUInt32Number), 1, Icc) != 1) return NULL; AdjustEndianess32((LPBYTE) &Count); + if (Count > MAXCHANNELS) { + cmsSignalError(LCMS_ERRC_ABORTED, "Too many colorants '%lx'", Count); + return NULL; + } + List = cmsAllocNamedColorList(Count); for (i=0; i < Count; i++) { - if (!Icc ->Read(List->List[i].Name, 1, 32 , Icc)) goto Error; if (!Icc ->Read(List->List[i].PCS, sizeof(icUInt16Number), 3, Icc)) goto Error; AdjustEndianessArray16(List->List[i].PCS, 3); @@ -1965,7 +2154,7 @@ const char* LCMSEXPORT cmsTakeManufacturer(cmsHPROFILE hProfile) if (cmsIsTag(hProfile, icSigDeviceMfgDescTag)) { - cmsReadICCText(hProfile, icSigDeviceMfgDescTag, Manufacturer); + cmsReadICCTextEx(hProfile, icSigDeviceMfgDescTag, Manufacturer, LCMS_DESC_MAX); } return Manufacturer; @@ -1982,7 +2171,7 @@ const char* LCMSEXPORT cmsTakeModel(cmsHPROFILE hProfile) if (cmsIsTag(hProfile, icSigDeviceModelDescTag)) { - cmsReadICCText(hProfile, icSigDeviceModelDescTag, Model); + cmsReadICCTextEx(hProfile, icSigDeviceModelDescTag, Model, LCMS_DESC_MAX); } return Model; @@ -1995,10 +2184,9 @@ const char* LCMSEXPORT cmsTakeCopyright(cmsHPROFILE hProfile) static char Copyright[LCMS_DESC_MAX] = ""; Copyright[0] = 0; - if (cmsIsTag(hProfile, icSigCopyrightTag)) { - cmsReadICCText(hProfile, icSigCopyrightTag, Copyright); + cmsReadICCTextEx(hProfile, icSigCopyrightTag, Copyright, LCMS_DESC_MAX); } return Copyright; @@ -2009,7 +2197,7 @@ const char* LCMSEXPORT cmsTakeCopyright(cmsHPROFILE hProfile) const char* LCMSEXPORT cmsTakeProductName(cmsHPROFILE hProfile) { - static char Name[2048]; + static char Name[LCMS_DESC_MAX*2+4]; char Manufacturer[LCMS_DESC_MAX], Model[LCMS_DESC_MAX]; Name[0] = '\0'; @@ -2017,19 +2205,19 @@ const char* LCMSEXPORT cmsTakeProductName(cmsHPROFILE hProfile) if (cmsIsTag(hProfile, icSigDeviceMfgDescTag)) { - cmsReadICCText(hProfile, icSigDeviceMfgDescTag, Manufacturer); + cmsReadICCTextEx(hProfile, icSigDeviceMfgDescTag, Manufacturer, LCMS_DESC_MAX); } if (cmsIsTag(hProfile, icSigDeviceModelDescTag)) { - cmsReadICCText(hProfile, icSigDeviceModelDescTag, Model); + cmsReadICCTextEx(hProfile, icSigDeviceModelDescTag, Model, LCMS_DESC_MAX); } if (!Manufacturer[0] && !Model[0]) { if (cmsIsTag(hProfile, icSigProfileDescriptionTag)) { - cmsReadICCText(hProfile, icSigProfileDescriptionTag, Name); + cmsReadICCTextEx(hProfile, icSigProfileDescriptionTag, Name, LCMS_DESC_MAX); return Name; } else return "{no name}"; @@ -2129,7 +2317,7 @@ const char* LCMSEXPORT cmsTakeProductInfo(cmsHPROFILE hProfile) // Extract the target data as a big string. Does not signal if tag is not present. -BOOL LCMSEXPORT cmsTakeCharTargetData(cmsHPROFILE hProfile, char** Data, size_t* len) +LCMSBOOL LCMSEXPORT cmsTakeCharTargetData(cmsHPROFILE hProfile, char** Data, size_t* len) { LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile; int n; @@ -2142,7 +2330,11 @@ BOOL LCMSEXPORT cmsTakeCharTargetData(cmsHPROFILE hProfile, char** Data, size_t* *len = Icc -> TagSizes[n]; - *Data = (char*) malloc(*len + 1); // Plus zero marker + + // Make sure that is reasonable (600K) + if (*len > 600*1024) *len = 600*1024; + + *Data = (char*) _cmsMalloc(*len + 1); // Plus zero marker if (!*Data) { @@ -2162,7 +2354,7 @@ BOOL LCMSEXPORT cmsTakeCharTargetData(cmsHPROFILE hProfile, char** Data, size_t* -BOOL LCMSEXPORT cmsTakeCalibrationDateTime(struct tm *Dest, cmsHPROFILE hProfile) +LCMSBOOL LCMSEXPORT cmsTakeCalibrationDateTime(struct tm *Dest, cmsHPROFILE hProfile) { LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile; int n; @@ -2170,8 +2362,8 @@ BOOL LCMSEXPORT cmsTakeCalibrationDateTime(struct tm *Dest, cmsHPROFILE hProfile n = _cmsSearchTag(Icc, icSigCalibrationDateTimeTag, FALSE); if (n < 0) return FALSE; - if (!Icc ->stream) - { + if (Icc ->TagPtrs[n]) { + CopyMemory(Dest, Icc ->TagPtrs[n], sizeof(struct tm)); } else @@ -2212,9 +2404,10 @@ LPcmsSEQ LCMSEXPORT cmsReadProfileSequenceDescription(cmsHPROFILE hProfile) size = Icc -> TagSizes[n]; if (size < 12) return NULL; - if (!Icc -> stream) { + if (Icc -> TagPtrs[n]) { - OutSeq = (LPcmsSEQ) malloc(size); + OutSeq = (LPcmsSEQ) _cmsMalloc(size); + if (OutSeq == NULL) return NULL; CopyMemory(OutSeq, Icc ->TagPtrs[n], size); return OutSeq; } @@ -2231,8 +2424,13 @@ LPcmsSEQ LCMSEXPORT cmsReadProfileSequenceDescription(cmsHPROFILE hProfile) Icc ->Read(&Count, sizeof(icUInt32Number), 1, Icc); AdjustEndianess32((LPBYTE) &Count); + if (Count > 1000) { + return NULL; + } + size = sizeof(int) + Count * sizeof(cmsPSEQDESC); - OutSeq = (LPcmsSEQ) malloc(size); + OutSeq = (LPcmsSEQ) _cmsMalloc(size); + if (OutSeq == NULL) return NULL; OutSeq ->n = Count; @@ -2268,181 +2466,11 @@ LPcmsSEQ LCMSEXPORT cmsReadProfileSequenceDescription(cmsHPROFILE hProfile) void LCMSEXPORT cmsFreeProfileSequenceDescription(LPcmsSEQ pseq) { if (pseq) - free(pseq); + _cmsFree(pseq); } -// Extended gamut -- an HP extension - - -LPcmsGAMUTEX LCMSEXPORT cmsReadExtendedGamut(cmsHPROFILE hProfile, int index) -{ - LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile; - size_t size, offset; - icUInt32Number off_samp, off_desc, off_vc; - int n; - icTagTypeSignature BaseType; - icColorSpaceSignature CoordSig; - icUInt16Number Method, Usage; - icUInt32Number GamutCount, SamplesCount; - LPcmsGAMUTEX gex; - size_t Offsets[256]; - size_t i, Actual, Loc; - icS15Fixed16Number Num; - icUInt16Number Surround; - - - n = _cmsSearchTag(Icc, icSigHPGamutDescTag, FALSE); - if (n < 0) return NULL; - - if (!Icc ->stream) return NULL; // In memory is not supported - - // Read the header - - offset = Icc -> TagOffsets[n]; - - if (Icc -> Seek(Icc, offset)) - return NULL; - - // Here is the beginning of tag - Actual = Icc ->Tell(Icc); - - - BaseType = ReadBase(Icc); - - if (BaseType != icSigHPGamutDescType) { - cmsSignalError(LCMS_ERRC_ABORTED, "Bad tag signature '%lx' found.", BaseType); - return NULL; - } - - - // Read the gamut descriptors count - Icc ->Read(&GamutCount, sizeof(icUInt32Number), 1, Icc); - AdjustEndianess32((LPBYTE) &GamutCount); - - - if (GamutCount >= 256) { - cmsSignalError(LCMS_ERRC_ABORTED, "Too many gamut structures '%d'.", GamutCount); - return NULL; - } - - // Read the directory - - for (i=0; i < GamutCount; i++) { - - Icc ->Read(&Offsets[i], sizeof(icUInt32Number), 1, Icc); - AdjustEndianess32((LPBYTE) &Offsets[i]); - } - - - // Is there such element? - if (index >= (int) GamutCount) return NULL; - Loc = Actual + Offsets[index]; - - - // Go to specified index - if (Icc -> Seek(Icc, Loc)) - return NULL; - - - // Read all members - Icc ->Read(&CoordSig, sizeof(icColorSpaceSignature), 1, Icc); - AdjustEndianess32((LPBYTE) &CoordSig); - - Icc ->Read(&Method, sizeof(icUInt16Number), 1, Icc); - AdjustEndianess16((LPBYTE) &Method); - - Icc ->Read(&Usage, sizeof(icUInt16Number), 1, Icc); - AdjustEndianess16((LPBYTE) &Usage); - - Icc ->Read(&SamplesCount, sizeof(icUInt32Number), 1, Icc); - AdjustEndianess32((LPBYTE) &SamplesCount); - - Icc ->Read(&off_samp, sizeof(icUInt32Number), 1, Icc); - AdjustEndianess32((LPBYTE) &off_samp); - - Icc ->Read(&off_desc, sizeof(icUInt32Number), 1, Icc); - AdjustEndianess32((LPBYTE) &off_desc); - - Icc ->Read(&off_vc, sizeof(icUInt32Number), 1, Icc); - AdjustEndianess32((LPBYTE) &off_vc); - - - size = sizeof(cmsGAMUTEX) + (SamplesCount - 1) * sizeof(double); - - gex = (LPcmsGAMUTEX) malloc(size); - if (gex == NULL) return NULL; - - - gex ->CoordSig = CoordSig; - gex ->Method = Method; - gex ->Usage = Usage; - gex ->Count = SamplesCount; - - - // Read data - if (Icc -> Seek(Icc, Loc + off_samp)) - return NULL; - - for (i=0; i < SamplesCount; i++) { - Icc -> Read(&Num, sizeof(icS15Fixed16Number), 1, Icc); - gex ->Data[i] = Convert15Fixed16(Num); - } - - - // Read mluc - if (Icc -> Seek(Icc, Loc + off_desc)) { - - free(gex); - return NULL; - } - - ReadEmbeddedTextTag(Icc, 256, gex ->Description, LCMS_DESC_MAX); - - - // Read viewing conditions - if (Icc -> Seek(Icc, Loc + off_vc)) { - free(gex); - return NULL; - } - - - Icc -> Read(&Num, sizeof(icS15Fixed16Number), 1, Icc); - gex ->Vc.whitePoint.X = Convert15Fixed16(Num); - - Icc -> Read(&Num, sizeof(icS15Fixed16Number), 1, Icc); - gex ->Vc.whitePoint.Y = Convert15Fixed16(Num); - - Icc -> Read(&Num, sizeof(icS15Fixed16Number), 1, Icc); - gex ->Vc.whitePoint.Z = Convert15Fixed16(Num); - - Icc -> Read(&Num, sizeof(icS15Fixed16Number), 1, Icc); - gex ->Vc.La = Convert15Fixed16(Num); - - Icc -> Read(&Num, sizeof(icS15Fixed16Number), 1, Icc); - gex ->Vc.Yb = Convert15Fixed16(Num); - - Icc -> Read(&Num, sizeof(icS15Fixed16Number), 1, Icc); - gex ->Vc.D_value = Convert15Fixed16(Num); - - Icc -> Read(&Surround, sizeof(icUInt16Number), 1, Icc); - AdjustEndianess16((LPBYTE) &Surround); - gex ->Vc.surround = Surround; - - - // All OK - return gex; - -} - - - -void LCMSEXPORT cmsFreeExtendedGamut(LPcmsGAMUTEX gex) -{ - if (gex) - free(gex); -} // Read a few tags that are hardly required @@ -2564,6 +2592,7 @@ cmsHPROFILE LCMSEXPORT cmsOpenProfileFromFile(const char *lpFileName, const char NewIcc = (LPLCMSICCPROFILE) (LPSTR) hEmpty; NewIcc -> IsWrite = TRUE; strncpy(NewIcc ->PhysicalFile, lpFileName, MAX_PATH-1); + NewIcc ->PhysicalFile[MAX_PATH-1] = 0; // Save LUT as 8 bit @@ -2609,14 +2638,14 @@ cmsHPROFILE LCMSEXPORT cmsOpenProfileFromMem(LPVOID MemPtr, DWORD dwSize) -BOOL LCMSEXPORT cmsCloseProfile(cmsHPROFILE hProfile) +LCMSBOOL LCMSEXPORT cmsCloseProfile(cmsHPROFILE hProfile) { LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile; - BOOL rc = TRUE; + LCMSBOOL rc = TRUE; + icInt32Number i; if (!Icc) return FALSE; - // Was open in write mode? if (Icc ->IsWrite) { @@ -2624,21 +2653,15 @@ BOOL LCMSEXPORT cmsCloseProfile(cmsHPROFILE hProfile) rc = _cmsSaveProfile(hProfile, Icc ->PhysicalFile); } - - if (Icc -> stream == NULL) { // Was a memory (i.e. not serialized) profile? - - - icInt32Number i; // Yes, free tags - - for (i=0; i < Icc -> TagCount; i++) { + for (i=0; i < Icc -> TagCount; i++) { if (Icc -> TagPtrs[i]) free(Icc -> TagPtrs[i]); - } - } - else Icc -> Close(Icc); // No, close the stream + if (Icc -> stream != NULL) { // Was a memory (i.e. not serialized) profile? + Icc -> Close(Icc); // No, close the stream + } free(Icc); // Free placeholder memory @@ -2652,11 +2675,11 @@ BOOL LCMSEXPORT cmsCloseProfile(cmsHPROFILE hProfile) static -BOOL SaveWordsTable(int nEntries, LPWORD Tab, LPLCMSICCPROFILE Icc) +LCMSBOOL SaveWordsTable(int nEntries, LPWORD Tab, LPLCMSICCPROFILE Icc) { size_t nTabSize = sizeof(WORD) * nEntries; - LPWORD PtrW = (LPWORD) malloc(nTabSize); - BOOL rc; + LPWORD PtrW = (LPWORD) _cmsMalloc(nTabSize); + LCMSBOOL rc; if (!PtrW) return FALSE; CopyMemory(PtrW, Tab, nTabSize); @@ -2672,7 +2695,7 @@ BOOL SaveWordsTable(int nEntries, LPWORD Tab, LPLCMSICCPROFILE Icc) // Saves profile header static -BOOL SaveHeader(LPLCMSICCPROFILE Icc) +LCMSBOOL SaveHeader(LPLCMSICCPROFILE Icc) { icHeader Header; time_t now = time(NULL); @@ -2727,7 +2750,7 @@ BOOL SaveHeader(LPLCMSICCPROFILE Icc) // Setup base marker static -BOOL SetupBase(icTagTypeSignature sig, LPLCMSICCPROFILE Icc) +LCMSBOOL SetupBase(icTagTypeSignature sig, LPLCMSICCPROFILE Icc) { icTagBase Base; @@ -2737,10 +2760,10 @@ BOOL SetupBase(icTagTypeSignature sig, LPLCMSICCPROFILE Icc) } -// Store an XYZ tag +// Store a XYZ tag static -BOOL SaveXYZNumber(LPcmsCIEXYZ Value, LPLCMSICCPROFILE Icc) +LCMSBOOL SaveXYZNumber(LPcmsCIEXYZ Value, LPLCMSICCPROFILE Icc) { icXYZNumber XYZ; @@ -2756,72 +2779,97 @@ BOOL SaveXYZNumber(LPcmsCIEXYZ Value, LPLCMSICCPROFILE Icc) } +// Store a XYZ array. + +static +LCMSBOOL SaveXYZArray(int n, LPcmsCIEXYZ Value, LPLCMSICCPROFILE Icc) +{ + int i; + icXYZNumber XYZ; + + if (!SetupBase(icSigS15Fixed16ArrayType, Icc)) return FALSE; + + for (i=0; i < n; i++) { + + XYZ.X = TransportValue32(DOUBLE_TO_FIXED(Value -> X)); + XYZ.Y = TransportValue32(DOUBLE_TO_FIXED(Value -> Y)); + XYZ.Z = TransportValue32(DOUBLE_TO_FIXED(Value -> Z)); + + if (!Icc -> Write(Icc, sizeof(icXYZNumber), &XYZ)) return FALSE; + + Value++; + } + + return TRUE; +} + + // Save a gamma structure as a table static -BOOL SaveGammaTable(LPGAMMATABLE Gamma, LPLCMSICCPROFILE Icc) +LCMSBOOL SaveGammaTable(LPGAMMATABLE Gamma, LPLCMSICCPROFILE Icc) { - icInt32Number Count; + icInt32Number Count; - if (!SetupBase(icSigCurveType, Icc)) return FALSE; + if (!SetupBase(icSigCurveType, Icc)) return FALSE; - Count = TransportValue32(Gamma->nEntries); + Count = TransportValue32(Gamma->nEntries); - if (!Icc ->Write(Icc, sizeof(icInt32Number), &Count)) return FALSE; + if (!Icc ->Write(Icc, sizeof(icInt32Number), &Count)) return FALSE; - return SaveWordsTable(Gamma->nEntries, Gamma ->GammaTable, Icc); + return SaveWordsTable(Gamma->nEntries, Gamma ->GammaTable, Icc); } // Save a gamma structure as a one-value static -BOOL SaveGammaOneValue(LPGAMMATABLE Gamma, LPLCMSICCPROFILE Icc) +LCMSBOOL SaveGammaOneValue(LPGAMMATABLE Gamma, LPLCMSICCPROFILE Icc) { - icInt32Number Count; - Fixed32 GammaFixed32; - WORD GammaFixed8; + icInt32Number Count; + Fixed32 GammaFixed32; + WORD GammaFixed8; - if (!SetupBase(icSigCurveType, Icc)) return FALSE; + if (!SetupBase(icSigCurveType, Icc)) return FALSE; - Count = TransportValue32(1); - if (!Icc ->Write(Icc, sizeof(icInt32Number), &Count)) return FALSE; + Count = TransportValue32(1); + if (!Icc ->Write(Icc, sizeof(icInt32Number), &Count)) return FALSE; - GammaFixed32 = DOUBLE_TO_FIXED(Gamma ->Seed.Params[0]); - GammaFixed8 = (WORD) ((GammaFixed32 >> 8) & 0xFFFF); - GammaFixed8 = TransportValue16(GammaFixed8); + GammaFixed32 = DOUBLE_TO_FIXED(Gamma ->Seed.Params[0]); + GammaFixed8 = (WORD) ((GammaFixed32 >> 8) & 0xFFFF); + GammaFixed8 = TransportValue16(GammaFixed8); - return Icc ->Write(Icc, sizeof(icInt16Number), &GammaFixed8); + return Icc ->Write(Icc, sizeof(icInt16Number), &GammaFixed8); } // Save a gamma structure as a parametric gamma static -BOOL SaveGammaParametric(LPGAMMATABLE Gamma, LPLCMSICCPROFILE Icc) +LCMSBOOL SaveGammaParametric(LPGAMMATABLE Gamma, LPLCMSICCPROFILE Icc) { - icUInt16Number Type, Reserved; - int i, nParams; - int ParamsByType[] = { 1, 3, 4, 5, 7 }; + icUInt16Number Type, Reserved; + int i, nParams; + int ParamsByType[] = { 1, 3, 4, 5, 7 }; - if (!SetupBase(icSigParametricCurveType, Icc)) return FALSE; + if (!SetupBase(icSigParametricCurveType, Icc)) return FALSE; - nParams = ParamsByType[Gamma -> Seed.Type]; + nParams = ParamsByType[Gamma -> Seed.Type]; - Type = (icUInt16Number) TransportValue16((WORD) Gamma -> Seed. Type); - Reserved = (icUInt16Number) TransportValue16((WORD) 0); + Type = (icUInt16Number) TransportValue16((WORD) Gamma -> Seed. Type); + Reserved = (icUInt16Number) TransportValue16((WORD) 0); - Icc -> Write(Icc, sizeof(icInt16Number), &Type); - Icc -> Write(Icc, sizeof(icUInt16Number), &Reserved); + Icc -> Write(Icc, sizeof(icInt16Number), &Type); + Icc -> Write(Icc, sizeof(icUInt16Number), &Reserved); - for (i=0; i < nParams; i++) { + for (i=0; i < nParams; i++) { - icInt32Number val = TransportValue32(DOUBLE_TO_FIXED(Gamma -> Seed.Params[i])); - Icc ->Write(Icc, sizeof(icInt32Number), &val); - } + icInt32Number val = TransportValue32(DOUBLE_TO_FIXED(Gamma -> Seed.Params[i])); + Icc ->Write(Icc, sizeof(icInt32Number), &val); + } - return TRUE; + return TRUE; } @@ -2829,29 +2877,29 @@ BOOL SaveGammaParametric(LPGAMMATABLE Gamma, LPLCMSICCPROFILE Icc) // Save a gamma table static -BOOL SaveGamma(LPGAMMATABLE Gamma, LPLCMSICCPROFILE Icc) +LCMSBOOL SaveGamma(LPGAMMATABLE Gamma, LPLCMSICCPROFILE Icc) { - // Is the gamma curve type supported by ICC format? + // Is the gamma curve type supported by ICC format? - if (Gamma -> Seed.Type < 0 || Gamma -> Seed.Type > 5 || + if (Gamma -> Seed.Type < 0 || Gamma -> Seed.Type > 5 || - // has been modified by user? + // has been modified by user? - _cmsCrc32OfGammaTable(Gamma) != Gamma -> Seed.Crc32) { + _cmsCrc32OfGammaTable(Gamma) != Gamma -> Seed.Crc32) { - return SaveGammaTable(Gamma, Icc); - } + return SaveGammaTable(Gamma, Icc); + } - if (Gamma -> Seed.Type == 1) return SaveGammaOneValue(Gamma, Icc); + if (Gamma -> Seed.Type == 1) return SaveGammaOneValue(Gamma, Icc); - // Only v4 profiles are allowed to hold parametric curves + // Only v4 profiles are allowed to hold parametric curves - if (cmsGetProfileICCversion((cmsHPROFILE) Icc) >= 0x4000000) - return SaveGammaParametric(Gamma, Icc); + if (cmsGetProfileICCversion((cmsHPROFILE) Icc) >= 0x4000000) + return SaveGammaParametric(Gamma, Icc); - // Defaults to save as table + // Defaults to save as table - return SaveGammaTable(Gamma, Icc); + return SaveGammaTable(Gamma, Icc); } @@ -2861,7 +2909,7 @@ BOOL SaveGamma(LPGAMMATABLE Gamma, LPLCMSICCPROFILE Icc) // Save an DESC Tag static -BOOL SaveDescription(const char *Text, LPLCMSICCPROFILE Icc) +LCMSBOOL SaveDescription(const char *Text, LPLCMSICCPROFILE Icc) { icUInt32Number len, Count, TotalSize, AlignedSize; @@ -2893,6 +2941,11 @@ BOOL SaveDescription(const char *Text, LPLCMSICCPROFILE Icc) if (!Icc ->Write(Icc, len, (LPVOID)Text)) return FALSE; AlignedSize -= len; + if (AlignedSize < 0) + AlignedSize = 0; + if (AlignedSize > 255) + AlignedSize = 255; + ZeroMemory(Filler, AlignedSize); if (!Icc ->Write(Icc, AlignedSize, Filler)) return FALSE; @@ -2902,7 +2955,7 @@ BOOL SaveDescription(const char *Text, LPLCMSICCPROFILE Icc) // Save an ASCII Tag static -BOOL SaveText(const char *Text, LPLCMSICCPROFILE Icc) +LCMSBOOL SaveText(const char *Text, LPLCMSICCPROFILE Icc) { size_t len = strlen(Text) + 1; @@ -2915,7 +2968,7 @@ BOOL SaveText(const char *Text, LPLCMSICCPROFILE Icc) // Save one of these new chromaticity values static -BOOL SaveOneChromaticity(double x, double y, LPLCMSICCPROFILE Icc) +LCMSBOOL SaveOneChromaticity(double x, double y, LPLCMSICCPROFILE Icc) { Fixed32 xf, yf; @@ -2932,7 +2985,7 @@ BOOL SaveOneChromaticity(double x, double y, LPLCMSICCPROFILE Icc) // New tag added in Addendum II of old spec. static -BOOL SaveChromaticities(LPcmsCIExyYTRIPLE chrm, LPLCMSICCPROFILE Icc) +LCMSBOOL SaveChromaticities(LPcmsCIExyYTRIPLE chrm, LPLCMSICCPROFILE Icc) { WORD nChans, Table; @@ -2952,7 +3005,7 @@ BOOL SaveChromaticities(LPcmsCIExyYTRIPLE chrm, LPLCMSICCPROFILE Icc) static -BOOL SaveSequenceDescriptionTag(LPcmsSEQ seq, LPLCMSICCPROFILE Icc) +LCMSBOOL SaveSequenceDescriptionTag(LPcmsSEQ seq, LPLCMSICCPROFILE Icc) { icUInt32Number nSeqs; icDescStruct DescStruct; @@ -2989,7 +3042,7 @@ BOOL SaveSequenceDescriptionTag(LPcmsSEQ seq, LPLCMSICCPROFILE Icc) // Saves a timestamp tag static -BOOL SaveDateTimeNumber(const struct tm *DateTime, LPLCMSICCPROFILE Icc) +LCMSBOOL SaveDateTimeNumber(const struct tm *DateTime, LPLCMSICCPROFILE Icc) { icDateTimeNumber Dest; @@ -3003,14 +3056,14 @@ BOOL SaveDateTimeNumber(const struct tm *DateTime, LPLCMSICCPROFILE Icc) // Saves a named color list into a named color profile static -BOOL SaveNamedColorList(LPcmsNAMEDCOLORLIST NamedColorList, LPLCMSICCPROFILE Icc) +LCMSBOOL SaveNamedColorList(LPcmsNAMEDCOLORLIST NamedColorList, LPLCMSICCPROFILE Icc) { icUInt32Number vendorFlag; // Bottom 16 bits for IC use icUInt32Number count; // Count of named colors icUInt32Number nDeviceCoords; // Num of device coordinates - icInt8Number prefix[32]; // Prefix for each color name - icInt8Number suffix[32]; // Suffix for each color name + char prefix[32]; // Prefix for each color name + char suffix[32]; // Suffix for each color name int i; if (!SetupBase(icSigNamedColor2Type, Icc)) return FALSE; @@ -3019,8 +3072,10 @@ BOOL SaveNamedColorList(LPcmsNAMEDCOLORLIST NamedColorList, LPLCMSICCPROFILE Icc count = TransportValue32(NamedColorList ->nColors); nDeviceCoords = TransportValue32(NamedColorList ->ColorantCount); - strncpy(prefix, (const char*) NamedColorList->Prefix, 32); - strncpy(suffix, (const char*) NamedColorList->Suffix, 32); + strncpy(prefix, (const char*) NamedColorList->Prefix, 31); + strncpy(suffix, (const char*) NamedColorList->Suffix, 31); + + suffix[31] = prefix[31] = 0; if (!Icc ->Write(Icc, sizeof(icUInt32Number), &vendorFlag)) return FALSE; if (!Icc ->Write(Icc, sizeof(icUInt32Number), &count)) return FALSE; @@ -3030,15 +3085,17 @@ BOOL SaveNamedColorList(LPcmsNAMEDCOLORLIST NamedColorList, LPLCMSICCPROFILE Icc for (i=0; i < NamedColorList ->nColors; i++) { - icUInt16Number PCS[3]; - icUInt16Number Colorant[MAXCHANNELS]; - icInt8Number root[32]; + icUInt16Number PCS[3]; + icUInt16Number Colorant[MAXCHANNELS]; + char root[32]; LPcmsNAMEDCOLOR Color; int j; Color = NamedColorList ->List + i; - strncpy((char*) root, Color ->Name, 32); + strncpy(root, Color ->Name, 32); + Color ->Name[32] = 0; + if (!Icc ->Write(Icc, 32 , root)) return FALSE; for (j=0; j < 3; j++) @@ -3062,7 +3119,7 @@ BOOL SaveNamedColorList(LPcmsNAMEDCOLORLIST NamedColorList, LPLCMSICCPROFILE Icc // Saves a colorant table. It is using the named color structure for simplicity sake static -BOOL SaveColorantTable(LPcmsNAMEDCOLORLIST NamedColorList, LPLCMSICCPROFILE Icc) +LCMSBOOL SaveColorantTable(LPcmsNAMEDCOLORLIST NamedColorList, LPLCMSICCPROFILE Icc) { icUInt32Number count; // Count of named colors int i; @@ -3076,13 +3133,15 @@ BOOL SaveColorantTable(LPcmsNAMEDCOLORLIST NamedColorList, LPLCMSICCPROFILE Icc) for (i=0; i < NamedColorList ->nColors; i++) { icUInt16Number PCS[3]; - icInt8Number root[32]; + icInt8Number root[33]; LPcmsNAMEDCOLOR Color; int j; Color = NamedColorList ->List + i; strncpy((char*) root, Color ->Name, 32); + root[32] = 0; + if (!Icc ->Write(Icc, 32 , root)) return FALSE; for (j=0; j < 3; j++) @@ -3099,7 +3158,7 @@ BOOL SaveColorantTable(LPcmsNAMEDCOLORLIST NamedColorList, LPLCMSICCPROFILE Icc) // Does serialization of LUT16 and writes it. static -BOOL SaveLUT(const LUT* NewLUT, LPLCMSICCPROFILE Icc) +LCMSBOOL SaveLUT(const LUT* NewLUT, LPLCMSICCPROFILE Icc) { icLut16 LUT16; unsigned int i; @@ -3189,7 +3248,7 @@ BOOL SaveLUT(const LUT* NewLUT, LPLCMSICCPROFILE Icc) // Does serialization of LUT8 and writes it static -BOOL SaveLUT8(const LUT* NewLUT, LPLCMSICCPROFILE Icc) +LCMSBOOL SaveLUT8(const LUT* NewLUT, LPLCMSICCPROFILE Icc) { icLut8 LUT8; unsigned int i, j; @@ -3323,7 +3382,7 @@ void LCMSEXPORT _cmsSetLUTdepth(cmsHPROFILE hProfile, int depth) // Saves Tag directory static -BOOL SaveTagDirectory(LPLCMSICCPROFILE Icc) +LCMSBOOL SaveTagDirectory(LPLCMSICCPROFILE Icc) { icInt32Number i; icTag Tag; @@ -3356,7 +3415,7 @@ BOOL SaveTagDirectory(LPLCMSICCPROFILE Icc) // Dump tag contents static -BOOL SaveTags(LPLCMSICCPROFILE Icc) +LCMSBOOL SaveTags(LPLCMSICCPROFILE Icc, LPLCMSICCPROFILE FileOrig) { LPBYTE Data; @@ -3384,8 +3443,31 @@ BOOL SaveTags(LPLCMSICCPROFILE Icc) Icc -> TagOffsets[i] = Begin = Icc ->UsedSpace; Data = (LPBYTE) Icc -> TagPtrs[i]; - if (!Data) + if (!Data) { + + // Reach here if we are copying a tag from a disk-based ICC profile which has not been modified by user. + // In this case a blind copy of the block data is performed + + if (Icc -> TagOffsets[i]) { + + size_t TagSize = FileOrig -> TagSizes[i]; + size_t TagOffset = FileOrig -> TagOffsets[i]; + void* Mem; + + if (FileOrig ->Seek(FileOrig, TagOffset)) return FALSE; + + Mem = _cmsMalloc(TagSize); + + if (FileOrig ->Read(Mem, TagSize, 1, FileOrig) != 1) return FALSE; + if (!Icc ->Write(Icc, TagSize, Mem)) return FALSE; + + Icc -> TagSizes[i] = (Icc ->UsedSpace - Begin); + free(Mem); + } + continue; + } + switch (Icc -> TagNames[i]) { @@ -3464,6 +3546,10 @@ BOOL SaveTags(LPLCMSICCPROFILE Icc) break; + case icSigChromaticAdaptationTag: + if (!SaveXYZArray(3, (LPcmsCIEXYZ) Data, Icc)) return FALSE; + break; + default: return FALSE; } @@ -3480,9 +3566,9 @@ BOOL SaveTags(LPLCMSICCPROFILE Icc) // Add tags to profile structure -BOOL LCMSEXPORT cmsAddTag(cmsHPROFILE hProfile, icTagSignature sig, const void* Tag) +LCMSBOOL LCMSEXPORT cmsAddTag(cmsHPROFILE hProfile, icTagSignature sig, const void* Tag) { - BOOL rc; + LCMSBOOL rc; switch (sig) { @@ -3543,6 +3629,11 @@ BOOL LCMSEXPORT cmsAddTag(cmsHPROFILE hProfile, icTagSignature sig, const void* rc = _cmsAddColorantTableTag(hProfile, sig, (LPcmsNAMEDCOLORLIST) Tag); break; + + case icSigChromaticAdaptationTag: + rc = _cmsAddChromaticAdaptationTag(hProfile, sig, (const cmsCIEXYZ*) Tag); + break; + default: cmsSignalError(LCMS_ERRC_ABORTED, "cmsAddTag: Tag '%x' is unsupported", sig); return FALSE; @@ -3568,11 +3659,11 @@ BOOL LCMSEXPORT cmsAddTag(cmsHPROFILE hProfile, icTagSignature sig, const void* // Low-level save to disk. It closes the profile on exit -BOOL LCMSEXPORT _cmsSaveProfile(cmsHPROFILE hProfile, const char* FileName) +LCMSBOOL LCMSEXPORT _cmsSaveProfile(cmsHPROFILE hProfile, const char* FileName) { LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile; LCMSICCPROFILE Keep; - BOOL rc; + LCMSBOOL rc; CopyMemory(&Keep, Icc, sizeof(LCMSICCPROFILE)); _cmsSetSaveToDisk(Icc, NULL); @@ -3581,7 +3672,7 @@ BOOL LCMSEXPORT _cmsSaveProfile(cmsHPROFILE hProfile, const char* FileName) if (!SaveHeader(Icc)) return FALSE; if (!SaveTagDirectory(Icc)) return FALSE; - if (!SaveTags(Icc)) return FALSE; + if (!SaveTags(Icc, &Keep)) return FALSE; _cmsSetSaveToDisk(Icc, FileName); @@ -3591,7 +3682,7 @@ BOOL LCMSEXPORT _cmsSaveProfile(cmsHPROFILE hProfile, const char* FileName) if (!SaveHeader(Icc)) goto CleanUp; if (!SaveTagDirectory(Icc)) goto CleanUp; - if (!SaveTags(Icc)) goto CleanUp; + if (!SaveTags(Icc, &Keep)) goto CleanUp; rc = (Icc ->Close(Icc) == 0); CopyMemory(Icc, &Keep, sizeof(LCMSICCPROFILE)); @@ -3608,7 +3699,7 @@ BOOL LCMSEXPORT _cmsSaveProfile(cmsHPROFILE hProfile, const char* FileName) // Low-level save from open stream -BOOL LCMSEXPORT _cmsSaveProfileToMem(cmsHPROFILE hProfile, void *MemPtr, +LCMSBOOL LCMSEXPORT _cmsSaveProfileToMem(cmsHPROFILE hProfile, void *MemPtr, size_t* BytesNeeded) { LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile; @@ -3623,20 +3714,20 @@ BOOL LCMSEXPORT _cmsSaveProfileToMem(cmsHPROFILE hProfile, void *MemPtr, if (!SaveHeader(Icc)) return FALSE; if (!SaveTagDirectory(Icc)) return FALSE; - if (!SaveTags(Icc)) return FALSE; + if (!SaveTags(Icc, &Keep)) return FALSE; if (!MemPtr) { // update BytesSaved so caller knows how many bytes are needed for MemPtr *BytesNeeded = Icc ->UsedSpace; - CopyMemory(Icc, &Keep, sizeof(LCMSICCPROFILE)); + CopyMemory(Icc, &Keep, sizeof(LCMSICCPROFILE)); return TRUE; } if (*BytesNeeded < Icc ->UsedSpace) { // need at least UsedSpace in MemPtr to continue - CopyMemory(Icc, &Keep, sizeof(LCMSICCPROFILE)); + CopyMemory(Icc, &Keep, sizeof(LCMSICCPROFILE)); return FALSE; } @@ -3646,7 +3737,7 @@ BOOL LCMSEXPORT _cmsSaveProfileToMem(cmsHPROFILE hProfile, void *MemPtr, // Pass #2 does save to file into supplied stream if (!SaveHeader(Icc)) goto CleanUp; if (!SaveTagDirectory(Icc)) goto CleanUp; - if (!SaveTags(Icc)) goto CleanUp; + if (!SaveTags(Icc, &Keep)) goto CleanUp; // update BytesSaved so caller knows how many bytes put into stream *BytesNeeded = Icc ->UsedSpace; @@ -3661,3 +3752,4 @@ CleanUp: CopyMemory(Icc, &Keep, sizeof(LCMSICCPROFILE)); return FALSE; } + diff --git a/jdk/src/share/native/sun/java2d/cmm/lcms/cmslut.c b/jdk/src/share/native/sun/java2d/cmm/lcms/cmslut.c index 43032109121..1a222febf86 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmslut.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmslut.c @@ -29,7 +29,7 @@ // // // Little cms -// Copyright (C) 1998-2006 Marti Maria +// Copyright (C) 1998-2007 Marti Maria // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -118,7 +118,7 @@ LPLUT LCMSEXPORT cmsAllocLUT(void) { LPLUT NewLUT; - NewLUT = (LPLUT) malloc(sizeof(LUT)); + NewLUT = (LPLUT) _cmsMalloc(sizeof(LUT)); if (NewLUT) ZeroMemory(NewLUT, sizeof(LUT)); @@ -171,9 +171,10 @@ void LCMSEXPORT cmsFreeLUT(LPLUT Lut) static LPVOID DupBlockTab(LPVOID Org, size_t size) { - LPVOID mem = malloc(size); + LPVOID mem = _cmsMalloc(size); + if (mem != NULL) + CopyMemory(mem, Org, size); - CopyMemory(mem, Org, size); return mem; } @@ -211,6 +212,37 @@ unsigned int UIpow(unsigned int a, unsigned int b) } +LCMSBOOL _cmsValidateLUT(LPLUT NewLUT) +{ + unsigned int calc = 1; + unsigned int oldCalc; + unsigned int power = NewLUT -> InputChan; + + if (NewLUT -> cLutPoints > 100) return FALSE; + if (NewLUT -> InputChan > MAXCHANNELS) return FALSE; + if (NewLUT -> OutputChan > MAXCHANNELS) return FALSE; + + if (NewLUT -> cLutPoints == 0) return TRUE; + + for (; power > 0; power--) { + + oldCalc = calc; + calc *= NewLUT -> cLutPoints; + + if (calc / NewLUT -> cLutPoints != oldCalc) { + return FALSE; + } + } + + oldCalc = calc; + calc *= NewLUT -> OutputChan; + if (NewLUT -> OutputChan && calc / NewLUT -> OutputChan != oldCalc) { + return FALSE; + } + + return TRUE; +} + LPLUT LCMSEXPORT cmsAlloc3DGrid(LPLUT NewLUT, int clutPoints, int inputChan, int outputChan) { DWORD nTabSize; @@ -220,12 +252,17 @@ LPLUT LCMSEXPORT cmsAlloc3DGrid(LPLUT NewLUT, int clutPoints, int inputChan, int NewLUT -> InputChan = inputChan; NewLUT -> OutputChan = outputChan; + if (!_cmsValidateLUT(NewLUT)) { + return NULL; + } - nTabSize = (NewLUT -> OutputChan * UIpow(NewLUT->cLutPoints, - NewLUT->InputChan) - * sizeof(WORD)); + nTabSize = NewLUT -> OutputChan * UIpow(NewLUT->cLutPoints, + NewLUT->InputChan); + + NewLUT -> T = (LPWORD) _cmsCalloc(sizeof(WORD), nTabSize); + nTabSize *= sizeof(WORD); + if (NewLUT -> T == NULL) return NULL; - NewLUT -> T = (LPWORD) malloc(nTabSize); ZeroMemory(NewLUT -> T, nTabSize); NewLUT ->Tsize = nTabSize; @@ -254,10 +291,12 @@ LPLUT LCMSEXPORT cmsAllocLinearTable(LPLUT NewLUT, LPGAMMATABLE Tables[], int nT for (i=0; i < NewLUT -> InputChan; i++) { - PtrW = (LPWORD) malloc(sizeof(WORD) * NewLUT -> InputEntries); + PtrW = (LPWORD) _cmsMalloc(sizeof(WORD) * NewLUT -> InputEntries); + if (PtrW == NULL) return NULL; + NewLUT -> L1[i] = PtrW; CopyMemory(PtrW, Tables[i]->GammaTable, sizeof(WORD) * NewLUT -> InputEntries); - CopyMemory(&NewLUT -> LCurvesSeed[0][i], &Tables[i] -> Seed, sizeof(LCMSGAMMAPARAMS)); + CopyMemory(&NewLUT -> LCurvesSeed[0][i], &Tables[i] -> Seed, sizeof(LCMSGAMMAPARAMS)); } @@ -268,10 +307,12 @@ LPLUT LCMSEXPORT cmsAllocLinearTable(LPLUT NewLUT, LPGAMMATABLE Tables[], int nT NewLUT -> OutputEntries = Tables[0] -> nEntries; for (i=0; i < NewLUT -> OutputChan; i++) { - PtrW = (LPWORD) malloc(sizeof(WORD) * NewLUT -> OutputEntries); + PtrW = (LPWORD) _cmsMalloc(sizeof(WORD) * NewLUT -> OutputEntries); + if (PtrW == NULL) return NULL; + NewLUT -> L2[i] = PtrW; CopyMemory(PtrW, Tables[i]->GammaTable, sizeof(WORD) * NewLUT -> OutputEntries); - CopyMemory(&NewLUT -> LCurvesSeed[1][i], &Tables[i] -> Seed, sizeof(LCMSGAMMAPARAMS)); + CopyMemory(&NewLUT -> LCurvesSeed[1][i], &Tables[i] -> Seed, sizeof(LCMSGAMMAPARAMS)); } break; @@ -285,10 +326,12 @@ LPLUT LCMSEXPORT cmsAllocLinearTable(LPLUT NewLUT, LPGAMMATABLE Tables[], int nT for (i=0; i < NewLUT -> InputChan; i++) { - PtrW = (LPWORD) malloc(sizeof(WORD) * NewLUT -> L3Entries); + PtrW = (LPWORD) _cmsMalloc(sizeof(WORD) * NewLUT -> L3Entries); + if (PtrW == NULL) return NULL; + NewLUT -> L3[i] = PtrW; CopyMemory(PtrW, Tables[i]->GammaTable, sizeof(WORD) * NewLUT -> L3Entries); - CopyMemory(&NewLUT -> LCurvesSeed[2][i], &Tables[i] -> Seed, sizeof(LCMSGAMMAPARAMS)); + CopyMemory(&NewLUT -> LCurvesSeed[2][i], &Tables[i] -> Seed, sizeof(LCMSGAMMAPARAMS)); } break; @@ -298,10 +341,12 @@ LPLUT LCMSEXPORT cmsAllocLinearTable(LPLUT NewLUT, LPGAMMATABLE Tables[], int nT NewLUT -> L4Entries = Tables[0] -> nEntries; for (i=0; i < NewLUT -> OutputChan; i++) { - PtrW = (LPWORD) malloc(sizeof(WORD) * NewLUT -> L4Entries); + PtrW = (LPWORD) _cmsMalloc(sizeof(WORD) * NewLUT -> L4Entries); + if (PtrW == NULL) return NULL; + NewLUT -> L4[i] = PtrW; CopyMemory(PtrW, Tables[i]->GammaTable, sizeof(WORD) * NewLUT -> L4Entries); - CopyMemory(&NewLUT -> LCurvesSeed[3][i], &Tables[i] -> Seed, sizeof(LCMSGAMMAPARAMS)); + CopyMemory(&NewLUT -> LCurvesSeed[3][i], &Tables[i] -> Seed, sizeof(LCMSGAMMAPARAMS)); } break; @@ -580,7 +625,7 @@ LPLUT _cmsBlessLUT8(LPLUT Lut) LPL16PARAMS p = &Lut ->CLut16params; - p8 = (LPL8PARAMS) malloc(sizeof(L8PARAMS)); + p8 = (LPL8PARAMS) _cmsMalloc(sizeof(L8PARAMS)); if (p8 == NULL) return NULL; // values comes * 257, so we can safely take first byte (x << 8 + x) @@ -593,8 +638,8 @@ LPLUT _cmsBlessLUT8(LPLUT Lut) if (Lut ->wFlags & LUT_HASTL1) { for (j=0; j < 3; j++) - StageABC[i] = cmsLinearInterpLUT16(StageABC[i], - Lut -> L1[i], + StageABC[j] = cmsLinearInterpLUT16(StageABC[j], + Lut -> L1[j], &Lut -> In16params); Lut ->wFlags &= ~LUT_HASTL1; } @@ -697,7 +742,7 @@ void EvalLUTdoubleKLab(LPLUT Lut, const VEC3* In, WORD FixedK, LPcmsCIELab Out) wIn[3] = FixedK; cmsEvalLUT(Lut, wIn, wOut); - cmsLabEncoded2Float(Out, wOut); + cmsLabEncoded2Float(Out, wOut); } // Builds a Jacobian CMY->Lab @@ -722,9 +767,9 @@ void ComputeJacobianLab(LPLUT Lut, LPMAT3 Jacobian, const VEC3* Colorant, WORD K EvalLUTdoubleKLab(Lut, &ColorantD, K, &LabD); - Jacobian->v[0].n[j] = ((LabD.L - Lab.L) / JACOBIAN_EPSILON); - Jacobian->v[1].n[j] = ((LabD.a - Lab.a) / JACOBIAN_EPSILON); - Jacobian->v[2].n[j] = ((LabD.b - Lab.b) / JACOBIAN_EPSILON); + Jacobian->v[0].n[j] = ((LabD.L - Lab.L) / JACOBIAN_EPSILON); + Jacobian->v[1].n[j] = ((LabD.a - Lab.a) / JACOBIAN_EPSILON); + Jacobian->v[2].n[j] = ((LabD.b - Lab.b) / JACOBIAN_EPSILON); } } @@ -797,18 +842,18 @@ LCMSAPI double LCMSEXPORT cmsEvalLUTreverse(LPLUT Lut, WORD Target[], WORD Resul // Obtain slope ComputeJacobianLab(Lut, &Jacobian, &x, FixedK); - // Solve system - tmp2.n[0] = fx.L - Goal.L; - tmp2.n[1] = fx.a - Goal.a; - tmp2.n[2] = fx.b - Goal.b; + // Solve system + tmp2.n[0] = fx.L - Goal.L; + tmp2.n[1] = fx.a - Goal.a; + tmp2.n[2] = fx.b - Goal.b; - if (!MAT3solve(&tmp, &Jacobian, &tmp2)) - break; + if (!MAT3solve(&tmp, &Jacobian, &tmp2)) + break; // Move our guess - x.n[0] -= tmp.n[0]; - x.n[1] -= tmp.n[1]; - x.n[2] -= tmp.n[2]; + x.n[0] -= tmp.n[0]; + x.n[1] -= tmp.n[1]; + x.n[2] -= tmp.n[2]; // Some clipping.... VEC3saturate(&x); @@ -822,3 +867,6 @@ LCMSAPI double LCMSEXPORT cmsEvalLUTreverse(LPLUT Lut, WORD Target[], WORD Resul return LastError; } + + + diff --git a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsmatsh.c b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsmatsh.c index c70829989b2..9a6576bce23 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsmatsh.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsmatsh.c @@ -29,7 +29,7 @@ // // // Little cms -// Copyright (C) 1998-2006 Marti Maria +// Copyright (C) 1998-2007 Marti Maria // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -62,6 +62,7 @@ // data yet in fixed point, so no additional process is required. // Then, we obtain data on 15.16, so we need to shift >> by 1 to // obtain 1.15 PCS format. + // On OUTPUT profiles, things are inverse, we must first expand 1 bit // by shifting left, and then convert result between 0 and 1.000 to // RGB, so FromFixedDomain() must be called before pass values to @@ -71,6 +72,7 @@ // input is encoded from 0 to 0xffff, we must first use the shaper and // then the matrix, an additional FromFixedDomain() must be used to // accomodate output values. + // For a sake of simplicity, I will handle this three behaviours // with different routines, so the flags MATSHAPER_INPUT and MATSHAPER_OUTPUT // can be conbined to signal smelted matrix-shapers @@ -89,7 +91,7 @@ int ComputeTables(LPGAMMATABLE Table[3], LPWORD Out[3], LPL16PARAMS p16) { LPWORD PtrW; - PtrW = (LPWORD) malloc(sizeof(WORD) * p16 -> nSamples); + PtrW = (LPWORD) _cmsMalloc(sizeof(WORD) * p16 -> nSamples); if (PtrW == NULL) return -1; // Signal error @@ -119,7 +121,7 @@ LPMATSHAPER cmsAllocMatShaper2(LPMAT3 Matrix, LPGAMMATABLE In[], LPGAMMATABLE Ou LPMATSHAPER NewMatShaper; int rc; - NewMatShaper = (LPMATSHAPER) malloc(sizeof(MATSHAPER)); + NewMatShaper = (LPMATSHAPER) _cmsMalloc(sizeof(MATSHAPER)); if (NewMatShaper) ZeroMemory(NewMatShaper, sizeof(MATSHAPER)); @@ -171,7 +173,13 @@ LPMATSHAPER cmsAllocMatShaper(LPMAT3 Matrix, LPGAMMATABLE Tables[], DWORD Behavi LPMATSHAPER NewMatShaper; int i, AllLinear; - NewMatShaper = (LPMATSHAPER) malloc(sizeof(MATSHAPER)); + if (Matrix == NULL) return NULL; + for (i=0; i < 3; i++) { + + if (Tables[i] == NULL) return NULL; + } + + NewMatShaper = (LPMATSHAPER) _cmsMalloc(sizeof(MATSHAPER)); if (NewMatShaper) ZeroMemory(NewMatShaper, sizeof(MATSHAPER)); @@ -187,17 +195,16 @@ LPMATSHAPER cmsAllocMatShaper(LPMAT3 Matrix, LPGAMMATABLE Tables[], DWORD Behavi NewMatShaper -> dwFlags |= MATSHAPER_HASMATRIX; // Now, on the table characteristics - cmsCalcL16Params(Tables[0] -> nEntries, &NewMatShaper -> p16); // Copy tables AllLinear = 0; - for (i=0; i < 3; i++) - { + for (i=0; i < 3; i++) { + LPWORD PtrW; - PtrW = (LPWORD) malloc(sizeof(WORD) * NewMatShaper -> p16.nSamples); + PtrW = (LPWORD) _cmsMalloc(sizeof(WORD) * NewMatShaper -> p16.nSamples); if (PtrW == NULL) { cmsFreeMatShaper(NewMatShaper); @@ -235,11 +242,11 @@ void cmsFreeMatShaper(LPMATSHAPER MatShaper) for (i=0; i < 3; i++) { - if (MatShaper -> L[i]) free(MatShaper ->L[i]); - if (MatShaper -> L2[i]) free(MatShaper ->L2[i]); + if (MatShaper -> L[i]) _cmsFree(MatShaper ->L[i]); + if (MatShaper -> L2[i]) _cmsFree(MatShaper ->L2[i]); } - free(MatShaper); + _cmsFree(MatShaper); } diff --git a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsmtrx.c b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsmtrx.c index b404fdc6924..f6bc3cb5a59 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsmtrx.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsmtrx.c @@ -29,7 +29,7 @@ // // // Little cms -// Copyright (C) 1998-2006 Marti Maria +// Copyright (C) 1998-2007 Marti Maria // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -71,16 +71,16 @@ double cdecl VEC3length(LPVEC3 a); double cdecl VEC3distance(LPVEC3 a, LPVEC3 b); -void cdecl MAT3identity(LPMAT3 a); -void cdecl MAT3per(LPMAT3 r, LPMAT3 a, LPMAT3 b); -int cdecl MAT3inverse(LPMAT3 a, LPMAT3 b); -BOOL cdecl MAT3solve(LPVEC3 x, LPMAT3 a, LPVEC3 b); -double cdecl MAT3det(LPMAT3 m); -void cdecl MAT3eval(LPVEC3 r, LPMAT3 a, LPVEC3 v); -void cdecl MAT3toFix(LPWMAT3 r, LPMAT3 v); -void cdecl MAT3evalW(LPWVEC3 r, LPWMAT3 a, LPWVEC3 v); -void cdecl MAT3perK(LPMAT3 r, LPMAT3 v, double d); -void cdecl MAT3scaleAndCut(LPWMAT3 r, LPMAT3 v, double d); +void cdecl MAT3identity(LPMAT3 a); +void cdecl MAT3per(LPMAT3 r, LPMAT3 a, LPMAT3 b); +int cdecl MAT3inverse(LPMAT3 a, LPMAT3 b); +LCMSBOOL cdecl MAT3solve(LPVEC3 x, LPMAT3 a, LPVEC3 b); +double cdecl MAT3det(LPMAT3 m); +void cdecl MAT3eval(LPVEC3 r, LPMAT3 a, LPVEC3 v); +void cdecl MAT3toFix(LPWMAT3 r, LPMAT3 v); +void cdecl MAT3evalW(LPWVEC3 r, LPWMAT3 a, LPWVEC3 v); +void cdecl MAT3perK(LPMAT3 r, LPMAT3 v, double d); +void cdecl MAT3scaleAndCut(LPWMAT3 r, LPMAT3 v, double d); // --------------------- Implementation ---------------------------- @@ -345,13 +345,13 @@ void VEC3minus(LPVEC3 r, LPVEC3 a, LPVEC3 b) // Check id two vectors are the same, allowing tolerance static -BOOL RangeCheck(double l, double h, double v) +LCMSBOOL RangeCheck(double l, double h, double v) { return (v >= l && v <= h); } -BOOL VEC3equal(LPWVEC3 a, LPWVEC3 b, double Tolerance) +LCMSBOOL VEC3equal(LPWVEC3 a, LPWVEC3 b, double Tolerance) { int i; double c; @@ -367,7 +367,7 @@ BOOL VEC3equal(LPWVEC3 a, LPWVEC3 b, double Tolerance) return TRUE; } -BOOL VEC3equalF(LPVEC3 a, LPVEC3 b, double Tolerance) +LCMSBOOL VEC3equalF(LPVEC3 a, LPVEC3 b, double Tolerance) { int i; double c; @@ -462,7 +462,7 @@ void MAT3identity(LPMAT3 a) // Check if matrix is Identity. Allow a tolerance as % -BOOL MAT3isIdentity(LPWMAT3 a, double Tolerance) +LCMSBOOL MAT3isIdentity(LPWMAT3 a, double Tolerance) { int i; MAT3 Idd; @@ -545,16 +545,16 @@ int MAT3inverse(LPMAT3 a, LPMAT3 b) // Solve a system in the form Ax = b -BOOL MAT3solve(LPVEC3 x, LPMAT3 a, LPVEC3 b) +LCMSBOOL MAT3solve(LPVEC3 x, LPMAT3 a, LPVEC3 b) { - MAT3 m, a_1; + MAT3 m, a_1; - CopyMemory(&m, a, sizeof(MAT3)); + CopyMemory(&m, a, sizeof(MAT3)); - if (!MAT3inverse(&m, &a_1)) return FALSE; // Singular matrix + if (!MAT3inverse(&m, &a_1)) return FALSE; // Singular matrix - MAT3eval(x, &a_1, b); - return TRUE; + MAT3eval(x, &a_1, b); + return TRUE; } @@ -839,3 +839,7 @@ void MAT3scaleAndCut(LPWMAT3 r, LPMAT3 v, double d) VEC3scaleAndCut(&r -> v[1], &v -> v[1], d); VEC3scaleAndCut(&r -> v[2], &v -> v[2], d); } + + + + diff --git a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsnamed.c b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsnamed.c index c943badcb3b..c47d002f7cf 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsnamed.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsnamed.c @@ -29,7 +29,7 @@ // // // Little cms -// Copyright (C) 1998-2006 Marti Maria +// Copyright (C) 1998-2007 Marti Maria // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -74,7 +74,7 @@ LPcmsNAMEDCOLORLIST GrowNamedColorList(LPcmsNAMEDCOLORLIST v, int ByElements) NewElements *= 2; size = sizeof(cmsNAMEDCOLORLIST) + (sizeof(cmsNAMEDCOLOR) * NewElements); - TheNewList = (LPcmsNAMEDCOLORLIST) malloc(size); + TheNewList = (LPcmsNAMEDCOLORLIST) _cmsMalloc(size); if (TheNewList == NULL) { @@ -86,7 +86,7 @@ LPcmsNAMEDCOLORLIST GrowNamedColorList(LPcmsNAMEDCOLORLIST v, int ByElements) CopyMemory(TheNewList, v, sizeof(cmsNAMEDCOLORLIST) + (v ->nColors - 1) * sizeof(cmsNAMEDCOLOR)); TheNewList -> Allocated = NewElements; - free(v); + _cmsFree(v); return TheNewList; } } @@ -99,7 +99,7 @@ LPcmsNAMEDCOLORLIST cmsAllocNamedColorList(int n) { size_t size = sizeof(cmsNAMEDCOLORLIST) + (n - 1) * sizeof(cmsNAMEDCOLOR); - LPcmsNAMEDCOLORLIST v = (LPcmsNAMEDCOLORLIST) malloc(size); + LPcmsNAMEDCOLORLIST v = (LPcmsNAMEDCOLORLIST) _cmsMalloc(size); if (v == NULL) { @@ -124,10 +124,10 @@ void cmsFreeNamedColorList(LPcmsNAMEDCOLORLIST v) return; } - free(v); + _cmsFree(v); } -BOOL cmsAppendNamedColor(cmsHTRANSFORM xform, const char* Name, WORD PCS[3], WORD Colorant[MAXCHANNELS]) +LCMSBOOL cmsAppendNamedColor(cmsHTRANSFORM xform, const char* Name, WORD PCS[3], WORD Colorant[MAXCHANNELS]) { _LPcmsTRANSFORM v = (_LPcmsTRANSFORM) xform; LPcmsNAMEDCOLORLIST List; @@ -146,6 +146,7 @@ BOOL cmsAppendNamedColor(cmsHTRANSFORM xform, const char* Name, WORD PCS[3], WOR List ->List[List ->nColors].PCS[i] = PCS[i]; strncpy(List ->List[List ->nColors].Name, Name, MAX_PATH-1); + List ->List[List ->nColors].Name[MAX_PATH-1] = 0; List ->nColors++; return TRUE; @@ -164,18 +165,17 @@ int LCMSEXPORT cmsNamedColorCount(cmsHTRANSFORM xform) } -BOOL LCMSEXPORT cmsNamedColorInfo(cmsHTRANSFORM xform, int nColor, char* Name, char* Prefix, char* Suffix) +LCMSBOOL LCMSEXPORT cmsNamedColorInfo(cmsHTRANSFORM xform, int nColor, char* Name, char* Prefix, char* Suffix) { _LPcmsTRANSFORM v = (_LPcmsTRANSFORM) xform; - if (v ->NamedColorList == NULL) return FALSE; if (nColor < 0 || nColor >= cmsNamedColorCount(xform)) return FALSE; - if (Name) strncpy(Name, v ->NamedColorList->List[nColor].Name, 31); - if (Prefix) strncpy(Prefix, v ->NamedColorList->Prefix, 31); - if (Suffix) strncpy(Suffix, v ->NamedColorList->Suffix, 31); + if (Name) { strncpy(Name, v ->NamedColorList->List[nColor].Name, 31); Name[31] = 0; } + if (Prefix) { strncpy(Prefix, v ->NamedColorList->Prefix, 31); Prefix[31] = 0; } + if (Suffix) { strncpy(Suffix, v ->NamedColorList->Suffix, 31); Suffix[31] = 0; } return TRUE; } @@ -196,3 +196,5 @@ int LCMSEXPORT cmsNamedColorIndex(cmsHTRANSFORM xform, const char* Name) return -1; } + + diff --git a/jdk/src/share/native/sun/java2d/cmm/lcms/cmspack.c b/jdk/src/share/native/sun/java2d/cmm/lcms/cmspack.c index ca76c07844a..6c5ef725635 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmspack.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmspack.c @@ -28,7 +28,7 @@ // file: // // Little cms -// Copyright (C) 1998-2006 Marti Maria +// Copyright (C) 1998-2007 Marti Maria // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -639,9 +639,81 @@ LPBYTE UnrollDouble(register _LPcmsTRANSFORM info, register WORD wIn[], register +static +LPBYTE UnrollDouble1Chan(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum) +{ + double* Inks = (double*) accum; + double v; + + + v = floor(Inks[0] * 65535.0 + 0.5); + + if (v > 65535.0) v = 65535.0; + if (v < 0) v = 0; + + + wIn[0] = wIn[1] = wIn[2] = (WORD) v; + + return accum + sizeof(double); +} + + // ----------------------------------------------------------- Packing routines +// Generic N-bytes plus dither 16-to-8 conversion. Currently is just a quick hack + +static int err[MAXCHANNELS]; + +static +LPBYTE PackNBytesDither(register _LPcmsTRANSFORM info, register WORD wOut[], register LPBYTE output) +{ + int nChan = T_CHANNELS(info -> OutputFormat); + register int i; + unsigned int n, pe, pf; + + for (i=0; i < nChan; i++) { + + n = wOut[i] + err[i]; // Value + + pe = (n / 257); // Whole part + pf = (n % 257); // Fractional part + + err[i] = pf; // Store it for next pixel + + *output++ = (BYTE) pe; + } + + return output + T_EXTRA(info ->OutputFormat); +} + + + +static +LPBYTE PackNBytesSwapDither(register _LPcmsTRANSFORM info, register WORD wOut[], register LPBYTE output) +{ + int nChan = T_CHANNELS(info -> OutputFormat); + register int i; + unsigned int n, pe, pf; + + for (i=nChan-1; i >= 0; --i) { + + n = wOut[i] + err[i]; // Value + + pe = (n / 257); // Whole part + pf = (n % 257); // Fractional part + + err[i] = pf; // Store it for next pixel + + *output++ = (BYTE) pe; + } + + + return output + T_EXTRA(info ->OutputFormat); +} + + + // Generic chunky for byte static @@ -1486,7 +1558,10 @@ _cmsFIXFN _cmsIdentifyInputFormat(_LPcmsTRANSFORM xform, DWORD dwInput) case PT_HSV: case PT_HLS: case PT_Yxy: - FromInput = UnrollDouble; + if (T_CHANNELS(dwInput) == 1) + FromInput = UnrollDouble1Chan; + else + FromInput = UnrollDouble; break; // Inks (%) 0.0 .. 100.0 @@ -1749,6 +1824,9 @@ _cmsFIXFN _cmsIdentifyOutputFormat(_LPcmsTRANSFORM xform, DWORD dwOutput) switch (T_CHANNELS(dwOutput)) { case 1: + if (T_DITHER(dwOutput)) + ToOutput = PackNBytesDither; + else ToOutput = Pack1Byte; if (T_EXTRA(dwOutput) == 1) { if (T_SWAPFIRST(dwOutput)) @@ -1766,8 +1844,12 @@ _cmsFIXFN _cmsIdentifyOutputFormat(_LPcmsTRANSFORM xform, DWORD dwOutput) else if (T_COLORSPACE(dwOutput) == PT_Lab) ToOutput = Pack3BytesLab; + else { + if (T_DITHER(dwOutput)) + ToOutput = PackNBytesDither; else ToOutput = Pack3Bytes; + } break; case 1: // TODO: ALab8 should be handled here @@ -1793,12 +1875,22 @@ _cmsFIXFN _cmsIdentifyOutputFormat(_LPcmsTRANSFORM xform, DWORD dwOutput) case 4: if (T_EXTRA(dwOutput) == 0) { + if (T_DOSWAP(dwOutput)) { - if (T_SWAPFIRST(dwOutput)) + + if (T_SWAPFIRST(dwOutput)) { ToOutput = Pack4BytesSwapSwapFirst; - else + } + else { + + if (T_DITHER(dwOutput)) { + ToOutput = PackNBytesSwapDither; + } + else { ToOutput = Pack4BytesSwap; + } + } } else { if (T_SWAPFIRST(dwOutput)) @@ -1807,11 +1899,15 @@ _cmsFIXFN _cmsIdentifyOutputFormat(_LPcmsTRANSFORM xform, DWORD dwOutput) if (T_FLAVOR(dwOutput)) ToOutput = Pack4BytesReverse; + else { + if (T_DITHER(dwOutput)) + ToOutput = PackNBytesDither; else ToOutput = Pack4Bytes; } } } + } else { if (!T_DOSWAP(dwOutput) && !T_SWAPFIRST(dwOutput)) ToOutput = PackNBytes; @@ -1833,7 +1929,7 @@ _cmsFIXFN _cmsIdentifyOutputFormat(_LPcmsTRANSFORM xform, DWORD dwOutput) } break; - case 2: + case 2: case 5: case 7: case 8: @@ -1849,8 +1945,13 @@ _cmsFIXFN _cmsIdentifyOutputFormat(_LPcmsTRANSFORM xform, DWORD dwOutput) { if (T_DOSWAP(dwOutput)) ToOutput = PackNBytesSwap; + else { + + if (T_DITHER(dwOutput)) + ToOutput = PackNBytesDither; else ToOutput = PackNBytes; + } } break; @@ -1984,7 +2085,7 @@ _cmsFIXFN _cmsIdentifyOutputFormat(_LPcmsTRANSFORM xform, DWORD dwOutput) break; - case 2: + case 2: case 5: case 7: case 8: diff --git a/jdk/src/share/native/sun/java2d/cmm/lcms/cmspcs.c b/jdk/src/share/native/sun/java2d/cmm/lcms/cmspcs.c index 4ad975550c3..e9b3d2ed545 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmspcs.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmspcs.c @@ -29,7 +29,7 @@ // // // Little cms -// Copyright (C) 1998-2006 Marti Maria +// Copyright (C) 1998-2007 Marti Maria // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -624,3 +624,7 @@ void LCMSEXPORT cmsXYZEncoded2Float(LPcmsCIEXYZ fXYZ, const WORD XYZ[3]) fXYZ -> Z = XYZ2float(XYZ[2]); } + + + + diff --git a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsps2.c b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsps2.c index f3bf7ec6fe8..22a67c0772d 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsps2.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsps2.c @@ -29,7 +29,7 @@ // // // Little cms -// Copyright (C) 1998-2006 Marti Maria +// Copyright (C) 1998-2007 Marti Maria // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -144,6 +144,8 @@ LCMSAPI DWORD LCMSEXPORT cmsGetPostScriptCRDEx(cmsHPROFILE hProfile, int Intent, /Table [ p p p [<...>]] /RangeABC [ 0 1 0 1 0 1] /DecodeABC[ ] + /RangeLMN [ -0.236 1.254 0 1 -0.635 1.640 ] + % -128/500 1+127/500 0 1 -127/200 1+128/200 /MatrixABC [ 1 1 1 1 0 0 0 0 -1] /WhitePoint [D50] /BlackPoint [BP] @@ -347,7 +349,8 @@ typedef struct { static LPMEMSTREAM CreateMemStream(LPBYTE Buffer, DWORD dwMax, int MaxCols) { - LPMEMSTREAM m = (LPMEMSTREAM) malloc(sizeof(MEMSTREAM)); + LPMEMSTREAM m = (LPMEMSTREAM) _cmsMalloc(sizeof(MEMSTREAM)); + if (m == NULL) return NULL; ZeroMemory(m, sizeof(MEMSTREAM)); @@ -376,9 +379,9 @@ BYTE Word2Byte(WORD w) static BYTE L2Byte(WORD w) { - int ww = w + 0x0080; + int ww = w + 0x0080; - if (ww > 0xFFFF) return 0xFF; + if (ww > 0xFFFF) return 0xFF; return (BYTE) ((WORD) (ww >> 8) & 0xFF); } @@ -387,7 +390,6 @@ BYTE L2Byte(WORD w) static void WriteRawByte(LPMEMSTREAM m, BYTE b) { - if (m -> dwUsed + 1 > m -> dwMax) { m -> HasError = 1; } @@ -422,7 +424,7 @@ void WriteByte(LPMEMSTREAM m, BYTE b) } -// Does write a formatted string +// Does write a formatted string. Guaranteed to be 2048 bytes at most. static void Writef(LPMEMSTREAM m, const char *frm, ...) { @@ -432,7 +434,7 @@ void Writef(LPMEMSTREAM m, const char *frm, ...) va_start(args, frm); - vsprintf((char*) Buffer, frm, args); + vsnprintf((char*) Buffer, 2048, frm, args); for (pt = Buffer; *pt; pt++) { @@ -562,7 +564,7 @@ void EmitLab2XYZ(LPMEMSTREAM m) Writef(m, "{255 mul 128 sub 200 div } bind\n"); Writef(m, "]\n"); Writef(m, "/MatrixABC [ 1 1 1 1 0 0 0 0 -1]\n"); - Writef(m, "/RangeLMN [ 0.0 0.9642 0.0 1.0000 0.0 0.8249 ]\n"); + Writef(m, "/RangeLMN [ -0.236 1.254 0 1 -0.635 1.640 ]\n"); Writef(m, "/DecodeLMN [\n"); Writef(m, "{dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse 0.964200 mul} bind\n"); Writef(m, "{dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse } bind\n"); @@ -584,7 +586,11 @@ void Emit1Gamma(LPMEMSTREAM m, LPWORD Table, int nEntries) if (nEntries <= 0) return; // Empty table // Suppress whole if identity - if (cmsIsLinear(Table, nEntries)) return; + if (cmsIsLinear(Table, nEntries)) { + Writef(m, "{} "); + return; + } + // Check if is really an exponential. If so, emit "exp" gamma = cmsEstimateGammaEx(Table, nEntries, 0.001); @@ -646,7 +652,7 @@ void Emit1Gamma(LPMEMSTREAM m, LPWORD Table, int nEntries) // Compare gamma table static -BOOL GammaTableEquals(LPWORD g1, LPWORD g2, int nEntries) +LCMSBOOL GammaTableEquals(LPWORD g1, LPWORD g2, int nEntries) { return memcmp(g1, g2, nEntries* sizeof(WORD)) == 0; } @@ -676,7 +682,7 @@ void EmitNGamma(LPMEMSTREAM m, int n, LPWORD g[], int nEntries) // Check whatever a profile has CLUT tables (only on input) static -BOOL IsLUTbased(cmsHPROFILE hProfile, int Intent) +LCMSBOOL IsLUTbased(cmsHPROFILE hProfile, int Intent) { icTagSignature Tag; @@ -718,10 +724,10 @@ int OutputValueSampler(register WORD In[], register WORD Out[], register LPVOID if (sc -> FixWhite) { - if (In[0] == 0xFFFF) { // Only in L* = 100 + if (In[0] == 0xFFFF) { // Only in L* = 100, ab = [-8..8] - if ((In[1] >= 0x8000 && In[1] <= 0x87FF) || - (In[2] >= 0x8000 && In[2] <= 0x87FF)) { + if ((In[1] >= 0x7800 && In[1] <= 0x8800) && + (In[2] >= 0x7800 && In[2] <= 0x8800)) { WORD* Black; WORD* White; @@ -829,8 +835,8 @@ void WriteCLUT(LPMEMSTREAM m, LPLUT Lut, int bps, const char* PreMaj, sc.PreMaj = PreMaj; sc.PostMaj= PostMaj; - sc.PreMin = PreMin; - sc.PostMin= PostMin; + sc.PreMin = PreMin; + sc.PostMin = PostMin; sc.lIsInput = lIsInput; sc.FixWhite = FixWhite; sc.ColorSpace = ColorSpace; @@ -1231,7 +1237,7 @@ DWORD LCMSEXPORT cmsGetPostScriptCSA(cmsHPROFILE hProfile, if (!WriteNamedColorCSA(mem, hProfile, Intent)) { - free((void*) mem); + _cmsFree((void*) mem); return 0; } } @@ -1246,7 +1252,7 @@ DWORD LCMSEXPORT cmsGetPostScriptCSA(cmsHPROFILE hProfile, ColorSpace != icSigLabData) { cmsSignalError(LCMS_ERRC_ABORTED, "Invalid output color space"); - free((void*) mem); + _cmsFree((void*) mem); return 0; } @@ -1256,7 +1262,7 @@ DWORD LCMSEXPORT cmsGetPostScriptCSA(cmsHPROFILE hProfile, // Yes, so handle as LUT-based if (!WriteInputLUT(mem, hProfile, Intent)) { - free((void*) mem); + _cmsFree((void*) mem); return 0; } } @@ -1266,7 +1272,7 @@ DWORD LCMSEXPORT cmsGetPostScriptCSA(cmsHPROFILE hProfile, if (!WriteInputMatrixShaper(mem, hProfile)) { - free((void*) mem); // Something went wrong + _cmsFree((void*) mem); // Something went wrong return 0; } } @@ -1277,7 +1283,7 @@ DWORD LCMSEXPORT cmsGetPostScriptCSA(cmsHPROFILE hProfile, dwBytesUsed = mem ->dwUsed; // Get rid of memory stream - free((void*) mem); + _cmsFree((void*) mem); // Finally, return used byte count return dwBytesUsed; @@ -1350,27 +1356,40 @@ DWORD LCMSEXPORT cmsGetPostScriptCSA(cmsHPROFILE hProfile, static -void EmitPQRStage(LPMEMSTREAM m, int DoBPC, int lIsAbsolute) +void EmitPQRStage(LPMEMSTREAM m, cmsHPROFILE hProfile, int DoBPC, int lIsAbsolute) { + if (lIsAbsolute) { + + // For absolute colorimetric intent, encode back to relative + // and generate a relative LUT + + // Relative encoding is obtained across XYZpcs*(D50/WhitePoint) + + cmsCIEXYZ White; + + cmsTakeMediaWhitePoint(&White, hProfile); + + Writef(m,"/MatrixPQR [1 0 0 0 1 0 0 0 1 ]\n"); + Writef(m,"/RangePQR [ -0.5 2 -0.5 2 -0.5 2 ]\n"); + + Writef(m, "%% Absolute colorimetric -- encode to relative to maximize LUT usage\n" + "/TransformPQR [\n" + "{0.9642 mul %g div exch pop exch pop exch pop exch pop} bind\n" + "{1.0000 mul %g div exch pop exch pop exch pop exch pop} bind\n" + "{0.8249 mul %g div exch pop exch pop exch pop exch pop} bind\n]\n", + White.X, White.Y, White.Z); + return; + } + + Writef(m,"%% Bradford Cone Space\n" "/MatrixPQR [0.8951 -0.7502 0.0389 0.2664 1.7135 -0.0685 -0.1614 0.0367 1.0296 ] \n"); Writef(m, "/RangePQR [ -0.5 2 -0.5 2 -0.5 2 ]\n"); - if (lIsAbsolute) { - - // For absolute colorimetric intent, do nothing - - Writef(m, "%% Absolute colorimetric -- no transformation\n" - "/TransformPQR [\n" - "{exch pop exch pop exch pop exch pop} bind dup dup]\n"); - return; - } - - // No BPC if (!DoBPC) { @@ -1414,6 +1433,7 @@ void EmitPQRStage(LPMEMSTREAM m, int DoBPC, int lIsAbsolute) static void EmitXYZ2Lab(LPMEMSTREAM m) { + Writef(m, "/RangeLMN [ -0.635 2.0 0 2 -0.635 2.0 ]\n"); Writef(m, "/EncodeLMN [\n"); Writef(m, "{ 0.964200 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind\n"); Writef(m, "{ 1.000000 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind\n"); @@ -1423,18 +1443,11 @@ void EmitXYZ2Lab(LPMEMSTREAM m) Writef(m, "/EncodeABC [\n"); - Writef(m, "{ 116 mul 16 sub 100 div } bind\n"); - Writef(m, "{ 500 mul 128 add 255 div } bind\n"); - Writef(m, "{ 200 mul 128 add 255 div } bind\n"); + Writef(m, "{ 500 mul 128 add 256 div } bind\n"); + Writef(m, "{ 200 mul 128 add 256 div } bind\n"); - /* - Writef(m, "{ 116 mul 16 sub 256 mul 25700 div } bind\n"); - Writef(m, "{ 500 mul 128 add 256 mul 65535 div } bind\n"); - Writef(m, "{ 200 mul 128 add 256 mul 65535 div } bind\n"); - */ - Writef(m, "]\n"); @@ -1458,20 +1471,27 @@ int WriteOutputLUT(LPMEMSTREAM m, cmsHPROFILE hProfile, int Intent, DWORD dwFlag LPLUT DeviceLink; cmsHPROFILE Profiles[3]; cmsCIEXYZ BlackPointAdaptedToD50; - BOOL lFreeDeviceLink = FALSE; - BOOL lDoBPC = (dwFlags & cmsFLAGS_BLACKPOINTCOMPENSATION); + LCMSBOOL lFreeDeviceLink = FALSE; + LCMSBOOL lDoBPC = (dwFlags & cmsFLAGS_BLACKPOINTCOMPENSATION); + LCMSBOOL lFixWhite = !(dwFlags & cmsFLAGS_NOWHITEONWHITEFIXUP); + int RelativeEncodingIntent; - // Trick our v4 profile as it were v2. This prevents the ajusting done - // in perceptual & saturation. We only neew v4 encoding! - hLab = cmsCreateLab4Profile(NULL); - cmsSetProfileICCversion(hLab, 0); + hLab = cmsCreateLabProfile(NULL); ColorSpace = cmsGetColorSpace(hProfile); nChannels = _cmsChannelsOf(ColorSpace); OutputFormat = CHANNELS_SH(nChannels) | BYTES_SH(2); + // For absolute colorimetric, the LUT is encoded as relative + // in order to preserve precission. + + RelativeEncodingIntent = Intent; + if (RelativeEncodingIntent == INTENT_ABSOLUTE_COLORIMETRIC) + RelativeEncodingIntent = INTENT_RELATIVE_COLORIMETRIC; + + // Is a devicelink profile? if (cmsGetDeviceClass(hProfile) == icSigLinkClass) { @@ -1479,13 +1499,14 @@ int WriteOutputLUT(LPMEMSTREAM m, cmsHPROFILE hProfile, int Intent, DWORD dwFlag if (ColorSpace == icSigLabData) { - // adjust input to Lab to out v4 + // adjust input to Lab to our v4 Profiles[0] = hLab; Profiles[1] = hProfile; xform = cmsCreateMultiprofileTransform(Profiles, 2, TYPE_Lab_DBL, - OutputFormat, Intent, cmsFLAGS_NOPRELINEARIZATION); + OutputFormat, RelativeEncodingIntent, + dwFlags|cmsFLAGS_NOWHITEONWHITEFIXUP|cmsFLAGS_NOPRELINEARIZATION); } else { @@ -1499,7 +1520,7 @@ int WriteOutputLUT(LPMEMSTREAM m, cmsHPROFILE hProfile, int Intent, DWORD dwFlag // This is a normal profile xform = cmsCreateTransform(hLab, TYPE_Lab_DBL, hProfile, - OutputFormat, Intent, cmsFLAGS_NOPRELINEARIZATION); + OutputFormat, RelativeEncodingIntent, dwFlags|cmsFLAGS_NOWHITEONWHITEFIXUP|cmsFLAGS_NOPRELINEARIZATION); } if (xform == NULL) { @@ -1515,7 +1536,7 @@ int WriteOutputLUT(LPMEMSTREAM m, cmsHPROFILE hProfile, int Intent, DWORD dwFlag if (!DeviceLink) { - DeviceLink = _cmsPrecalculateDeviceLink(xform, 0); + DeviceLink = _cmsPrecalculateDeviceLink(xform, cmsFLAGS_NOPRELINEARIZATION); lFreeDeviceLink = TRUE; } @@ -1527,7 +1548,7 @@ int WriteOutputLUT(LPMEMSTREAM m, cmsHPROFILE hProfile, int Intent, DWORD dwFlag // Emit headers, etc. EmitWhiteBlackD50(m, &BlackPointAdaptedToD50); - EmitPQRStage(m, lDoBPC, Intent == INTENT_ABSOLUTE_COLORIMETRIC); + EmitPQRStage(m, hProfile, lDoBPC, Intent == INTENT_ABSOLUTE_COLORIMETRIC); EmitXYZ2Lab(m); if (DeviceLink ->wFlags & LUT_HASTL1) { @@ -1544,10 +1565,13 @@ int WriteOutputLUT(LPMEMSTREAM m, cmsHPROFILE hProfile, int Intent, DWORD dwFlag // zero. This would sacrifice a bit of highlights, but failure to do so would cause // scum dot. Ouch. + if (Intent == INTENT_ABSOLUTE_COLORIMETRIC) + lFixWhite = FALSE; + Writef(m, "/RenderTable "); WriteCLUT(m, DeviceLink, 8, "<", ">\n", "", "", FALSE, - (Intent != INTENT_ABSOLUTE_COLORIMETRIC), ColorSpace); + lFixWhite, ColorSpace); Writef(m, " %d {} bind ", nChannels); @@ -1582,6 +1606,9 @@ void BuildColorantList(char *Colorant, int nColorant, WORD Out[]) int j; Colorant[0] = 0; + if (nColorant > MAXCHANNELS) + nColorant = MAXCHANNELS; + for (j=0; j < nColorant; j++) { sprintf(Buff, "%.3f", Out[j] / 65535.0); @@ -1677,7 +1704,7 @@ DWORD LCMSEXPORT cmsGetPostScriptCRDEx(cmsHPROFILE hProfile, if (!WriteNamedColorCRD(mem, hProfile, Intent, dwFlags)) { - free((void*) mem); + _cmsFree((void*) mem); return 0; } } @@ -1687,7 +1714,7 @@ DWORD LCMSEXPORT cmsGetPostScriptCRDEx(cmsHPROFILE hProfile, if (!WriteOutputLUT(mem, hProfile, Intent, dwFlags)) { - free((void*) mem); + _cmsFree((void*) mem); return 0; } } @@ -1702,7 +1729,7 @@ DWORD LCMSEXPORT cmsGetPostScriptCRDEx(cmsHPROFILE hProfile, dwBytesUsed = mem ->dwUsed; // Get rid of memory stream - free((void*) mem); + _cmsFree((void*) mem); // Finally, return used byte count return dwBytesUsed; diff --git a/jdk/src/share/native/sun/java2d/cmm/lcms/cmssamp.c b/jdk/src/share/native/sun/java2d/cmm/lcms/cmssamp.c index 023a732dfeb..2b52b2daf88 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmssamp.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmssamp.c @@ -29,7 +29,7 @@ // // // Little cms -// Copyright (C) 1998-2006 Marti Maria +// Copyright (C) 1998-2007 Marti Maria // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -120,7 +120,7 @@ int ComponentOf(int n, int clut, int nColorant) // This routine does a sweep on whole input space, and calls its callback // function on knots. returns TRUE if all ok, FALSE otherwise. -BOOL LCMSEXPORT cmsSample3DGrid(LPLUT Lut, _cmsSAMPLER Sampler, LPVOID Cargo, DWORD dwFlags) +LCMSBOOL LCMSEXPORT cmsSample3DGrid(LPLUT Lut, _cmsSAMPLER Sampler, LPVOID Cargo, DWORD dwFlags) { int i, t, nTotalPoints, Colorant, index; WORD In[MAXCHANNELS], Out[MAXCHANNELS]; @@ -145,12 +145,16 @@ BOOL LCMSEXPORT cmsSample3DGrid(LPLUT Lut, _cmsSAMPLER Sampler, LPVOID Cargo, DW &Lut -> In16params); } + for (t=0; t < (int) Lut -> OutputChan; t++) + Out[t] = Lut->T[index + t]; - // if (dwFlags & SAMPLER_INSPECT) { + if (dwFlags & SAMPLER_HASTL2) { for (t=0; t < (int) Lut -> OutputChan; t++) - Out[t] = Lut->T[index + t]; - // } + Out[t] = cmsLinearInterpLUT16(Out[t], + Lut -> L2[t], + &Lut -> Out16params); + } if (!Sampler(In, Out, Cargo)) @@ -255,9 +259,11 @@ LPLUT _cmsPrecalculateDeviceLink(cmsHTRANSFORM h, DWORD dwFlags) LPLUT Grid; int nGridPoints; DWORD dwFormatIn, dwFormatOut; + DWORD SaveFormatIn, SaveFormatOut; int ChannelsIn, ChannelsOut; LPLUT SaveGamutLUT; + // Remove any gamut checking SaveGamutLUT = p ->Gamut; p ->Gamut = NULL; @@ -276,8 +282,13 @@ LPLUT _cmsPrecalculateDeviceLink(cmsHTRANSFORM h, DWORD dwFlags) dwFormatIn = (CHANNELS_SH(ChannelsIn)|BYTES_SH(2)); dwFormatOut = (CHANNELS_SH(ChannelsOut)|BYTES_SH(2)); - p -> FromInput = _cmsIdentifyInputFormat(p, dwFormatIn); - p -> ToOutput = _cmsIdentifyOutputFormat(p, dwFormatOut); + SaveFormatIn = p ->InputFormat; + SaveFormatOut = p ->OutputFormat; + + p -> InputFormat = dwFormatIn; + p -> OutputFormat = dwFormatOut; + p -> FromInput = _cmsIdentifyInputFormat(p, dwFormatIn); + p -> ToOutput = _cmsIdentifyOutputFormat(p, dwFormatOut); // Fix gamut & gamma possible mismatches. @@ -289,7 +300,6 @@ LPLUT _cmsPrecalculateDeviceLink(cmsHTRANSFORM h, DWORD dwFlags) _cmsComputePrelinearizationTablesFromXFORM(hOne, 1, Grid); } - // Attention to this typecast! we can take the luxury to // do this since cmsHTRANSFORM is only an alias to a pointer // to the transform struct. @@ -297,11 +307,13 @@ LPLUT _cmsPrecalculateDeviceLink(cmsHTRANSFORM h, DWORD dwFlags) if (!cmsSample3DGrid(Grid, XFormSampler, (LPVOID) p, Grid -> wFlags)) { cmsFreeLUT(Grid); - return NULL; + Grid = NULL; } + p ->Gamut = SaveGamutLUT; + p ->InputFormat = SaveFormatIn; + p ->OutputFormat = SaveFormatOut; - p ->Gamut = SaveGamutLUT; return Grid; } @@ -348,7 +360,7 @@ int BlackPreservingGrayOnlySampler(register WORD In[], register WORD Out[], regi -// That is our K-preserving callback. +// Preserve all K plane. static int BlackPreservingSampler(register WORD In[], register WORD Out[], register LPVOID Cargo) { @@ -469,6 +481,7 @@ int LCMSEXPORT cmsSetCMYKPreservationStrategy(int n) return OldVal; } +#pragma warning(disable: 4550) // Get a pointer to callback on depending of strategy static @@ -504,11 +517,10 @@ LPLUT _cmsPrecalculateBlackPreservingDeviceLink(cmsHTRANSFORM hCMYK2CMYK, DWORD if (p -> dwOriginalFlags & cmsFLAGS_BLACKPOINTCOMPENSATION) LocalFlags |= cmsFLAGS_BLACKPOINTCOMPENSATION; - // Fill in cargo struct Cargo.cmyk2cmyk = hCMYK2CMYK; - // Compute tone curve + // Compute tone curve. Cargo.KTone = _cmsBuildKToneCurve(hCMYK2CMYK, 256); if (Cargo.KTone == NULL) return NULL; cmsCalcL16Params(Cargo.KTone ->nEntries, &Cargo.KToneParams); @@ -522,11 +534,11 @@ LPLUT _cmsPrecalculateBlackPreservingDeviceLink(cmsHTRANSFORM hCMYK2CMYK, DWORD Cargo.LabK2cmyk = cmsReadICCLut(p->OutputProfile, Device2PCS[p->Intent]); // Is there any table available? - if (Cargo.LabK2cmyk == NULL) { + if (Cargo.LabK2cmyk == NULL) { - Grid = NULL; + Grid = NULL; goto Cleanup; - } + } // Setup a roundtrip on output profile for TAC estimation Cargo.hRoundTrip = cmsCreateTransform(p ->OutputProfile, TYPE_CMYK_16, @@ -654,7 +666,7 @@ void PatchLUT(LPLUT Grid, WORD At[], WORD Value[], -BOOL _cmsFixWhiteMisalignment(_LPcmsTRANSFORM p) +LCMSBOOL _cmsFixWhiteMisalignment(_LPcmsTRANSFORM p) { WORD *WhitePointIn, *WhitePointOut, *BlackPointIn, *BlackPointOut; @@ -682,3 +694,4 @@ BOOL _cmsFixWhiteMisalignment(_LPcmsTRANSFORM p) return TRUE; } + diff --git a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsvirt.c b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsvirt.c index cd128dab6a4..9c3afc451dd 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsvirt.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsvirt.c @@ -29,7 +29,7 @@ // // // Little cms -// Copyright (C) 1998-2006 Marti Maria +// Copyright (C) 1998-2007 Marti Maria // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -320,7 +320,7 @@ cmsHPROFILE LCMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, DWORD d cmsHPROFILE hICC; _LPcmsTRANSFORM v = (_LPcmsTRANSFORM) hTransform; LPLUT Lut; - BOOL MustFreeLUT; + LCMSBOOL MustFreeLUT; LPcmsNAMEDCOLORLIST InputColorant = NULL; LPcmsNAMEDCOLORLIST OutputColorant = NULL; @@ -373,10 +373,8 @@ cmsHPROFILE LCMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, DWORD d if (cmsGetDeviceClass(hICC) == icSigOutputClass) { - cmsAddTag(hICC, icSigBToA0Tag, (LPVOID) Lut); } - else cmsAddTag(hICC, icSigAToB0Tag, (LPVOID) Lut); @@ -404,7 +402,7 @@ cmsHPROFILE LCMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, DWORD d OutputColorant = cmsReadColorantTable(v ->OutputProfile, icSigColorantTableTag); } - } + } if (InputColorant) cmsAddTag(hICC, icSigColorantTableTag, InputColorant); @@ -446,6 +444,7 @@ cmsHPROFILE LCMSEXPORT cmsCreateLinearizationDeviceLink(icColorSpaceSignature Co // Creates a LUT with prelinearization step only Lut = cmsAllocLUT(); + if (Lut == NULL) return NULL; // Set up channels Lut ->InputChan = Lut ->OutputChan = _cmsChannelsOf(ColorSpace); @@ -548,6 +547,10 @@ cmsHPROFILE LCMSEXPORT cmsCreateInkLimitingDeviceLink(icColorSpaceSignature Colo // Creates a LUT with 3D grid only Lut = cmsAllocLUT(); + if (Lut == NULL) { + cmsCloseProfile(hICC); + return NULL; + } cmsAlloc3DGrid(Lut, 17, _cmsChannelsOf(ColorSpace), @@ -584,8 +587,9 @@ static LPLUT Create3x3EmptyLUT(void) { LPLUT AToB0 = cmsAllocLUT(); - AToB0 -> InputChan = AToB0 -> OutputChan = 3; + if (AToB0 == NULL) return NULL; + AToB0 -> InputChan = AToB0 -> OutputChan = 3; return AToB0; } @@ -597,8 +601,8 @@ cmsHPROFILE LCMSEXPORT cmsCreateLabProfile(LPcmsCIExyY WhitePoint) cmsHPROFILE hProfile; LPLUT Lut; - hProfile = cmsCreateRGBProfile(WhitePoint == NULL ? cmsD50_xyY() : WhitePoint, NULL, NULL); + if (hProfile == NULL) return NULL; cmsSetDeviceClass(hProfile, icSigAbstractClass); cmsSetColorSpace(hProfile, icSigLabData); @@ -611,7 +615,10 @@ cmsHPROFILE LCMSEXPORT cmsCreateLabProfile(LPcmsCIExyY WhitePoint) // An empty LUTs is all we need Lut = Create3x3EmptyLUT(); - if (Lut == NULL) return NULL; + if (Lut == NULL) { + cmsCloseProfile(hProfile); + return NULL; + } cmsAddTag(hProfile, icSigAToB0Tag, (LPVOID) Lut); cmsAddTag(hProfile, icSigBToA0Tag, (LPVOID) Lut); @@ -628,8 +635,8 @@ cmsHPROFILE LCMSEXPORT cmsCreateLab4Profile(LPcmsCIExyY WhitePoint) cmsHPROFILE hProfile; LPLUT Lut; - hProfile = cmsCreateRGBProfile(WhitePoint == NULL ? cmsD50_xyY() : WhitePoint, NULL, NULL); + if (hProfile == NULL) return NULL; cmsSetProfileICCversion(hProfile, 0x4000000); @@ -644,7 +651,10 @@ cmsHPROFILE LCMSEXPORT cmsCreateLab4Profile(LPcmsCIExyY WhitePoint) // An empty LUTs is all we need Lut = Create3x3EmptyLUT(); - if (Lut == NULL) return NULL; + if (Lut == NULL) { + cmsCloseProfile(hProfile); + return NULL; + } Lut -> wFlags |= LUT_V4_INPUT_EMULATE_V2; cmsAddTag(hProfile, icSigAToB0Tag, (LPVOID) Lut); @@ -666,6 +676,7 @@ cmsHPROFILE LCMSEXPORT cmsCreateXYZProfile(void) LPLUT Lut; hProfile = cmsCreateRGBProfile(cmsD50_xyY(), NULL, NULL); + if (hProfile == NULL) return NULL; cmsSetDeviceClass(hProfile, icSigAbstractClass); cmsSetColorSpace(hProfile, icSigXYZData); @@ -677,15 +688,16 @@ cmsHPROFILE LCMSEXPORT cmsCreateXYZProfile(void) // An empty LUTs is all we need Lut = Create3x3EmptyLUT(); - if (Lut == NULL) return NULL; + if (Lut == NULL) { + cmsCloseProfile(hProfile); + return NULL; + } cmsAddTag(hProfile, icSigAToB0Tag, (LPVOID) Lut); cmsAddTag(hProfile, icSigBToA0Tag, (LPVOID) Lut); cmsAddTag(hProfile, icSigPreview0Tag, (LPVOID) Lut); cmsFreeLUT(Lut); - - return hProfile; } @@ -723,6 +735,7 @@ LPGAMMATABLE Build_sRGBGamma(void) return cmsBuildParametricGamma(1024, 4, Parameters); } +// Create the ICC virtual profile for sRGB space cmsHPROFILE LCMSEXPORT cmsCreate_sRGBProfile(void) { cmsCIExyY D65; @@ -739,6 +752,7 @@ cmsHPROFILE LCMSEXPORT cmsCreate_sRGBProfile(void) hsRGB = cmsCreateRGBProfile(&D65, &Rec709Primaries, Gamma22); cmsFreeGamma(Gamma22[0]); + if (hsRGB == NULL) return NULL; cmsAddTag(hsRGB, icSigDeviceMfgDescTag, (LPVOID) "(lcms internal)"); @@ -750,7 +764,6 @@ cmsHPROFILE LCMSEXPORT cmsCreate_sRGBProfile(void) - typedef struct { double Brightness; double Contrast; @@ -793,7 +806,6 @@ int bchswSampler(register WORD In[], register WORD Out[], register LPVOID Cargo) cmsFloat2LabEncoded(Out, &LabOut); - return TRUE; } @@ -839,7 +851,10 @@ cmsHPROFILE LCMSEXPORT cmsCreateBCHSWabstractProfile(int nLUTPoints, // Creates a LUT with 3D grid only Lut = cmsAllocLUT(); - + if (Lut == NULL) { + cmsCloseProfile(hICC); + return NULL; + } cmsAlloc3DGrid(Lut, nLUTPoints, 3, 3); @@ -890,7 +905,10 @@ cmsHPROFILE LCMSEXPORT cmsCreateNULLProfile(void) // An empty LUTs is all we need Lut = cmsAllocLUT(); - if (Lut == NULL) return NULL; + if (Lut == NULL) { + cmsCloseProfile(hProfile); + return NULL; + } Lut -> InputChan = 3; Lut -> OutputChan = 1; diff --git a/jdk/src/share/native/sun/java2d/cmm/lcms/cmswtpnt.c b/jdk/src/share/native/sun/java2d/cmm/lcms/cmswtpnt.c index 3f3beb76665..b7e38844de1 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmswtpnt.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmswtpnt.c @@ -29,7 +29,7 @@ // // // Little cms -// Copyright (C) 1998-2006 Marti Maria +// Copyright (C) 1998-2007 Marti Maria // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -51,10 +51,6 @@ #include "lcms.h" -// Uncomment this line if you want lcms to use the black point tag in profile, -// if commented, lcms will compute the black point by its own. -// It is safer to leve it commented out -// #define HONOR_BLACK_POINT_TAG // Conversions @@ -79,10 +75,9 @@ void LCMSEXPORT cmsxyY2XYZ(LPcmsCIEXYZ Dest, const cmsCIExyY* Source) } - // Obtains WhitePoint from Temperature -BOOL LCMSEXPORT cmsWhitePointFromTemp(int TempK, LPcmsCIExyY WhitePoint) +LCMSBOOL LCMSEXPORT cmsWhitePointFromTemp(int TempK, LPcmsCIExyY WhitePoint) { double x, y; double T, T2, T3; @@ -147,7 +142,7 @@ BOOL LCMSEXPORT cmsWhitePointFromTemp(int TempK, LPcmsCIExyY WhitePoint) // - Then, I apply these coeficients to the original matrix -BOOL LCMSEXPORT cmsBuildRGB2XYZtransferMatrix(LPMAT3 r, LPcmsCIExyY WhitePt, +LCMSBOOL LCMSEXPORT cmsBuildRGB2XYZtransferMatrix(LPMAT3 r, LPcmsCIExyY WhitePt, LPcmsCIExyYTRIPLE Primrs) { VEC3 WhitePoint, Coef; @@ -169,14 +164,12 @@ BOOL LCMSEXPORT cmsBuildRGB2XYZtransferMatrix(LPMAT3 r, LPcmsCIExyY WhitePt, // Build Primaries matrix - VEC3init(&Primaries.v[0], xr, xg, xb); VEC3init(&Primaries.v[1], yr, yg, yb); VEC3init(&Primaries.v[2], (1-xr-yr), (1-xg-yg), (1-xb-yb)); // Result = Primaries ^ (-1) inverse matrix - if (!MAT3inverse(&Primaries, &Result)) return FALSE; @@ -184,11 +177,9 @@ BOOL LCMSEXPORT cmsBuildRGB2XYZtransferMatrix(LPMAT3 r, LPcmsCIExyY WhitePt, VEC3init(&WhitePoint, xn/yn, 1.0, (1.0-xn-yn)/yn); // Across inverse primaries ... - MAT3eval(&Coef, &Result, &WhitePoint); // Give us the Coefs, then I build transformation matrix - VEC3init(&r -> v[0], Coef.n[VX]*xr, Coef.n[VY]*xg, Coef.n[VZ]*xb); VEC3init(&r -> v[1], Coef.n[VX]*yr, Coef.n[VY]*yg, Coef.n[VZ]*yb); VEC3init(&r -> v[2], Coef.n[VX]*(1.0-xr-yr), Coef.n[VY]*(1.0-xg-yg), Coef.n[VZ]*(1.0-xb-yb)); @@ -246,7 +237,7 @@ void ComputeChromaticAdaptation(LPMAT3 Conversion, // Returns the final chrmatic adaptation from illuminant FromIll to Illuminant ToIll // The cone matrix can be specified in ConeMatrix. If NULL, Bradford is assumed -BOOL cmsAdaptationMatrix(LPMAT3 r, LPMAT3 ConeMatrix, LPcmsCIEXYZ FromIll, LPcmsCIEXYZ ToIll) +LCMSBOOL cmsAdaptationMatrix(LPMAT3 r, LPMAT3 ConeMatrix, LPcmsCIEXYZ FromIll, LPcmsCIEXYZ ToIll) { MAT3 LamRigg = {{ // Bradford matrix {{ 0.8951, 0.2664, -0.1614 }}, @@ -265,7 +256,7 @@ BOOL cmsAdaptationMatrix(LPMAT3 r, LPMAT3 ConeMatrix, LPcmsCIEXYZ FromIll, LPcms // Same as anterior, but assuming D50 destination. White point is given in xyY -BOOL cmsAdaptMatrixToD50(LPMAT3 r, LPcmsCIExyY SourceWhitePt) +LCMSBOOL cmsAdaptMatrixToD50(LPMAT3 r, LPcmsCIExyY SourceWhitePt) { cmsCIEXYZ Dn; MAT3 Bradford; @@ -284,7 +275,7 @@ BOOL cmsAdaptMatrixToD50(LPMAT3 r, LPcmsCIExyY SourceWhitePt) // Same as anterior, but assuming D50 source. White point is given in xyY -BOOL cmsAdaptMatrixFromD50(LPMAT3 r, LPcmsCIExyY DestWhitePt) +LCMSBOOL cmsAdaptMatrixFromD50(LPMAT3 r, LPcmsCIExyY DestWhitePt) { cmsCIEXYZ Dn; MAT3 Bradford; @@ -304,7 +295,7 @@ BOOL cmsAdaptMatrixFromD50(LPMAT3 r, LPcmsCIExyY DestWhitePt) // Adapts a color to a given illuminant. Original color is expected to have // a SourceWhitePt white point. -BOOL LCMSEXPORT cmsAdaptToIlluminant(LPcmsCIEXYZ Result, +LCMSBOOL LCMSEXPORT cmsAdaptToIlluminant(LPcmsCIEXYZ Result, LPcmsCIEXYZ SourceWhitePt, LPcmsCIEXYZ Illuminant, LPcmsCIEXYZ Value) @@ -404,8 +395,6 @@ double Robertson(LPcmsCIExyY v) dj = ((vs - vj) - tj * (us - uj)) / sqrt(1 + tj*tj); - - if ((j!=0) && (di/dj < 0.0)) { Tc = 1000000.0 / (mi + (di / (di - dj)) * (mj - mi)); break; @@ -423,7 +412,7 @@ double Robertson(LPcmsCIExyY v) static -BOOL InRange(LPcmsCIExyY a, LPcmsCIExyY b, double tolerance) +LCMSBOOL InRange(LPcmsCIExyY a, LPcmsCIExyY b, double tolerance) { double dist_x, dist_y; @@ -458,6 +447,7 @@ int FromD40toD150(LPWHITEPOINTS pts) } +// To be removed in future versions void _cmsIdentifyWhitePoint(char *Buffer, LPcmsCIEXYZ WhitePt) { int i, n; @@ -518,7 +508,6 @@ int BlackPointAsDarkerColorant(cmsHPROFILE hInput, cmsCIEXYZ BlackXYZ, MediaWhite; // If the profile does not support input direction, assume Black point 0 - if (!cmsIsIntentSupported(hInput, Intent, LCMS_USED_AS_INPUT)) { BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; @@ -527,7 +516,6 @@ int BlackPointAsDarkerColorant(cmsHPROFILE hInput, // Try to get black by using black colorant - Space = cmsGetColorSpace(hInput); if (!_cmsEndPointsBySpace(Space, &White, &Black, &nChannels)) { @@ -576,7 +564,7 @@ int BlackPointAsDarkerColorant(cmsHPROFILE hInput, // Get a black point of output CMYK profile, discounting any ink-limiting embedded -// in the profile. Fou doing that, use perceptual intent in input direction: +// in the profile. For doing that, use perceptual intent in input direction: // Lab (0, 0, 0) -> [Perceptual] Profile -> CMYK -> [Rel. colorimetric] Profile -> Lab static @@ -651,6 +639,8 @@ int GetV4PerceptualBlack(LPcmsCIEXYZ BlackPoint, cmsHPROFILE hProfile, DWORD dwF D50BlackPoint.X = PERCEPTUAL_BLACK_X; D50BlackPoint.Y = PERCEPTUAL_BLACK_Y; D50BlackPoint.Z = PERCEPTUAL_BLACK_Z; + + // Obtain the absolute XYZ. Adapt perceptual black back from D50 to whatever media white cmsAdaptToIlluminant(BlackPoint, cmsD50_XYZ(), &MediaWhite, &D50BlackPoint); } @@ -662,26 +652,24 @@ int GetV4PerceptualBlack(LPcmsCIEXYZ BlackPoint, cmsHPROFILE hProfile, DWORD dwF // This function shouldn't exist at all -- there is such quantity of broken // profiles on black point tag, that we must somehow fix chromaticity to // avoid huge tint when doing Black point compensation. This function does -// just that. If BP is specified, then forces it to neutral and uses only L -// component. If does not exist, computes it by taking 400% of ink or RGB=0 This -// works well on relative intent and is undefined on perceptual & saturation. -// However, I will support all intents for tricking & trapping. - +// just that. There is a special flag for using black point tag, but turned +// off by default because it is bogus on most profiles. The detection algorithm +// involves to turn BP to neutral and to use only L component. int cmsDetectBlackPoint(LPcmsCIEXYZ BlackPoint, cmsHPROFILE hProfile, int Intent, DWORD dwFlags) { - // v4 + perceptual & saturation intents does have its own black point + // v4 + perceptual & saturation intents does have its own black point, and it is + // well specified enough to use it. if ((cmsGetProfileICCversion(hProfile) >= 0x4000000) && (Intent == INTENT_PERCEPTUAL || Intent == INTENT_SATURATION)) { // Matrix shaper share MRC & perceptual intents - if (_cmsIsMatrixShaper(hProfile)) return BlackPointAsDarkerColorant(hProfile, INTENT_RELATIVE_COLORIMETRIC, BlackPoint, cmsFLAGS_NOTPRECALC); - // Get fixed value + // CLUT based - Get perceptual black point (fixed value) return GetV4PerceptualBlack(BlackPoint, hProfile, dwFlags); } @@ -701,7 +689,6 @@ int cmsDetectBlackPoint(LPcmsCIEXYZ BlackPoint, cmsHPROFILE hProfile, int Intent cmsTakeMediaWhitePoint(&MediaWhite, hProfile); // Black point is absolute XYZ, so adapt to D50 to get PCS value - cmsAdaptToIlluminant(&UntrustedBlackPoint, &MediaWhite, cmsD50_XYZ(), &BlackXYZ); // Force a=b=0 to get rid of any chroma @@ -713,7 +700,6 @@ int cmsDetectBlackPoint(LPcmsCIEXYZ BlackPoint, cmsHPROFILE hProfile, int Intent cmsLab2XYZ(NULL, &TrustedBlackPoint, &Lab); // Return BP as D50 relative or absolute XYZ (depends on flags) - if (!(dwFlags & LCMS_BPFLAGS_D50_ADAPTED)) cmsAdaptToIlluminant(BlackPoint, cmsD50_XYZ(), &MediaWhite, &TrustedBlackPoint); else @@ -724,15 +710,15 @@ int cmsDetectBlackPoint(LPcmsCIEXYZ BlackPoint, cmsHPROFILE hProfile, int Intent #endif - // If output profile, discount ink-limiting + // That is about v2 profiles. + // If output profile, discount ink-limiting and that's all if (Intent == INTENT_RELATIVE_COLORIMETRIC && (cmsGetDeviceClass(hProfile) == icSigOutputClass) && (cmsGetColorSpace(hProfile) == icSigCmykData)) return BlackPointUsingPerceptualBlack(BlackPoint, hProfile, dwFlags); // Nope, compute BP using current intent. - return BlackPointAsDarkerColorant(hProfile, Intent, BlackPoint, dwFlags); } diff --git a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsxform.c b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsxform.c index 8b82f26c5f2..ec37bebb1e3 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsxform.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsxform.c @@ -29,7 +29,7 @@ // // // Little cms -// Copyright (C) 1998-2006 Marti Maria +// Copyright (C) 1998-2007 Marti Maria // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -52,7 +52,6 @@ #include "lcms.h" -// #define DEBUG 1 // Transformations stuff // ----------------------------------------------------------------------- @@ -85,7 +84,7 @@ void LCMSEXPORT cmsDoTransform(cmsHTRANSFORM Transform, void LCMSEXPORT cmsGetAlarmCodes(int *r, int *g, int *b); void LCMSEXPORT cmsSetAlarmCodes(int r, int g, int b); -BOOL LCMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile, +LCMSBOOL LCMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile, int Intent, int UsedDirection); // ------------------------------------------------------------------------- @@ -343,7 +342,7 @@ void PrecalculatedXFORM(_LPcmsTRANSFORM p, p ->DeviceLink ->CLut16params.Interp3D(wIn, wOut, p ->DeviceLink -> T, &p ->DeviceLink -> CLut16params); - } + } else cmsEvalLUT(p -> DeviceLink, wIn, wOut); @@ -414,7 +413,7 @@ void CachedXFORM(_LPcmsTRANSFORM p, register LPBYTE output; WORD wIn[MAXCHANNELS], wOut[MAXCHANNELS]; register unsigned int i, n; - WORD CacheIn[MAXCHANNELS], CacheOut[MAXCHANNELS]; + WORD CacheIn[MAXCHANNELS], CacheOut[MAXCHANNELS]; accum = (LPBYTE) in; @@ -427,10 +426,10 @@ void CachedXFORM(_LPcmsTRANSFORM p, ZeroMemory(wOut, sizeof(WORD) * MAXCHANNELS); - LCMS_READ_LOCK(&p ->rwlock); - CopyMemory(CacheIn, p ->CacheIn, sizeof(WORD) * MAXCHANNELS); - CopyMemory(CacheOut, p ->CacheOut, sizeof(WORD) * MAXCHANNELS); - LCMS_UNLOCK(&p ->rwlock); + LCMS_READ_LOCK(&p ->rwlock); + CopyMemory(CacheIn, p ->CacheIn, sizeof(WORD) * MAXCHANNELS); + CopyMemory(CacheOut, p ->CacheOut, sizeof(WORD) * MAXCHANNELS); + LCMS_UNLOCK(&p ->rwlock); for (i=0; i < n; i++) { @@ -443,14 +442,14 @@ void CachedXFORM(_LPcmsTRANSFORM p, } else { - // Try to speedup things on plain devicelinks + // Try to speedup things on plain devicelinks - if (p ->DeviceLink ->wFlags == LUT_HAS3DGRID) { + if (p ->DeviceLink ->wFlags == LUT_HAS3DGRID) { p ->DeviceLink ->CLut16params.Interp3D(wIn, wOut, p ->DeviceLink -> T, &p ->DeviceLink -> CLut16params); - } + } else cmsEvalLUT(p -> DeviceLink, wIn, wOut); @@ -463,10 +462,10 @@ void CachedXFORM(_LPcmsTRANSFORM p, } - LCMS_WRITE_LOCK(&p ->rwlock); - CopyMemory(p->CacheIn, CacheIn, sizeof(WORD) * MAXCHANNELS); - CopyMemory(p->CacheOut, CacheOut, sizeof(WORD) * MAXCHANNELS); - LCMS_UNLOCK(&p ->rwlock); + LCMS_WRITE_LOCK(&p ->rwlock); + CopyMemory(p->CacheIn, CacheIn, sizeof(WORD) * MAXCHANNELS); + CopyMemory(p->CacheOut, CacheOut, sizeof(WORD) * MAXCHANNELS); + LCMS_UNLOCK(&p ->rwlock); } @@ -483,7 +482,7 @@ void CachedXFORMGamutCheck(_LPcmsTRANSFORM p, register LPBYTE output; WORD wIn[MAXCHANNELS], wOut[MAXCHANNELS]; register unsigned int i, n; - WORD CacheIn[MAXCHANNELS], CacheOut[MAXCHANNELS]; + WORD CacheIn[MAXCHANNELS], CacheOut[MAXCHANNELS]; accum = (LPBYTE) in; @@ -495,10 +494,10 @@ void CachedXFORMGamutCheck(_LPcmsTRANSFORM p, ZeroMemory(wIn, sizeof(WORD) * MAXCHANNELS); ZeroMemory(wOut, sizeof(WORD) * MAXCHANNELS); - LCMS_READ_LOCK(&p ->rwlock); - CopyMemory(CacheIn, p ->CacheIn, sizeof(WORD) * MAXCHANNELS); - CopyMemory(CacheOut, p ->CacheOut, sizeof(WORD) * MAXCHANNELS); - LCMS_UNLOCK(&p ->rwlock); + LCMS_READ_LOCK(&p ->rwlock); + CopyMemory(CacheIn, p ->CacheIn, sizeof(WORD) * MAXCHANNELS); + CopyMemory(CacheOut, p ->CacheOut, sizeof(WORD) * MAXCHANNELS); + LCMS_UNLOCK(&p ->rwlock); for (i=0; i < n; i++) { @@ -520,10 +519,10 @@ void CachedXFORMGamutCheck(_LPcmsTRANSFORM p, output = p -> ToOutput(p, wOut, output); } - LCMS_WRITE_LOCK(&p ->rwlock); - CopyMemory(p->CacheIn, CacheIn, sizeof(WORD) * MAXCHANNELS); - CopyMemory(p->CacheOut, CacheOut, sizeof(WORD) * MAXCHANNELS); - LCMS_UNLOCK(&p ->rwlock); + LCMS_WRITE_LOCK(&p ->rwlock); + CopyMemory(p->CacheIn, CacheIn, sizeof(WORD) * MAXCHANNELS); + CopyMemory(p->CacheOut, CacheOut, sizeof(WORD) * MAXCHANNELS); + LCMS_UNLOCK(&p ->rwlock); } @@ -635,6 +634,8 @@ LPMATSHAPER cmsBuildGrayInputMatrixShaper(cmsHPROFILE hProfile) MAT3 Scale; GrayTRC = cmsReadICCGamma(hProfile, icSigGrayTRCTag); // Y + if (GrayTRC == NULL) return NULL; + cmsTakeIluminant(&Illuminant, hProfile); if (cmsGetPCS(hProfile) == icSigLabData) { @@ -789,6 +790,10 @@ LPMATSHAPER cmsBuildOutputMatrixShaper(cmsHPROFILE OutputProfile) InverseShapes[1] = cmsReadICCGammaReversed(OutputProfile, icSigGreenTRCTag); InverseShapes[2] = cmsReadICCGammaReversed(OutputProfile, icSigBlueTRCTag); + if (InverseShapes[0] == NULL || + InverseShapes[1] == NULL || + InverseShapes[2] == NULL) return NULL; + OutMatSh = cmsAllocMatShaper(&DoubleInv, InverseShapes, MATSHAPER_OUTPUT); cmsFreeGammaTriple(InverseShapes); @@ -801,7 +806,7 @@ LPMATSHAPER cmsBuildOutputMatrixShaper(cmsHPROFILE OutputProfile) // This function builds a transform matrix chaining parameters static -BOOL cmsBuildSmeltMatShaper(_LPcmsTRANSFORM p) +LCMSBOOL cmsBuildSmeltMatShaper(_LPcmsTRANSFORM p) { MAT3 From, To, ToInv, Transfer; LPGAMMATABLE In[3], InverseOut[3]; @@ -814,7 +819,6 @@ BOOL cmsBuildSmeltMatShaper(_LPcmsTRANSFORM p) if (!cmsReadICCMatrixRGB2XYZ(&To, p -> OutputProfile)) return FALSE; - // invert dest if (MAT3inverse(&To, &ToInv) < 0) @@ -838,10 +842,14 @@ BOOL cmsBuildSmeltMatShaper(_LPcmsTRANSFORM p) InverseOut[1] = cmsReadICCGammaReversed(p -> OutputProfile, icSigGreenTRCTag); InverseOut[2] = cmsReadICCGammaReversed(p -> OutputProfile, icSigBlueTRCTag); + if (!InverseOut[0] || !InverseOut[1] || !InverseOut[2]) { + cmsFreeGammaTriple(In); + return FALSE; + } + p -> SmeltMatShaper = cmsAllocMatShaper2(&Transfer, In, InverseOut, MATSHAPER_ALLSMELTED); cmsFreeGammaTriple(In); - cmsFreeGammaTriple(InverseOut); return (p -> SmeltMatShaper != NULL); @@ -1029,7 +1037,7 @@ void TakeConversionRoutines(_LPcmsTRANSFORM p, int DoBPC) // Check colorspace static -BOOL IsProperColorSpace(cmsHPROFILE hProfile, DWORD dwFormat, BOOL lUsePCS) +LCMSBOOL IsProperColorSpace(cmsHPROFILE hProfile, DWORD dwFormat, LCMSBOOL lUsePCS) { int Space = T_COLORSPACE(dwFormat); @@ -1049,10 +1057,10 @@ _LPcmsTRANSFORM AllocEmptyTransform(void) { // Allocate needed memory - _LPcmsTRANSFORM p = (_LPcmsTRANSFORM) malloc(sizeof(_cmsTRANSFORM)); + _LPcmsTRANSFORM p = (_LPcmsTRANSFORM) _cmsMalloc(sizeof(_cmsTRANSFORM)); if (!p) { - cmsSignalError(LCMS_ERRC_ABORTED, "cmsCreateTransform: malloc() failed"); + cmsSignalError(LCMS_ERRC_ABORTED, "cmsCreateTransform: _cmsMalloc() failed"); return NULL; } @@ -1078,7 +1086,7 @@ _LPcmsTRANSFORM AllocEmptyTransform(void) p -> ExitColorSpace = (icColorSpaceSignature) 0; p -> AdaptationState = GlobalAdaptationState; - LCMS_CREATE_LOCK(&p->rwlock); + LCMS_CREATE_LOCK(&p->rwlock); return p; } @@ -1269,12 +1277,12 @@ _LPcmsTRANSFORM PickTransformRoutine(_LPcmsTRANSFORM p, else { // Can we optimize matrix-shaper only transform? - if (*FromTagPtr == 0 && - *ToTagPtr == 0 && - !p->PreviewProfile && - p -> Intent != INTENT_ABSOLUTE_COLORIMETRIC && + if ((*FromTagPtr == 0) && + (*ToTagPtr == 0) && + (!p->PreviewProfile) && + (p -> Intent != INTENT_ABSOLUTE_COLORIMETRIC) && (p -> EntryColorSpace == icSigRgbData) && - (p -> ExitColorSpace == icSigRgbData) && + (p -> ExitColorSpace == icSigRgbData) && !(p -> dwOriginalFlags & cmsFLAGS_BLACKPOINTCOMPENSATION)) { // Yes... try to smelt matrix-shapers @@ -1530,7 +1538,6 @@ cmsHTRANSFORM LCMSEXPORT cmsCreateProofingTransform(cmsHPROFILE InputProfile, TakeConversionRoutines(p, dwFlags & cmsFLAGS_BLACKPOINTCOMPENSATION); - if (!(p -> dwOriginalFlags & cmsFLAGS_NOTPRECALC)) { LPLUT DeviceLink; @@ -1553,7 +1560,8 @@ cmsHTRANSFORM LCMSEXPORT cmsCreateProofingTransform(cmsHPROFILE InputProfile, DeviceLink = _cmsPrecalculateDeviceLink((cmsHTRANSFORM) p, dwFlags); } - if (p -> dwOriginalFlags & cmsFLAGS_GAMUTCHECK) { + // Allow to specify cmsFLAGS_GAMUTCHECK, even if no proofing profile is given + if ((p ->PreviewProfile != NULL) && (p -> dwOriginalFlags & cmsFLAGS_GAMUTCHECK)) { GamutCheck = _cmsPrecalculateGamutCheck((cmsHTRANSFORM) p); } @@ -1561,7 +1569,6 @@ cmsHTRANSFORM LCMSEXPORT cmsCreateProofingTransform(cmsHPROFILE InputProfile, // If input colorspace is Rgb, Cmy, then use tetrahedral interpolation // for speed reasons (it only works well on spaces on Luma is diagonal, and // not if luma is in separate channel) - if (p ->EntryColorSpace == icSigRgbData || p ->EntryColorSpace == icSigCmyData) { @@ -1663,12 +1670,12 @@ void LCMSEXPORT cmsDeleteTransform(cmsHTRANSFORM hTransform) cmsFreeMatShaper(p -> SmeltMatShaper); if (p ->NamedColorList) cmsFreeNamedColorList(p ->NamedColorList); - if (p -> GamutCheck) - cmsFreeLUT(p -> GamutCheck); + if (p -> GamutCheck) + cmsFreeLUT(p -> GamutCheck); - LCMS_FREE_LOCK(&p->rwlock); + LCMS_FREE_LOCK(&p->rwlock); - free((void *) p); + _cmsFree((void *) p); } @@ -1704,7 +1711,7 @@ void LCMSEXPORT cmsGetAlarmCodes(int *r, int *g, int *b) // Returns TRUE if the profile is implemented as matrix-shaper -BOOL LCMSEXPORT _cmsIsMatrixShaper(cmsHPROFILE hProfile) +LCMSBOOL LCMSEXPORT _cmsIsMatrixShaper(cmsHPROFILE hProfile) { switch (cmsGetColorSpace(hProfile)) { @@ -1728,7 +1735,7 @@ BOOL LCMSEXPORT _cmsIsMatrixShaper(cmsHPROFILE hProfile) } -BOOL LCMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile, +LCMSBOOL LCMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile, int Intent, int UsedDirection) { @@ -1774,6 +1781,16 @@ int MultiprofileSampler(register WORD In[], register WORD Out[], register LPVOID } +static +int IsAllowedInSingleXform(icProfileClassSignature aClass) +{ + return (aClass == icSigInputClass) || + (aClass == icSigDisplayClass) || + (aClass == icSigOutputClass) || + (aClass == icSigColorSpaceClass); +} + + // A multiprofile transform does chain several profiles into a single // devicelink. It couls also be used to merge named color profiles into // a single database. @@ -1805,10 +1822,16 @@ cmsHTRANSFORM LCMSEXPORT cmsCreateMultiprofileTransform(cmsHPROFILE hProfiles[], // There is a simple case with just two profiles, try to catch it in order of getting // black preservation to work on this function, at least with two profiles. + if (nProfiles == 2) { - if ((cmsGetDeviceClass(hProfiles[0]) != icSigLinkClass) && - (cmsGetDeviceClass(hProfiles[1]) != icSigLinkClass)) + icProfileClassSignature Class1 = cmsGetDeviceClass(hProfiles[0]); + icProfileClassSignature Class2 = cmsGetDeviceClass(hProfiles[1]); + + // Only input, output and display are allowed + + if (IsAllowedInSingleXform(Class1) && + IsAllowedInSingleXform(Class2)) return cmsCreateTransform(hProfiles[0], dwInput, hProfiles[1], dwOutput, Intent, dwFlags); } @@ -1984,6 +2007,14 @@ cmsHTRANSFORM LCMSEXPORT cmsCreateMultiprofileTransform(cmsHPROFILE hProfiles[], if (hLab) cmsCloseProfile(hLab); if (hXYZ) cmsCloseProfile(hXYZ); + + if (p ->EntryColorSpace == icSigRgbData || + p ->EntryColorSpace == icSigCmyData) { + + p->DeviceLink -> CLut16params.Interp3D = cmsTetrahedralInterp16; + } + + if ((Intent != INTENT_ABSOLUTE_COLORIMETRIC) && !(dwFlags & cmsFLAGS_NOWHITEONWHITEFIXUP)) _cmsFixWhiteMisalignment(p); diff --git a/jdk/src/share/native/sun/java2d/cmm/lcms/icc34.h b/jdk/src/share/native/sun/java2d/cmm/lcms/icc34.h index 409928362ac..6ae05188889 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/icc34.h +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/icc34.h @@ -206,6 +206,11 @@ typedef __int32_t icInt64Number[2]; #if defined(__sun) || defined(__hpux) || defined (__MINGW) || defined(__MINGW32__) +#if defined (__MINGW) || defined(__MINGW32__) +#include +#endif + + typedef uint8_t icUInt8Number; typedef uint16_t icUInt16Number; typedef uint32_t icUInt32Number; diff --git a/jdk/src/share/native/sun/java2d/cmm/lcms/lcms.h b/jdk/src/share/native/sun/java2d/cmm/lcms/lcms.h index 404c1020bb0..33b3cca67fd 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/lcms.h +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/lcms.h @@ -29,7 +29,7 @@ // // // Little cms -// Copyright (C) 1998-2006 Marti Maria +// Copyright (C) 1998-2007 Marti Maria // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -49,8 +49,8 @@ // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// Version 1.16 -#undef DEBUG +// Version 1.18 + #ifndef __cms_H // ********** Configuration toggles **************************************** @@ -62,13 +62,8 @@ // virtually any machine. //#define USE_FLOAT 1 -#ifdef _WIN64 -#define USE_C 1 -#undef USE_ASSEMBLER -#else -#undef USE_C +// #define USE_C 1 #define USE_ASSEMBLER 1 -#endif // Define this if you are using this package as a DLL (windows only) @@ -77,15 +72,11 @@ // Uncomment if you are trying the engine in a non-windows environment // like linux, SGI, VAX, FreeBSD, BeOS, etc. -#if !defined(_WIN32) || !defined(_WIN64) #define NON_WINDOWS 1 -#endif // Uncomment this one if you are using big endian machines (only meaningful // when NON_WINDOWS is used) -#ifndef _LITTLE_ENDIAN -#define USE_BIG_ENDIAN 1 -#endif +// #define USE_BIG_ENDIAN 1 // Uncomment this one if your compiler/machine does support the // "long long" type This will speedup fixed point math. (USE_C only) @@ -104,18 +95,24 @@ // Uncomment this line on multithreading environments // #define USE_PTHREADS 1 +// Uncomment this line if you want lcms to use the black point tag in profile, +// if commented, lcms will compute the black point by its own. +// It is safer to leve it commented out +// #define HONOR_BLACK_POINT_TAG 1 + // ********** End of configuration toggles ****************************** -#define LCMS_VERSION 116 +#define LCMS_VERSION 118 // Microsoft VisualC++ // Deal with Microsoft's attempt at deprecating C standard runtime functions - #ifdef _MSC_VER # undef NON_WINDOWS # if (_MSC_VER >= 1400) +# ifndef _CRT_SECURE_NO_DEPRECATE # define _CRT_SECURE_NO_DEPRECATE 1 +# endif # endif #endif @@ -125,7 +122,6 @@ # undef NON_WINDOWS #endif - #include #include #include @@ -134,11 +130,11 @@ #include // Metroworks CodeWarrior - #ifdef __MWERKS__ # define unlink remove # if WIN32 # define USE_CUSTOM_SWAB 1 +# undef NON_WINDOWS # else # define NON_WINDOWS 1 # endif @@ -172,15 +168,21 @@ typedef pthread_rwlock_t LCMS_RWLOCK_T; # define USE_BIG_ENDIAN 1 #endif -#if defined(__sgi__) || defined(__sgi) || defined(__powerpc__) || defined(sparc) || defined(__ppc__) +#if defined(__sgi__) || defined(__sgi) || defined(__powerpc__) || defined(sparc) || defined(__ppc__) || defined(__s390__) || defined(__s390x__) # define USE_BIG_ENDIAN 1 #endif -#ifdef TARGET_CPU_PPC +#if TARGET_CPU_PPC # define USE_BIG_ENDIAN 1 #endif -#ifdef macintosh +#if macintosh +# ifndef __LITTLE_ENDIAN__ +# define USE_BIG_ENDIAN 1 +# endif +#endif + +#ifdef __BIG_ENDIAN__ # define USE_BIG_ENDIAN 1 #endif @@ -217,11 +219,8 @@ typedef pthread_rwlock_t LCMS_RWLOCK_T; typedef unsigned char BYTE, *LPBYTE; typedef unsigned short WORD, *LPWORD; typedef unsigned long DWORD, *LPDWORD; -typedef int BOOL; typedef char *LPSTR; typedef void *LPVOID; -typedef void* LCMSHANDLE; - #define ZeroMemory(p,l) memset((p),0,(l)) #define CopyMemory(d,s,l) memcpy((d),(s),(l)) @@ -263,8 +262,12 @@ typedef void* LCMSHANDLE; #include -typedef HANDLE LCMSHANDLE; - +#ifdef _WIN64 +# ifdef USE_ASSEMBLER +# undef USE_ASSEMBLER +# define USE_C 1 +# endif +#endif #ifdef USE_INT64 # ifndef LCMSULONGLONG @@ -296,6 +299,10 @@ typedef int LCMS_RWLOCK_T; # define LCMS_UNLOCK(x) #endif +// Base types + +typedef int LCMSBOOL; +typedef void* LCMSHANDLE; #include "icc34.h" // ICC header file @@ -322,16 +329,10 @@ typedef int LCMS_RWLOCK_T; #define icSigMCHEData ((icColorSpaceSignature) 0x4d434845L) // MCHE #define icSigMCHFData ((icColorSpaceSignature) 0x4d434846L) // MCHF -#define icSigCAM97JABData ((icColorSpaceSignature) 0x4A616231L) // 'Jab1' H. Zeng -#define icSigCAM02JABData ((icColorSpaceSignature) 0x4A616232L) // 'Jab2' H. Zeng -#define icSigCAM02JCHData ((icColorSpaceSignature) 0x4A636A32L) // 'Jch2' H. Zeng - #define icSigChromaticityTag ((icTagSignature) 0x6368726dL) // As per Addendum 2 to Spec. ICC.1:1998-09 #define icSigChromaticAdaptationTag ((icTagSignature) 0x63686164L) // 'chad' #define icSigColorantTableTag ((icTagSignature) 0x636c7274L) // 'clrt' #define icSigColorantTableOutTag ((icTagSignature) 0x636c6f74L) // 'clot' -#define icSigHPGamutDescTag ((icTagSignature) 0x676D7441L) // 'gmtA' H. Zeng - #define icSigParametricCurveType ((icTagTypeSignature) 0x70617261L) // parametric (ICC 4.0) #define icSigMultiLocalizedUnicodeType ((icTagTypeSignature) 0x6D6C7563L) @@ -340,7 +341,6 @@ typedef int LCMS_RWLOCK_T; #define icSiglutAtoBType ((icTagTypeSignature) 0x6d414220L) // mAB #define icSiglutBtoAType ((icTagTypeSignature) 0x6d424120L) // mBA #define icSigColorantTableType ((icTagTypeSignature) 0x636c7274L) // clrt -#define icSigHPGamutDescType ((icTagTypeSignature) 0x676D7441L) // gmtA H. Zeng typedef struct { @@ -438,9 +438,6 @@ extern "C" { #ifndef itoa # define itoa _itoa #endif -#ifndef filelength -# define filelength _filelength -#endif #ifndef fileno # define fileno _fileno #endif @@ -450,6 +447,14 @@ extern "C" { #ifndef hypot # define hypot _hypot #endif +#ifndef snprintf +# define snprintf _snprintf +#endif +#ifndef vsnprintf +# define vsnprintf _vsnprintf +#endif + + #endif @@ -470,8 +475,9 @@ typedef LCMSHANDLE cmsHTRANSFORM; // Format of pixel is defined by one DWORD, using bit fields as follows // -// TTTTT U Y F P X S EEE CCCC BBB +// D TTTTT U Y F P X S EEE CCCC BBB // +// D: Use dither (8 bits only) // T: Pixeltype // F: Flavor 0=MinIsBlack(Chocolate) 1=MinIsWhite(Vanilla) // P: Planar? 0=Chunky, 1=Planar @@ -483,6 +489,7 @@ typedef LCMSHANDLE cmsHTRANSFORM; // Y: Swap first - changes ABGR to BGRA and KCMY to CMYK +#define DITHER_SH(s) ((s) << 22) #define COLORSPACE_SH(s) ((s) << 16) #define SWAPFIRST_SH(s) ((s) << 14) #define FLAVOR_SH(s) ((s) << 13) @@ -711,20 +718,20 @@ typedef LCMSHANDLE cmsHTRANSFORM; typedef struct { - unsigned int Crc32; // Has my table been touched? + unsigned int Crc32; // Has my table been touched? - // Keep initial parameters for further serialization + // Keep initial parameters for further serialization int Type; double Params[10]; - } LCMSGAMMAPARAMS, FAR* LPLCMSGAMMAPARAMS; + } LCMSGAMMAPARAMS, FAR* LPLCMSGAMMAPARAMS; // Gamma tables. typedef struct { - LCMSGAMMAPARAMS Seed; // Parameters used for table creation + LCMSGAMMAPARAMS Seed; // Parameters used for table creation // Table-based representation follows @@ -858,7 +865,7 @@ LCMSAPI LPcmsCIExyY LCMSEXPORT cmsD50_xyY(void); LCMSAPI cmsHPROFILE LCMSEXPORT cmsOpenProfileFromFile(const char *ICCProfile, const char *sAccess); LCMSAPI cmsHPROFILE LCMSEXPORT cmsOpenProfileFromMem(LPVOID MemPtr, DWORD dwSize); -LCMSAPI BOOL LCMSEXPORT cmsCloseProfile(cmsHPROFILE hProfile); +LCMSAPI LCMSBOOL LCMSEXPORT cmsCloseProfile(cmsHPROFILE hProfile); // Predefined run-time profiles @@ -915,14 +922,14 @@ LCMSAPI double LCMSEXPORT cmsCIE2000DeltaE(LPcmsCIELab Lab1, LPcmsCIELab LCMSAPI void LCMSEXPORT cmsClampLab(LPcmsCIELab Lab, double amax, double amin, double bmax, double bmin); -LCMSAPI BOOL LCMSEXPORT cmsWhitePointFromTemp(int TempK, LPcmsCIExyY WhitePoint); +LCMSAPI LCMSBOOL LCMSEXPORT cmsWhitePointFromTemp(int TempK, LPcmsCIExyY WhitePoint); -LCMSAPI BOOL LCMSEXPORT cmsAdaptToIlluminant(LPcmsCIEXYZ Result, +LCMSAPI LCMSBOOL LCMSEXPORT cmsAdaptToIlluminant(LPcmsCIEXYZ Result, LPcmsCIEXYZ SourceWhitePt, LPcmsCIEXYZ Illuminant, LPcmsCIEXYZ Value); -LCMSAPI BOOL LCMSEXPORT cmsBuildRGB2XYZtransferMatrix(LPMAT3 r, +LCMSAPI LCMSBOOL LCMSEXPORT cmsBuildRGB2XYZtransferMatrix(LPMAT3 r, LPcmsCIExyY WhitePoint, LPcmsCIExyYTRIPLE Primaries); @@ -976,7 +983,7 @@ LCMSAPI LPGAMMATABLE LCMSEXPORT cmsDupGamma(LPGAMMATABLE Src); LCMSAPI LPGAMMATABLE LCMSEXPORT cmsReverseGamma(int nResultSamples, LPGAMMATABLE InGamma); LCMSAPI LPGAMMATABLE LCMSEXPORT cmsJoinGamma(LPGAMMATABLE InGamma, LPGAMMATABLE OutGamma); LCMSAPI LPGAMMATABLE LCMSEXPORT cmsJoinGammaEx(LPGAMMATABLE InGamma, LPGAMMATABLE OutGamma, int nPoints); -LCMSAPI BOOL LCMSEXPORT cmsSmoothGamma(LPGAMMATABLE Tab, double lambda); +LCMSAPI LCMSBOOL LCMSEXPORT cmsSmoothGamma(LPGAMMATABLE Tab, double lambda); LCMSAPI double LCMSEXPORT cmsEstimateGamma(LPGAMMATABLE t); LCMSAPI double LCMSEXPORT cmsEstimateGammaEx(LPWORD Table, int nEntries, double Thereshold); LCMSAPI LPGAMMATABLE LCMSEXPORT cmsReadICCGamma(cmsHPROFILE hProfile, icTagSignature sig); @@ -984,14 +991,14 @@ LCMSAPI LPGAMMATABLE LCMSEXPORT cmsReadICCGammaReversed(cmsHPROFILE hProfile, i // Access to Profile data. -LCMSAPI BOOL LCMSEXPORT cmsTakeMediaWhitePoint(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile); -LCMSAPI BOOL LCMSEXPORT cmsTakeMediaBlackPoint(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile); -LCMSAPI BOOL LCMSEXPORT cmsTakeIluminant(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile); -LCMSAPI BOOL LCMSEXPORT cmsTakeColorants(LPcmsCIEXYZTRIPLE Dest, cmsHPROFILE hProfile); +LCMSAPI LCMSBOOL LCMSEXPORT cmsTakeMediaWhitePoint(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile); +LCMSAPI LCMSBOOL LCMSEXPORT cmsTakeMediaBlackPoint(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile); +LCMSAPI LCMSBOOL LCMSEXPORT cmsTakeIluminant(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile); +LCMSAPI LCMSBOOL LCMSEXPORT cmsTakeColorants(LPcmsCIEXYZTRIPLE Dest, cmsHPROFILE hProfile); LCMSAPI DWORD LCMSEXPORT cmsTakeHeaderFlags(cmsHPROFILE hProfile); LCMSAPI DWORD LCMSEXPORT cmsTakeHeaderAttributes(cmsHPROFILE hProfile); -LCMSAPI void LCMSEXPORT cmsSetLanguage(int LanguageCode, int CountryCode); +LCMSAPI void LCMSEXPORT cmsSetLanguage(const char LanguageCode[4], const char CountryCode[4]); LCMSAPI const char* LCMSEXPORT cmsTakeProductName(cmsHPROFILE hProfile); LCMSAPI const char* LCMSEXPORT cmsTakeProductDesc(cmsHPROFILE hProfile); LCMSAPI const char* LCMSEXPORT cmsTakeProductInfo(cmsHPROFILE hProfile); @@ -1000,13 +1007,13 @@ LCMSAPI const char* LCMSEXPORT cmsTakeModel(cmsHPROFILE hProfile); LCMSAPI const char* LCMSEXPORT cmsTakeCopyright(cmsHPROFILE hProfile); LCMSAPI const BYTE* LCMSEXPORT cmsTakeProfileID(cmsHPROFILE hProfile); -LCMSAPI BOOL LCMSEXPORT cmsTakeCreationDateTime(struct tm *Dest, cmsHPROFILE hProfile); -LCMSAPI BOOL LCMSEXPORT cmsTakeCalibrationDateTime(struct tm *Dest, cmsHPROFILE hProfile); +LCMSAPI LCMSBOOL LCMSEXPORT cmsTakeCreationDateTime(struct tm *Dest, cmsHPROFILE hProfile); +LCMSAPI LCMSBOOL LCMSEXPORT cmsTakeCalibrationDateTime(struct tm *Dest, cmsHPROFILE hProfile); -LCMSAPI BOOL LCMSEXPORT cmsIsTag(cmsHPROFILE hProfile, icTagSignature sig); +LCMSAPI LCMSBOOL LCMSEXPORT cmsIsTag(cmsHPROFILE hProfile, icTagSignature sig); LCMSAPI int LCMSEXPORT cmsTakeRenderingIntent(cmsHPROFILE hProfile); -LCMSAPI BOOL LCMSEXPORT cmsTakeCharTargetData(cmsHPROFILE hProfile, char** Data, size_t* len); +LCMSAPI LCMSBOOL LCMSEXPORT cmsTakeCharTargetData(cmsHPROFILE hProfile, char** Data, size_t* len); LCMSAPI int LCMSEXPORT cmsReadICCTextEx(cmsHPROFILE hProfile, icTagSignature sig, char *Text, size_t size); LCMSAPI int LCMSEXPORT cmsReadICCText(cmsHPROFILE hProfile, icTagSignature sig, char *Text); @@ -1038,50 +1045,18 @@ LCMSAPI LPcmsSEQ LCMSEXPORT cmsReadProfileSequenceDescription(cmsHPROFILE h LCMSAPI void LCMSEXPORT cmsFreeProfileSequenceDescription(LPcmsSEQ pseq); -// Extended gamut tag -- an HP extension - -#define LCMSGAMUTMETHOD_SEGMENTMAXIMA 0 -#define LCMSGAMUTMETHOD_CONVEXHULL 1 -#define LCMSGAMUTMETHOD_ALPHASHAPE 2 - - -#define LCMSGAMUT_PHYSICAL 0 -#define LCMSGAMUT_HP1 1 -#define LCMSGAMUT_HP2 2 - -typedef struct { - - icColorSpaceSignature CoordSig; // Gamut coordinates signature - icUInt16Number Method; // Method used to generate gamut - icUInt16Number Usage; // Gamut usage or intent - - char Description[LCMS_DESC_MAX]; // Textual description - - cmsViewingConditions Vc; // The viewing conditions - - icUInt32Number Count; // Number of entries - double Data[1]; // The current data - - } cmsGAMUTEX, FAR* LPcmsGAMUTEX; - - -LCMSAPI LPcmsGAMUTEX LCMSEXPORT cmsReadExtendedGamut(cmsHPROFILE hProfile, int index); -LCMSAPI void LCMSEXPORT cmsFreeExtendedGamut(LPcmsGAMUTEX gex); - - - - // Translate form/to our notation to ICC LCMSAPI icColorSpaceSignature LCMSEXPORT _cmsICCcolorSpace(int OurNotation); -LCMSAPI int LCMSEXPORT _cmsLCMScolorSpace(icColorSpaceSignature ProfileSpace); -LCMSAPI int LCMSEXPORT _cmsChannelsOf(icColorSpaceSignature ColorSpace); -LCMSAPI BOOL LCMSEXPORT _cmsIsMatrixShaper(cmsHPROFILE hProfile); +LCMSAPI int LCMSEXPORT _cmsLCMScolorSpace(icColorSpaceSignature ProfileSpace); +LCMSAPI int LCMSEXPORT _cmsChannelsOf(icColorSpaceSignature ColorSpace); +LCMSAPI LCMSBOOL LCMSEXPORT _cmsIsMatrixShaper(cmsHPROFILE hProfile); +// How profiles may be used #define LCMS_USED_AS_INPUT 0 #define LCMS_USED_AS_OUTPUT 1 #define LCMS_USED_AS_PROOF 2 -LCMSAPI BOOL LCMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile, int Intent, int UsedDirection); +LCMSAPI LCMSBOOL LCMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile, int Intent, int UsedDirection); LCMSAPI icColorSpaceSignature LCMSEXPORT cmsGetPCS(cmsHPROFILE hProfile); LCMSAPI icColorSpaceSignature LCMSEXPORT cmsGetColorSpace(cmsHPROFILE hProfile); @@ -1141,7 +1116,7 @@ LCMSAPI void LCMSEXPORT cmsSetProfileID(cmsHPROFILE hProfile, LPBYTE Pr // CRD special -#define cmsFLAGS_NODEFAULTRESOURCEDEF 0x00010000 +#define cmsFLAGS_NODEFAULTRESOURCEDEF 0x01000000 // Gridpoints @@ -1220,9 +1195,9 @@ typedef struct { // Named color support -LCMSAPI int LCMSEXPORT cmsNamedColorCount(cmsHTRANSFORM xform); -LCMSAPI BOOL LCMSEXPORT cmsNamedColorInfo(cmsHTRANSFORM xform, int nColor, char* Name, char* Prefix, char* Suffix); -LCMSAPI int LCMSEXPORT cmsNamedColorIndex(cmsHTRANSFORM xform, const char* Name); +LCMSAPI int LCMSEXPORT cmsNamedColorCount(cmsHTRANSFORM xform); +LCMSAPI LCMSBOOL LCMSEXPORT cmsNamedColorInfo(cmsHTRANSFORM xform, int nColor, char* Name, char* Prefix, char* Suffix); +LCMSAPI int LCMSEXPORT cmsNamedColorIndex(cmsHTRANSFORM xform, const char* Name); // Colorant tables @@ -1230,7 +1205,7 @@ LCMSAPI LPcmsNAMEDCOLORLIST LCMSEXPORT cmsReadColorantTable(cmsHPROFILE hProfile // Profile creation -LCMSAPI BOOL LCMSEXPORT cmsAddTag(cmsHPROFILE hProfile, icTagSignature sig, const void* data); +LCMSAPI LCMSBOOL LCMSEXPORT cmsAddTag(cmsHPROFILE hProfile, icTagSignature sig, const void* data); // Converts a transform to a devicelink profile LCMSAPI cmsHPROFILE LCMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, DWORD dwFlags); @@ -1240,8 +1215,8 @@ LCMSAPI void LCMSEXPORT _cmsSetLUTdepth(cmsHPROFILE hProfile, int depth); // Save profile -LCMSAPI BOOL LCMSEXPORT _cmsSaveProfile(cmsHPROFILE hProfile, const char* FileName); -LCMSAPI BOOL LCMSEXPORT _cmsSaveProfileToMem(cmsHPROFILE hProfile, void *MemPtr, +LCMSAPI LCMSBOOL LCMSEXPORT _cmsSaveProfile(cmsHPROFILE hProfile, const char* FileName); +LCMSAPI LCMSBOOL LCMSEXPORT _cmsSaveProfileToMem(cmsHPROFILE hProfile, void *MemPtr, size_t* BytesNeeded); @@ -1286,6 +1261,7 @@ LCMSAPI double LCMSEXPORT cmsEvalLUTreverse(LPLUT Lut, WORD Target[], WORD Resul LCMSAPI LPLUT LCMSEXPORT cmsReadICCLut(cmsHPROFILE hProfile, icTagSignature sig); LCMSAPI LPLUT LCMSEXPORT cmsDupLUT(LPLUT Orig); + // LUT Sampling typedef int (* _cmsSAMPLER)(register WORD In[], @@ -1325,35 +1301,37 @@ LCMSAPI int LCMSEXPORT cmsIT8SetTable(LCMSHANDLE IT8, int nTable); // Persistence LCMSAPI LCMSHANDLE LCMSEXPORT cmsIT8LoadFromFile(const char* cFileName); LCMSAPI LCMSHANDLE LCMSEXPORT cmsIT8LoadFromMem(void *Ptr, size_t len); -LCMSAPI BOOL LCMSEXPORT cmsIT8SaveToFile(LCMSHANDLE IT8, const char* cFileName); -LCMSAPI BOOL LCMSEXPORT cmsIT8SaveToMem(LCMSHANDLE hIT8, void *MemPtr, size_t* BytesNeeded); +LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SaveToFile(LCMSHANDLE IT8, const char* cFileName); +LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SaveToMem(LCMSHANDLE hIT8, void *MemPtr, size_t* BytesNeeded); // Properties LCMSAPI const char* LCMSEXPORT cmsIT8GetSheetType(LCMSHANDLE hIT8); -LCMSAPI BOOL LCMSEXPORT cmsIT8SetSheetType(LCMSHANDLE hIT8, const char* Type); +LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetSheetType(LCMSHANDLE hIT8, const char* Type); -LCMSAPI BOOL LCMSEXPORT cmsIT8SetComment(LCMSHANDLE hIT8, const char* cComment); +LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetComment(LCMSHANDLE hIT8, const char* cComment); -LCMSAPI BOOL LCMSEXPORT cmsIT8SetPropertyStr(LCMSHANDLE hIT8, const char* cProp, const char *Str); -LCMSAPI BOOL LCMSEXPORT cmsIT8SetPropertyDbl(LCMSHANDLE hIT8, const char* cProp, double Val); -LCMSAPI BOOL LCMSEXPORT cmsIT8SetPropertyHex(LCMSHANDLE hIT8, const char* cProp, int Val); - -LCMSAPI BOOL LCMSEXPORT cmsIT8SetPropertyUncooked(LCMSHANDLE hIT8, const char* Key, const char* Buffer); +LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetPropertyStr(LCMSHANDLE hIT8, const char* cProp, const char *Str); +LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetPropertyDbl(LCMSHANDLE hIT8, const char* cProp, double Val); +LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetPropertyHex(LCMSHANDLE hIT8, const char* cProp, int Val); +LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetPropertyMulti(LCMSHANDLE hIT8, const char* cProp, const char* cSubProp, const char *Val); +LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetPropertyUncooked(LCMSHANDLE hIT8, const char* Key, const char* Buffer); LCMSAPI const char* LCMSEXPORT cmsIT8GetProperty(LCMSHANDLE hIT8, const char* cProp); LCMSAPI double LCMSEXPORT cmsIT8GetPropertyDbl(LCMSHANDLE hIT8, const char* cProp); -LCMSAPI int LCMSEXPORT cmsIT8EnumProperties(LCMSHANDLE IT8, char ***PropertyNames); +LCMSAPI const char* LCMSEXPORT cmsIT8GetPropertyMulti(LCMSHANDLE hIT8, const char* cProp, const char *cSubProp); +LCMSAPI int LCMSEXPORT cmsIT8EnumProperties(LCMSHANDLE hIT8, const char ***PropertyNames); +LCMSAPI int LCMSEXPORT cmsIT8EnumPropertyMulti(LCMSHANDLE hIT8, const char* cProp, const char*** SubpropertyNames); // Datasets LCMSAPI const char* LCMSEXPORT cmsIT8GetDataRowCol(LCMSHANDLE IT8, int row, int col); LCMSAPI double LCMSEXPORT cmsIT8GetDataRowColDbl(LCMSHANDLE IT8, int row, int col); -LCMSAPI BOOL LCMSEXPORT cmsIT8SetDataRowCol(LCMSHANDLE hIT8, int row, int col, +LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetDataRowCol(LCMSHANDLE hIT8, int row, int col, const char* Val); -LCMSAPI BOOL LCMSEXPORT cmsIT8SetDataRowColDbl(LCMSHANDLE hIT8, int row, int col, +LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetDataRowColDbl(LCMSHANDLE hIT8, int row, int col, double Val); LCMSAPI const char* LCMSEXPORT cmsIT8GetData(LCMSHANDLE IT8, const char* cPatch, const char* cSample); @@ -1361,25 +1339,28 @@ LCMSAPI const char* LCMSEXPORT cmsIT8GetData(LCMSHANDLE IT8, const char* cPa LCMSAPI double LCMSEXPORT cmsIT8GetDataDbl(LCMSHANDLE IT8, const char* cPatch, const char* cSample); -LCMSAPI BOOL LCMSEXPORT cmsIT8SetData(LCMSHANDLE IT8, const char* cPatch, +LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetData(LCMSHANDLE IT8, const char* cPatch, const char* cSample, const char *Val); -LCMSAPI BOOL LCMSEXPORT cmsIT8SetDataDbl(LCMSHANDLE hIT8, const char* cPatch, +LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetDataDbl(LCMSHANDLE hIT8, const char* cPatch, const char* cSample, double Val); LCMSAPI int LCMSEXPORT cmsIT8GetDataFormat(LCMSHANDLE hIT8, const char* cSample); -LCMSAPI BOOL LCMSEXPORT cmsIT8SetDataFormat(LCMSHANDLE IT8, int n, const char *Sample); +LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetDataFormat(LCMSHANDLE IT8, int n, const char *Sample); LCMSAPI int LCMSEXPORT cmsIT8EnumDataFormat(LCMSHANDLE IT8, char ***SampleNames); LCMSAPI const char* LCMSEXPORT cmsIT8GetPatchName(LCMSHANDLE hIT8, int nPatch, char* buffer); +LCMSAPI int LCMSEXPORT cmsIT8GetPatchByName(LCMSHANDLE hIT8, const char *cSample); // The LABEL extension LCMSAPI int LCMSEXPORT cmsIT8SetTableByLabel(LCMSHANDLE hIT8, const char* cSet, const char* cField, const char* ExpectedType); +LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetIndexColumn(LCMSHANDLE hIT8, const char* cSample); + // Formatter for double LCMSAPI void LCMSEXPORT cmsIT8DefineDblFormat(LCMSHANDLE IT8, const char* Formatter); @@ -1405,15 +1386,16 @@ LCMSAPI void LCMSEXPORT cmsFloat2XYZEncoded(WORD XYZ[3], const cmsCIEXY // Profiling Extensions --- Would be removed from API in future revisions -LCMSAPI BOOL LCMSEXPORT _cmsAddTextTag(cmsHPROFILE hProfile, icTagSignature sig, const char* Text); -LCMSAPI BOOL LCMSEXPORT _cmsAddXYZTag(cmsHPROFILE hProfile, icTagSignature sig, const cmsCIEXYZ* XYZ); -LCMSAPI BOOL LCMSEXPORT _cmsAddLUTTag(cmsHPROFILE hProfile, icTagSignature sig, const void* lut); -LCMSAPI BOOL LCMSEXPORT _cmsAddGammaTag(cmsHPROFILE hProfile, icTagSignature sig, LPGAMMATABLE TransferFunction); -LCMSAPI BOOL LCMSEXPORT _cmsAddChromaticityTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsCIExyYTRIPLE Chrm); -LCMSAPI BOOL LCMSEXPORT _cmsAddSequenceDescriptionTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsSEQ PSeq); -LCMSAPI BOOL LCMSEXPORT _cmsAddNamedColorTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsNAMEDCOLORLIST nc); -LCMSAPI BOOL LCMSEXPORT _cmsAddDateTimeTag(cmsHPROFILE hProfile, icTagSignature sig, struct tm *DateTime); -LCMSAPI BOOL LCMSEXPORT _cmsAddColorantTableTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsNAMEDCOLORLIST nc); +LCMSAPI LCMSBOOL LCMSEXPORT _cmsAddTextTag(cmsHPROFILE hProfile, icTagSignature sig, const char* Text); +LCMSAPI LCMSBOOL LCMSEXPORT _cmsAddXYZTag(cmsHPROFILE hProfile, icTagSignature sig, const cmsCIEXYZ* XYZ); +LCMSAPI LCMSBOOL LCMSEXPORT _cmsAddLUTTag(cmsHPROFILE hProfile, icTagSignature sig, const void* lut); +LCMSAPI LCMSBOOL LCMSEXPORT _cmsAddGammaTag(cmsHPROFILE hProfile, icTagSignature sig, LPGAMMATABLE TransferFunction); +LCMSAPI LCMSBOOL LCMSEXPORT _cmsAddChromaticityTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsCIExyYTRIPLE Chrm); +LCMSAPI LCMSBOOL LCMSEXPORT _cmsAddSequenceDescriptionTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsSEQ PSeq); +LCMSAPI LCMSBOOL LCMSEXPORT _cmsAddNamedColorTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsNAMEDCOLORLIST nc); +LCMSAPI LCMSBOOL LCMSEXPORT _cmsAddDateTimeTag(cmsHPROFILE hProfile, icTagSignature sig, struct tm *DateTime); +LCMSAPI LCMSBOOL LCMSEXPORT _cmsAddColorantTableTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsNAMEDCOLORLIST nc); +LCMSAPI LCMSBOOL LCMSEXPORT _cmsAddChromaticAdaptationTag(cmsHPROFILE hProfile, icTagSignature sig, const cmsCIEXYZ* mat); // --------------------------------------------------------------------------------------------------- Inline functions @@ -1455,6 +1437,38 @@ LCMS_INLINE WORD _cmsClampWord(int in) return (WORD) in; } +#ifndef LCMS_USER_ALLOC + +// Low-level alloc hook + +LCMS_INLINE void* _cmsMalloc(size_t size) +{ + if (size > ((size_t) 1024*1024*500)) return NULL; // Never allow over 500Mb + if (size < 0) return NULL; // Prevent signed size_t exploits + + return (void*) malloc(size); +} + +LCMS_INLINE void* _cmsCalloc(size_t nmemb, size_t size) +{ + size_t alloc = nmemb * size; + + if (size == 0) { + return _cmsMalloc(0); + } + if (alloc / size != nmemb) { + return NULL; + } + return _cmsMalloc(alloc); +} + +LCMS_INLINE void _cmsFree(void *Ptr) +{ + if (Ptr) free(Ptr); +} + +#endif + // ------------------------------------------------------------------------------------------- end of inline functions // Signal error from inside lcms code @@ -1531,36 +1545,36 @@ typedef struct { // Matrix (Fixed 15.16) -void cdecl VEC3init(LPVEC3 r, double x, double y, double z); // double version -void cdecl VEC3initF(LPWVEC3 r, double x, double y, double z); // Fix32 version -void cdecl VEC3toFix(LPWVEC3 r, LPVEC3 v); -void cdecl VEC3fromFix(LPVEC3 r, LPWVEC3 v); -void cdecl VEC3scaleFix(LPWORD r, LPWVEC3 Scale); -void cdecl VEC3swap(LPVEC3 a, LPVEC3 b); -void cdecl VEC3divK(LPVEC3 r, LPVEC3 v, double d); -void cdecl VEC3perK(LPVEC3 r, LPVEC3 v, double d); -void cdecl VEC3minus(LPVEC3 r, LPVEC3 a, LPVEC3 b); -void cdecl VEC3perComp(LPVEC3 r, LPVEC3 a, LPVEC3 b); -BOOL cdecl VEC3equal(LPWVEC3 a, LPWVEC3 b, double Tolerance); -BOOL cdecl VEC3equalF(LPVEC3 a, LPVEC3 b, double Tolerance); -void cdecl VEC3scaleAndCut(LPWVEC3 r, LPVEC3 v, double d); -void cdecl VEC3cross(LPVEC3 r, LPVEC3 u, LPVEC3 v); -void cdecl VEC3saturate(LPVEC3 v); -double cdecl VEC3distance(LPVEC3 a, LPVEC3 b); -double cdecl VEC3length(LPVEC3 a); +void cdecl VEC3init(LPVEC3 r, double x, double y, double z); // double version +void cdecl VEC3initF(LPWVEC3 r, double x, double y, double z); // Fix32 version +void cdecl VEC3toFix(LPWVEC3 r, LPVEC3 v); +void cdecl VEC3fromFix(LPVEC3 r, LPWVEC3 v); +void cdecl VEC3scaleFix(LPWORD r, LPWVEC3 Scale); +void cdecl VEC3swap(LPVEC3 a, LPVEC3 b); +void cdecl VEC3divK(LPVEC3 r, LPVEC3 v, double d); +void cdecl VEC3perK(LPVEC3 r, LPVEC3 v, double d); +void cdecl VEC3minus(LPVEC3 r, LPVEC3 a, LPVEC3 b); +void cdecl VEC3perComp(LPVEC3 r, LPVEC3 a, LPVEC3 b); +LCMSBOOL cdecl VEC3equal(LPWVEC3 a, LPWVEC3 b, double Tolerance); +LCMSBOOL cdecl VEC3equalF(LPVEC3 a, LPVEC3 b, double Tolerance); +void cdecl VEC3scaleAndCut(LPWVEC3 r, LPVEC3 v, double d); +void cdecl VEC3cross(LPVEC3 r, LPVEC3 u, LPVEC3 v); +void cdecl VEC3saturate(LPVEC3 v); +double cdecl VEC3distance(LPVEC3 a, LPVEC3 b); +double cdecl VEC3length(LPVEC3 a); -void cdecl MAT3identity(LPMAT3 a); -void cdecl MAT3per(LPMAT3 r, LPMAT3 a, LPMAT3 b); -void cdecl MAT3perK(LPMAT3 r, LPMAT3 v, double d); -int cdecl MAT3inverse(LPMAT3 a, LPMAT3 b); -BOOL cdecl MAT3solve(LPVEC3 x, LPMAT3 a, LPVEC3 b); -double cdecl MAT3det(LPMAT3 m); -void cdecl MAT3eval(LPVEC3 r, LPMAT3 a, LPVEC3 v); -void cdecl MAT3toFix(LPWMAT3 r, LPMAT3 v); -void cdecl MAT3fromFix(LPMAT3 r, LPWMAT3 v); -void cdecl MAT3evalW(LPWVEC3 r, LPWMAT3 a, LPWVEC3 v); -BOOL cdecl MAT3isIdentity(LPWMAT3 a, double Tolerance); -void cdecl MAT3scaleAndCut(LPWMAT3 r, LPMAT3 v, double d); +void cdecl MAT3identity(LPMAT3 a); +void cdecl MAT3per(LPMAT3 r, LPMAT3 a, LPMAT3 b); +void cdecl MAT3perK(LPMAT3 r, LPMAT3 v, double d); +int cdecl MAT3inverse(LPMAT3 a, LPMAT3 b); +LCMSBOOL cdecl MAT3solve(LPVEC3 x, LPMAT3 a, LPVEC3 b); +double cdecl MAT3det(LPMAT3 m); +void cdecl MAT3eval(LPVEC3 r, LPMAT3 a, LPVEC3 v); +void cdecl MAT3toFix(LPWMAT3 r, LPMAT3 v); +void cdecl MAT3fromFix(LPMAT3 r, LPWMAT3 v); +void cdecl MAT3evalW(LPWVEC3 r, LPWMAT3 a, LPWVEC3 v); +LCMSBOOL cdecl MAT3isIdentity(LPWMAT3 a, double Tolerance); +void cdecl MAT3scaleAndCut(LPWMAT3 r, LPMAT3 v, double d); // Is a table linear? @@ -1608,7 +1622,7 @@ typedef struct _lcms_l16params_struc { // Used on 16 bits interpolations void cdecl cmsCalcL16Params(int nSamples, LPL16PARAMS p); void cdecl cmsCalcCLUT16Params(int nSamples, int InputChan, int OutputChan, LPL16PARAMS p); void cdecl cmsCalcCLUT16ParamsEx(int nSamples, int InputChan, int OutputChan, - BOOL lUseTetrahedral, LPL16PARAMS p); + LCMSBOOL lUseTetrahedral, LPL16PARAMS p); WORD cdecl cmsLinearInterpLUT16(WORD Value, WORD LutTable[], LPL16PARAMS p); Fixed32 cdecl cmsLinearInterpFixed(WORD Value1, WORD LutTable[], LPL16PARAMS p); @@ -1692,18 +1706,18 @@ struct _lcms_LUT_struc { // Gray axes fixup. Only on v2 8-bit Lab LUT - BOOL FixGrayAxes; + LCMSBOOL FixGrayAxes; - // Parameters used for curve creation + // Parameters used for curve creation - LCMSGAMMAPARAMS LCurvesSeed[4][MAXCHANNELS]; + LCMSGAMMAPARAMS LCurvesSeed[4][MAXCHANNELS]; }; // LUT, FAR* LPLUT; -BOOL cdecl _cmsSmoothEndpoints(LPWORD Table, int nEntries); +LCMSBOOL cdecl _cmsSmoothEndpoints(LPWORD Table, int nEntries); // CRC of gamma tables @@ -1721,7 +1735,7 @@ LPGAMMATABLE cdecl cmsConvertSampledCurveToGamma(LPSAMPLEDCURVE Sampled, doubl void cdecl cmsEndpointsOfSampledCurve(LPSAMPLEDCURVE p, double* Min, double* Max); void cdecl cmsClampSampledCurve(LPSAMPLEDCURVE p, double Min, double Max); -BOOL cdecl cmsSmoothSampledCurve(LPSAMPLEDCURVE Tab, double SmoothingLambda); +LCMSBOOL cdecl cmsSmoothSampledCurve(LPSAMPLEDCURVE Tab, double SmoothingLambda); void cdecl cmsRescaleSampledCurve(LPSAMPLEDCURVE p, double Min, double Max, int nPoints); LPSAMPLEDCURVE cdecl cmsJoinSampledCurves(LPSAMPLEDCURVE X, LPSAMPLEDCURVE Y, int nResultingPoints); @@ -1755,19 +1769,19 @@ LPMATSHAPER cdecl cmsAllocMatShaper2(LPMAT3 matrix, LPGAMMATABLE In[], LPGAMMATA void cdecl cmsFreeMatShaper(LPMATSHAPER MatShaper); void cdecl cmsEvalMatShaper(LPMATSHAPER MatShaper, WORD In[], WORD Out[]); -BOOL cdecl cmsReadICCMatrixRGB2XYZ(LPMAT3 r, cmsHPROFILE hProfile); +LCMSBOOL cdecl cmsReadICCMatrixRGB2XYZ(LPMAT3 r, cmsHPROFILE hProfile); -LPMATSHAPER cdecl cmsBuildInputMatrixShaper(cmsHPROFILE InputProfile); -LPMATSHAPER cdecl cmsBuildOutputMatrixShaper(cmsHPROFILE OutputProfile); +LPMATSHAPER cdecl cmsBuildInputMatrixShaper(cmsHPROFILE InputProfile); +LPMATSHAPER cdecl cmsBuildOutputMatrixShaper(cmsHPROFILE OutputProfile); // White Point & Primary chromas handling -BOOL cdecl cmsAdaptationMatrix(LPMAT3 r, LPMAT3 ConeMatrix, LPcmsCIEXYZ FromIll, LPcmsCIEXYZ ToIll); -BOOL cdecl cmsAdaptMatrixToD50(LPMAT3 r, LPcmsCIExyY SourceWhitePt); -BOOL cdecl cmsAdaptMatrixFromD50(LPMAT3 r, LPcmsCIExyY DestWhitePt); +LCMSBOOL cdecl cmsAdaptationMatrix(LPMAT3 r, LPMAT3 ConeMatrix, LPcmsCIEXYZ FromIll, LPcmsCIEXYZ ToIll); +LCMSBOOL cdecl cmsAdaptMatrixToD50(LPMAT3 r, LPcmsCIExyY SourceWhitePt); +LCMSBOOL cdecl cmsAdaptMatrixFromD50(LPMAT3 r, LPcmsCIExyY DestWhitePt); -BOOL cdecl cmsReadChromaticAdaptationMatrix(LPMAT3 r, cmsHPROFILE hProfile); +LCMSBOOL cdecl cmsReadChromaticAdaptationMatrix(LPMAT3 r, cmsHPROFILE hProfile); // Inter-PCS conversion routines. They assume D50 as white point. void cdecl cmsXYZ2LabEncoded(WORD XYZ[3], WORD Lab[3]); @@ -1782,7 +1796,7 @@ WORD cdecl _cmsQuantizeVal(double i, int MaxSamples); LPcmsNAMEDCOLORLIST cdecl cmsAllocNamedColorList(int n); int cdecl cmsReadICCnamedColorList(cmsHTRANSFORM xform, cmsHPROFILE hProfile, icTagSignature sig); void cdecl cmsFreeNamedColorList(LPcmsNAMEDCOLORLIST List); -BOOL cdecl cmsAppendNamedColor(cmsHTRANSFORM xform, const char* Name, WORD PCS[3], WORD Colorant[MAXCHANNELS]); +LCMSBOOL cdecl cmsAppendNamedColor(cmsHTRANSFORM xform, const char* Name, WORD PCS[3], WORD Colorant[MAXCHANNELS]); // I/O @@ -1804,7 +1818,7 @@ typedef struct _lcms_iccprofile_struct { icColorSpaceSignature PCS; icRenderingIntent RenderingIntent; icUInt32Number flags; - icUInt32Number attributes; + icUInt32Number attributes; cmsCIEXYZ Illuminant; // Additions for V4 profiles @@ -1826,23 +1840,23 @@ typedef struct _lcms_iccprofile_struct { char PhysicalFile[MAX_PATH]; - BOOL IsWrite; - BOOL SaveAs8Bits; + LCMSBOOL IsWrite; + LCMSBOOL SaveAs8Bits; struct tm Created; // I/O handlers - size_t (* Read)(void *buffer, size_t size, size_t count, struct _lcms_iccprofile_struct* Icc); + size_t (* Read)(void *buffer, size_t size, size_t count, struct _lcms_iccprofile_struct* Icc); - BOOL (* Seek)(struct _lcms_iccprofile_struct* Icc, size_t offset); - BOOL (* Close)(struct _lcms_iccprofile_struct* Icc); - size_t (* Tell)(struct _lcms_iccprofile_struct* Icc); - BOOL (* Grow)(struct _lcms_iccprofile_struct* Icc, size_t amount); + LCMSBOOL (* Seek)(struct _lcms_iccprofile_struct* Icc, size_t offset); + LCMSBOOL (* Close)(struct _lcms_iccprofile_struct* Icc); + size_t (* Tell)(struct _lcms_iccprofile_struct* Icc); + LCMSBOOL (* Grow)(struct _lcms_iccprofile_struct* Icc, size_t amount); // Writting - BOOL (* Write)(struct _lcms_iccprofile_struct* Icc, size_t size, LPVOID Ptr); + LCMSBOOL (* Write)(struct _lcms_iccprofile_struct* Icc, size_t size, LPVOID Ptr); size_t UsedSpace; @@ -1854,7 +1868,7 @@ typedef struct _lcms_iccprofile_struct { cmsHPROFILE cdecl _cmsCreateProfilePlaceholder(void); // Search into tag dictionary -icInt32Number cdecl _cmsSearchTag(LPLCMSICCPROFILE Profile, icTagSignature sig, BOOL lSignalError); +icInt32Number cdecl _cmsSearchTag(LPLCMSICCPROFILE Profile, icTagSignature sig, LCMSBOOL lSignalError); // Search for a particular tag, replace if found or add new one else LPVOID _cmsInitTag(LPLCMSICCPROFILE Icc, icTagSignature sig, size_t size, const void* Init); @@ -1870,6 +1884,7 @@ void _cmsSetSaveToMemory(LPLCMSICCPROFILE Icc, LPVOID MemPtr, size_t dwSize); // These macros unpack format specifiers into integers +#define T_DITHER(s) (((s)>>22)&1) #define T_COLORSPACE(s) (((s)>>16)&31) #define T_SWAPFIRST(s) (((s)>>14)&1) #define T_FLAVOR(s) (((s)>>13)&1) @@ -1966,7 +1981,7 @@ typedef struct _cmstransform_struct { // Flag for transform involving v4 profiles - BOOL lInputV4Lab, lOutputV4Lab; + LCMSBOOL lInputV4Lab, lOutputV4Lab; // 1-pixel cache @@ -1976,7 +1991,7 @@ typedef struct _cmstransform_struct { double AdaptationState; // Figure for v4 incomplete state of adaptation - LCMS_RWLOCK_T rwlock; + LCMS_RWLOCK_T rwlock; } _cmsTRANSFORM,FAR *_LPcmsTRANSFORM; @@ -2013,7 +2028,7 @@ int cdecl cmsChooseCnvrt(int Absolute, // Clamping & Gamut handling -BOOL cdecl _cmsEndPointsBySpace(icColorSpaceSignature Space, +LCMSBOOL cdecl _cmsEndPointsBySpace(icColorSpaceSignature Space, WORD **White, WORD **Black, int *nOutputs); WORD * cdecl _cmsWhiteBySpace(icColorSpaceSignature Space); @@ -2042,7 +2057,7 @@ LPLUT _cmsPrecalculateBlackPreservingDeviceLink(cmsHTRANSFORM hCMYK2CMYK, DWORD LPLUT cdecl _cmsPrecalculateGamutCheck(cmsHTRANSFORM h); // Hot fixes bad profiles -BOOL cdecl _cmsFixWhiteMisalignment(_LPcmsTRANSFORM p); +LCMSBOOL cdecl _cmsFixWhiteMisalignment(_LPcmsTRANSFORM p); // Marks LUT as 8 bit on input LPLUT cdecl _cmsBlessLUT8(LPLUT Lut); @@ -2060,6 +2075,10 @@ void cdecl _cmsComputePrelinearizationTablesFromXFORM(cmsHTRANSFORM h[], int nTr // Build a tone curve for K->K' if possible (only works on CMYK) LPGAMMATABLE _cmsBuildKToneCurve(cmsHTRANSFORM hCMYK2CMYK, int nPoints); +// Validates a LUT +LCMSBOOL cdecl _cmsValidateLUT(LPLUT NewLUT); + + // These are two VITAL macros, from converting between 8 and 16 bit // representation. @@ -2077,3 +2096,4 @@ LPGAMMATABLE _cmsBuildKToneCurve(cmsHTRANSFORM hCMYK2CMYK, int nPoints); #endif #endif + From b2f54efed2d4041925064131ecf815e9d5555be6 Mon Sep 17 00:00:00 2001 From: Phil Race Date: Tue, 24 Mar 2009 10:53:04 -0700 Subject: [PATCH 178/292] 6821504: typo in lcmsio.c Reviewed-by: jgodinez --- jdk/src/share/native/sun/java2d/cmm/lcms/cmsio0.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsio0.c b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsio0.c index 602a3eb943b..7f8cbf06779 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsio0.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsio0.c @@ -190,7 +190,7 @@ LCMSBOOL MemoryGrow(struct _lcms_iccprofile_struct* Icc, size_t size) /* Follow same policies as functions in lcms.h */ if (ResData->Size + size < 0) return NULL; - if (ResData->Size + size > (size_t)1024*1024*500))) return NULL; + if (ResData->Size + size > ((size_t)1024*1024*500)) return NULL; newBlock = realloc(ResData->Block, ResData->Size + size); From fface2e4ca7b42bc98bea879a2ff7fe48172f760 Mon Sep 17 00:00:00 2001 From: Changpeng Fang Date: Tue, 24 Mar 2009 12:19:47 -0700 Subject: [PATCH 179/292] 6636138: UseSuperWord enabled failure Fixed SuperWord scheduling of memory operations. Reviewed-by: kvn, never --- hotspot/src/share/vm/opto/superword.cpp | 175 +++++++++++++++++++---- hotspot/src/share/vm/opto/superword.hpp | 7 +- hotspot/test/compiler/6636138/Test1.java | 67 +++++++++ hotspot/test/compiler/6636138/Test2.java | 70 +++++++++ 4 files changed, 292 insertions(+), 27 deletions(-) create mode 100644 hotspot/test/compiler/6636138/Test1.java create mode 100644 hotspot/test/compiler/6636138/Test2.java diff --git a/hotspot/src/share/vm/opto/superword.cpp b/hotspot/src/share/vm/opto/superword.cpp index d64d2e5ec21..c8198392c33 100644 --- a/hotspot/src/share/vm/opto/superword.cpp +++ b/hotspot/src/share/vm/opto/superword.cpp @@ -454,9 +454,13 @@ void SuperWord::mem_slice_preds(Node* start, Node* stop, GrowableArray &p // or need to run igvn.optimize() again before SLP } else if (out->is_Phi() && out->bottom_type() == Type::MEMORY && !in_bb(out)) { // Ditto. Not sure what else to check further. - } else if (out->Opcode() == Op_StoreCM && out->in(4) == n) { + } else if (out->Opcode() == Op_StoreCM && out->in(MemNode::OopStore) == n) { // StoreCM has an input edge used as a precedence edge. // Maybe an issue when oop stores are vectorized. + } else if( out->is_MergeMem() && prev && + prev->Opcode() == Op_StoreCM && out == prev->in(MemNode::OopStore)) { + // Oop store is a MergeMem! This should not happen. Temporarily remove the assertion + // for this case because it could not be superwordized anyway. } else { assert(out == prev || prev == NULL, "no branches off of store slice"); } @@ -912,54 +916,175 @@ void SuperWord::schedule() { } } -//------------------------------co_locate_pack--------------------------- -// Within a pack, move stores down to the last executed store, -// and move loads up to the first executed load. +//-------------------------------remove_and_insert------------------- +//remove "current" from its current position in the memory graph and insert +//it after the appropriate insertion point (lip or uip) +void SuperWord::remove_and_insert(MemNode *current, MemNode *prev, MemNode *lip, + Node *uip, Unique_Node_List &sched_before) { + Node* my_mem = current->in(MemNode::Memory); + _igvn.hash_delete(current); + _igvn.hash_delete(my_mem); + + //remove current_store from its current position in the memmory graph + for (DUIterator i = current->outs(); current->has_out(i); i++) { + Node* use = current->out(i); + if (use->is_Mem()) { + assert(use->in(MemNode::Memory) == current, "must be"); + _igvn.hash_delete(use); + if (use == prev) { // connect prev to my_mem + use->set_req(MemNode::Memory, my_mem); + } else if (sched_before.member(use)) { + _igvn.hash_delete(uip); + use->set_req(MemNode::Memory, uip); + } else { + _igvn.hash_delete(lip); + use->set_req(MemNode::Memory, lip); + } + _igvn._worklist.push(use); + --i; //deleted this edge; rescan position + } + } + + bool sched_up = sched_before.member(current); + Node *insert_pt = sched_up ? uip : lip; + _igvn.hash_delete(insert_pt); + + // all uses of insert_pt's memory state should use current's instead + for (DUIterator i = insert_pt->outs(); insert_pt->has_out(i); i++) { + Node* use = insert_pt->out(i); + if (use->is_Mem()) { + assert(use->in(MemNode::Memory) == insert_pt, "must be"); + _igvn.hash_delete(use); + use->set_req(MemNode::Memory, current); + _igvn._worklist.push(use); + --i; //deleted this edge; rescan position + } else if (!sched_up && use->is_Phi() && use->bottom_type() == Type::MEMORY) { + uint pos; //lip (lower insert point) must be the last one in the memory slice + _igvn.hash_delete(use); + for (pos=1; pos < use->req(); pos++) { + if (use->in(pos) == insert_pt) break; + } + use->set_req(pos, current); + _igvn._worklist.push(use); + --i; + } + } + + //connect current to insert_pt + current->set_req(MemNode::Memory, insert_pt); + _igvn._worklist.push(current); +} + +//------------------------------co_locate_pack---------------------------------- +// To schedule a store pack, we need to move any sandwiched memory ops either before +// or after the pack, based upon dependence information: +// (1) If any store in the pack depends on the sandwiched memory op, the +// sandwiched memory op must be scheduled BEFORE the pack; +// (2) If a sandwiched memory op depends on any store in the pack, the +// sandwiched memory op must be scheduled AFTER the pack; +// (3) If a sandwiched memory op (say, memA) depends on another sandwiched +// memory op (say memB), memB must be scheduled before memA. So, if memA is +// scheduled before the pack, memB must also be scheduled before the pack; +// (4) If there is no dependence restriction for a sandwiched memory op, we simply +// schedule this store AFTER the pack +// (5) We know there is no dependence cycle, so there in no other case; +// (6) Finally, all memory ops in another single pack should be moved in the same direction. +// +// To schedule a load pack: the memory edge of every loads in the pack must be +// the same as the memory edge of the last executed load in the pack void SuperWord::co_locate_pack(Node_List* pk) { if (pk->at(0)->is_Store()) { - // Push Stores down towards last executed pack member MemNode* first = executed_first(pk)->as_Mem(); MemNode* last = executed_last(pk)->as_Mem(); - MemNode* insert_pt = last; + Unique_Node_List schedule_before_pack; + Unique_Node_List memops; + MemNode* current = last->in(MemNode::Memory)->as_Mem(); + MemNode* previous = last; while (true) { assert(in_bb(current), "stay in block"); + memops.push(previous); + for (DUIterator i = current->outs(); current->has_out(i); i++) { + Node* use = current->out(i); + if (use->is_Mem() && use != previous) + memops.push(use); + } + if(current == first) break; + previous = current; + current = current->in(MemNode::Memory)->as_Mem(); + } + + // determine which memory operations should be scheduled before the pack + for (uint i = 1; i < memops.size(); i++) { + Node *s1 = memops.at(i); + if (!in_pack(s1, pk) && !schedule_before_pack.member(s1)) { + for (uint j = 0; j< i; j++) { + Node *s2 = memops.at(j); + if (!independent(s1, s2)) { + if (in_pack(s2, pk) || schedule_before_pack.member(s2)) { + schedule_before_pack.push(s1); //s1 must be scheduled before + Node_List* mem_pk = my_pack(s1); + if (mem_pk != NULL) { + for (uint ii = 0; ii < mem_pk->size(); ii++) { + Node* s = mem_pk->at(ii); // follow partner + if (memops.member(s) && !schedule_before_pack.member(s)) + schedule_before_pack.push(s); + } + } + } + } + } + } + } + + MemNode* lower_insert_pt = last; + Node* upper_insert_pt = first->in(MemNode::Memory); + previous = last; //previous store in pk + current = last->in(MemNode::Memory)->as_Mem(); + + //start scheduling from "last" to "first" + while (true) { + assert(in_bb(current), "stay in block"); + assert(in_pack(previous, pk), "previous stays in pack"); Node* my_mem = current->in(MemNode::Memory); + if (in_pack(current, pk)) { - // Forward users of my memory state to my input memory state + // Forward users of my memory state (except "previous) to my input memory state _igvn.hash_delete(current); - _igvn.hash_delete(my_mem); for (DUIterator i = current->outs(); current->has_out(i); i++) { Node* use = current->out(i); - if (use->is_Mem()) { + if (use->is_Mem() && use != previous) { assert(use->in(MemNode::Memory) == current, "must be"); _igvn.hash_delete(use); - use->set_req(MemNode::Memory, my_mem); + if (schedule_before_pack.member(use)) { + _igvn.hash_delete(upper_insert_pt); + use->set_req(MemNode::Memory, upper_insert_pt); + } else { + _igvn.hash_delete(lower_insert_pt); + use->set_req(MemNode::Memory, lower_insert_pt); + } _igvn._worklist.push(use); --i; // deleted this edge; rescan position } } - // put current immediately before insert_pt - current->set_req(MemNode::Memory, insert_pt->in(MemNode::Memory)); - _igvn.hash_delete(insert_pt); - insert_pt->set_req(MemNode::Memory, current); - _igvn._worklist.push(insert_pt); - _igvn._worklist.push(current); - insert_pt = current; + previous = current; + } else { // !in_pack(current, pk) ==> a sandwiched store + remove_and_insert(current, previous, lower_insert_pt, upper_insert_pt, schedule_before_pack); } + if (current == first) break; current = my_mem->as_Mem(); - } - } else if (pk->at(0)->is_Load()) { - // Pull Loads up towards first executed pack member - LoadNode* first = executed_first(pk)->as_Load(); - Node* first_mem = first->in(MemNode::Memory); - _igvn.hash_delete(first_mem); - // Give each load same memory state as first + } // end while + } else if (pk->at(0)->is_Load()) { //load + // all use the memory state that the last executed load uses + LoadNode* last_load = executed_last(pk)->as_Load(); + Node* last_mem = last_load->in(MemNode::Memory); + _igvn.hash_delete(last_mem); + // Give each load same memory state as last for (uint i = 0; i < pk->size(); i++) { LoadNode* ld = pk->at(i)->as_Load(); _igvn.hash_delete(ld); - ld->set_req(MemNode::Memory, first_mem); + ld->set_req(MemNode::Memory, last_mem); _igvn._worklist.push(ld); } } diff --git a/hotspot/src/share/vm/opto/superword.hpp b/hotspot/src/share/vm/opto/superword.hpp index 1c09607ed7d..4c11ff639b8 100644 --- a/hotspot/src/share/vm/opto/superword.hpp +++ b/hotspot/src/share/vm/opto/superword.hpp @@ -341,8 +341,11 @@ class SuperWord : public ResourceObj { void filter_packs(); // Adjust the memory graph for the packed operations void schedule(); - // Within a pack, move stores down to the last executed store, - // and move loads up to the first executed load. + // Remove "current" from its current position in the memory graph and insert + // it after the appropriate insert points (lip or uip); + void remove_and_insert(MemNode *current, MemNode *prev, MemNode *lip, Node *uip, Unique_Node_List &schd_before); + // Within a store pack, schedule stores together by moving out the sandwiched memory ops according + // to dependence info; and within a load pack, move loads down to the last executed load. void co_locate_pack(Node_List* p); // Convert packs into vector node operations void output(); diff --git a/hotspot/test/compiler/6636138/Test1.java b/hotspot/test/compiler/6636138/Test1.java new file mode 100644 index 00000000000..e01ab7f1e8d --- /dev/null +++ b/hotspot/test/compiler/6636138/Test1.java @@ -0,0 +1,67 @@ +/* + * Copyright 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 6636138 + * @summary SuperWord::co_locate_pack(Node_List* p) generates memory graph that leads to memory order violation. + * + * @run main/othervm -server -Xbatch -XX:CompileOnly=Test1.init -XX:+UseSuperword Test1 + */ + +class Test1 { + + public static void init(int src[], int [] dst, int[] ref) { + // initialize the arrays + for (int i =0; i 0; i--){ + int tmp = src[i]; + src[i] = src[i-1]; + src[i-1] = tmp; + } + } + + public static void verify(int src[]) { + for (int i = 0; i < src.length; i++){ + int value = (i-1 + src.length)%src.length; // correct value after shifting + if (src[i] != value) { + System.out.println("Error: src["+i+"] should be "+ value + " instead of " + src[i]); + System.exit(-1); + } + } + } + + public static void test() { + int[] src = new int[10]; + init(src); + shift(src); + verify(src); + } + + public static void main(String[] args) { + for (int i=0; i< 2000; i++) + test(); + } +} From 1a0a9da57001bf3e49e7941f34cc2ed8e2fd2584 Mon Sep 17 00:00:00 2001 From: Roman Kennke Date: Tue, 24 Mar 2009 21:57:50 +0100 Subject: [PATCH 180/292] 6809233: Modal dialog blocks calling thread after it is hidden and disposed Send WakingRunnable to toolkit to prevent early cleanup. Reviewed-by: art, son --- jdk/src/share/classes/java/awt/Dialog.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jdk/src/share/classes/java/awt/Dialog.java b/jdk/src/share/classes/java/awt/Dialog.java index 310e52350e1..a67d94a32ae 100644 --- a/jdk/src/share/classes/java/awt/Dialog.java +++ b/jdk/src/share/classes/java/awt/Dialog.java @@ -1226,7 +1226,7 @@ public class Dialog extends Window { synchronized (getTreeLock()) { if (keepBlockingEDT) { keepBlockingEDT = false; - PeerEvent wakingEvent = new PeerEvent(this, new WakingRunnable(), PeerEvent.PRIORITY_EVENT); + PeerEvent wakingEvent = new PeerEvent(getToolkit(), new WakingRunnable(), PeerEvent.PRIORITY_EVENT); AppContext curAppContext = AppContext.getAppContext(); if (showAppContext != curAppContext) { // Wake up event dispatch thread on which the dialog was From a5396e1107cf5e3b154a1f52cafbb31a4a244574 Mon Sep 17 00:00:00 2001 From: Tom Rodriguez Date: Tue, 24 Mar 2009 15:09:52 -0700 Subject: [PATCH 181/292] 6820510: assertion failure with unloaded class in subnode.cpp Reviewed-by: kvn --- hotspot/src/share/vm/opto/subnode.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hotspot/src/share/vm/opto/subnode.cpp b/hotspot/src/share/vm/opto/subnode.cpp index 260b5dc8af8..d7c3cc87e2a 100644 --- a/hotspot/src/share/vm/opto/subnode.cpp +++ b/hotspot/src/share/vm/opto/subnode.cpp @@ -639,8 +639,8 @@ const Type *CmpPNode::sub( const Type *t1, const Type *t2 ) const { int kps = (p0->isa_klassptr()?1:0) + (p1->isa_klassptr()?1:0); if (klass0 && klass1 && kps != 1 && // both or neither are klass pointers - !klass0->is_interface() && // do not trust interfaces - !klass1->is_interface()) { + klass0->is_loaded() && !klass0->is_interface() && // do not trust interfaces + klass1->is_loaded() && !klass1->is_interface()) { bool unrelated_classes = false; // See if neither subclasses the other, or if the class on top // is precise. In either of these cases, the compare is known From 5231fcdc40072a17f40916d95b25e00b7740c16e Mon Sep 17 00:00:00 2001 From: Paul Hohensee Date: Tue, 24 Mar 2009 21:56:53 -0400 Subject: [PATCH 182/292] 6810653: Change String cache class used by Hotspot from String to StringValue Change create_vm() to load and initialize StringValue rather than String. Reviewed-by: kvn --- hotspot/src/share/vm/classfile/vmSymbols.hpp | 1 + hotspot/src/share/vm/runtime/thread.cpp | 22 +++++++++++--------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/hotspot/src/share/vm/classfile/vmSymbols.hpp b/hotspot/src/share/vm/classfile/vmSymbols.hpp index b9c17c2e2d2..1d5b68f0da6 100644 --- a/hotspot/src/share/vm/classfile/vmSymbols.hpp +++ b/hotspot/src/share/vm/classfile/vmSymbols.hpp @@ -49,6 +49,7 @@ template(java_lang_Object, "java/lang/Object") \ template(java_lang_Class, "java/lang/Class") \ template(java_lang_String, "java/lang/String") \ + template(java_lang_StringValue, "java/lang/StringValue") \ template(java_lang_Thread, "java/lang/Thread") \ template(java_lang_ThreadGroup, "java/lang/ThreadGroup") \ template(java_lang_Cloneable, "java/lang/Cloneable") \ diff --git a/hotspot/src/share/vm/runtime/thread.cpp b/hotspot/src/share/vm/runtime/thread.cpp index 2e4c6360143..547ea7fe64c 100644 --- a/hotspot/src/share/vm/runtime/thread.cpp +++ b/hotspot/src/share/vm/runtime/thread.cpp @@ -3007,17 +3007,19 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) { } if (UseStringCache) { - // Forcibly initialize java/lang/String and mutate the private + // Forcibly initialize java/lang/StringValue and mutate the private // static final "stringCacheEnabled" field before we start creating instances - klassOop k_o = SystemDictionary::resolve_or_null(vmSymbolHandles::java_lang_String(), Handle(), Handle(), CHECK_0); - KlassHandle k = KlassHandle(THREAD, k_o); - guarantee(k.not_null(), "Must find java/lang/String"); - instanceKlassHandle ik = instanceKlassHandle(THREAD, k()); - ik->initialize(CHECK_0); - fieldDescriptor fd; - // Possible we might not find this field; if so, don't break - if (ik->find_local_field(vmSymbols::stringCacheEnabled_name(), vmSymbols::bool_signature(), &fd)) { - k()->bool_field_put(fd.offset(), true); + klassOop k_o = SystemDictionary::resolve_or_null(vmSymbolHandles::java_lang_StringValue(), Handle(), Handle(), CHECK_0); + // Possible that StringValue isn't present: if so, silently don't break + if (k_o != NULL) { + KlassHandle k = KlassHandle(THREAD, k_o); + instanceKlassHandle ik = instanceKlassHandle(THREAD, k()); + ik->initialize(CHECK_0); + fieldDescriptor fd; + // Possible we might not find this field: if so, silently don't break + if (ik->find_local_field(vmSymbols::stringCacheEnabled_name(), vmSymbols::bool_signature(), &fd)) { + k()->bool_field_put(fd.offset(), true); + } } } } From 01a36018d3056abd0b12ffdff20827cf5a1e352d Mon Sep 17 00:00:00 2001 From: Doug Lea Date: Tue, 24 Mar 2009 19:42:23 -0700 Subject: [PATCH 183/292] 6800572: Removing elements from views of NavigableMap implementations does not always work correctly Replace use of new TreeSet with new KeySet Reviewed-by: martin --- jdk/src/share/classes/java/util/TreeMap.java | 10 +- .../concurrent/ConcurrentSkipListMap.java | 11 +-- jdk/test/java/util/Collection/MOAT.java | 92 +++++++++++++++++++ 3 files changed, 102 insertions(+), 11 deletions(-) diff --git a/jdk/src/share/classes/java/util/TreeMap.java b/jdk/src/share/classes/java/util/TreeMap.java index 6a1c6b411f5..cf97bccb7e7 100644 --- a/jdk/src/share/classes/java/util/TreeMap.java +++ b/jdk/src/share/classes/java/util/TreeMap.java @@ -1068,14 +1068,14 @@ public class TreeMap } public NavigableSet subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) { - return new TreeSet(m.subMap(fromElement, fromInclusive, - toElement, toInclusive)); + return new KeySet(m.subMap(fromElement, fromInclusive, + toElement, toInclusive)); } public NavigableSet headSet(E toElement, boolean inclusive) { - return new TreeSet(m.headMap(toElement, inclusive)); + return new KeySet(m.headMap(toElement, inclusive)); } public NavigableSet tailSet(E fromElement, boolean inclusive) { - return new TreeSet(m.tailMap(fromElement, inclusive)); + return new KeySet(m.tailMap(fromElement, inclusive)); } public SortedSet subSet(E fromElement, E toElement) { return subSet(fromElement, true, toElement, false); @@ -1087,7 +1087,7 @@ public class TreeMap return tailSet(fromElement, true); } public NavigableSet descendingSet() { - return new TreeSet(m.descendingMap()); + return new KeySet(m.descendingMap()); } } diff --git a/jdk/src/share/classes/java/util/concurrent/ConcurrentSkipListMap.java b/jdk/src/share/classes/java/util/concurrent/ConcurrentSkipListMap.java index 143d06713b4..323482acb4e 100644 --- a/jdk/src/share/classes/java/util/concurrent/ConcurrentSkipListMap.java +++ b/jdk/src/share/classes/java/util/concurrent/ConcurrentSkipListMap.java @@ -2394,15 +2394,14 @@ public class ConcurrentSkipListMap extends AbstractMap boolean fromInclusive, E toElement, boolean toInclusive) { - return new ConcurrentSkipListSet - (m.subMap(fromElement, fromInclusive, - toElement, toInclusive)); + return new KeySet(m.subMap(fromElement, fromInclusive, + toElement, toInclusive)); } public NavigableSet headSet(E toElement, boolean inclusive) { - return new ConcurrentSkipListSet(m.headMap(toElement, inclusive)); + return new KeySet(m.headMap(toElement, inclusive)); } public NavigableSet tailSet(E fromElement, boolean inclusive) { - return new ConcurrentSkipListSet(m.tailMap(fromElement, inclusive)); + return new KeySet(m.tailMap(fromElement, inclusive)); } public NavigableSet subSet(E fromElement, E toElement) { return subSet(fromElement, true, toElement, false); @@ -2414,7 +2413,7 @@ public class ConcurrentSkipListMap extends AbstractMap return tailSet(fromElement, true); } public NavigableSet descendingSet() { - return new ConcurrentSkipListSet(m.descendingMap()); + return new KeySet(m.descendingMap()); } } diff --git a/jdk/test/java/util/Collection/MOAT.java b/jdk/test/java/util/Collection/MOAT.java index 0dd89f35500..f9d30f56217 100644 --- a/jdk/test/java/util/Collection/MOAT.java +++ b/jdk/test/java/util/Collection/MOAT.java @@ -555,6 +555,7 @@ public class MOAT { NavigableMap nm = (NavigableMap) m; + testNavigableMapRemovers(nm); testNavigableMap(nm); testNavigableMap(nm.headMap(6, false)); testNavigableMap(nm.headMap(5, true)); @@ -742,6 +743,97 @@ public class MOAT { equal(it.next(), expected); } + static void equalMaps(Map m1, Map m2) { + equal(m1, m2); + equal(m2, m1); + equal(m1.size(), m2.size()); + equal(m1.isEmpty(), m2.isEmpty()); + equal(m1.toString(), m2.toString()); + check(Arrays.equals(m1.entrySet().toArray(), m2.entrySet().toArray())); + } + + @SuppressWarnings({"unchecked", "rawtypes"}) + static void testNavigableMapRemovers(NavigableMap m) + { + final Map emptyMap = new HashMap(); + + final Map singletonMap = new HashMap(); + singletonMap.put(1, 2); + + abstract class NavigableMapView { + abstract NavigableMap view(NavigableMap m); + } + + NavigableMapView[] views = { + new NavigableMapView() { NavigableMap view(NavigableMap m) { + return m; }}, + new NavigableMapView() { NavigableMap view(NavigableMap m) { + return m.headMap(99, true); }}, + new NavigableMapView() { NavigableMap view(NavigableMap m) { + return m.tailMap(-99, false); }}, + new NavigableMapView() { NavigableMap view(NavigableMap m) { + return m.subMap(-99, true, 99, false); }}, + }; + + abstract class Remover { + abstract void remove(NavigableMap m, Object k, Object v); + } + + Remover[] removers = { + new Remover() { void remove(NavigableMap m, Object k, Object v) { + equal(m.remove(k), v); }}, + + new Remover() { void remove(NavigableMap m, Object k, Object v) { + equal(m.descendingMap().remove(k), v); }}, + new Remover() { void remove(NavigableMap m, Object k, Object v) { + equal(m.descendingMap().headMap(-86, false).remove(k), v); }}, + new Remover() { void remove(NavigableMap m, Object k, Object v) { + equal(m.descendingMap().tailMap(86, true).remove(k), v); }}, + + new Remover() { void remove(NavigableMap m, Object k, Object v) { + equal(m.headMap(86, true).remove(k), v); }}, + new Remover() { void remove(NavigableMap m, Object k, Object v) { + equal(m.tailMap(-86, true).remove(k), v); }}, + new Remover() { void remove(NavigableMap m, Object k, Object v) { + equal(m.subMap(-86, false, 86, true).remove(k), v); }}, + + new Remover() { void remove(NavigableMap m, Object k, Object v) { + check(m.keySet().remove(k)); }}, + new Remover() { void remove(NavigableMap m, Object k, Object v) { + check(m.navigableKeySet().remove(k)); }}, + + new Remover() { void remove(NavigableMap m, Object k, Object v) { + check(m.navigableKeySet().headSet(86, true).remove(k)); }}, + new Remover() { void remove(NavigableMap m, Object k, Object v) { + check(m.navigableKeySet().tailSet(-86, false).remove(k)); }}, + new Remover() { void remove(NavigableMap m, Object k, Object v) { + check(m.navigableKeySet().subSet(-86, true, 86, false) + .remove(k)); }}, + + new Remover() { void remove(NavigableMap m, Object k, Object v) { + check(m.descendingKeySet().headSet(-86, false).remove(k)); }}, + new Remover() { void remove(NavigableMap m, Object k, Object v) { + check(m.descendingKeySet().tailSet(86, true).remove(k)); }}, + new Remover() { void remove(NavigableMap m, Object k, Object v) { + check(m.descendingKeySet().subSet(86, true, -86, false) + .remove(k)); }}, + }; + + for (NavigableMapView view : views) { + for (Remover remover : removers) { + try { + m.clear(); + equalMaps(m, emptyMap); + equal(m.put(1, 2), null); + equalMaps(m, singletonMap); + NavigableMap v = view.view(m); + remover.remove(v, 1, 2); + equalMaps(m, emptyMap); + } catch (Throwable t) { unexpected(t); } + } + } + } + private static void testNavigableMap(NavigableMap m) { clear(m); From 83216051219492406d3a6286400eb7a29f0a233d Mon Sep 17 00:00:00 2001 From: Maurizio Cimadamore Date: Wed, 25 Mar 2009 10:28:36 +0000 Subject: [PATCH 184/292] 6182950: methods clash algorithm should not depend on return type Fixed code that checks for duplicate method declarations Reviewed-by: jjg --- .../com/sun/tools/javac/comp/Check.java | 20 +++++++-- .../javac/generics/6182950/T6182950a.java | 36 +++++++++++++++ .../javac/generics/6182950/T6182950a.out | 2 + .../javac/generics/6182950/T6182950b.java | 40 +++++++++++++++++ .../javac/generics/6182950/T6182950b.out | 2 + .../javac/generics/6182950/T6182950c.java | 44 +++++++++++++++++++ 6 files changed, 141 insertions(+), 3 deletions(-) create mode 100644 langtools/test/tools/javac/generics/6182950/T6182950a.java create mode 100644 langtools/test/tools/javac/generics/6182950/T6182950a.out create mode 100644 langtools/test/tools/javac/generics/6182950/T6182950b.java create mode 100644 langtools/test/tools/javac/generics/6182950/T6182950b.out create mode 100644 langtools/test/tools/javac/generics/6182950/T6182950c.java diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java index e02c85c21d6..0f9f8d98c44 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java @@ -1458,10 +1458,14 @@ public class Check { while (e.scope != null) { if (m.overrides(e.sym, origin, types, false)) checkOverride(tree, m, (MethodSymbol)e.sym, origin); - else if (e.sym.isInheritedIn(origin, types) && !m.isConstructor()) { + else if (e.sym.kind == MTH && + e.sym.isInheritedIn(origin, types) && + (e.sym.flags() & SYNTHETIC) == 0 && + !m.isConstructor()) { Type er1 = m.erasure(types); Type er2 = e.sym.erasure(types); - if (types.isSameType(er1,er2)) { + if (types.isSameTypes(er1.getParameterTypes(), + er2.getParameterTypes())) { log.error(TreeInfo.diagnosticPositionFor(m, tree), "name.clash.same.erasure.no.override", m, m.location(), @@ -2088,9 +2092,11 @@ public class Check { if (sym != e.sym && sym.kind == e.sym.kind && sym.name != names.error && - (sym.kind != MTH || types.overrideEquivalent(sym.type, e.sym.type))) { + (sym.kind != MTH || types.hasSameArgs(types.erasure(sym.type), types.erasure(e.sym.type)))) { if ((sym.flags() & VARARGS) != (e.sym.flags() & VARARGS)) varargsDuplicateError(pos, sym, e.sym); + else if (sym.kind == MTH && !types.overrideEquivalent(sym.type, e.sym.type)) + duplicateErasureError(pos, sym, e.sym); else duplicateError(pos, e.sym); return false; @@ -2098,6 +2104,14 @@ public class Check { } return true; } + //where + /** Report duplicate declaration error. + */ + void duplicateErasureError(DiagnosticPosition pos, Symbol sym1, Symbol sym2) { + if (!sym1.type.isErroneous() && !sym2.type.isErroneous()) { + log.error(pos, "name.clash.same.erasure", sym1, sym2); + } + } /** Check that single-type import is not already imported or top-level defined, * but make an exception for two single-type imports which denote the same type. diff --git a/langtools/test/tools/javac/generics/6182950/T6182950a.java b/langtools/test/tools/javac/generics/6182950/T6182950a.java new file mode 100644 index 00000000000..82fb49ec734 --- /dev/null +++ b/langtools/test/tools/javac/generics/6182950/T6182950a.java @@ -0,0 +1,36 @@ +/* + * Copyright 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 6182950 + * @summary methods clash algorithm should not depend on return type + * @author mcimadamore + * @compile/fail/ref=T6182950a.out -XDrawDiagnostics T6182950a.java + */ +import java.util.List; + +class T6182950a { + int m(List l) {return 0;} + double m(List l) {return 0;} +} diff --git a/langtools/test/tools/javac/generics/6182950/T6182950a.out b/langtools/test/tools/javac/generics/6182950/T6182950a.out new file mode 100644 index 00000000000..6c0f5cb2916 --- /dev/null +++ b/langtools/test/tools/javac/generics/6182950/T6182950a.out @@ -0,0 +1,2 @@ +T6182950a.java:35:12: compiler.err.name.clash.same.erasure: m(java.util.List), m(java.util.List) +1 error diff --git a/langtools/test/tools/javac/generics/6182950/T6182950b.java b/langtools/test/tools/javac/generics/6182950/T6182950b.java new file mode 100644 index 00000000000..b3120dcc03f --- /dev/null +++ b/langtools/test/tools/javac/generics/6182950/T6182950b.java @@ -0,0 +1,40 @@ +/* + * Copyright 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 6182950 + * @summary methods clash algorithm should not depend on return type + * @author mcimadamore + * @compile/fail/ref=T6182950b.out -XDrawDiagnostics T6182950b.java + */ +import java.util.List; + +class T6182950b { + static class A { + int m(List l) {return 0;} + } + static class B extends A { + double m(List l) {return 0;} + } +} diff --git a/langtools/test/tools/javac/generics/6182950/T6182950b.out b/langtools/test/tools/javac/generics/6182950/T6182950b.out new file mode 100644 index 00000000000..d9dcb48f1fa --- /dev/null +++ b/langtools/test/tools/javac/generics/6182950/T6182950b.out @@ -0,0 +1,2 @@ +T6182950b.java:38:16: compiler.err.name.clash.same.erasure.no.override: m(java.util.List), T6182950b.B, m(java.util.List), T6182950b.A +1 error diff --git a/langtools/test/tools/javac/generics/6182950/T6182950c.java b/langtools/test/tools/javac/generics/6182950/T6182950c.java new file mode 100644 index 00000000000..db8da8f6ff5 --- /dev/null +++ b/langtools/test/tools/javac/generics/6182950/T6182950c.java @@ -0,0 +1,44 @@ +/* + * Copyright 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 6182950 + * @summary methods clash algorithm should not depend on return type + * @author mcimadamore + * @compile T6182950c.java + */ + +class T6182950c { + static abstract class A { + abstract Object m(X x); + } + + static abstract class B extends A { + Number m(X x) {return 0;} + } + + final static class C extends B { + Integer m(X x) {return 0;} + } +} From d0892edd69551a03b54f9e45c91f7ee01d15c176 Mon Sep 17 00:00:00 2001 From: Maurizio Cimadamore Date: Wed, 25 Mar 2009 10:28:52 +0000 Subject: [PATCH 185/292] 6816548: Uninitialized register when performing casting + auto(un)boxing Constant value of final variable is lost during lowering Reviewed-by: jjg --- .../com/sun/tools/javac/comp/Lower.java | 4 +- .../test/tools/javac/boxing/T6816548.java | 66 +++++++++++++++++++ 2 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 langtools/test/tools/javac/boxing/T6816548.java diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java index 3f513209caf..fe729ee9592 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java @@ -2631,8 +2631,8 @@ public class Lower extends TreeTranslator { if (havePrimitive) { Type unboxedTarget = types.unboxedType(type); if (unboxedTarget.tag != NONE) { - if (!types.isSubtype(tree.type, unboxedTarget)) - tree.type = unboxedTarget; // e.g. Character c = 89; + if (!types.isSubtype(tree.type, unboxedTarget)) //e.g. Character c = 89; + tree.type = unboxedTarget.constType(tree.type.constValue()); return (T)boxPrimitive((JCExpression)tree, type); } else { tree = (T)boxPrimitive((JCExpression)tree); diff --git a/langtools/test/tools/javac/boxing/T6816548.java b/langtools/test/tools/javac/boxing/T6816548.java new file mode 100644 index 00000000000..2629fa7fe41 --- /dev/null +++ b/langtools/test/tools/javac/boxing/T6816548.java @@ -0,0 +1,66 @@ +/* + * Copyright 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 6816548 + * @summary Uninitialized register when performing casting + auto(un)boxing + * @author mcimadamore + */ +public class T6816548 { + + public static void main(String[] args) { + testInt(); + testShort(); + testByte(); + testChar(); + } + + public static void testInt() { + final int fi = 0; + Byte b = fi; + Short s = fi; + Character c = fi; + } + + public static void testShort() { + final short fs = 0; + Byte b = fs; + Short s = fs; + Character c = fs; + } + + public static void testByte() { + final byte fb = 0; + Byte b = fb; + Short s = fb; + Character c = fb; + } + + public static void testChar() { + final char fc = '0'; + Byte b = fc; + Short s = fc; + Character c = fc; + } +} From 584c02dfa8cc2d22a50f7e8a25a416477164f62d Mon Sep 17 00:00:00 2001 From: Maurizio Cimadamore Date: Wed, 25 Mar 2009 10:29:28 +0000 Subject: [PATCH 186/292] 6400189: raw types and inference Fixed resolution problem with raw overriding (CCC) Reviewed-by: jjg --- .../com/sun/tools/javac/comp/Resolve.java | 51 +++++++++++++----- .../OverrideChecks/6400189/T6400189a.java | 38 +++++++++++++ .../OverrideChecks/6400189/T6400189a.out | 4 ++ .../OverrideChecks/6400189/T6400189b.java | 49 +++++++++++++++++ .../OverrideChecks/6400189/T6400189b.out | 4 ++ .../OverrideChecks/6400189/T6400189c.java | 45 ++++++++++++++++ .../OverrideChecks/6400189/T6400189d.java | 53 +++++++++++++++++++ 7 files changed, 230 insertions(+), 14 deletions(-) create mode 100644 langtools/test/tools/javac/OverrideChecks/6400189/T6400189a.java create mode 100644 langtools/test/tools/javac/OverrideChecks/6400189/T6400189a.out create mode 100644 langtools/test/tools/javac/OverrideChecks/6400189/T6400189b.java create mode 100644 langtools/test/tools/javac/OverrideChecks/6400189/T6400189b.out create mode 100644 langtools/test/tools/javac/OverrideChecks/6400189/T6400189c.java create mode 100644 langtools/test/tools/javac/OverrideChecks/6400189/T6400189d.java diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java index 1a141aa5400..ca4908830cc 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java @@ -216,7 +216,9 @@ public class Resolve { && isAccessible(env, site) && - sym.isInheritedIn(site.tsym, types); + sym.isInheritedIn(site.tsym, types) + && + notOverriddenIn(site, sym); case PROTECTED: return (env.toplevel.packge == sym.owner.owner // fast special case @@ -231,14 +233,23 @@ public class Resolve { && isAccessible(env, site) && - // `sym' is accessible only if not overridden by - // another symbol which is a member of `site' - // (because, if it is overridden, `sym' is not strictly - // speaking a member of `site'.) - (sym.kind != MTH || sym.isConstructor() || sym.isStatic() || - ((MethodSymbol)sym).implementation(site.tsym, types, true) == sym); + notOverriddenIn(site, sym); default: // this case includes erroneous combinations as well - return isAccessible(env, site); + return isAccessible(env, site) && notOverriddenIn(site, sym); + } + } + //where + /* `sym' is accessible only if not overridden by + * another symbol which is a member of `site' + * (because, if it is overridden, `sym' is not strictly + * speaking a member of `site'.) + */ + private boolean notOverriddenIn(Type site, Symbol sym) { + if (sym.kind != MTH || sym.isConstructor() || sym.isStatic()) + return true; + else { + Symbol s2 = ((MethodSymbol)sym).implementation(site.tsym, types, true); + return (s2 == null || s2 == sym); } } //where @@ -605,7 +616,7 @@ public class Resolve { Symbol mostSpecific(Symbol m1, Symbol m2, Env env, - Type site, + final Type site, boolean allowBoxing, boolean useVarargs) { switch (m2.kind) { @@ -661,21 +672,33 @@ public class Resolve { m2.erasure(types).getParameterTypes())) return new AmbiguityError(m1, m2); // both abstract, neither overridden; merge throws clause and result type - Symbol result; + Symbol mostSpecific; Type result2 = mt2.getReturnType(); if (mt2.tag == FORALL) result2 = types.subst(result2, ((ForAll)mt2).tvars, ((ForAll)mt1).tvars); if (types.isSubtype(mt1.getReturnType(), result2)) { - result = m1; + mostSpecific = m1; } else if (types.isSubtype(result2, mt1.getReturnType())) { - result = m2; + mostSpecific = m2; } else { // Theoretically, this can't happen, but it is possible // due to error recovery or mixing incompatible class files return new AmbiguityError(m1, m2); } - result = result.clone(result.owner); - result.type = (Type)result.type.clone(); + MethodSymbol result = new MethodSymbol( + mostSpecific.flags(), + mostSpecific.name, + null, + mostSpecific.owner) { + @Override + public MethodSymbol implementation(TypeSymbol origin, Types types, boolean checkResult) { + if (origin == site.tsym) + return this; + else + return super.implementation(origin, types, checkResult); + } + }; + result.type = (Type)mostSpecific.type.clone(); result.type.setThrown(chk.intersect(mt1.getThrownTypes(), mt2.getThrownTypes())); return result; diff --git a/langtools/test/tools/javac/OverrideChecks/6400189/T6400189a.java b/langtools/test/tools/javac/OverrideChecks/6400189/T6400189a.java new file mode 100644 index 00000000000..a1808b81f94 --- /dev/null +++ b/langtools/test/tools/javac/OverrideChecks/6400189/T6400189a.java @@ -0,0 +1,38 @@ +/* + * Copyright 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 6400189 + * @summary raw types and inference + * @author mcimadamore + * @compile/fail/ref=T6400189a.out T6400189a.java -Xlint:unchecked -XDrawDiagnostics + */ + +import java.lang.reflect.Constructor; +import java.lang.annotation.Documented; + +class T6400189a { + Constructor c = null; + Documented d = c.getAnnotation(Documented.class); +} diff --git a/langtools/test/tools/javac/OverrideChecks/6400189/T6400189a.out b/langtools/test/tools/javac/OverrideChecks/6400189/T6400189a.out new file mode 100644 index 00000000000..39938023fa3 --- /dev/null +++ b/langtools/test/tools/javac/OverrideChecks/6400189/T6400189a.out @@ -0,0 +1,4 @@ +T6400189a.java:37:35: compiler.warn.unchecked.call.mbr.of.raw.type: getAnnotation(java.lang.Class), java.lang.reflect.Constructor +T6400189a.java:37:35: compiler.err.prob.found.req: (compiler.misc.incompatible.types), java.lang.annotation.Annotation, java.lang.annotation.Documented +1 error +1 warning diff --git a/langtools/test/tools/javac/OverrideChecks/6400189/T6400189b.java b/langtools/test/tools/javac/OverrideChecks/6400189/T6400189b.java new file mode 100644 index 00000000000..c7a6993d565 --- /dev/null +++ b/langtools/test/tools/javac/OverrideChecks/6400189/T6400189b.java @@ -0,0 +1,49 @@ +/* + * Copyright 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 6400189 + * @summary raw types and inference + * @author mcimadamore + * @compile/fail/ref=T6400189b.out T6400189b.java -Xlint:unchecked -XDrawDiagnostics + */ + +class T6400189b { + + static class A { + T m(T6400189b x) { + return null; + } + } + + static class B extends A { + T m(T6400189b x) { + return null; + } + } + + void test(B b) { + Integer i = b.m(new T6400189b()); + } +} diff --git a/langtools/test/tools/javac/OverrideChecks/6400189/T6400189b.out b/langtools/test/tools/javac/OverrideChecks/6400189/T6400189b.out new file mode 100644 index 00000000000..8d7711a117e --- /dev/null +++ b/langtools/test/tools/javac/OverrideChecks/6400189/T6400189b.out @@ -0,0 +1,4 @@ +T6400189b.java:47:24: compiler.warn.unchecked.call.mbr.of.raw.type: m(T6400189b), T6400189b.B +T6400189b.java:47:24: compiler.err.prob.found.req: (compiler.misc.incompatible.types), java.lang.Object, java.lang.Integer +1 error +1 warning diff --git a/langtools/test/tools/javac/OverrideChecks/6400189/T6400189c.java b/langtools/test/tools/javac/OverrideChecks/6400189/T6400189c.java new file mode 100644 index 00000000000..5d95c10c490 --- /dev/null +++ b/langtools/test/tools/javac/OverrideChecks/6400189/T6400189c.java @@ -0,0 +1,45 @@ +/* + * Copyright 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 6400189 + * @summary raw types and inference + * @author mcimadamore + * @compile T6400189c.java + */ + +class T6400189c { + + static class A { + T m(T6400189c x) { + return null; + } + } + + static class B extends A {} + + void test(B b) { + Integer i = b.m(new T6400189c()); + } +} diff --git a/langtools/test/tools/javac/OverrideChecks/6400189/T6400189d.java b/langtools/test/tools/javac/OverrideChecks/6400189/T6400189d.java new file mode 100644 index 00000000000..12ab97f693b --- /dev/null +++ b/langtools/test/tools/javac/OverrideChecks/6400189/T6400189d.java @@ -0,0 +1,53 @@ +/* + * Copyright 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 6400189 + * @summary raw types and inference + * @author mcimadamore + * @compile T6400189d.java + */ + +import java.util.Iterator; + +class T6400189c { + + interface A extends Iterable { + Iterator iterator(); + } + + interface A2 extends A { + Iterator iterator(); + } + + static abstract class B implements A { + public abstract Iterator iterator(); + } + + static abstract class C extends B implements A2 { + Iterator test() { + return iterator(); + } + } +} From be5021d224fc80319134e4a7c2fd13e1e1eead06 Mon Sep 17 00:00:00 2001 From: Anthony Petrov Date: Wed, 25 Mar 2009 13:37:08 +0300 Subject: [PATCH 187/292] 6714678: IDE (Netbeans, Eclipse, JDeveloper) Debugger hangs process on Linux Added the system property sun.awt.disablegrab Reviewed-by: art, dcherepanov --- .../classes/sun/awt/X11/XBaseWindow.java | 54 +++++++++++-------- .../solaris/classes/sun/awt/X11/XToolkit.java | 9 ++++ 2 files changed, 41 insertions(+), 22 deletions(-) diff --git a/jdk/src/solaris/classes/sun/awt/X11/XBaseWindow.java b/jdk/src/solaris/classes/sun/awt/X11/XBaseWindow.java index ace8b583077..46491e04c1d 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XBaseWindow.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XBaseWindow.java @@ -842,27 +842,35 @@ public class XBaseWindow { | XConstants.ButtonMotionMask); final int ownerEvents = 1; - int ptrGrab = XlibWrapper.XGrabPointer(XToolkit.getDisplay(), - getContentWindow(), ownerEvents, eventMask, XConstants.GrabModeAsync, - XConstants.GrabModeAsync, XConstants.None, (XWM.isMotif() ? XToolkit.arrowCursor : XConstants.None), - XConstants.CurrentTime); - // Check grab results to be consistent with X server grab - if (ptrGrab != XConstants.GrabSuccess) { - XlibWrapper.XUngrabPointer(XToolkit.getDisplay(), XConstants.CurrentTime); - XAwtState.setGrabWindow(null); - grabLog.fine(" Grab Failure - mouse"); - return false; - } - int keyGrab = XlibWrapper.XGrabKeyboard(XToolkit.getDisplay(), - getContentWindow(), ownerEvents, XConstants.GrabModeAsync, XConstants.GrabModeAsync, - XConstants.CurrentTime); - if (keyGrab != XConstants.GrabSuccess) { - XlibWrapper.XUngrabPointer(XToolkit.getDisplay(), XConstants.CurrentTime); - XlibWrapper.XUngrabKeyboard(XToolkit.getDisplay(), XConstants.CurrentTime); - XAwtState.setGrabWindow(null); - grabLog.fine(" Grab Failure - keyboard"); - return false; + //6714678: IDE (Netbeans, Eclipse, JDeveloper) Debugger hangs + //process on Linux + //The user must pass the sun.awt.disablegrab property to disable + //taking grabs. This prevents hanging of the GUI when a breakpoint + //is hit while a popup window taking the grab is open. + if (!XToolkit.getSunAwtDisableGrab()) { + int ptrGrab = XlibWrapper.XGrabPointer(XToolkit.getDisplay(), + getContentWindow(), ownerEvents, eventMask, XConstants.GrabModeAsync, + XConstants.GrabModeAsync, XConstants.None, (XWM.isMotif() ? XToolkit.arrowCursor : XConstants.None), + XConstants.CurrentTime); + // Check grab results to be consistent with X server grab + if (ptrGrab != XConstants.GrabSuccess) { + XlibWrapper.XUngrabPointer(XToolkit.getDisplay(), XConstants.CurrentTime); + XAwtState.setGrabWindow(null); + grabLog.fine(" Grab Failure - mouse"); + return false; + } + + int keyGrab = XlibWrapper.XGrabKeyboard(XToolkit.getDisplay(), + getContentWindow(), ownerEvents, XConstants.GrabModeAsync, XConstants.GrabModeAsync, + XConstants.CurrentTime); + if (keyGrab != XConstants.GrabSuccess) { + XlibWrapper.XUngrabPointer(XToolkit.getDisplay(), XConstants.CurrentTime); + XlibWrapper.XUngrabKeyboard(XToolkit.getDisplay(), XConstants.CurrentTime); + XAwtState.setGrabWindow(null); + grabLog.fine(" Grab Failure - keyboard"); + return false; + } } if (prevGrabWindow != null) { prevGrabWindow.ungrabInputImpl(); @@ -882,8 +890,10 @@ public class XBaseWindow { grabLog.log(Level.FINE, "UnGrab input on {0}", new Object[] {grabWindow}); if (grabWindow != null) { grabWindow.ungrabInputImpl(); - XlibWrapper.XUngrabPointer(XToolkit.getDisplay(), XConstants.CurrentTime); - XlibWrapper.XUngrabKeyboard(XToolkit.getDisplay(), XConstants.CurrentTime); + if (!XToolkit.getSunAwtDisableGrab()) { + XlibWrapper.XUngrabPointer(XToolkit.getDisplay(), XConstants.CurrentTime); + XlibWrapper.XUngrabKeyboard(XToolkit.getDisplay(), XConstants.CurrentTime); + } XAwtState.setGrabWindow(null); // we need to call XFlush() here to force ungrab // see 6384219 for details diff --git a/jdk/src/solaris/classes/sun/awt/X11/XToolkit.java b/jdk/src/solaris/classes/sun/awt/X11/XToolkit.java index 65324290213..8667008d576 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XToolkit.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XToolkit.java @@ -54,6 +54,7 @@ import sun.awt.*; import sun.font.FontManager; import sun.misc.PerformanceLogger; import sun.print.PrintJob2D; +import sun.security.action.GetBooleanAction; public final class XToolkit extends UNIXToolkit implements Runnable { private static Logger log = Logger.getLogger("sun.awt.X11.XToolkit"); @@ -2305,4 +2306,12 @@ public final class XToolkit extends UNIXToolkit implements Runnable { } return ((X11GraphicsConfig)gc).isTranslucencyCapable(); } + + /** + * Returns the value of "sun.awt.disablegrab" property. Default + * value is {@code false}. + */ + public static boolean getSunAwtDisableGrab() { + return AccessController.doPrivileged(new GetBooleanAction("sun.awt.disablegrab")); + } } From 101468324dba1bc05323892cf8c0f8fa9b2312a7 Mon Sep 17 00:00:00 2001 From: Karen Kinnear Date: Wed, 25 Mar 2009 13:09:28 -0400 Subject: [PATCH 188/292] 6603316: Improve instrumentation for classes loaded at startup Reviewed-by: xlu, mchung --- .../share/vm/classfile/classFileParser.cpp | 4 +-- hotspot/src/share/vm/prims/jni.cpp | 15 ++++++++++- hotspot/src/share/vm/prims/jvm.cpp | 26 ++++++++++++++----- hotspot/src/share/vm/prims/jvm_misc.hpp | 1 + 4 files changed, 37 insertions(+), 9 deletions(-) diff --git a/hotspot/src/share/vm/classfile/classFileParser.cpp b/hotspot/src/share/vm/classfile/classFileParser.cpp index b1f61dcf69a..119b95adf46 100644 --- a/hotspot/src/share/vm/classfile/classFileParser.cpp +++ b/hotspot/src/share/vm/classfile/classFileParser.cpp @@ -3230,7 +3230,7 @@ instanceKlassHandle ClassFileParser::parseClassFile(symbolHandle name, // print out the superclass. const char * from = Klass::cast(this_klass())->external_name(); if (this_klass->java_super() != NULL) { - tty->print("RESOLVE %s %s\n", from, instanceKlass::cast(this_klass->java_super())->external_name()); + tty->print("RESOLVE %s %s (super)\n", from, instanceKlass::cast(this_klass->java_super())->external_name()); } // print out each of the interface classes referred to by this class. objArrayHandle local_interfaces(THREAD, this_klass->local_interfaces()); @@ -3240,7 +3240,7 @@ instanceKlassHandle ClassFileParser::parseClassFile(symbolHandle name, klassOop k = klassOop(local_interfaces->obj_at(i)); instanceKlass* to_class = instanceKlass::cast(k); const char * to = to_class->external_name(); - tty->print("RESOLVE %s %s\n", from, to); + tty->print("RESOLVE %s %s (interface)\n", from, to); } } } diff --git a/hotspot/src/share/vm/prims/jni.cpp b/hotspot/src/share/vm/prims/jni.cpp index bd4f1ec3223..bde5dba7771 100644 --- a/hotspot/src/share/vm/prims/jni.cpp +++ b/hotspot/src/share/vm/prims/jni.cpp @@ -301,6 +301,10 @@ JNI_ENTRY(jclass, jni_DefineClass(JNIEnv *env, const char *name, jobject loaderR klassOop k = SystemDictionary::resolve_from_stream(class_name, class_loader, Handle(), &st, CHECK_NULL); + if (TraceClassResolution && k != NULL) { + trace_class_resolution(k); + } + cls = (jclass)JNIHandles::make_local( env, Klass::cast(k)->java_mirror()); return cls; @@ -365,6 +369,10 @@ JNI_ENTRY(jclass, jni_FindClass(JNIEnv *env, const char *name)) result = find_class_from_class_loader(env, sym, true, loader, protection_domain, true, thread); + if (TraceClassResolution && result != NULL) { + trace_class_resolution(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(result))); + } + // If we were the first invocation of jni_FindClass, we enable compilation again // rather than just allowing invocation counter to overflow and decay. // Controlled by flag DelayCompilationDuringStartup. @@ -2646,7 +2654,12 @@ static jclass lookupOne(JNIEnv* env, const char* name, TRAPS) { Handle protection_domain; // null protection domain symbolHandle sym = oopFactory::new_symbol_handle(name, CHECK_NULL); - return find_class_from_class_loader(env, sym, true, loader, protection_domain, true, CHECK_NULL); + jclass result = find_class_from_class_loader(env, sym, true, loader, protection_domain, true, CHECK_NULL); + + if (TraceClassResolution && result != NULL) { + trace_class_resolution(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(result))); + } + return result; } // These lookups are done with the NULL (bootstrap) ClassLoader to diff --git a/hotspot/src/share/vm/prims/jvm.cpp b/hotspot/src/share/vm/prims/jvm.cpp index cf866df9f61..5d341330506 100644 --- a/hotspot/src/share/vm/prims/jvm.cpp +++ b/hotspot/src/share/vm/prims/jvm.cpp @@ -64,6 +64,7 @@ static void trace_class_resolution_impl(klassOop to_class, TRAPS) { ResourceMark rm; int line_number = -1; const char * source_file = NULL; + const char * trace = "explicit"; klassOop caller = NULL; JavaThread* jthread = JavaThread::current(); if (jthread->has_last_Java_frame()) { @@ -107,12 +108,21 @@ static void trace_class_resolution_impl(klassOop to_class, TRAPS) { (last_caller->name() == vmSymbols::loadClassInternal_name() || last_caller->name() == vmSymbols::loadClass_name())) { found_it = true; + } else if (!vfst.at_end()) { + if (vfst.method()->is_native()) { + // JNI call + found_it = true; + } } if (found_it && !vfst.at_end()) { // found the caller caller = vfst.method()->method_holder(); line_number = vfst.method()->line_number_from_bci(vfst.bci()); - symbolOop s = instanceKlass::cast(vfst.method()->method_holder())->source_file_name(); + if (line_number == -1) { + // show method name if it's a native method + trace = vfst.method()->name_and_sig_as_C_string(); + } + symbolOop s = instanceKlass::cast(caller)->source_file_name(); if (s != NULL) { source_file = s->as_C_string(); } @@ -124,15 +134,15 @@ static void trace_class_resolution_impl(klassOop to_class, TRAPS) { const char * to = Klass::cast(to_class)->external_name(); // print in a single call to reduce interleaving between threads if (source_file != NULL) { - tty->print("RESOLVE %s %s %s:%d (explicit)\n", from, to, source_file, line_number); + tty->print("RESOLVE %s %s %s:%d (%s)\n", from, to, source_file, line_number, trace); } else { - tty->print("RESOLVE %s %s (explicit)\n", from, to); + tty->print("RESOLVE %s %s (%s)\n", from, to, trace); } } } } -static void trace_class_resolution(klassOop to_class) { +void trace_class_resolution(klassOop to_class) { EXCEPTION_MARK; trace_class_resolution_impl(to_class, THREAD); if (HAS_PENDING_EXCEPTION) { @@ -3213,8 +3223,12 @@ JVM_ENTRY(jclass, JVM_LoadClass0(JNIEnv *env, jobject receiver, } Handle h_loader(THREAD, loader); Handle h_prot (THREAD, protection_domain); - return find_class_from_class_loader(env, name, true, h_loader, h_prot, - false, thread); + jclass result = find_class_from_class_loader(env, name, true, h_loader, h_prot, + false, thread); + if (TraceClassResolution && result != NULL) { + trace_class_resolution(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(result))); + } + return result; JVM_END diff --git a/hotspot/src/share/vm/prims/jvm_misc.hpp b/hotspot/src/share/vm/prims/jvm_misc.hpp index 7af47518c0f..50644842bbd 100644 --- a/hotspot/src/share/vm/prims/jvm_misc.hpp +++ b/hotspot/src/share/vm/prims/jvm_misc.hpp @@ -27,6 +27,7 @@ jclass find_class_from_class_loader(JNIEnv* env, symbolHandle name, jboolean init, Handle loader, Handle protection_domain, jboolean throwError, TRAPS); +void trace_class_resolution(klassOop to_class); /* * Support for Serialization and RMI. Currently used by HotSpot only. From cec3a034d180a3b3026d6760b3639e28620398b2 Mon Sep 17 00:00:00 2001 From: Coleen Phillimore Date: Wed, 25 Mar 2009 14:19:20 -0400 Subject: [PATCH 189/292] 6541756: Reduce executable C-heap Add executable parameters to reserve_memory and commit_memory to reduce executable memory to only the Code Heap. Reviewed-by: xlu, kvn, acorn --- hotspot/src/os/linux/vm/os_linux.cpp | 22 ++++---- hotspot/src/os/solaris/vm/os_solaris.cpp | 15 +++--- hotspot/src/os/windows/vm/os_windows.cpp | 50 ++++++++++++------- hotspot/src/share/vm/memory/heap.cpp | 2 +- hotspot/src/share/vm/runtime/os.hpp | 9 ++-- hotspot/src/share/vm/runtime/virtualspace.cpp | 49 +++++++++++++----- hotspot/src/share/vm/runtime/virtualspace.hpp | 33 ++++++++---- 7 files changed, 122 insertions(+), 58 deletions(-) diff --git a/hotspot/src/os/linux/vm/os_linux.cpp b/hotspot/src/os/linux/vm/os_linux.cpp index 1b892e7eafe..3788eac461e 100644 --- a/hotspot/src/os/linux/vm/os_linux.cpp +++ b/hotspot/src/os/linux/vm/os_linux.cpp @@ -2269,15 +2269,16 @@ void linux_wrap_code(char* base, size_t size) { // All it does is to check if there are enough free pages // left at the time of mmap(). This could be a potential // problem. -bool os::commit_memory(char* addr, size_t size) { - uintptr_t res = (uintptr_t) ::mmap(addr, size, - PROT_READ|PROT_WRITE|PROT_EXEC, +bool os::commit_memory(char* addr, size_t size, bool exec) { + int prot = exec ? PROT_READ|PROT_WRITE|PROT_EXEC : PROT_READ|PROT_WRITE; + uintptr_t res = (uintptr_t) ::mmap(addr, size, prot, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0); return res != (uintptr_t) MAP_FAILED; } -bool os::commit_memory(char* addr, size_t size, size_t alignment_hint) { - return commit_memory(addr, size); +bool os::commit_memory(char* addr, size_t size, size_t alignment_hint, + bool exec) { + return commit_memory(addr, size, exec); } void os::realign_memory(char *addr, size_t bytes, size_t alignment_hint) { } @@ -2417,8 +2418,7 @@ os::Linux::numa_interleave_memory_func_t os::Linux::_numa_interleave_memory; unsigned long* os::Linux::_numa_all_nodes; bool os::uncommit_memory(char* addr, size_t size) { - return ::mmap(addr, size, - PROT_READ|PROT_WRITE|PROT_EXEC, + return ::mmap(addr, size, PROT_NONE, MAP_PRIVATE|MAP_FIXED|MAP_NORESERVE|MAP_ANONYMOUS, -1, 0) != MAP_FAILED; } @@ -2441,7 +2441,9 @@ static char* anon_mmap(char* requested_addr, size_t bytes, bool fixed) { flags |= MAP_FIXED; } - addr = (char*)::mmap(requested_addr, bytes, PROT_READ|PROT_WRITE|PROT_EXEC, + // Map uncommitted pages PROT_READ and PROT_WRITE, change access + // to PROT_EXEC if executable when we commit the page. + addr = (char*)::mmap(requested_addr, bytes, PROT_READ|PROT_WRITE, flags, -1, 0); if (addr != MAP_FAILED) { @@ -2582,7 +2584,9 @@ bool os::large_page_init() { #define SHM_HUGETLB 04000 #endif -char* os::reserve_memory_special(size_t bytes, char* req_addr) { +char* os::reserve_memory_special(size_t bytes, char* req_addr, bool exec) { + // "exec" is passed in but not used. Creating the shared image for + // the code cache doesn't have an SHM_X executable permission to check. assert(UseLargePages, "only for large pages"); key_t key = IPC_PRIVATE; diff --git a/hotspot/src/os/solaris/vm/os_solaris.cpp b/hotspot/src/os/solaris/vm/os_solaris.cpp index 165c71e659f..23b4ff2f5f2 100644 --- a/hotspot/src/os/solaris/vm/os_solaris.cpp +++ b/hotspot/src/os/solaris/vm/os_solaris.cpp @@ -2623,15 +2623,16 @@ int os::vm_allocation_granularity() { return page_size; } -bool os::commit_memory(char* addr, size_t bytes) { +bool os::commit_memory(char* addr, size_t bytes, bool exec) { + int prot = exec ? PROT_READ|PROT_WRITE|PROT_EXEC : PROT_READ|PROT_WRITE; size_t size = bytes; return - NULL != Solaris::mmap_chunk(addr, size, MAP_PRIVATE|MAP_FIXED, - PROT_READ | PROT_WRITE | PROT_EXEC); + NULL != Solaris::mmap_chunk(addr, size, MAP_PRIVATE|MAP_FIXED, prot); } -bool os::commit_memory(char* addr, size_t bytes, size_t alignment_hint) { - if (commit_memory(addr, bytes)) { +bool os::commit_memory(char* addr, size_t bytes, size_t alignment_hint, + bool exec) { + if (commit_memory(addr, bytes, exec)) { if (UseMPSS && alignment_hint > (size_t)vm_page_size()) { // If the large page size has been set and the VM // is using large pages, use the large page size @@ -3220,7 +3221,9 @@ bool os::Solaris::set_mpss_range(caddr_t start, size_t bytes, size_t align) { return true; } -char* os::reserve_memory_special(size_t bytes, char* addr) { +char* os::reserve_memory_special(size_t bytes, char* addr, bool exec) { + // "exec" is passed in but not used. Creating the shared image for + // the code cache doesn't have an SHM_X executable permission to check. assert(UseLargePages && UseISM, "only for ISM large pages"); size_t size = bytes; diff --git a/hotspot/src/os/windows/vm/os_windows.cpp b/hotspot/src/os/windows/vm/os_windows.cpp index dd280bb4fbf..cc3c6202d65 100644 --- a/hotspot/src/os/windows/vm/os_windows.cpp +++ b/hotspot/src/os/windows/vm/os_windows.cpp @@ -2189,7 +2189,8 @@ LONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo) { if (addr > thread->stack_yellow_zone_base() && addr < thread->stack_base() ) { addr = (address)((uintptr_t)addr & (~((uintptr_t)os::vm_page_size() - (uintptr_t)1))); - os::commit_memory( (char *)addr, thread->stack_base() - addr ); + os::commit_memory((char *)addr, thread->stack_base() - addr, + false ); return EXCEPTION_CONTINUE_EXECUTION; } else @@ -2565,8 +2566,7 @@ char* os::reserve_memory(size_t bytes, char* addr, size_t alignment_hint) { assert((size_t)addr % os::vm_allocation_granularity() == 0, "reserve alignment"); assert(bytes % os::vm_allocation_granularity() == 0, "reserve block size"); - char* res = (char*)VirtualAlloc(addr, bytes, MEM_RESERVE, - PAGE_EXECUTE_READWRITE); + char* res = (char*)VirtualAlloc(addr, bytes, MEM_RESERVE, PAGE_READWRITE); assert(res == NULL || addr == NULL || addr == res, "Unexpected address from reserve."); return res; @@ -2595,7 +2595,7 @@ bool os::can_execute_large_page_memory() { return true; } -char* os::reserve_memory_special(size_t bytes, char* addr) { +char* os::reserve_memory_special(size_t bytes, char* addr, bool exec) { if (UseLargePagesIndividualAllocation) { if (TracePageSizes && Verbose) { @@ -2618,7 +2618,7 @@ char* os::reserve_memory_special(size_t bytes, char* addr) { p_buf = (char *) VirtualAlloc(addr, size_of_reserve, // size of Reserve MEM_RESERVE, - PAGE_EXECUTE_READWRITE); + PAGE_READWRITE); // If reservation failed, return NULL if (p_buf == NULL) return NULL; @@ -2659,7 +2659,13 @@ char* os::reserve_memory_special(size_t bytes, char* addr) { p_new = (char *) VirtualAlloc(next_alloc_addr, bytes_to_rq, MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES, - PAGE_EXECUTE_READWRITE); + PAGE_READWRITE); + if (p_new != NULL && exec) { + DWORD oldprot; + // Windows doc says to use VirtualProtect to get execute permissions + VirtualProtect(next_alloc_addr, bytes_to_rq, + PAGE_EXECUTE_READWRITE, &oldprot); + } } if (p_new == NULL) { @@ -2688,10 +2694,12 @@ char* os::reserve_memory_special(size_t bytes, char* addr) { } else { // normal policy just allocate it all at once DWORD flag = MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES; - char * res = (char *)VirtualAlloc(NULL, - bytes, - flag, - PAGE_EXECUTE_READWRITE); + char * res = (char *)VirtualAlloc(NULL, bytes, flag, PAGE_READWRITE); + if (res != NULL && exec) { + DWORD oldprot; + // Windows doc says to use VirtualProtect to get execute permissions + VirtualProtect(res, bytes, PAGE_EXECUTE_READWRITE, &oldprot); + } return res; } } @@ -2703,7 +2711,7 @@ bool os::release_memory_special(char* base, size_t bytes) { void os::print_statistics() { } -bool os::commit_memory(char* addr, size_t bytes) { +bool os::commit_memory(char* addr, size_t bytes, bool exec) { if (bytes == 0) { // Don't bother the OS with noops. return true; @@ -2712,11 +2720,19 @@ bool os::commit_memory(char* addr, size_t bytes) { assert(bytes % os::vm_page_size() == 0, "commit in page-sized chunks"); // Don't attempt to print anything if the OS call fails. We're // probably low on resources, so the print itself may cause crashes. - return VirtualAlloc(addr, bytes, MEM_COMMIT, PAGE_EXECUTE_READWRITE) != NULL; + bool result = VirtualAlloc(addr, bytes, MEM_COMMIT, PAGE_READWRITE) != 0; + if (result != NULL && exec) { + DWORD oldprot; + // Windows doc says to use VirtualProtect to get execute permissions + return VirtualProtect(addr, bytes, PAGE_EXECUTE_READWRITE, &oldprot) != 0; + } else { + return result; + } } -bool os::commit_memory(char* addr, size_t size, size_t alignment_hint) { - return commit_memory(addr, size); +bool os::commit_memory(char* addr, size_t size, size_t alignment_hint, + bool exec) { + return commit_memory(addr, size, exec); } bool os::uncommit_memory(char* addr, size_t bytes) { @@ -2750,7 +2766,7 @@ bool os::protect_memory(char* addr, size_t bytes, ProtType prot, // Strange enough, but on Win32 one can change protection only for committed // memory, not a big deal anyway, as bytes less or equal than 64K - if (!is_committed && !commit_memory(addr, bytes)) { + if (!is_committed && !commit_memory(addr, bytes, prot == MEM_PROT_RWX)) { fatal("cannot commit protection page"); } // One cannot use os::guard_memory() here, as on Win32 guard page @@ -3248,10 +3264,10 @@ jint os::init_2(void) { #endif if (!UseMembar) { - address mem_serialize_page = (address)VirtualAlloc(NULL, os::vm_page_size(), MEM_RESERVE, PAGE_EXECUTE_READWRITE); + address mem_serialize_page = (address)VirtualAlloc(NULL, os::vm_page_size(), MEM_RESERVE, PAGE_READWRITE); guarantee( mem_serialize_page != NULL, "Reserve Failed for memory serialize page"); - return_page = (address)VirtualAlloc(mem_serialize_page, os::vm_page_size(), MEM_COMMIT, PAGE_EXECUTE_READWRITE); + return_page = (address)VirtualAlloc(mem_serialize_page, os::vm_page_size(), MEM_COMMIT, PAGE_READWRITE); guarantee( return_page != NULL, "Commit Failed for memory serialize page"); os::set_memory_serialize_page( mem_serialize_page ); diff --git a/hotspot/src/share/vm/memory/heap.cpp b/hotspot/src/share/vm/memory/heap.cpp index b0986d1e3ff..ced1bf23c01 100644 --- a/hotspot/src/share/vm/memory/heap.cpp +++ b/hotspot/src/share/vm/memory/heap.cpp @@ -112,7 +112,7 @@ bool CodeHeap::reserve(size_t reserved_size, size_t committed_size, const size_t rs_align = page_size == (size_t) os::vm_page_size() ? 0 : MAX2(page_size, granularity); - ReservedSpace rs(r_size, rs_align, rs_align > 0); + ReservedCodeSpace rs(r_size, rs_align, rs_align > 0); os::trace_page_sizes("code heap", committed_size, reserved_size, page_size, rs.base(), rs.size()); if (!_memory.initialize(rs, c_size)) { diff --git a/hotspot/src/share/vm/runtime/os.hpp b/hotspot/src/share/vm/runtime/os.hpp index a245a56782f..e655d3e34b0 100644 --- a/hotspot/src/share/vm/runtime/os.hpp +++ b/hotspot/src/share/vm/runtime/os.hpp @@ -202,8 +202,10 @@ class os: AllStatic { static char* attempt_reserve_memory_at(size_t bytes, char* addr); static void split_reserved_memory(char *base, size_t size, size_t split, bool realloc); - static bool commit_memory(char* addr, size_t bytes); - static bool commit_memory(char* addr, size_t size, size_t alignment_hint); + static bool commit_memory(char* addr, size_t bytes, + bool executable = false); + static bool commit_memory(char* addr, size_t size, size_t alignment_hint, + bool executable = false); static bool uncommit_memory(char* addr, size_t bytes); static bool release_memory(char* addr, size_t bytes); @@ -243,7 +245,8 @@ class os: AllStatic { static char* non_memory_address_word(); // reserve, commit and pin the entire memory region - static char* reserve_memory_special(size_t size, char* addr = NULL); + static char* reserve_memory_special(size_t size, char* addr = NULL, + bool executable = false); static bool release_memory_special(char* addr, size_t bytes); static bool large_page_init(); static size_t large_page_size(); diff --git a/hotspot/src/share/vm/runtime/virtualspace.cpp b/hotspot/src/share/vm/runtime/virtualspace.cpp index 8ade3eb6abe..e6e4b55a690 100644 --- a/hotspot/src/share/vm/runtime/virtualspace.cpp +++ b/hotspot/src/share/vm/runtime/virtualspace.cpp @@ -28,7 +28,7 @@ // ReservedSpace ReservedSpace::ReservedSpace(size_t size) { - initialize(size, 0, false, NULL, 0); + initialize(size, 0, false, NULL, 0, false); } ReservedSpace::ReservedSpace(size_t size, size_t alignment, @@ -36,7 +36,13 @@ ReservedSpace::ReservedSpace(size_t size, size_t alignment, char* requested_address, const size_t noaccess_prefix) { initialize(size+noaccess_prefix, alignment, large, requested_address, - noaccess_prefix); + noaccess_prefix, false); +} + +ReservedSpace::ReservedSpace(size_t size, size_t alignment, + bool large, + bool executable) { + initialize(size, alignment, large, NULL, 0, executable); } char * @@ -132,7 +138,8 @@ ReservedSpace::ReservedSpace(const size_t prefix_size, const bool try_reserve_special = UseLargePages && prefix_align == os::large_page_size(); if (!os::can_commit_large_page_memory() && try_reserve_special) { - initialize(size, prefix_align, true, requested_address, noaccess_prefix); + initialize(size, prefix_align, true, requested_address, noaccess_prefix, + false); return; } @@ -141,6 +148,7 @@ ReservedSpace::ReservedSpace(const size_t prefix_size, _alignment = 0; _special = false; _noaccess_prefix = 0; + _executable = false; // Assert that if noaccess_prefix is used, it is the same as prefix_align. assert(noaccess_prefix == 0 || @@ -189,7 +197,8 @@ ReservedSpace::ReservedSpace(const size_t prefix_size, void ReservedSpace::initialize(size_t size, size_t alignment, bool large, char* requested_address, - const size_t noaccess_prefix) { + const size_t noaccess_prefix, + bool executable) { const size_t granularity = os::vm_allocation_granularity(); assert((size & granularity - 1) == 0, "size not aligned to os::vm_allocation_granularity()"); @@ -201,6 +210,7 @@ void ReservedSpace::initialize(size_t size, size_t alignment, bool large, _base = NULL; _size = 0; _special = false; + _executable = executable; _alignment = 0; _noaccess_prefix = 0; if (size == 0) { @@ -214,7 +224,7 @@ void ReservedSpace::initialize(size_t size, size_t alignment, bool large, if (special) { - base = os::reserve_memory_special(size, requested_address); + base = os::reserve_memory_special(size, requested_address, executable); if (base != NULL) { // Check alignment constraints @@ -284,7 +294,7 @@ void ReservedSpace::initialize(size_t size, size_t alignment, bool large, ReservedSpace::ReservedSpace(char* base, size_t size, size_t alignment, - bool special) { + bool special, bool executable) { assert((size % os::vm_allocation_granularity()) == 0, "size not allocation aligned"); _base = base; @@ -292,6 +302,7 @@ ReservedSpace::ReservedSpace(char* base, size_t size, size_t alignment, _alignment = alignment; _noaccess_prefix = 0; _special = special; + _executable = executable; } @@ -299,9 +310,10 @@ ReservedSpace ReservedSpace::first_part(size_t partition_size, size_t alignment, bool split, bool realloc) { assert(partition_size <= size(), "partition failed"); if (split) { - os::split_reserved_memory(_base, _size, partition_size, realloc); + os::split_reserved_memory(base(), size(), partition_size, realloc); } - ReservedSpace result(base(), partition_size, alignment, special()); + ReservedSpace result(base(), partition_size, alignment, special(), + executable()); return result; } @@ -310,7 +322,7 @@ ReservedSpace ReservedSpace::last_part(size_t partition_size, size_t alignment) { assert(partition_size <= size(), "partition failed"); ReservedSpace result(base() + partition_size, size() - partition_size, - alignment, special()); + alignment, special(), executable()); return result; } @@ -348,6 +360,7 @@ void ReservedSpace::release() { _size = 0; _noaccess_prefix = 0; _special = false; + _executable = false; } } @@ -396,6 +409,14 @@ ReservedHeapSpace::ReservedHeapSpace(const size_t prefix_size, protect_noaccess_prefix(prefix_size+suffix_size); } +// Reserve space for code segment. Same as Java heap only we mark this as +// executable. +ReservedCodeSpace::ReservedCodeSpace(size_t r_size, + size_t rs_align, + bool large) : + ReservedSpace(r_size, rs_align, large, /*executable*/ true) { +} + // VirtualSpace VirtualSpace::VirtualSpace() { @@ -413,6 +434,7 @@ VirtualSpace::VirtualSpace() { _middle_alignment = 0; _upper_alignment = 0; _special = false; + _executable = false; } @@ -426,6 +448,7 @@ bool VirtualSpace::initialize(ReservedSpace rs, size_t committed_size) { _high = low(); _special = rs.special(); + _executable = rs.executable(); // When a VirtualSpace begins life at a large size, make all future expansion // and shrinking occur aligned to a granularity of large pages. This avoids @@ -483,6 +506,7 @@ void VirtualSpace::release() { _middle_alignment = 0; _upper_alignment = 0; _special = false; + _executable = false; } @@ -592,7 +616,7 @@ bool VirtualSpace::expand_by(size_t bytes, bool pre_touch) { assert(low_boundary() <= lower_high() && lower_high() + lower_needs <= lower_high_boundary(), "must not expand beyond region"); - if (!os::commit_memory(lower_high(), lower_needs)) { + if (!os::commit_memory(lower_high(), lower_needs, _executable)) { debug_only(warning("os::commit_memory failed")); return false; } else { @@ -603,7 +627,8 @@ bool VirtualSpace::expand_by(size_t bytes, bool pre_touch) { assert(lower_high_boundary() <= middle_high() && middle_high() + middle_needs <= middle_high_boundary(), "must not expand beyond region"); - if (!os::commit_memory(middle_high(), middle_needs, middle_alignment())) { + if (!os::commit_memory(middle_high(), middle_needs, middle_alignment(), + _executable)) { debug_only(warning("os::commit_memory failed")); return false; } @@ -613,7 +638,7 @@ bool VirtualSpace::expand_by(size_t bytes, bool pre_touch) { assert(middle_high_boundary() <= upper_high() && upper_high() + upper_needs <= upper_high_boundary(), "must not expand beyond region"); - if (!os::commit_memory(upper_high(), upper_needs)) { + if (!os::commit_memory(upper_high(), upper_needs, _executable)) { debug_only(warning("os::commit_memory failed")); return false; } else { diff --git a/hotspot/src/share/vm/runtime/virtualspace.hpp b/hotspot/src/share/vm/runtime/virtualspace.hpp index b6e5a71099b..f412d11ad55 100644 --- a/hotspot/src/share/vm/runtime/virtualspace.hpp +++ b/hotspot/src/share/vm/runtime/virtualspace.hpp @@ -32,12 +32,15 @@ class ReservedSpace VALUE_OBJ_CLASS_SPEC { size_t _noaccess_prefix; size_t _alignment; bool _special; + bool _executable; // ReservedSpace - ReservedSpace(char* base, size_t size, size_t alignment, bool special); + ReservedSpace(char* base, size_t size, size_t alignment, bool special, + bool executable); void initialize(size_t size, size_t alignment, bool large, char* requested_address, - const size_t noaccess_prefix); + const size_t noaccess_prefix, + bool executable); // Release parts of an already-reserved memory region [addr, addr + len) to // get a new region that has "compound alignment." Return the start of the @@ -75,16 +78,16 @@ class ReservedSpace VALUE_OBJ_CLASS_SPEC { const size_t suffix_size, const size_t suffix_align, char* requested_address, const size_t noaccess_prefix = 0); + ReservedSpace(size_t size, size_t alignment, bool large, bool executable); // Accessors - char* base() const { return _base; } - size_t size() const { return _size; } - size_t alignment() const { return _alignment; } - bool special() const { return _special; } - - size_t noaccess_prefix() const { return _noaccess_prefix; } - - bool is_reserved() const { return _base != NULL; } + char* base() const { return _base; } + size_t size() const { return _size; } + size_t alignment() const { return _alignment; } + bool special() const { return _special; } + bool executable() const { return _executable; } + size_t noaccess_prefix() const { return _noaccess_prefix; } + bool is_reserved() const { return _base != NULL; } void release(); // Splitting @@ -126,6 +129,13 @@ public: char* requested_address); }; +// Class encapsulating behavior specific memory space for Code +class ReservedCodeSpace : public ReservedSpace { + public: + // Constructor + ReservedCodeSpace(size_t r_size, size_t rs_align, bool large); +}; + // VirtualSpace is data structure for committing a previously reserved address range in smaller chunks. class VirtualSpace VALUE_OBJ_CLASS_SPEC { @@ -143,6 +153,9 @@ class VirtualSpace VALUE_OBJ_CLASS_SPEC { // os::commit_memory() or os::uncommit_memory(). bool _special; + // Need to know if commit should be executable. + bool _executable; + // MPSS Support // Each virtualspace region has a lower, middle, and upper region. // Each region has an end boundary and a high pointer which is the From 5d6fffa036ede81851b754d0f737f9b00d7142f9 Mon Sep 17 00:00:00 2001 From: Mandy Chung Date: Wed, 25 Mar 2009 12:24:30 -0700 Subject: [PATCH 190/292] 6819122: DefaultProxySelector should lazily initialize the Pattern object and the NonProxyInfo objects Move two static NonProxyInfo fields into NonProxyInfo class and instantiate Pattern object when needed Reviewed-by: jccollet --- .../classes/sun/net/spi/DefaultProxySelector.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/jdk/src/share/classes/sun/net/spi/DefaultProxySelector.java b/jdk/src/share/classes/sun/net/spi/DefaultProxySelector.java index a4fd7df23e1..714dc4ce5c3 100644 --- a/jdk/src/share/classes/sun/net/spi/DefaultProxySelector.java +++ b/jdk/src/share/classes/sun/net/spi/DefaultProxySelector.java @@ -78,7 +78,6 @@ public class DefaultProxySelector extends ProxySelector { }; private static boolean hasSystemProxies = false; - private static Properties defprops = new Properties(); static { final String key = "java.net.useSystemProxies"; @@ -107,6 +106,9 @@ public class DefaultProxySelector extends ProxySelector { RegexpPool hostsPool; String property; + static NonProxyInfo ftpNonProxyInfo = new NonProxyInfo("ftp.nonProxyHosts", null, null); + static NonProxyInfo httpNonProxyInfo = new NonProxyInfo("http.nonProxyHosts", null, null); + NonProxyInfo(String p, String s, RegexpPool pool) { property = p; hostsSource = s; @@ -114,8 +116,6 @@ public class DefaultProxySelector extends ProxySelector { } } - private static NonProxyInfo ftpNonProxyInfo = new NonProxyInfo("ftp.nonProxyHosts", null, null); - private static NonProxyInfo httpNonProxyInfo = new NonProxyInfo("http.nonProxyHosts", null, null); /** * select() method. Where all the hard work is done. @@ -175,13 +175,13 @@ public class DefaultProxySelector extends ProxySelector { NonProxyInfo pinfo = null; if ("http".equalsIgnoreCase(protocol)) { - pinfo = httpNonProxyInfo; + pinfo = NonProxyInfo.httpNonProxyInfo; } else if ("https".equalsIgnoreCase(protocol)) { // HTTPS uses the same property as HTTP, for backward // compatibility - pinfo = httpNonProxyInfo; + pinfo = NonProxyInfo.httpNonProxyInfo; } else if ("ftp".equalsIgnoreCase(protocol)) { - pinfo = ftpNonProxyInfo; + pinfo = NonProxyInfo.ftpNonProxyInfo; } /** @@ -334,7 +334,6 @@ public class DefaultProxySelector extends ProxySelector { } } - private static final Pattern p6 = Pattern.compile("::1|(0:){7}1|(0:){1,6}:1"); private boolean isLoopback(String host) { if (host == null || host.length() == 0) return false; @@ -364,6 +363,7 @@ public class DefaultProxySelector extends ProxySelector { } if (host.endsWith(":1")) { + final Pattern p6 = Pattern.compile("::1|(0:){7}1|(0:){1,6}:1"); return p6.matcher(host).matches(); } return false; From cf2ae8d98d2d77d64aebe95b4c325da96c3f8bf9 Mon Sep 17 00:00:00 2001 From: Andrey Petrusenko Date: Wed, 25 Mar 2009 13:10:54 -0700 Subject: [PATCH 191/292] 6543938: G1: remove the concept of popularity Reviewed-by: iveresov, tonyp --- hotspot/src/cpu/sparc/vm/assembler_sparc.cpp | 11 +- .../g1/collectionSetChooser.cpp | 2 - .../gc_implementation/g1/g1CollectedHeap.cpp | 499 +----------------- .../gc_implementation/g1/g1CollectedHeap.hpp | 84 +-- .../g1/g1CollectorPolicy.cpp | 297 ++--------- .../g1/g1CollectorPolicy.hpp | 79 +-- .../vm/gc_implementation/g1/g1MarkSweep.cpp | 45 +- .../vm/gc_implementation/g1/g1RemSet.cpp | 7 +- .../gc_implementation/g1/g1RemSet.inline.hpp | 10 +- .../vm/gc_implementation/g1/g1_globals.hpp | 16 - .../vm/gc_implementation/g1/heapRegion.cpp | 4 - .../vm/gc_implementation/g1/heapRegion.hpp | 30 -- .../gc_implementation/g1/heapRegionRemSet.hpp | 46 +- .../vm/gc_implementation/g1/heapRegionSeq.cpp | 14 +- .../vm/gc_implementation/g1/heapRegionSeq.hpp | 5 +- .../gc_implementation/g1/vm_operations_g1.cpp | 9 +- .../gc_implementation/g1/vm_operations_g1.hpp | 14 - hotspot/src/share/vm/gc_interface/gcCause.hpp | 2 +- .../src/share/vm/runtime/vm_operations.hpp | 1 - 19 files changed, 101 insertions(+), 1074 deletions(-) diff --git a/hotspot/src/cpu/sparc/vm/assembler_sparc.cpp b/hotspot/src/cpu/sparc/vm/assembler_sparc.cpp index 4a61d2f2c5d..82b03a7ccee 100644 --- a/hotspot/src/cpu/sparc/vm/assembler_sparc.cpp +++ b/hotspot/src/cpu/sparc/vm/assembler_sparc.cpp @@ -4234,7 +4234,6 @@ void MacroAssembler::g1_write_barrier_pre(Register obj, Register index, int offs static jint num_ct_writes = 0; static jint num_ct_writes_filtered_in_hr = 0; static jint num_ct_writes_filtered_null = 0; -static jint num_ct_writes_filtered_pop = 0; static G1CollectedHeap* g1 = NULL; static Thread* count_ct_writes(void* filter_val, void* new_val) { @@ -4247,25 +4246,19 @@ static Thread* count_ct_writes(void* filter_val, void* new_val) { if (g1 == NULL) { g1 = G1CollectedHeap::heap(); } - if ((HeapWord*)new_val < g1->popular_object_boundary()) { - Atomic::inc(&num_ct_writes_filtered_pop); - } } if ((num_ct_writes % 1000000) == 0) { jint num_ct_writes_filtered = num_ct_writes_filtered_in_hr + - num_ct_writes_filtered_null + - num_ct_writes_filtered_pop; + num_ct_writes_filtered_null; tty->print_cr("%d potential CT writes: %5.2f%% filtered\n" - " (%5.2f%% intra-HR, %5.2f%% null, %5.2f%% popular).", + " (%5.2f%% intra-HR, %5.2f%% null).", num_ct_writes, 100.0*(float)num_ct_writes_filtered/(float)num_ct_writes, 100.0*(float)num_ct_writes_filtered_in_hr/ (float)num_ct_writes, 100.0*(float)num_ct_writes_filtered_null/ - (float)num_ct_writes, - 100.0*(float)num_ct_writes_filtered_pop/ (float)num_ct_writes); } return Thread::current(); diff --git a/hotspot/src/share/vm/gc_implementation/g1/collectionSetChooser.cpp b/hotspot/src/share/vm/gc_implementation/g1/collectionSetChooser.cpp index fbc5f4f151b..418dd584954 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/collectionSetChooser.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/collectionSetChooser.cpp @@ -277,8 +277,6 @@ printHeapRegion(HeapRegion *hr) { gclog_or_tty->print("H: "); if (hr->in_collection_set()) gclog_or_tty->print("CS: "); - if (hr->popular()) - gclog_or_tty->print("pop: "); gclog_or_tty->print_cr("Region " PTR_FORMAT " (%s%s) " "[" PTR_FORMAT ", " PTR_FORMAT"] " "Used: " SIZE_FORMAT "K, garbage: " SIZE_FORMAT "K.", diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp index 1966a7c59b4..a1e0262382c 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp @@ -42,21 +42,6 @@ // Local to this file. -// Finds the first HeapRegion. -// No longer used, but might be handy someday. - -class FindFirstRegionClosure: public HeapRegionClosure { - HeapRegion* _a_region; -public: - FindFirstRegionClosure() : _a_region(NULL) {} - bool doHeapRegion(HeapRegion* r) { - _a_region = r; - return true; - } - HeapRegion* result() { return _a_region; } -}; - - class RefineCardTableEntryClosure: public CardTableEntryClosure { SuspendibleThreadSet* _sts; G1RemSet* _g1rs; @@ -1207,13 +1192,12 @@ G1CollectedHeap::free_region_if_totally_empty_work(HeapRegion* hr, bool par) { assert(!hr->continuesHumongous(), "should have filtered these out"); size_t res = 0; - if (!hr->popular() && hr->used() > 0 && hr->garbage_bytes() == hr->used()) { - if (!hr->is_young()) { - if (G1PolicyVerbose > 0) - gclog_or_tty->print_cr("Freeing empty region "PTR_FORMAT "(" SIZE_FORMAT " bytes)" - " during cleanup", hr, hr->used()); - free_region_work(hr, pre_used, cleared_h, freed_regions, list, par); - } + if (hr->used() > 0 && hr->garbage_bytes() == hr->used() && + !hr->is_young()) { + if (G1PolicyVerbose > 0) + gclog_or_tty->print_cr("Freeing empty region "PTR_FORMAT "(" SIZE_FORMAT " bytes)" + " during cleanup", hr, hr->used()); + free_region_work(hr, pre_used, cleared_h, freed_regions, list, par); } } @@ -1342,10 +1326,6 @@ G1CollectedHeap::G1CollectedHeap(G1CollectorPolicy* policy_) : _refine_cte_cl(NULL), _free_region_list(NULL), _free_region_list_size(0), _free_regions(0), - _popular_object_boundary(NULL), - _cur_pop_hr_index(0), - _popular_regions_to_be_evacuated(NULL), - _pop_obj_rc_at_copy(), _full_collection(false), _unclean_region_list(), _unclean_regions_coming(false), @@ -1520,26 +1500,11 @@ jint G1CollectedHeap::initialize() { _czft = new ConcurrentZFThread(); } - - - // Allocate the popular regions; take them off free lists. - size_t pop_byte_size = G1NumPopularRegions * HeapRegion::GrainBytes; - expand(pop_byte_size); - _popular_object_boundary = - _g1_reserved.start() + (G1NumPopularRegions * HeapRegion::GrainWords); - for (int i = 0; i < G1NumPopularRegions; i++) { - HeapRegion* hr = newAllocRegion(HeapRegion::GrainWords); - // assert(hr != NULL && hr->bottom() < _popular_object_boundary, - // "Should be enough, and all should be below boundary."); - hr->set_popular(true); - } - assert(_cur_pop_hr_index == 0, "Start allocating at the first region."); - // Initialize the from_card cache structure of HeapRegionRemSet. HeapRegionRemSet::init_heap(max_regions()); - // Now expand into the rest of the initial heap size. - expand(init_byte_size - pop_byte_size); + // Now expand into the initial heap size. + expand(init_byte_size); // Perform any initialization actions delegated to the policy. g1_policy()->init(); @@ -1654,8 +1619,7 @@ size_t G1CollectedHeap::recalculate_used() const { class SumUsedRegionsClosure: public HeapRegionClosure { size_t _num; public: - // _num is set to 1 to account for the popular region - SumUsedRegionsClosure() : _num(G1NumPopularRegions) {} + SumUsedRegionsClosure() : _num(0) {} bool doHeapRegion(HeapRegion* r) { if (r->continuesHumongous() || r->used() > 0 || r->is_gc_alloc_region()) { _num += 1; @@ -2318,9 +2282,6 @@ void G1CollectedHeap::print_tracing_info() const { if (SummarizeG1ZFStats) { ConcurrentZFThread::print_summary_info(); } - if (G1SummarizePopularity) { - print_popularity_summary_info(); - } g1_policy()->print_yg_surv_rate_info(); GCOverheadReporter::printGCOverhead(); @@ -2495,30 +2456,19 @@ G1CollectedHeap::cleanup_surviving_young_words() { // void -G1CollectedHeap::do_collection_pause_at_safepoint(HeapRegion* popular_region) { +G1CollectedHeap::do_collection_pause_at_safepoint() { char verbose_str[128]; sprintf(verbose_str, "GC pause "); - if (popular_region != NULL) - strcat(verbose_str, "(popular)"); - else if (g1_policy()->in_young_gc_mode()) { + if (g1_policy()->in_young_gc_mode()) { if (g1_policy()->full_young_gcs()) strcat(verbose_str, "(young)"); else strcat(verbose_str, "(partial)"); } - bool reset_should_initiate_conc_mark = false; - if (popular_region != NULL && g1_policy()->should_initiate_conc_mark()) { - // we currently do not allow an initial mark phase to be piggy-backed - // on a popular pause - reset_should_initiate_conc_mark = true; - g1_policy()->unset_should_initiate_conc_mark(); - } if (g1_policy()->should_initiate_conc_mark()) strcat(verbose_str, " (initial-mark)"); - GCCauseSetter x(this, (popular_region == NULL ? - GCCause::_g1_inc_collection_pause : - GCCause::_g1_pop_region_collection_pause)); + GCCauseSetter x(this, GCCause::_g1_inc_collection_pause); // if PrintGCDetails is on, we'll print long statistics information // in the collector policy code, so let's not print this as the output @@ -2609,7 +2559,7 @@ G1CollectedHeap::do_collection_pause_at_safepoint(HeapRegion* popular_region) { save_marks(); // We must do this before any possible evacuation that should propagate - // marks, including evacuation of popular objects in a popular pause. + // marks. if (mark_in_progress()) { double start_time_sec = os::elapsedTime(); @@ -2626,29 +2576,15 @@ G1CollectedHeap::do_collection_pause_at_safepoint(HeapRegion* popular_region) { assert(regions_accounted_for(), "Region leakage."); - bool abandoned = false; - if (mark_in_progress()) concurrent_mark()->newCSet(); // Now choose the CS. - if (popular_region == NULL) { - g1_policy()->choose_collection_set(); - } else { - // We may be evacuating a single region (for popularity). - g1_policy()->record_popular_pause_preamble_start(); - popularity_pause_preamble(popular_region); - g1_policy()->record_popular_pause_preamble_end(); - abandoned = (g1_policy()->collection_set() == NULL); - // Now we allow more regions to be added (we have to collect - // all popular regions). - if (!abandoned) { - g1_policy()->choose_collection_set(popular_region); - } - } + g1_policy()->choose_collection_set(); + // We may abandon a pause if we find no region that will fit in the MMU // pause. - abandoned = (g1_policy()->collection_set() == NULL); + bool abandoned = (g1_policy()->collection_set() == NULL); // Nothing to do if we were unable to choose a collection set. if (!abandoned) { @@ -2673,12 +2609,6 @@ G1CollectedHeap::do_collection_pause_at_safepoint(HeapRegion* popular_region) { _in_cset_fast_test = NULL; _in_cset_fast_test_base = NULL; - if (popular_region != NULL) { - // We have to wait until now, because we don't want the region to - // be rescheduled for pop-evac during RS update. - popular_region->set_popular_pending(false); - } - release_gc_alloc_regions(false /* totally */); cleanup_surviving_young_words(); @@ -2724,8 +2654,7 @@ G1CollectedHeap::do_collection_pause_at_safepoint(HeapRegion* popular_region) { double pause_time_ms = (end_time_sec - start_time_sec) * MILLIUNITS; g1_policy()->record_pause_time_ms(pause_time_ms); GCOverheadReporter::recordSTWEnd(end_time_sec); - g1_policy()->record_collection_pause_end(popular_region != NULL, - abandoned); + g1_policy()->record_collection_pause_end(abandoned); assert(regions_accounted_for(), "Region leakage."); @@ -2759,9 +2688,6 @@ G1CollectedHeap::do_collection_pause_at_safepoint(HeapRegion* popular_region) { assert(verify_region_lists(), "Bad region lists."); - if (reset_should_initiate_conc_mark) - g1_policy()->set_should_initiate_conc_mark(); - if (ExitAfterGCNum > 0 && total_collections() == ExitAfterGCNum) { gclog_or_tty->print_cr("Stopping after GC #%d", ExitAfterGCNum); print_tracing_info(); @@ -4707,7 +4633,6 @@ G1CollectedHeap::free_region_work(HeapRegion* hr, size_t& freed_regions, UncleanRegionList* list, bool par) { - assert(!hr->popular(), "should not free popular regions"); pre_used += hr->used(); if (hr->isHumongous()) { assert(hr->startsHumongous(), @@ -4791,12 +4716,6 @@ void G1CollectedHeap::cleanUpCardTable() { void G1CollectedHeap::do_collection_pause_if_appropriate(size_t word_size) { - // First do any popular regions. - HeapRegion* hr; - while ((hr = popular_region_to_evac()) != NULL) { - evac_popular_region(hr); - } - // Now do heuristic pauses. if (g1_policy()->should_do_collection_pause(word_size)) { do_collection_pause(); } @@ -5192,7 +5111,7 @@ class RegionCounter: public HeapRegionClosure { public: RegionCounter() : _n(0) {} bool doHeapRegion(HeapRegion* r) { - if (r->is_empty() && !r->popular()) { + if (r->is_empty()) { assert(!r->isHumongous(), "H regions should not be empty."); _n++; } @@ -5336,14 +5255,8 @@ public: r->set_zero_fill_allocated(); } else { assert(r->is_empty(), "tautology"); - if (r->popular()) { - if (r->zero_fill_state() != HeapRegion::Allocated) { - r->ensure_zero_filled_locked(); - r->set_zero_fill_allocated(); - } - } else { - _n++; - switch (r->zero_fill_state()) { + _n++; + switch (r->zero_fill_state()) { case HeapRegion::NotZeroFilled: case HeapRegion::ZeroFilling: _g1->put_region_on_unclean_list_locked(r); @@ -5354,7 +5267,6 @@ public: case HeapRegion::ZeroFilled: _g1->put_free_region_on_list_locked(r); break; - } } } return false; @@ -5402,376 +5314,6 @@ void G1CollectedHeap::set_used_regions_to_need_zero_fill() { heap_region_iterate(&rs); } -class CountObjClosure: public ObjectClosure { - size_t _n; -public: - CountObjClosure() : _n(0) {} - void do_object(oop obj) { _n++; } - size_t n() { return _n; } -}; - -size_t G1CollectedHeap::pop_object_used_objs() { - size_t sum_objs = 0; - for (int i = 0; i < G1NumPopularRegions; i++) { - CountObjClosure cl; - _hrs->at(i)->object_iterate(&cl); - sum_objs += cl.n(); - } - return sum_objs; -} - -size_t G1CollectedHeap::pop_object_used_bytes() { - size_t sum_bytes = 0; - for (int i = 0; i < G1NumPopularRegions; i++) { - sum_bytes += _hrs->at(i)->used(); - } - return sum_bytes; -} - - -static int nq = 0; - -HeapWord* G1CollectedHeap::allocate_popular_object(size_t word_size) { - while (_cur_pop_hr_index < G1NumPopularRegions) { - HeapRegion* cur_pop_region = _hrs->at(_cur_pop_hr_index); - HeapWord* res = cur_pop_region->allocate(word_size); - if (res != NULL) { - // We account for popular objs directly in the used summary: - _summary_bytes_used += (word_size * HeapWordSize); - return res; - } - // Otherwise, try the next region (first making sure that we remember - // the last "top" value as the "next_top_at_mark_start", so that - // objects made popular during markings aren't automatically considered - // live). - cur_pop_region->note_end_of_copying(); - // Otherwise, try the next region. - _cur_pop_hr_index++; - } - // XXX: For now !!! - vm_exit_out_of_memory(word_size, - "Not enough pop obj space (To Be Fixed)"); - return NULL; -} - -class HeapRegionList: public CHeapObj { - public: - HeapRegion* hr; - HeapRegionList* next; -}; - -void G1CollectedHeap::schedule_popular_region_evac(HeapRegion* r) { - // This might happen during parallel GC, so protect by this lock. - MutexLockerEx x(ParGCRareEvent_lock, Mutex::_no_safepoint_check_flag); - // We don't schedule regions whose evacuations are already pending, or - // are already being evacuated. - if (!r->popular_pending() && !r->in_collection_set()) { - r->set_popular_pending(true); - if (G1TracePopularity) { - gclog_or_tty->print_cr("Scheduling region "PTR_FORMAT" " - "["PTR_FORMAT", "PTR_FORMAT") for pop-object evacuation.", - r, r->bottom(), r->end()); - } - HeapRegionList* hrl = new HeapRegionList; - hrl->hr = r; - hrl->next = _popular_regions_to_be_evacuated; - _popular_regions_to_be_evacuated = hrl; - } -} - -HeapRegion* G1CollectedHeap::popular_region_to_evac() { - MutexLockerEx x(ParGCRareEvent_lock, Mutex::_no_safepoint_check_flag); - HeapRegion* res = NULL; - while (_popular_regions_to_be_evacuated != NULL && res == NULL) { - HeapRegionList* hrl = _popular_regions_to_be_evacuated; - _popular_regions_to_be_evacuated = hrl->next; - res = hrl->hr; - // The G1RSPopLimit may have increased, so recheck here... - if (res->rem_set()->occupied() < (size_t) G1RSPopLimit) { - // Hah: don't need to schedule. - if (G1TracePopularity) { - gclog_or_tty->print_cr("Unscheduling region "PTR_FORMAT" " - "["PTR_FORMAT", "PTR_FORMAT") " - "for pop-object evacuation (size %d < limit %d)", - res, res->bottom(), res->end(), - res->rem_set()->occupied(), G1RSPopLimit); - } - res->set_popular_pending(false); - res = NULL; - } - // We do not reset res->popular() here; if we did so, it would allow - // the region to be "rescheduled" for popularity evacuation. Instead, - // this is done in the collection pause, with the world stopped. - // So the invariant is that the regions in the list have the popularity - // boolean set, but having the boolean set does not imply membership - // on the list (though there can at most one such pop-pending region - // not on the list at any time). - delete hrl; - } - return res; -} - -void G1CollectedHeap::evac_popular_region(HeapRegion* hr) { - while (true) { - // Don't want to do a GC pause while cleanup is being completed! - wait_for_cleanup_complete(); - - // Read the GC count while holding the Heap_lock - int gc_count_before = SharedHeap::heap()->total_collections(); - g1_policy()->record_stop_world_start(); - - { - MutexUnlocker mu(Heap_lock); // give up heap lock, execute gets it back - VM_G1PopRegionCollectionPause op(gc_count_before, hr); - VMThread::execute(&op); - - // If the prolog succeeded, we didn't do a GC for this. - if (op.prologue_succeeded()) break; - } - // Otherwise we didn't. We should recheck the size, though, since - // the limit may have increased... - if (hr->rem_set()->occupied() < (size_t) G1RSPopLimit) { - hr->set_popular_pending(false); - break; - } - } -} - -void G1CollectedHeap::atomic_inc_obj_rc(oop obj) { - Atomic::inc(obj_rc_addr(obj)); -} - -class CountRCClosure: public OopsInHeapRegionClosure { - G1CollectedHeap* _g1h; - bool _parallel; -public: - CountRCClosure(G1CollectedHeap* g1h) : - _g1h(g1h), _parallel(ParallelGCThreads > 0) - {} - void do_oop(narrowOop* p) { - guarantee(false, "NYI"); - } - void do_oop(oop* p) { - oop obj = *p; - assert(obj != NULL, "Precondition."); - if (_parallel) { - // We go sticky at the limit to avoid excess contention. - // If we want to track the actual RC's further, we'll need to keep a - // per-thread hash table or something for the popular objects. - if (_g1h->obj_rc(obj) < G1ObjPopLimit) { - _g1h->atomic_inc_obj_rc(obj); - } - } else { - _g1h->inc_obj_rc(obj); - } - } -}; - -class EvacPopObjClosure: public ObjectClosure { - G1CollectedHeap* _g1h; - size_t _pop_objs; - size_t _max_rc; -public: - EvacPopObjClosure(G1CollectedHeap* g1h) : - _g1h(g1h), _pop_objs(0), _max_rc(0) {} - - void do_object(oop obj) { - size_t rc = _g1h->obj_rc(obj); - _max_rc = MAX2(rc, _max_rc); - if (rc >= (size_t) G1ObjPopLimit) { - _g1h->_pop_obj_rc_at_copy.add((double)rc); - size_t word_sz = obj->size(); - HeapWord* new_pop_loc = _g1h->allocate_popular_object(word_sz); - oop new_pop_obj = (oop)new_pop_loc; - Copy::aligned_disjoint_words((HeapWord*)obj, new_pop_loc, word_sz); - obj->forward_to(new_pop_obj); - G1ScanAndBalanceClosure scan_and_balance(_g1h); - new_pop_obj->oop_iterate_backwards(&scan_and_balance); - // preserve "next" mark bit if marking is in progress. - if (_g1h->mark_in_progress() && !_g1h->is_obj_ill(obj)) { - _g1h->concurrent_mark()->markAndGrayObjectIfNecessary(new_pop_obj); - } - - if (G1TracePopularity) { - gclog_or_tty->print_cr("Found obj " PTR_FORMAT " of word size " SIZE_FORMAT - " pop (%d), move to " PTR_FORMAT, - (void*) obj, word_sz, - _g1h->obj_rc(obj), (void*) new_pop_obj); - } - _pop_objs++; - } - } - size_t pop_objs() { return _pop_objs; } - size_t max_rc() { return _max_rc; } -}; - -class G1ParCountRCTask : public AbstractGangTask { - G1CollectedHeap* _g1h; - BitMap _bm; - - size_t getNCards() { - return (_g1h->capacity() + G1BlockOffsetSharedArray::N_bytes - 1) - / G1BlockOffsetSharedArray::N_bytes; - } - CountRCClosure _count_rc_closure; -public: - G1ParCountRCTask(G1CollectedHeap* g1h) : - AbstractGangTask("G1 Par RC Count task"), - _g1h(g1h), _bm(getNCards()), _count_rc_closure(g1h) - {} - - void work(int i) { - ResourceMark rm; - HandleMark hm; - _g1h->g1_rem_set()->oops_into_collection_set_do(&_count_rc_closure, i); - } -}; - -void G1CollectedHeap::popularity_pause_preamble(HeapRegion* popular_region) { - // We're evacuating a single region (for popularity). - if (G1TracePopularity) { - gclog_or_tty->print_cr("Doing pop region pause for ["PTR_FORMAT", "PTR_FORMAT")", - popular_region->bottom(), popular_region->end()); - } - g1_policy()->set_single_region_collection_set(popular_region); - size_t max_rc; - if (!compute_reference_counts_and_evac_popular(popular_region, - &max_rc)) { - // We didn't evacuate any popular objects. - // We increase the RS popularity limit, to prevent this from - // happening in the future. - if (G1RSPopLimit < (1 << 30)) { - G1RSPopLimit *= 2; - } - // For now, interesting enough for a message: -#if 1 - gclog_or_tty->print_cr("In pop region pause for ["PTR_FORMAT", "PTR_FORMAT"), " - "failed to find a pop object (max = %d).", - popular_region->bottom(), popular_region->end(), - max_rc); - gclog_or_tty->print_cr("Increased G1RSPopLimit to %d.", G1RSPopLimit); -#endif // 0 - // Also, we reset the collection set to NULL, to make the rest of - // the collection do nothing. - assert(popular_region->next_in_collection_set() == NULL, - "should be single-region."); - popular_region->set_in_collection_set(false); - popular_region->set_popular_pending(false); - g1_policy()->clear_collection_set(); - } -} - -bool G1CollectedHeap:: -compute_reference_counts_and_evac_popular(HeapRegion* popular_region, - size_t* max_rc) { - HeapWord* rc_region_bot; - HeapWord* rc_region_end; - - // Set up the reference count region. - HeapRegion* rc_region = newAllocRegion(HeapRegion::GrainWords); - if (rc_region != NULL) { - rc_region_bot = rc_region->bottom(); - rc_region_end = rc_region->end(); - } else { - rc_region_bot = NEW_C_HEAP_ARRAY(HeapWord, HeapRegion::GrainWords); - if (rc_region_bot == NULL) { - vm_exit_out_of_memory(HeapRegion::GrainWords, - "No space for RC region."); - } - rc_region_end = rc_region_bot + HeapRegion::GrainWords; - } - - if (G1TracePopularity) - gclog_or_tty->print_cr("RC region is ["PTR_FORMAT", "PTR_FORMAT")", - rc_region_bot, rc_region_end); - if (rc_region_bot > popular_region->bottom()) { - _rc_region_above = true; - _rc_region_diff = - pointer_delta(rc_region_bot, popular_region->bottom(), 1); - } else { - assert(rc_region_bot < popular_region->bottom(), "Can't be equal."); - _rc_region_above = false; - _rc_region_diff = - pointer_delta(popular_region->bottom(), rc_region_bot, 1); - } - g1_policy()->record_pop_compute_rc_start(); - // Count external references. - g1_rem_set()->prepare_for_oops_into_collection_set_do(); - if (ParallelGCThreads > 0) { - - set_par_threads(workers()->total_workers()); - G1ParCountRCTask par_count_rc_task(this); - workers()->run_task(&par_count_rc_task); - set_par_threads(0); - - } else { - CountRCClosure count_rc_closure(this); - g1_rem_set()->oops_into_collection_set_do(&count_rc_closure, 0); - } - g1_rem_set()->cleanup_after_oops_into_collection_set_do(); - g1_policy()->record_pop_compute_rc_end(); - - // Now evacuate popular objects. - g1_policy()->record_pop_evac_start(); - EvacPopObjClosure evac_pop_obj_cl(this); - popular_region->object_iterate(&evac_pop_obj_cl); - *max_rc = evac_pop_obj_cl.max_rc(); - - // Make sure the last "top" value of the current popular region is copied - // as the "next_top_at_mark_start", so that objects made popular during - // markings aren't automatically considered live. - HeapRegion* cur_pop_region = _hrs->at(_cur_pop_hr_index); - cur_pop_region->note_end_of_copying(); - - if (rc_region != NULL) { - free_region(rc_region); - } else { - FREE_C_HEAP_ARRAY(HeapWord, rc_region_bot); - } - g1_policy()->record_pop_evac_end(); - - return evac_pop_obj_cl.pop_objs() > 0; -} - -class CountPopObjInfoClosure: public HeapRegionClosure { - size_t _objs; - size_t _bytes; - - class CountObjClosure: public ObjectClosure { - int _n; - public: - CountObjClosure() : _n(0) {} - void do_object(oop obj) { _n++; } - size_t n() { return _n; } - }; - -public: - CountPopObjInfoClosure() : _objs(0), _bytes(0) {} - bool doHeapRegion(HeapRegion* r) { - _bytes += r->used(); - CountObjClosure blk; - r->object_iterate(&blk); - _objs += blk.n(); - return false; - } - size_t objs() { return _objs; } - size_t bytes() { return _bytes; } -}; - - -void G1CollectedHeap::print_popularity_summary_info() const { - CountPopObjInfoClosure blk; - for (int i = 0; i <= _cur_pop_hr_index; i++) { - blk.doHeapRegion(_hrs->at(i)); - } - gclog_or_tty->print_cr("\nPopular objects: %d objs, %d bytes.", - blk.objs(), blk.bytes()); - gclog_or_tty->print_cr(" RC at copy = [avg = %5.2f, max = %5.2f, sd = %5.2f].", - _pop_obj_rc_at_copy.avg(), - _pop_obj_rc_at_copy.maximum(), - _pop_obj_rc_at_copy.sd()); -} - void G1CollectedHeap::set_refine_cte_cl_concurrency(bool concurrent) { _refine_cte_cl->set_concurrent(concurrent); } @@ -5845,7 +5387,6 @@ bool G1CollectedHeap::regions_accounted_for() { } bool G1CollectedHeap::print_region_accounting_info() { - gclog_or_tty->print_cr("P regions: %d.", G1NumPopularRegions); gclog_or_tty->print_cr("Free regions: %d (count: %d count list %d) (clean: %d unclean: %d).", free_regions(), count_free_regions(), count_free_regions_list(), diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp index e67e4d4cab3..9a3b0b6d9e9 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp @@ -29,7 +29,6 @@ class HeapRegion; class HeapRegionSeq; -class HeapRegionList; class PermanentGenerationSpec; class GenerationSpec; class OopsInHeapRegionClosure; @@ -143,7 +142,6 @@ class G1CollectedHeap : public SharedHeap { friend class VM_GenCollectForPermanentAllocation; friend class VM_G1CollectFull; friend class VM_G1IncCollectionPause; - friend class VM_G1PopRegionCollectionPause; friend class VMStructs; // Closures used in implementation. @@ -253,10 +251,6 @@ private: // than the current allocation region. size_t _summary_bytes_used; - // Summary information about popular objects; method to print it. - NumberSeq _pop_obj_rc_at_copy; - void print_popularity_summary_info() const; - // This is used for a quick test on whether a reference points into // the collection set or not. Basically, we have an array, with one // byte per region, and that byte denotes whether the corresponding @@ -447,10 +441,8 @@ protected: virtual void do_collection_pause(); // The guts of the incremental collection pause, executed by the vm - // thread. If "popular_region" is non-NULL, this pause should evacuate - // this single region whose remembered set has gotten large, moving - // any popular objects to one of the popular regions. - virtual void do_collection_pause_at_safepoint(HeapRegion* popular_region); + // thread. + virtual void do_collection_pause_at_safepoint(); // Actually do the work of evacuating the collection set. virtual void evacuate_collection_set(); @@ -625,67 +617,10 @@ protected: SubTasksDone* _process_strong_tasks; - // Allocate space to hold a popular object. Result is guaranteed below - // "popular_object_boundary()". Note: CURRENTLY halts the system if we - // run out of space to hold popular objects. - HeapWord* allocate_popular_object(size_t word_size); - - // The boundary between popular and non-popular objects. - HeapWord* _popular_object_boundary; - - HeapRegionList* _popular_regions_to_be_evacuated; - - // Compute which objects in "single_region" are popular. If any are, - // evacuate them to a popular region, leaving behind forwarding pointers, - // and select "popular_region" as the single collection set region. - // Otherwise, leave the collection set null. - void popularity_pause_preamble(HeapRegion* populer_region); - - // Compute which objects in "single_region" are popular, and evacuate - // them to a popular region, leaving behind forwarding pointers. - // Returns "true" if at least one popular object is discovered and - // evacuated. In any case, "*max_rc" is set to the maximum reference - // count of an object in the region. - bool compute_reference_counts_and_evac_popular(HeapRegion* populer_region, - size_t* max_rc); - // Subroutines used in the above. - bool _rc_region_above; - size_t _rc_region_diff; - jint* obj_rc_addr(oop obj) { - uintptr_t obj_addr = (uintptr_t)obj; - if (_rc_region_above) { - jint* res = (jint*)(obj_addr + _rc_region_diff); - assert((uintptr_t)res > obj_addr, "RC region is above."); - return res; - } else { - jint* res = (jint*)(obj_addr - _rc_region_diff); - assert((uintptr_t)res < obj_addr, "RC region is below."); - return res; - } - } - jint obj_rc(oop obj) { - return *obj_rc_addr(obj); - } - void inc_obj_rc(oop obj) { - (*obj_rc_addr(obj))++; - } - void atomic_inc_obj_rc(oop obj); - - - // Number of popular objects and bytes (latter is cheaper!). - size_t pop_object_used_objs(); - size_t pop_object_used_bytes(); - - // Index of the popular region in which allocation is currently being - // done. - int _cur_pop_hr_index; - // List of regions which require zero filling. UncleanRegionList _unclean_region_list; bool _unclean_regions_coming; - bool check_age_cohort_well_formed_work(int a, HeapRegion* hr); - public: void set_refine_cte_cl_concurrency(bool concurrent); @@ -1066,21 +1001,6 @@ public: // words. virtual size_t large_typearray_limit(); - // All popular objects are guaranteed to have addresses below this - // boundary. - HeapWord* popular_object_boundary() { - return _popular_object_boundary; - } - - // Declare the region as one that should be evacuated because its - // remembered set is too large. - void schedule_popular_region_evac(HeapRegion* r); - // If there is a popular region to evacuate it, remove it from the list - // and return it. - HeapRegion* popular_region_to_evac(); - // Evacuate the given popular region. - void evac_popular_region(HeapRegion* r); - // Returns "true" iff the given word_size is "very large". static bool isHumongous(size_t word_size) { return word_size >= VeryLargeInWords; diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp index 6147c8b6c67..d259ad38ea0 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp @@ -91,10 +91,8 @@ G1CollectorPolicy::G1CollectorPolicy() : _all_mod_union_times_ms(new NumberSeq()), - _non_pop_summary(new NonPopSummary()), - _pop_summary(new PopSummary()), - _non_pop_abandoned_summary(new NonPopAbandonedSummary()), - _pop_abandoned_summary(new PopAbandonedSummary()), + _summary(new Summary()), + _abandoned_summary(new AbandonedSummary()), _cur_clear_ct_time_ms(0.0), @@ -109,9 +107,6 @@ G1CollectorPolicy::G1CollectorPolicy() : _cur_aux_times_ms(new double[_aux_num]), _cur_aux_times_set(new bool[_aux_num]), - _pop_compute_rc_start(0.0), - _pop_evac_start(0.0), - _concurrent_mark_init_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)), _concurrent_mark_remark_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)), _concurrent_mark_cleanup_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)), @@ -224,16 +219,6 @@ G1CollectorPolicy::G1CollectorPolicy() : _par_last_termination_times_ms = new double[_parallel_gc_threads]; - // we store the data from the first pass during popularity pauses - _pop_par_last_update_rs_start_times_ms = new double[_parallel_gc_threads]; - _pop_par_last_update_rs_times_ms = new double[_parallel_gc_threads]; - _pop_par_last_update_rs_processed_buffers = new double[_parallel_gc_threads]; - - _pop_par_last_scan_rs_start_times_ms = new double[_parallel_gc_threads]; - _pop_par_last_scan_rs_times_ms = new double[_parallel_gc_threads]; - - _pop_par_last_closure_app_times_ms = new double[_parallel_gc_threads]; - // start conservatively _expensive_region_limit_ms = 0.5 * (double) G1MaxPauseTimeMS; @@ -1047,23 +1032,6 @@ void G1CollectorPolicy::record_full_collection_end() { calculate_young_list_target_config(); } -void G1CollectorPolicy::record_pop_compute_rc_start() { - _pop_compute_rc_start = os::elapsedTime(); -} -void G1CollectorPolicy::record_pop_compute_rc_end() { - double ms = (os::elapsedTime() - _pop_compute_rc_start)*1000.0; - _cur_popular_compute_rc_time_ms = ms; - _pop_compute_rc_start = 0.0; -} -void G1CollectorPolicy::record_pop_evac_start() { - _pop_evac_start = os::elapsedTime(); -} -void G1CollectorPolicy::record_pop_evac_end() { - double ms = (os::elapsedTime() - _pop_evac_start)*1000.0; - _cur_popular_evac_time_ms = ms; - _pop_evac_start = 0.0; -} - void G1CollectorPolicy::record_before_bytes(size_t bytes) { _bytes_in_to_space_before_gc += bytes; } @@ -1120,13 +1088,6 @@ void G1CollectorPolicy::record_collection_pause_start(double start_time_sec, _par_last_scan_new_refs_times_ms[i] = -666.0; _par_last_obj_copy_times_ms[i] = -666.0; _par_last_termination_times_ms[i] = -666.0; - - _pop_par_last_update_rs_start_times_ms[i] = -666.0; - _pop_par_last_update_rs_times_ms[i] = -666.0; - _pop_par_last_update_rs_processed_buffers[i] = -666.0; - _pop_par_last_scan_rs_start_times_ms[i] = -666.0; - _pop_par_last_scan_rs_times_ms[i] = -666.0; - _pop_par_last_closure_app_times_ms[i] = -666.0; } #endif @@ -1185,25 +1146,6 @@ void G1CollectorPolicy::tag_scan_only(size_t short_lived_scan_only_length) { guarantee( false, "we should never reach here" ); } -void G1CollectorPolicy::record_popular_pause_preamble_start() { - _cur_popular_preamble_start_ms = os::elapsedTime() * 1000.0; -} - -void G1CollectorPolicy::record_popular_pause_preamble_end() { - _cur_popular_preamble_time_ms = - (os::elapsedTime() * 1000.0) - _cur_popular_preamble_start_ms; - - // copy the recorded statistics of the first pass to temporary arrays - for (int i = 0; i < _parallel_gc_threads; ++i) { - _pop_par_last_update_rs_start_times_ms[i] = _par_last_update_rs_start_times_ms[i]; - _pop_par_last_update_rs_times_ms[i] = _par_last_update_rs_times_ms[i]; - _pop_par_last_update_rs_processed_buffers[i] = _par_last_update_rs_processed_buffers[i]; - _pop_par_last_scan_rs_start_times_ms[i] = _par_last_scan_rs_start_times_ms[i]; - _pop_par_last_scan_rs_times_ms[i] = _par_last_scan_rs_times_ms[i]; - _pop_par_last_closure_app_times_ms[i] = _par_last_obj_copy_times_ms[i]; - } -} - void G1CollectorPolicy::record_mark_closure_time(double mark_closure_time_ms) { _mark_closure_time_ms = mark_closure_time_ms; } @@ -1465,8 +1407,7 @@ double G1CollectorPolicy::max_sum (double* data1, // Anything below that is considered to be zero #define MIN_TIMER_GRANULARITY 0.0000001 -void G1CollectorPolicy::record_collection_pause_end(bool popular, - bool abandoned) { +void G1CollectorPolicy::record_collection_pause_end(bool abandoned) { double end_time_sec = os::elapsedTime(); double elapsed_ms = _last_pause_time_ms; bool parallel = ParallelGCThreads > 0; @@ -1587,42 +1528,10 @@ void G1CollectorPolicy::record_collection_pause_end(bool popular, } PauseSummary* summary; - if (!abandoned && !popular) - summary = _non_pop_summary; - else if (!abandoned && popular) - summary = _pop_summary; - else if (abandoned && !popular) - summary = _non_pop_abandoned_summary; - else if (abandoned && popular) - summary = _pop_abandoned_summary; - else - guarantee(false, "should not get here!"); - - double pop_update_rs_time; - double pop_update_rs_processed_buffers; - double pop_scan_rs_time; - double pop_closure_app_time; - double pop_other_time; - - if (popular) { - PopPreambleSummary* preamble_summary = summary->pop_preamble_summary(); - guarantee(preamble_summary != NULL, "should not be null!"); - - pop_update_rs_time = avg_value(_pop_par_last_update_rs_times_ms); - pop_update_rs_processed_buffers = - sum_of_values(_pop_par_last_update_rs_processed_buffers); - pop_scan_rs_time = avg_value(_pop_par_last_scan_rs_times_ms); - pop_closure_app_time = avg_value(_pop_par_last_closure_app_times_ms); - pop_other_time = _cur_popular_preamble_time_ms - - (pop_update_rs_time + pop_scan_rs_time + pop_closure_app_time + - _cur_popular_evac_time_ms); - - preamble_summary->record_pop_preamble_time_ms(_cur_popular_preamble_time_ms); - preamble_summary->record_pop_update_rs_time_ms(pop_update_rs_time); - preamble_summary->record_pop_scan_rs_time_ms(pop_scan_rs_time); - preamble_summary->record_pop_closure_app_time_ms(pop_closure_app_time); - preamble_summary->record_pop_evacuation_time_ms(_cur_popular_evac_time_ms); - preamble_summary->record_pop_other_time_ms(pop_other_time); + if (abandoned) { + summary = _abandoned_summary; + } else { + summary = _summary; } double ext_root_scan_time = avg_value(_par_last_ext_root_scan_times_ms); @@ -1694,8 +1603,6 @@ void G1CollectorPolicy::record_collection_pause_end(bool popular, } double other_time_ms = elapsed_ms; - if (popular) - other_time_ms -= _cur_popular_preamble_time_ms; if (!abandoned) { if (_satb_drain_time_set) @@ -1712,41 +1619,24 @@ void G1CollectorPolicy::record_collection_pause_end(bool popular, if (PrintGCDetails) { gclog_or_tty->print_cr("%s%s, %1.8lf secs]", - (popular && !abandoned) ? " (popular)" : - (!popular && abandoned) ? " (abandoned)" : - (popular && abandoned) ? " (popular/abandoned)" : "", + abandoned ? " (abandoned)" : "", (last_pause_included_initial_mark) ? " (initial-mark)" : "", elapsed_ms / 1000.0); if (!abandoned) { - if (_satb_drain_time_set) + if (_satb_drain_time_set) { print_stats(1, "SATB Drain Time", _cur_satb_drain_time_ms); - if (_last_satb_drain_processed_buffers >= 0) + } + if (_last_satb_drain_processed_buffers >= 0) { print_stats(2, "Processed Buffers", _last_satb_drain_processed_buffers); - } - if (popular) - print_stats(1, "Popularity Preamble", _cur_popular_preamble_time_ms); - if (parallel) { - if (popular) { - print_par_stats(2, "Update RS (Start)", _pop_par_last_update_rs_start_times_ms, false); - print_par_stats(2, "Update RS", _pop_par_last_update_rs_times_ms); + } + if (parallel) { + print_stats(1, "Parallel Time", _cur_collection_par_time_ms); + print_par_stats(2, "Update RS (Start)", _par_last_update_rs_start_times_ms, false); + print_par_stats(2, "Update RS", _par_last_update_rs_times_ms); if (G1RSBarrierUseQueue) print_par_buffers(3, "Processed Buffers", - _pop_par_last_update_rs_processed_buffers, true); - print_par_stats(2, "Scan RS", _pop_par_last_scan_rs_times_ms); - print_par_stats(2, "Closure app", _pop_par_last_closure_app_times_ms); - print_stats(2, "Evacuation", _cur_popular_evac_time_ms); - print_stats(2, "Other", pop_other_time); - } - if (!abandoned) { - print_stats(1, "Parallel Time", _cur_collection_par_time_ms); - if (!popular) { - print_par_stats(2, "Update RS (Start)", _par_last_update_rs_start_times_ms, false); - print_par_stats(2, "Update RS", _par_last_update_rs_times_ms); - if (G1RSBarrierUseQueue) - print_par_buffers(3, "Processed Buffers", - _par_last_update_rs_processed_buffers, true); - } + _par_last_update_rs_processed_buffers, true); print_par_stats(2, "Ext Root Scanning", _par_last_ext_root_scan_times_ms); print_par_stats(2, "Mark Stack Scanning", _par_last_mark_stack_scan_times_ms); print_par_stats(2, "Scan-Only Scanning", _par_last_scan_only_times_ms); @@ -1757,25 +1647,11 @@ void G1CollectorPolicy::record_collection_pause_end(bool popular, print_par_stats(2, "Termination", _par_last_termination_times_ms); print_stats(2, "Other", parallel_other_time); print_stats(1, "Clear CT", _cur_clear_ct_time_ms); - } - } else { - if (popular) { - print_stats(2, "Update RS", pop_update_rs_time); + } else { + print_stats(1, "Update RS", update_rs_time); if (G1RSBarrierUseQueue) - print_stats(3, "Processed Buffers", - (int)pop_update_rs_processed_buffers); - print_stats(2, "Scan RS", pop_scan_rs_time); - print_stats(2, "Closure App", pop_closure_app_time); - print_stats(2, "Evacuation", _cur_popular_evac_time_ms); - print_stats(2, "Other", pop_other_time); - } - if (!abandoned) { - if (!popular) { - print_stats(1, "Update RS", update_rs_time); - if (G1RSBarrierUseQueue) - print_stats(2, "Processed Buffers", - (int)update_rs_processed_buffers); - } + print_stats(2, "Processed Buffers", + (int)update_rs_processed_buffers); print_stats(1, "Ext Root Scanning", ext_root_scan_time); print_stats(1, "Mark Stack Scanning", mark_stack_scan_time); print_stats(1, "Scan-Only Scanning", scan_only_time); @@ -1855,7 +1731,7 @@ void G1CollectorPolicy::record_collection_pause_end(bool popular, // - if (!popular && update_stats) { + if (update_stats) { double pause_time_ms = elapsed_ms; size_t diff = 0; @@ -2454,36 +2330,8 @@ void G1CollectorPolicy::check_other_times(int level, void G1CollectorPolicy::print_summary(PauseSummary* summary) const { bool parallel = ParallelGCThreads > 0; MainBodySummary* body_summary = summary->main_body_summary(); - PopPreambleSummary* preamble_summary = summary->pop_preamble_summary(); - if (summary->get_total_seq()->num() > 0) { - print_summary_sd(0, - (preamble_summary == NULL) ? "Non-Popular Pauses" : - "Popular Pauses", - summary->get_total_seq()); - if (preamble_summary != NULL) { - print_summary(1, "Popularity Preamble", - preamble_summary->get_pop_preamble_seq()); - print_summary(2, "Update RS", preamble_summary->get_pop_update_rs_seq()); - print_summary(2, "Scan RS", preamble_summary->get_pop_scan_rs_seq()); - print_summary(2, "Closure App", - preamble_summary->get_pop_closure_app_seq()); - print_summary(2, "Evacuation", - preamble_summary->get_pop_evacuation_seq()); - print_summary(2, "Other", preamble_summary->get_pop_other_seq()); - { - NumberSeq* other_parts[] = { - preamble_summary->get_pop_update_rs_seq(), - preamble_summary->get_pop_scan_rs_seq(), - preamble_summary->get_pop_closure_app_seq(), - preamble_summary->get_pop_evacuation_seq() - }; - NumberSeq calc_other_times_ms(preamble_summary->get_pop_preamble_seq(), - 4, other_parts); - check_other_times(2, preamble_summary->get_pop_other_seq(), - &calc_other_times_ms); - } - } + print_summary_sd(0, "Evacuation Pauses", summary->get_total_seq()); if (body_summary != NULL) { print_summary(1, "SATB Drain", body_summary->get_satb_drain_seq()); if (parallel) { @@ -2537,19 +2385,15 @@ void G1CollectorPolicy::print_summary(PauseSummary* summary) const { // parallel NumberSeq* other_parts[] = { body_summary->get_satb_drain_seq(), - (preamble_summary == NULL) ? NULL : - preamble_summary->get_pop_preamble_seq(), body_summary->get_parallel_seq(), body_summary->get_clear_ct_seq() }; - calc_other_times_ms = NumberSeq (summary->get_total_seq(), - 4, other_parts); + calc_other_times_ms = NumberSeq(summary->get_total_seq(), + 3, other_parts); } else { // serial NumberSeq* other_parts[] = { body_summary->get_satb_drain_seq(), - (preamble_summary == NULL) ? NULL : - preamble_summary->get_pop_preamble_seq(), body_summary->get_update_rs_seq(), body_summary->get_ext_root_scan_seq(), body_summary->get_mark_stack_scan_seq(), @@ -2558,16 +2402,11 @@ void G1CollectorPolicy::print_summary(PauseSummary* summary) const { body_summary->get_obj_copy_seq() }; calc_other_times_ms = NumberSeq(summary->get_total_seq(), - 8, other_parts); + 7, other_parts); } } else { // abandoned - NumberSeq* other_parts[] = { - (preamble_summary == NULL) ? NULL : - preamble_summary->get_pop_preamble_seq() - }; - calc_other_times_ms = NumberSeq(summary->get_total_seq(), - 1, other_parts); + calc_other_times_ms = NumberSeq(); } check_other_times(1, summary->get_other_seq(), &calc_other_times_ms); } @@ -2579,18 +2418,12 @@ void G1CollectorPolicy::print_summary(PauseSummary* summary) const { } void -G1CollectorPolicy::print_abandoned_summary(PauseSummary* non_pop_summary, - PauseSummary* pop_summary) const { +G1CollectorPolicy::print_abandoned_summary(PauseSummary* summary) const { bool printed = false; - if (non_pop_summary->get_total_seq()->num() > 0) { + if (summary->get_total_seq()->num() > 0) { printed = true; - print_summary(non_pop_summary); + print_summary(summary); } - if (pop_summary->get_total_seq()->num() > 0) { - printed = true; - print_summary(pop_summary); - } - if (!printed) { print_indent(0); gclog_or_tty->print_cr("none"); @@ -2608,15 +2441,11 @@ void G1CollectorPolicy::print_tracing_info() const { gclog_or_tty->print_cr(" Partial Young GC Pauses: %8d", _partial_young_pause_num); gclog_or_tty->print_cr(""); - gclog_or_tty->print_cr("NON-POPULAR PAUSES"); - print_summary(_non_pop_summary); - - gclog_or_tty->print_cr("POPULAR PAUSES"); - print_summary(_pop_summary); + gclog_or_tty->print_cr("EVACUATION PAUSES"); + print_summary(_summary); gclog_or_tty->print_cr("ABANDONED PAUSES"); - print_abandoned_summary(_non_pop_abandoned_summary, - _pop_abandoned_summary); + print_abandoned_summary(_abandoned_summary); gclog_or_tty->print_cr("MISC"); print_summary_sd(0, "Stop World", _all_stop_world_times_ms); @@ -2702,14 +2531,6 @@ void G1CollectorPolicy::update_conc_refine_data() { _conc_refine_enabled++; } -void G1CollectorPolicy::set_single_region_collection_set(HeapRegion* hr) { - assert(collection_set() == NULL, "Must be no current CS."); - _collection_set_size = 0; - _collection_set_bytes_used_before = 0; - add_to_collection_set(hr); - count_CS_bytes_used(); -} - bool G1CollectorPolicy::should_add_next_region_to_young_list() { assert(in_young_gc_mode(), "should be in young GC mode"); @@ -2787,15 +2608,6 @@ void G1CollectorPolicy::calculate_survivors_policy() } } - -void -G1CollectorPolicy_BestRegionsFirst:: -set_single_region_collection_set(HeapRegion* hr) { - G1CollectorPolicy::set_single_region_collection_set(hr); - _collectionSetChooser->removeRegion(hr); -} - - bool G1CollectorPolicy_BestRegionsFirst::should_do_collection_pause(size_t word_size) { @@ -3061,19 +2873,13 @@ add_to_collection_set(HeapRegion* hr) { void G1CollectorPolicy_BestRegionsFirst:: -choose_collection_set(HeapRegion* pop_region) { +choose_collection_set() { double non_young_start_time_sec; start_recording_regions(); - if (pop_region != NULL) { - _target_pause_time_ms = (double) G1MaxPauseTimeMS; - } else { - guarantee(_target_pause_time_ms > -1.0, - "_target_pause_time_ms should have been set!"); - } - - // pop region is either null (and so is CS), or else it *is* the CS. - assert(_collection_set == pop_region, "Precondition"); + guarantee(_target_pause_time_ms > -1.0, + "_target_pause_time_ms should have been set!"); + assert(_collection_set == NULL, "Precondition"); double base_time_ms = predict_base_elapsed_time_ms(_pending_cards); double predicted_pause_time_ms = base_time_ms; @@ -3100,15 +2906,13 @@ choose_collection_set(HeapRegion* pop_region) { size_t expansion_bytes = _g1->expansion_regions() * HeapRegion::GrainBytes; - if (pop_region == NULL) { - _collection_set_bytes_used_before = 0; - _collection_set_size = 0; - } + _collection_set_bytes_used_before = 0; + _collection_set_size = 0; // Adjust for expansion and slop. max_live_bytes = max_live_bytes + expansion_bytes; - assert(pop_region != NULL || _g1->regions_accounted_for(), "Region leakage!"); + assert(_g1->regions_accounted_for(), "Region leakage!"); HeapRegion* hr; if (in_young_gc_mode()) { @@ -3135,14 +2939,9 @@ choose_collection_set(HeapRegion* pop_region) { double predicted_time_ms = predict_region_elapsed_time_ms(hr, true); time_remaining_ms -= predicted_time_ms; predicted_pause_time_ms += predicted_time_ms; - if (hr == pop_region) { - // The popular region was young. Skip over it. - assert(hr->in_collection_set(), "It's the pop region."); - } else { - assert(!hr->in_collection_set(), "It's not the pop region."); - add_to_collection_set(hr); - record_cset_region(hr, true); - } + assert(!hr->in_collection_set(), "invariant"); + add_to_collection_set(hr); + record_cset_region(hr, true); max_live_bytes -= MIN2(hr->max_live_bytes(), max_live_bytes); if (G1PolicyVerbose > 0) { gclog_or_tty->print_cr(" Added [" PTR_FORMAT ", " PTR_FORMAT") to CS.", @@ -3165,10 +2964,6 @@ choose_collection_set(HeapRegion* pop_region) { // don't bother adding more regions... goto choose_collection_set_end; } - } else if (pop_region != NULL) { - // We're not in young mode, and we chose a popular region; don't choose - // any more. - return; } if (!in_young_gc_mode() || !full_young_gcs()) { @@ -3178,7 +2973,7 @@ choose_collection_set(HeapRegion* pop_region) { do { hr = _collectionSetChooser->getNextMarkedRegion(time_remaining_ms, avg_prediction); - if (hr != NULL && !hr->popular()) { + if (hr != NULL) { double predicted_time_ms = predict_region_elapsed_time_ms(hr, false); time_remaining_ms -= predicted_time_ms; predicted_pause_time_ms += predicted_time_ms; @@ -3225,8 +3020,8 @@ expand_if_possible(size_t numRegions) { } void G1CollectorPolicy_BestRegionsFirst:: -record_collection_pause_end(bool popular, bool abandoned) { - G1CollectorPolicy::record_collection_pause_end(popular, abandoned); +record_collection_pause_end(bool abandoned) { + G1CollectorPolicy::record_collection_pause_end(abandoned); assert(assertMarkedBytesDataOK(), "Marked regions not OK at pause end."); } diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp index 598a4018109..3043b7b674e 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp @@ -47,7 +47,6 @@ public: \ } class MainBodySummary; -class PopPreambleSummary; class PauseSummary: public CHeapObj { define_num_seq(total) @@ -55,7 +54,6 @@ class PauseSummary: public CHeapObj { public: virtual MainBodySummary* main_body_summary() { return NULL; } - virtual PopPreambleSummary* pop_preamble_summary() { return NULL; } }; class MainBodySummary: public CHeapObj { @@ -75,36 +73,13 @@ class MainBodySummary: public CHeapObj { define_num_seq(clear_ct) // parallel only }; -class PopPreambleSummary: public CHeapObj { - define_num_seq(pop_preamble) - define_num_seq(pop_update_rs) - define_num_seq(pop_scan_rs) - define_num_seq(pop_closure_app) - define_num_seq(pop_evacuation) - define_num_seq(pop_other) -}; - -class NonPopSummary: public PauseSummary, - public MainBodySummary { +class Summary: public PauseSummary, + public MainBodySummary { public: virtual MainBodySummary* main_body_summary() { return this; } }; -class PopSummary: public PauseSummary, - public MainBodySummary, - public PopPreambleSummary { -public: - virtual MainBodySummary* main_body_summary() { return this; } - virtual PopPreambleSummary* pop_preamble_summary() { return this; } -}; - -class NonPopAbandonedSummary: public PauseSummary { -}; - -class PopAbandonedSummary: public PauseSummary, - public PopPreambleSummary { -public: - virtual PopPreambleSummary* pop_preamble_summary() { return this; } +class AbandonedSummary: public PauseSummary { }; class G1CollectorPolicy: public CollectorPolicy { @@ -146,10 +121,6 @@ protected: double _cur_satb_drain_time_ms; double _cur_clear_ct_time_ms; bool _satb_drain_time_set; - double _cur_popular_preamble_start_ms; - double _cur_popular_preamble_time_ms; - double _cur_popular_compute_rc_time_ms; - double _cur_popular_evac_time_ms; double _cur_CH_strong_roots_end_sec; double _cur_CH_strong_roots_dur_ms; @@ -173,10 +144,8 @@ protected: TruncatedSeq* _concurrent_mark_remark_times_ms; TruncatedSeq* _concurrent_mark_cleanup_times_ms; - NonPopSummary* _non_pop_summary; - PopSummary* _pop_summary; - NonPopAbandonedSummary* _non_pop_abandoned_summary; - PopAbandonedSummary* _pop_abandoned_summary; + Summary* _summary; + AbandonedSummary* _abandoned_summary; NumberSeq* _all_pause_times_ms; NumberSeq* _all_full_gc_times_ms; @@ -210,18 +179,6 @@ protected: double* _par_last_obj_copy_times_ms; double* _par_last_termination_times_ms; - // there are two pases during popular pauses, so we need to store - // somewhere the results of the first pass - double* _pop_par_last_update_rs_start_times_ms; - double* _pop_par_last_update_rs_times_ms; - double* _pop_par_last_update_rs_processed_buffers; - double* _pop_par_last_scan_rs_start_times_ms; - double* _pop_par_last_scan_rs_times_ms; - double* _pop_par_last_closure_app_times_ms; - - double _pop_compute_rc_start; - double _pop_evac_start; - // indicates that we are in young GC mode bool _in_young_gc_mode; @@ -634,8 +591,7 @@ protected: NumberSeq* calc_other_times_ms) const; void print_summary (PauseSummary* stats) const; - void print_abandoned_summary(PauseSummary* non_pop_summary, - PauseSummary* pop_summary) const; + void print_abandoned_summary(PauseSummary* summary) const; void print_summary (int level, const char* str, NumberSeq* seq) const; void print_summary_sd (int level, const char* str, NumberSeq* seq) const; @@ -856,9 +812,6 @@ public: virtual void record_collection_pause_start(double start_time_sec, size_t start_used); - virtual void record_popular_pause_preamble_start(); - virtual void record_popular_pause_preamble_end(); - // Must currently be called while the world is stopped. virtual void record_concurrent_mark_init_start(); virtual void record_concurrent_mark_init_end(); @@ -881,7 +834,7 @@ public: virtual void record_collection_pause_end_CH_strong_roots(); virtual void record_collection_pause_end_G1_strong_roots(); - virtual void record_collection_pause_end(bool popular, bool abandoned); + virtual void record_collection_pause_end(bool abandoned); // Record the fact that a full collection occurred. virtual void record_full_collection_start(); @@ -990,12 +943,6 @@ public: _cur_aux_times_ms[i] += ms; } - void record_pop_compute_rc_start(); - void record_pop_compute_rc_end(); - - void record_pop_evac_start(); - void record_pop_evac_end(); - // Record the fact that "bytes" bytes allocated in a region. void record_before_bytes(size_t bytes); void record_after_bytes(size_t bytes); @@ -1008,9 +955,7 @@ public: // Choose a new collection set. Marks the chosen regions as being // "in_collection_set", and links them together. The head and number of // the collection set are available via access methods. - // If "pop_region" is non-NULL, it is a popular region that has already - // been added to the collection set. - virtual void choose_collection_set(HeapRegion* pop_region = NULL) = 0; + virtual void choose_collection_set() = 0; void clear_collection_set() { _collection_set = NULL; } @@ -1018,9 +963,6 @@ public: // current collection set. HeapRegion* collection_set() { return _collection_set; } - // Sets the collection set to the given single region. - virtual void set_single_region_collection_set(HeapRegion* hr); - // The number of elements in the current collection set. size_t collection_set_size() { return _collection_set_size; } @@ -1203,7 +1145,7 @@ class G1CollectorPolicy_BestRegionsFirst: public G1CollectorPolicy { // If the estimated is less then desirable, resize if possible. void expand_if_possible(size_t numRegions); - virtual void choose_collection_set(HeapRegion* pop_region = NULL); + virtual void choose_collection_set(); virtual void record_collection_pause_start(double start_time_sec, size_t start_used); virtual void record_concurrent_mark_cleanup_end(size_t freed_bytes, @@ -1214,9 +1156,8 @@ public: G1CollectorPolicy_BestRegionsFirst() { _collectionSetChooser = new CollectionSetChooser(); } - void record_collection_pause_end(bool popular, bool abandoned); + void record_collection_pause_end(bool abandoned); bool should_do_collection_pause(size_t word_size); - virtual void set_single_region_collection_set(HeapRegion* hr); // This is not needed any more, after the CSet choosing code was // changed to use the pause prediction work. But let's leave the // hook in just in case. diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1MarkSweep.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1MarkSweep.cpp index 42d177a1e59..2e4ba2f9f48 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1MarkSweep.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1MarkSweep.cpp @@ -157,7 +157,6 @@ void G1MarkSweep::mark_sweep_phase1(bool& marked_for_unloading, class G1PrepareCompactClosure: public HeapRegionClosure { ModRefBarrierSet* _mrbs; CompactPoint _cp; - bool _popular_only; void free_humongous_region(HeapRegion* hr) { HeapWord* bot = hr->bottom(); @@ -172,17 +171,11 @@ class G1PrepareCompactClosure: public HeapRegionClosure { } public: - G1PrepareCompactClosure(CompactibleSpace* cs, bool popular_only) : + G1PrepareCompactClosure(CompactibleSpace* cs) : _cp(NULL, cs, cs->initialize_threshold()), - _mrbs(G1CollectedHeap::heap()->mr_bs()), - _popular_only(popular_only) + _mrbs(G1CollectedHeap::heap()->mr_bs()) {} bool doHeapRegion(HeapRegion* hr) { - if (_popular_only && !hr->popular()) - return true; // terminate early - else if (!_popular_only && hr->popular()) - return false; // skip this one. - if (hr->isHumongous()) { if (hr->startsHumongous()) { oop obj = oop(hr->bottom()); @@ -203,20 +196,15 @@ public: return false; } }; -// Stolen verbatim from g1CollectedHeap.cpp + +// Finds the first HeapRegion. class FindFirstRegionClosure: public HeapRegionClosure { HeapRegion* _a_region; - bool _find_popular; public: - FindFirstRegionClosure(bool find_popular) : - _a_region(NULL), _find_popular(find_popular) {} + FindFirstRegionClosure() : _a_region(NULL) {} bool doHeapRegion(HeapRegion* r) { - if (r->popular() == _find_popular) { - _a_region = r; - return true; - } else { - return false; - } + _a_region = r; + return true; } HeapRegion* result() { return _a_region; } }; @@ -242,30 +230,15 @@ void G1MarkSweep::mark_sweep_phase2() { TraceTime tm("phase 2", PrintGC && Verbose, true, gclog_or_tty); GenMarkSweep::trace("2"); - // First we compact the popular regions. - if (G1NumPopularRegions > 0) { - CompactibleSpace* sp = g1h->first_compactible_space(); - FindFirstRegionClosure cl(true /*find_popular*/); - g1h->heap_region_iterate(&cl); - HeapRegion *r = cl.result(); - assert(r->popular(), "should have found a popular region."); - assert(r == sp, "first popular heap region should " - "== first compactible space"); - G1PrepareCompactClosure blk(sp, true/*popular_only*/); - g1h->heap_region_iterate(&blk); - } - - // Now we do the regular regions. - FindFirstRegionClosure cl(false /*find_popular*/); + FindFirstRegionClosure cl; g1h->heap_region_iterate(&cl); HeapRegion *r = cl.result(); - assert(!r->popular(), "should have founda non-popular region."); CompactibleSpace* sp = r; if (r->isHumongous() && oop(r->bottom())->is_gc_marked()) { sp = r->next_compaction_space(); } - G1PrepareCompactClosure blk(sp, false/*popular_only*/); + G1PrepareCompactClosure blk(sp); g1h->heap_region_iterate(&blk); CompactPoint perm_cp(pg, NULL, NULL); diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.cpp index d0482ea1054..f8674dd16c5 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.cpp @@ -580,9 +580,7 @@ public: virtual void do_oop(oop* p) { HeapRegion* to = _g1->heap_region_containing(*p); if (to->in_collection_set()) { - if (to->rem_set()->add_reference(p, 0)) { - _g1->schedule_popular_region_evac(to); - } + to->rem_set()->add_reference(p, 0); } } }; @@ -1024,9 +1022,8 @@ void HRInto_G1RemSet::print_summary_info() { gclog_or_tty->print_cr(" %d occupied cards represented.", blk.occupied()); gclog_or_tty->print_cr(" Max sz region = [" PTR_FORMAT ", " PTR_FORMAT " )" - " %s, cap = " SIZE_FORMAT "K, occ = " SIZE_FORMAT "K.", + ", cap = " SIZE_FORMAT "K, occ = " SIZE_FORMAT "K.", blk.max_mem_sz_region()->bottom(), blk.max_mem_sz_region()->end(), - (blk.max_mem_sz_region()->popular() ? "POP" : ""), (blk.max_mem_sz_region()->rem_set()->mem_size() + K - 1)/K, (blk.max_mem_sz_region()->rem_set()->occupied() + K - 1)/K); gclog_or_tty->print_cr(" Did %d coarsenings.", diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.inline.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.inline.hpp index 6a29f1775ec..00aa14452c2 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.inline.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.inline.hpp @@ -65,7 +65,6 @@ inline void HRInto_G1RemSet::par_write_ref(HeapRegion* from, oop* p, int tid) { HeapRegion* to = _g1->heap_region_containing(obj); // The test below could be optimized by applying a bit op to to and from. if (to != NULL && from != NULL && from != to) { - bool update_delayed = false; // There is a tricky infinite loop if we keep pushing // self forwarding pointers onto our _new_refs list. // The _par_traversal_in_progress flag is true during the collection pause, @@ -77,10 +76,7 @@ inline void HRInto_G1RemSet::par_write_ref(HeapRegion* from, oop* p, int tid) { // or processed (if an evacuation failure occurs) at the end // of the collection. // See HRInto_G1RemSet::cleanup_after_oops_into_collection_set_do(). - update_delayed = true; - } - - if (!to->popular() && !update_delayed) { + } else { #if G1_REM_SET_LOGGING gclog_or_tty->print_cr("Adding " PTR_FORMAT " (" PTR_FORMAT ") to RS" " for region [" PTR_FORMAT ", " PTR_FORMAT ")", @@ -88,9 +84,7 @@ inline void HRInto_G1RemSet::par_write_ref(HeapRegion* from, oop* p, int tid) { to->bottom(), to->end()); #endif assert(to->rem_set() != NULL, "Need per-region 'into' remsets."); - if (to->rem_set()->add_reference(p, tid)) { - _g1->schedule_popular_region_evac(to); - } + to->rem_set()->add_reference(p, tid); } } } diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1_globals.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1_globals.hpp index 2b7a984a3fd..f6589e75c78 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1_globals.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1_globals.hpp @@ -185,15 +185,9 @@ product(intx, G1InefficientPausePct, 80, \ "Threshold of an 'inefficient' pauses (as % of cum efficiency.") \ \ - product(intx, G1RSPopLimit, 32768, \ - "Limit that defines popularity. Should go away! XXX") \ - \ develop(bool, G1RSCountHisto, false, \ "If true, print a histogram of RS occupancies after each pause") \ \ - product(intx, G1ObjPopLimit, 256, \ - "Limit that defines popularity for an object.") \ - \ product(bool, G1TraceFileOverwrite, false, \ "Allow the trace file to be overwritten") \ \ @@ -201,16 +195,6 @@ "When > 0, print the occupancies of the best and worst" \ "regions.") \ \ - develop(bool, G1TracePopularity, false, \ - "When true, provide detailed tracing of popularity.") \ - \ - product(bool, G1SummarizePopularity, false, \ - "When true, provide end-of-run-summarization of popularity.") \ - \ - product(intx, G1NumPopularRegions, 1, \ - "Number of regions reserved to hold popular objects. " \ - "Should go away later.") \ - \ develop(bool, G1PrintParCleanupStats, false, \ "When true, print extra stats about parallel cleanup.") \ \ diff --git a/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp b/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp index 26817660e60..ee578bb2c4c 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp @@ -104,7 +104,6 @@ public: HeapRegion* to = _g1h->heap_region_containing(*p); if (from != NULL && to != NULL && from != to && - !to->popular() && !to->isHumongous()) { jbyte cv_obj = *_bs->byte_for_const(_containing_obj); jbyte cv_field = *_bs->byte_for_const(p); @@ -285,8 +284,6 @@ void HeapRegion::hr_clear(bool par, bool clear_space) { } zero_marked_bytes(); set_sort_index(-1); - if ((uintptr_t)bottom() >= (uintptr_t)g1h->popular_object_boundary()) - set_popular(false); _offsets.resize(HeapRegion::GrainWords); init_top_at_mark_start(); @@ -371,7 +368,6 @@ HeapRegion(G1BlockOffsetSharedArray* sharedOffsetArray, _next_in_special_set(NULL), _orig_end(NULL), _claimed(InitialClaimValue), _evacuation_failed(false), _prev_marked_bytes(0), _next_marked_bytes(0), _sort_index(-1), - _popularity(NotPopular), _young_type(NotYoung), _next_young_region(NULL), _young_index_in_cset(-1), _surv_rate_group(NULL), _age_index(-1), _rem_set(NULL), _zfs(NotZeroFilled) diff --git a/hotspot/src/share/vm/gc_implementation/g1/heapRegion.hpp b/hotspot/src/share/vm/gc_implementation/g1/heapRegion.hpp index 0e71ead7c28..e0a801af30d 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/heapRegion.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegion.hpp @@ -238,15 +238,6 @@ class HeapRegion: public G1OffsetTableContigSpace { // See "sort_index" method. -1 means is not in the array. int _sort_index; - // Means it has (or at least had) a very large RS, and should not be - // considered for membership in a collection set. - enum PopularityState { - NotPopular, - PopularPending, - Popular - }; - PopularityState _popularity; - // double _gc_efficiency; // @@ -433,10 +424,6 @@ class HeapRegion: public G1OffsetTableContigSpace { _next_in_special_set = r; } - bool is_reserved() { - return popular(); - } - bool is_on_free_list() { return _is_on_free_list; } @@ -609,23 +596,6 @@ class HeapRegion: public G1OffsetTableContigSpace { init_top_at_mark_start(); } - bool popular() { return _popularity == Popular; } - void set_popular(bool b) { - if (b) { - _popularity = Popular; - } else { - _popularity = NotPopular; - } - } - bool popular_pending() { return _popularity == PopularPending; } - void set_popular_pending(bool b) { - if (b) { - _popularity = PopularPending; - } else { - _popularity = NotPopular; - } - } - // void calc_gc_efficiency(void); double gc_efficiency() { return _gc_efficiency;} diff --git a/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.hpp b/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.hpp index 042588458ef..aa8d3346fa9 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.hpp @@ -188,32 +188,6 @@ private: // the _outgoing_region_map. void clear_outgoing_entries(); -#if MAYBE - // Audit the given card index. - void audit_card(size_t card_num, HeapRegion* hr, u2* rc_arr, - HeapRegionRemSet* empty_cards, size_t* one_obj_cards); - - // Assumes that "audit_stage1" has been called for "hr", to set up - // "shadow" and "new_rs" appropriately. Identifies individual popular - // objects; returns "true" if any are found. - bool audit_find_pop(HeapRegion* hr, u2* rc_arr); - - // Assumes that "audit_stage1" has been called for "hr", to set up - // "shadow" and "new_rs" appropriately. Identifies individual popular - // objects, and determines the number of entries in "new_rs" if any such - // popular objects are ignored. If this is sufficiently small, returns - // "false" to indicate that a constraint should not be introduced. - // Otherwise, returns "true" to indicate that we should go ahead with - // adding the constraint. - bool audit_stag(HeapRegion* hr, u2* rc_arr); - - - u2* alloc_rc_array(); - - SeqHeapRegionRemSet* audit_post(u2* rc_arr, size_t multi_obj_crds, - SeqHeapRegionRemSet* empty_cards); -#endif - enum ParIterState { Unclaimed, Claimed, Complete }; ParIterState _iter_state; @@ -261,16 +235,14 @@ public: /* Used in the sequential case. Returns "true" iff this addition causes the size limit to be reached. */ - bool add_reference(oop* from) { + void add_reference(oop* from) { _other_regions.add_reference(from); - return false; } /* Used in the parallel case. Returns "true" iff this addition causes the size limit to be reached. */ - bool add_reference(oop* from, int tid) { + void add_reference(oop* from, int tid) { _other_regions.add_reference(from, tid); - return false; } // Records the fact that the current region contains an outgoing @@ -338,20 +310,6 @@ public: } void print() const; -#if MAYBE - // We are about to introduce a constraint, requiring the collection time - // of the region owning this RS to be <= "hr", and forgetting pointers - // from the owning region to "hr." Before doing so, examines this rem - // set for pointers to "hr", possibly identifying some popular objects., - // and possibly finding some cards to no longer contain pointers to "hr", - // - // These steps may prevent the the constraint from being necessary; in - // which case returns a set of cards now thought to contain no pointers - // into HR. In the normal (I assume) case, returns NULL, indicating that - // we should go ahead and add the constraint. - virtual SeqHeapRegionRemSet* audit(HeapRegion* hr) = 0; -#endif - // Called during a stop-world phase to perform any deferred cleanups. // The second version may be called by parallel threads after then finish // collection work. diff --git a/hotspot/src/share/vm/gc_implementation/g1/heapRegionSeq.cpp b/hotspot/src/share/vm/gc_implementation/g1/heapRegionSeq.cpp index 915cd439336..4e89c8cf979 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/heapRegionSeq.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegionSeq.cpp @@ -74,7 +74,6 @@ HeapRegionSeq::alloc_obj_from_region_index(int ind, size_t word_size) { // [first, cur) HeapRegion* curhr = _regions.at(cur); if (curhr->is_empty() - && !curhr->is_reserved() && (first == cur || (_regions.at(cur-1)->end() == curhr->bottom()))) { @@ -121,35 +120,27 @@ HeapRegionSeq::alloc_obj_from_region_index(int ind, size_t word_size) { } } -void HeapRegionSeq::print_empty_runs(bool reserved_are_empty) { +void HeapRegionSeq::print_empty_runs() { int empty_run = 0; int n_empty = 0; - bool at_least_one_reserved = false; int empty_run_start; for (int i = 0; i < _regions.length(); i++) { HeapRegion* r = _regions.at(i); if (r->continuesHumongous()) continue; - if (r->is_empty() && (reserved_are_empty || !r->is_reserved())) { + if (r->is_empty()) { assert(!r->isHumongous(), "H regions should not be empty."); if (empty_run == 0) empty_run_start = i; empty_run++; n_empty++; - if (r->is_reserved()) { - at_least_one_reserved = true; - } } else { if (empty_run > 0) { gclog_or_tty->print(" %d:%d", empty_run_start, empty_run); - if (reserved_are_empty && at_least_one_reserved) - gclog_or_tty->print("(R)"); empty_run = 0; - at_least_one_reserved = false; } } } if (empty_run > 0) { gclog_or_tty->print(" %d:%d", empty_run_start, empty_run); - if (reserved_are_empty && at_least_one_reserved) gclog_or_tty->print("(R)"); } gclog_or_tty->print_cr(" [tot = %d]", n_empty); } @@ -193,7 +184,6 @@ size_t HeapRegionSeq::free_suffix() { int cur = first; while (cur >= 0 && (_regions.at(cur)->is_empty() - && !_regions.at(cur)->is_reserved() && (first == cur || (_regions.at(cur+1)->bottom() == _regions.at(cur)->end())))) { diff --git a/hotspot/src/share/vm/gc_implementation/g1/heapRegionSeq.hpp b/hotspot/src/share/vm/gc_implementation/g1/heapRegionSeq.hpp index 6ddec8d3fc4..6eee58edcd3 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/heapRegionSeq.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegionSeq.hpp @@ -104,8 +104,7 @@ class HeapRegionSeq: public CHeapObj { void print(); - // Prints out runs of empty regions. If the arg is "true" reserved - // (popular regions are considered "empty". - void print_empty_runs(bool reserved_are_empty); + // Prints out runs of empty regions. + void print_empty_runs(); }; diff --git a/hotspot/src/share/vm/gc_implementation/g1/vm_operations_g1.cpp b/hotspot/src/share/vm/gc_implementation/g1/vm_operations_g1.cpp index e5753d53b42..40af9313c33 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/vm_operations_g1.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/vm_operations_g1.cpp @@ -43,16 +43,9 @@ void VM_G1IncCollectionPause::doit() { JvmtiGCForAllocationMarker jgcm; G1CollectedHeap* g1h = G1CollectedHeap::heap(); GCCauseSetter x(g1h, GCCause::_g1_inc_collection_pause); - g1h->do_collection_pause_at_safepoint(NULL); + g1h->do_collection_pause_at_safepoint(); } -void VM_G1PopRegionCollectionPause::doit() { - JvmtiGCForAllocationMarker jgcm; - G1CollectedHeap* g1h = G1CollectedHeap::heap(); - g1h->do_collection_pause_at_safepoint(_pop_region); -} - - void VM_CGC_Operation::doit() { gclog_or_tty->date_stamp(PrintGC && PrintGCDateStamps); TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty); diff --git a/hotspot/src/share/vm/gc_implementation/g1/vm_operations_g1.hpp b/hotspot/src/share/vm/gc_implementation/g1/vm_operations_g1.hpp index a914cea3b48..47eb146e7de 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/vm_operations_g1.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/vm_operations_g1.hpp @@ -77,20 +77,6 @@ class VM_G1IncCollectionPause: public VM_GC_Operation { } }; -class VM_G1PopRegionCollectionPause: public VM_GC_Operation { - HeapRegion* _pop_region; - public: - VM_G1PopRegionCollectionPause(int gc_count_before, HeapRegion* pop_region) : - VM_GC_Operation(gc_count_before), - _pop_region(pop_region) - {} - virtual VMOp_Type type() const { return VMOp_G1PopRegionCollectionPause; } - virtual void doit(); - virtual const char* name() const { - return "garbage-first popular region collection pause"; - } -}; - // Concurrent GC stop-the-world operations such as initial and final mark; // consider sharing these with CMS's counterparts. class VM_CGC_Operation: public VM_Operation { diff --git a/hotspot/src/share/vm/gc_interface/gcCause.hpp b/hotspot/src/share/vm/gc_interface/gcCause.hpp index bae001c9ca7..da23c8e70d4 100644 --- a/hotspot/src/share/vm/gc_interface/gcCause.hpp +++ b/hotspot/src/share/vm/gc_interface/gcCause.hpp @@ -60,7 +60,7 @@ class GCCause : public AllStatic { _old_generation_too_full_to_scavenge, _adaptive_size_policy, - _g1_inc_collection_pause, _g1_pop_region_collection_pause, + _g1_inc_collection_pause, _last_ditch_collection, _last_gc_cause diff --git a/hotspot/src/share/vm/runtime/vm_operations.hpp b/hotspot/src/share/vm/runtime/vm_operations.hpp index a2ed20b3b02..8f6e114623b 100644 --- a/hotspot/src/share/vm/runtime/vm_operations.hpp +++ b/hotspot/src/share/vm/runtime/vm_operations.hpp @@ -59,7 +59,6 @@ template(G1CollectFull) \ template(G1CollectForAllocation) \ template(G1IncCollectionPause) \ - template(G1PopRegionCollectionPause) \ template(EnableBiasedLocking) \ template(RevokeBias) \ template(BulkRevokeBias) \ From 93751b6e8c3fbb2efaea4eddeba84804b09b895c Mon Sep 17 00:00:00 2001 From: Pavel Porvatov Date: Thu, 26 Mar 2009 11:04:47 +0300 Subject: [PATCH 192/292] 6798062: Memory Leak on using getFiles of FileSystemView Reviewed-by: peterz, malenkov --- .../native/sun/windows/ShellFolder2.cpp | 9 +- .../JFileChooser/6798062/bug6798062.html | 11 + .../JFileChooser/6798062/bug6798062.java | 189 ++++++++++++++++++ 3 files changed, 208 insertions(+), 1 deletion(-) create mode 100644 jdk/test/javax/swing/JFileChooser/6798062/bug6798062.html create mode 100644 jdk/test/javax/swing/JFileChooser/6798062/bug6798062.java diff --git a/jdk/src/windows/native/sun/windows/ShellFolder2.cpp b/jdk/src/windows/native/sun/windows/ShellFolder2.cpp index e88498d3af8..6799b098218 100644 --- a/jdk/src/windows/native/sun/windows/ShellFolder2.cpp +++ b/jdk/src/windows/native/sun/windows/ShellFolder2.cpp @@ -685,6 +685,9 @@ JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_getLinkLocation psl->Release(); } + if (strret.uType == STRRET_WSTR) { + CoTaskMemFree(strret.pOleStr); + } if (SUCCEEDED(hres)) { return (jlong)pidl; } else { @@ -747,7 +750,11 @@ JNIEXPORT jstring JNICALL Java_sun_awt_shell_Win32ShellFolder2_getDisplayNameOf if (pParent->GetDisplayNameOf(pidl, attrs, &strret) != S_OK) { return NULL; } - return jstringFromSTRRET(env, pidl, &strret); + jstring result = jstringFromSTRRET(env, pidl, &strret); + if (strret.uType == STRRET_WSTR) { + CoTaskMemFree(strret.pOleStr); + } + return result; } /* diff --git a/jdk/test/javax/swing/JFileChooser/6798062/bug6798062.html b/jdk/test/javax/swing/JFileChooser/6798062/bug6798062.html new file mode 100644 index 00000000000..12955f6eee7 --- /dev/null +++ b/jdk/test/javax/swing/JFileChooser/6798062/bug6798062.html @@ -0,0 +1,11 @@ + + + +1. Create a link +2. Copy path to the link into TextField +3. Run the Windows Task Manager. Select the Processes tab and find the java process +4. Press the Start button in the test window +5. Wait several minutes and observe in the Windows Task Manager +that Memory Usage of java process is not increasing + + diff --git a/jdk/test/javax/swing/JFileChooser/6798062/bug6798062.java b/jdk/test/javax/swing/JFileChooser/6798062/bug6798062.java new file mode 100644 index 00000000000..ee4d333fc85 --- /dev/null +++ b/jdk/test/javax/swing/JFileChooser/6798062/bug6798062.java @@ -0,0 +1,189 @@ +/* + * Copyright 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 %W% %E% + @bug 6798062 + @summary Memory Leak on using getFiles of FileSystemView + @author Pavel Porvatov + @run applet/manual=done bug6798062.html +*/ + +import sun.awt.shell.ShellFolder; + +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.*; +import java.io.File; +import java.io.FileNotFoundException; + +public class bug6798062 extends JApplet { + + private final JSlider slider = new JSlider(0, 100); + + private final JTextField tfLink = new JTextField(); + + private final JButton btnStart = new JButton("Start"); + + private final JButton btnStop = new JButton("Stop"); + + private final JButton btnGC = new JButton("Run System.gc()"); + + private ShellFolder folder; + + private Thread thread; + + public static void main(String[] args) { + JFrame frame = new JFrame("bug6798062"); + + frame.setSize(400, 300); + frame.setLocationRelativeTo(null); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.add(new bug6798062().initialize()); + + frame.setVisible(true); + } + + public void init() { + add(initialize()); + } + + private JPanel initialize() { + File file = new File("c:/"); + + try { + folder = ShellFolder.getShellFolder(file); + } catch (FileNotFoundException e) { + fail("Directory " + file.getPath() + " not found"); + } + + slider.setMajorTickSpacing(10); + slider.setPaintTicks(true); + slider.setPaintLabels(true); + slider.setSnapToTicks(true); + slider.setValue(10); + + btnStart.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + setEnabledState(false); + + thread = new MyThread(slider.getValue(), tfLink.getText()); + thread.start(); + } + }); + + btnStop.setEnabled(false); + + btnStop.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + thread.interrupt(); + thread = null; + + setEnabledState(true); + } + }); + + btnGC.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + System.gc(); + } + }); + + setEnabledState(true); + + JPanel pnButtons = new JPanel(); + + pnButtons.setLayout(new BoxLayout(pnButtons, BoxLayout.X_AXIS)); + + pnButtons.add(btnStart); + pnButtons.add(btnStop); + pnButtons.add(btnGC); + + tfLink.setMaximumSize(new Dimension(300, 20)); + + JPanel pnContent = new JPanel(); + + pnContent.setLayout(new BoxLayout(pnContent, BoxLayout.Y_AXIS)); + pnContent.add(new JLabel("Delay between listFiles() invocation (ms):")); + pnContent.add(slider); + pnContent.add(new JLabel("Provide link here:")); + pnContent.add(tfLink); + pnContent.add(pnButtons); + + return pnContent; + } + + private void setEnabledState(boolean enabled) { + slider.setEnabled(enabled); + btnStart.setEnabled(enabled); + btnStop.setEnabled(!enabled); + } + + private static void fail(String msg) { + throw new RuntimeException(msg); + } + + private class MyThread extends Thread { + private final int delay; + + private final ShellFolder link; + + private MyThread(int delay, String link) { + this.delay = delay; + + ShellFolder linkFolder; + + try { + linkFolder = ShellFolder.getShellFolder(new File(link)); + } catch (FileNotFoundException e) { + e.printStackTrace(); + + linkFolder = null; + } + + this.link = linkFolder; + } + + public void run() { + while (!isInterrupted()) { + folder.listFiles(); + if (link != null) { + try { + link.getLinkLocation(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + } + + if (delay > 0) { + try { + Thread.sleep(delay); + } catch (InterruptedException e1) { + // The thread was interrupted + return; + } + } + } + } + } +} From a1fd30eb7a1a1ee6f31e69b8962cba4c9b1c2898 Mon Sep 17 00:00:00 2001 From: Anthony Petrov Date: Thu, 26 Mar 2009 14:38:46 +0300 Subject: [PATCH 193/292] 6693253: Security Warning appearance requires enhancements 6779717: A Window does not show applet security warning icon on X platforms 6785058: Parent dn't get the focus after dialog is closed if security warning is applied Forward-port from 6u10-6u14 Reviewed-by: art, dcherepanov --- jdk/make/sun/awt/Depend.mak | 1 + jdk/make/sun/awt/FILES_c_windows.gmk | 1 + jdk/make/sun/awt/README | 4 +- jdk/make/sun/awt/make.depend | 278 +++--- jdk/make/sun/xawt/FILES_c_unix.gmk | 3 +- jdk/make/sun/xawt/Makefile | 18 + jdk/make/sun/xawt/mapfile-vers | 2 + .../classes/com/sun/awt/SecurityWarning.java | 169 ++++ jdk/src/share/classes/java/awt/Component.java | 4 + jdk/src/share/classes/java/awt/Window.java | 70 ++ .../classes/java/awt/peer/WindowPeer.java | 5 + .../share/classes/sun/awt/AWTAccessor.java | 26 + .../share/classes/sun/awt/EmbeddedFrame.java | 2 + .../classes/sun/awt/X11/InfoWindow.java | 495 +++++++++++ .../classes/sun/awt/X11/XDecoratedPeer.java | 4 +- .../awt/X11/XKeyboardFocusManagerPeer.java | 17 + .../classes/sun/awt/X11/XNETProtocol.java | 54 +- .../classes/sun/awt/X11/XTrayIconPeer.java | 456 +--------- jdk/src/solaris/classes/sun/awt/X11/XWM.java | 2 +- .../classes/sun/awt/X11/XWarningWindow.java | 375 +++++++- .../solaris/classes/sun/awt/X11/XWindow.java | 138 +++ .../classes/sun/awt/X11/XWindowPeer.java | 170 ++-- .../classes/sun/awt/X11/XlibWrapper.java | 8 + .../sun/awt/X11/security-icon-bw16.png | Bin 0 -> 463 bytes .../sun/awt/X11/security-icon-bw24.png | Bin 0 -> 682 bytes .../sun/awt/X11/security-icon-bw32.png | Bin 0 -> 795 bytes .../sun/awt/X11/security-icon-bw48.png | Bin 0 -> 1137 bytes .../sun/awt/X11/security-icon-interim16.png | Bin 0 -> 489 bytes .../sun/awt/X11/security-icon-interim24.png | Bin 0 -> 741 bytes .../sun/awt/X11/security-icon-interim32.png | Bin 0 -> 871 bytes .../sun/awt/X11/security-icon-interim48.png | Bin 0 -> 1387 bytes .../sun/awt/X11/security-icon-yellow16.png | Bin 0 -> 477 bytes .../sun/awt/X11/security-icon-yellow24.png | Bin 0 -> 749 bytes .../sun/awt/X11/security-icon-yellow32.png | Bin 0 -> 866 bytes .../sun/awt/X11/security-icon-yellow48.png | Bin 0 -> 1323 bytes jdk/src/solaris/native/sun/awt/utility/rect.h | 11 + jdk/src/solaris/native/sun/xawt/XlibWrapper.c | 61 ++ .../classes/sun/awt/windows/WWindowPeer.java | 18 +- .../native/sun/windows/ComCtl32Util.cpp | 4 +- .../windows/native/sun/windows/ComCtl32Util.h | 6 + .../windows/native/sun/windows/DllUtil.cpp | 87 ++ jdk/src/windows/native/sun/windows/DllUtil.h | 97 ++ jdk/src/windows/native/sun/windows/awt.rc | 7 + .../native/sun/windows/awt_Component.cpp | 26 +- .../native/sun/windows/awt_Component.h | 9 +- .../windows/native/sun/windows/awt_Dialog.cpp | 11 +- .../windows/native/sun/windows/awt_Dialog.h | 4 +- .../windows/native/sun/windows/awt_Frame.cpp | 22 +- .../windows/native/sun/windows/awt_Frame.h | 1 - .../native/sun/windows/awt_Toolkit.cpp | 193 +++- .../windows/native/sun/windows/awt_Toolkit.h | 45 + .../sun/windows/awt_Win32GraphicsEnv.cpp | 40 +- .../windows/native/sun/windows/awt_Window.cpp | 831 +++++++++++++++--- .../windows/native/sun/windows/awt_Window.h | 75 +- .../native/sun/windows/security_warning.ico | Bin 0 -> 17542 bytes .../sun/windows/security_warning_bw.ico | Bin 0 -> 17542 bytes .../sun/windows/security_warning_int.ico | Bin 0 -> 17542 bytes .../CloseDialogActivateOwnerTest.java | 114 +++ .../CloseDialogActivateOwnerTest/java.policy | 3 + .../OwnedWindowFocusIMECrashTest.java | 88 ++ 60 files changed, 3114 insertions(+), 941 deletions(-) create mode 100644 jdk/src/share/classes/com/sun/awt/SecurityWarning.java create mode 100644 jdk/src/solaris/classes/sun/awt/X11/InfoWindow.java create mode 100644 jdk/src/solaris/classes/sun/awt/X11/security-icon-bw16.png create mode 100644 jdk/src/solaris/classes/sun/awt/X11/security-icon-bw24.png create mode 100644 jdk/src/solaris/classes/sun/awt/X11/security-icon-bw32.png create mode 100644 jdk/src/solaris/classes/sun/awt/X11/security-icon-bw48.png create mode 100644 jdk/src/solaris/classes/sun/awt/X11/security-icon-interim16.png create mode 100644 jdk/src/solaris/classes/sun/awt/X11/security-icon-interim24.png create mode 100644 jdk/src/solaris/classes/sun/awt/X11/security-icon-interim32.png create mode 100644 jdk/src/solaris/classes/sun/awt/X11/security-icon-interim48.png create mode 100644 jdk/src/solaris/classes/sun/awt/X11/security-icon-yellow16.png create mode 100644 jdk/src/solaris/classes/sun/awt/X11/security-icon-yellow24.png create mode 100644 jdk/src/solaris/classes/sun/awt/X11/security-icon-yellow32.png create mode 100644 jdk/src/solaris/classes/sun/awt/X11/security-icon-yellow48.png create mode 100644 jdk/src/windows/native/sun/windows/DllUtil.cpp create mode 100644 jdk/src/windows/native/sun/windows/DllUtil.h create mode 100644 jdk/src/windows/native/sun/windows/security_warning.ico create mode 100644 jdk/src/windows/native/sun/windows/security_warning_bw.ico create mode 100644 jdk/src/windows/native/sun/windows/security_warning_int.ico create mode 100644 jdk/test/java/awt/Focus/CloseDialogActivateOwnerTest/CloseDialogActivateOwnerTest.java create mode 100644 jdk/test/java/awt/Focus/CloseDialogActivateOwnerTest/java.policy create mode 100644 jdk/test/java/awt/Focus/OwnedWindowFocusIMECrashTest/OwnedWindowFocusIMECrashTest.java diff --git a/jdk/make/sun/awt/Depend.mak b/jdk/make/sun/awt/Depend.mak index 04720420608..98c02da56e1 100644 --- a/jdk/make/sun/awt/Depend.mak +++ b/jdk/make/sun/awt/Depend.mak @@ -71,6 +71,7 @@ STUBFILES = \ $(STUBDIR)/Ole2.h \ $(STUBDIR)/Zmouse.h \ $(STUBDIR)/cderr.h \ + $(STUBDIR)/commctrl.h \ $(STUBDIR)/commdlg.h \ $(STUBDIR)/direct.h \ $(STUBDIR)/d3dcom.h \ diff --git a/jdk/make/sun/awt/FILES_c_windows.gmk b/jdk/make/sun/awt/FILES_c_windows.gmk index 835da687938..ccf21af9c79 100644 --- a/jdk/make/sun/awt/FILES_c_windows.gmk +++ b/jdk/make/sun/awt/FILES_c_windows.gmk @@ -200,5 +200,6 @@ FILES_cpp = \ ShellFolder2.cpp \ ThemeReader.cpp \ ComCtl32Util.cpp \ + DllUtil.cpp \ initIDs.cpp \ MouseInfo.cpp diff --git a/jdk/make/sun/awt/README b/jdk/make/sun/awt/README index 5246150c394..2fe5bb639a6 100644 --- a/jdk/make/sun/awt/README +++ b/jdk/make/sun/awt/README @@ -6,11 +6,9 @@ runtime, it will probably work with other versions of that compiler. Included in this project is a generated file, make.depend, which lists all interdependencies of the source files. This file is generated *on -Solaris* with the following commands: +Solaris or Linux* with the following command: - % sccs edit make.depend % gnumake -f Depend.mak - % sccs delget make.depend This step only needs to be run when new files are added to the project, or include statements are changed. diff --git a/jdk/make/sun/awt/make.depend b/jdk/make/sun/awt/make.depend index c9507be1f14..ed367d74691 100644 --- a/jdk/make/sun/awt/make.depend +++ b/jdk/make/sun/awt/make.depend @@ -1,4 +1,4 @@ -$(OBJDIR)/AccelGlyphCache.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h +$(OBJDIR)/AccelGlyphCache.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h $(OBJDIR)/AlphaMacros.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h @@ -14,143 +14,143 @@ $(OBJDIR)/AnyInt.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/sha $(OBJDIR)/AnyShort.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyShort.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/awt_AWTEvent.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_AWTEvent.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_BitmapUtil.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_BitmapUtil.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/awt/utility/rect.h +$(OBJDIR)/awt_BitmapUtil.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_BitmapUtil.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Brush.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Brush.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Button.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Button.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WButtonPeer.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Button.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Button.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Button.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WButtonPeer.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Button.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Canvas.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsConfig.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Canvas.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsConfig.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Checkbox.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Checkbox.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WCheckboxPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Checkbox.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Checkbox.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Checkbox.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WCheckboxPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Checkbox.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Choice.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Choice.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Toolkit.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WChoicePeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Choice.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dimension.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Choice.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Choice.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Toolkit.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WChoicePeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Choice.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dimension.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Clipboard.obj:: $(CLASSHDRDIR)/sun_awt_windows_WClipboard.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Clipboard.h ../../../src/windows/native/sun/windows/awt_DataTransferer.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Clipboard.obj:: $(CLASSHDRDIR)/sun_awt_windows_WClipboard.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Clipboard.h ../../../src/windows/native/sun/windows/awt_DataTransferer.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Color.obj:: $(CLASSHDRDIR)/sun_awt_windows_WColor.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Color.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Color.obj:: $(CLASSHDRDIR)/sun_awt_windows_WColor.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Color.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Component.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Color.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_InputMethodEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_MouseWheelEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Insets.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Toolkit.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WInputMethod.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPanelPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jawt.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Cursor.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dimension.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_InputEvent.h ../../../src/windows/native/sun/windows/awt_InputTextInfor.h ../../../src/windows/native/sun/windows/awt_Insets.h ../../../src/windows/native/sun/windows/awt_KeyEvent.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_MouseEvent.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/awt/utility/rect.h +$(OBJDIR)/awt_Component.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Color.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_InputMethodEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_MouseWheelEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Insets.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Toolkit.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WInputMethod.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPanelPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jawt.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Cursor.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dimension.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_InputEvent.h ../../../src/windows/native/sun/windows/awt_InputTextInfor.h ../../../src/windows/native/sun/windows/awt_Insets.h ../../../src/windows/native/sun/windows/awt_KeyEvent.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_MouseEvent.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Container.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Container.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Cursor.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Cursor.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WCustomCursor.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WGlobalCursorManager.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Cursor.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_IconCursor.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Cursor.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Cursor.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WCustomCursor.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WGlobalCursorManager.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Cursor.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_IconCursor.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_DataTransferer.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_TextComponent.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_datatransfer_DataTransferer.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDataTransferer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/common/locale_str.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_DataTransferer.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_TextComponent.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_DataTransferer.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_TextComponent.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_datatransfer_DataTransferer.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDataTransferer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/common/locale_str.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_DataTransferer.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_TextComponent.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Debug.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Debug.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Desktop.obj:: ../../../src/share/javavm/export/jni.h ../../../src/windows/javavm/export/jni_md.h +$(OBJDIR)/awt_Desktop.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_DesktopProperties.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDesktopProperties.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DesktopProperties.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_DesktopProperties.obj:: $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_windows_WDesktopProperties.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DesktopProperties.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Dialog.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Dialog.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Dimension.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dimension.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Dimension.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dimension.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_DnDDS.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_dnd_DnDConstants.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_dnd_SunDragSourceContextPeer.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDragSourceContextPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Cursor.h ../../../src/windows/native/sun/windows/awt_DataTransferer.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DnDDS.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_DnDDS.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_dnd_DnDConstants.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_dnd_SunDragSourceContextPeer.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDragSourceContextPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Cursor.h ../../../src/windows/native/sun/windows/awt_DataTransferer.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DnDDS.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_DnDDT.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_dnd_DnDConstants.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDropTargetContextPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_DataTransferer.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_DnDDS.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_DnDDT.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_dnd_DnDConstants.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDropTargetContextPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_DataTransferer.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DnDDS.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_DrawingSurface.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jawt.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jawt_md.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DrawingSurface.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_DrawingSurface.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jawt.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jawt_md.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DrawingSurface.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Event.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Event.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Event.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Event.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_FileDialog.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_FileDialog.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Font.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDefaultFontCharset.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFontPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/Disposer.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Font.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDefaultFontCharset.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFontPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/Disposer.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Frame.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/java_lang_Integer.h $(CLASSHDRDIR)/sun_awt_EmbeddedFrame.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WEmbeddedFrame.h $(CLASSHDRDIR)/sun_awt_windows_WEmbeddedFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_IconCursor.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Frame.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/java_lang_Integer.h $(CLASSHDRDIR)/sun_awt_EmbeddedFrame.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WEmbeddedFrame.h $(CLASSHDRDIR)/sun_awt_windows_WEmbeddedFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_IconCursor.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_GDIObject.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_GDIObject.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_IconCursor.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_IconCursor.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_IconCursor.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_IconCursor.h ../../../src/windows/native/sun/windows/stdhdrs.h $(OBJDIR)/awt_ImageRep.obj:: $(CLASSHDRDIR)/sun_awt_image_ImageRepresentation.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/image/awt_parseImage.h ../../../src/share/native/sun/awt/image/imageInitIDs.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/jlong_md.h $(OBJDIR)/awt_ImagingLib.obj:: $(CLASSHDRDIR)/java_awt_color_ColorSpace.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_image_BufferedImage.h $(CLASSHDRDIR)/java_awt_image_ConvolveOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_image_ImagingLib.h $(CLASSHDRDIR)/sun_awt_image_IntegerComponentRaster.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/image/awt_parseImage.h ../../../src/share/native/sun/awt/image/imageInitIDs.h ../../../src/share/native/sun/awt/medialib/awt_ImagingLib.h ../../../src/share/native/sun/awt/medialib/mlib_image_get.h ../../../src/share/native/sun/awt/medialib/mlib_image_types.h ../../../src/share/native/sun/awt/medialib/mlib_status.h ../../../src/share/native/sun/awt/medialib/mlib_types.h ../../../src/share/native/sun/awt/medialib/safe_alloc.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/awt_Mlib.h -$(OBJDIR)/awt_InputEvent.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_InputEvent.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_InputEvent.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_InputEvent.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_InputMethod.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputMethodEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WInputMethod.h $(CLASSHDRDIR)/sun_awt_windows_WInputMethodDescriptor.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/common/locale_str.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_InputMethod.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_InputMethodEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WInputMethodDescriptor.h $(CLASSHDRDIR)/sun_awt_windows_WInputMethod.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/common/locale_str.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_InputTextInfor.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_InputTextInfor.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_InputTextInfor.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_InputTextInfor.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Insets.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Insets.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Insets.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Insets.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_KeyboardFocusManager.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_KeyboardFocusManager.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_KeyboardFocusManager.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_KeyEvent.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_KeyEvent.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_KeyEvent.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_KeyEvent.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Label.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Label.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WLabelPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Label.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Label.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Label.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WLabelPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Label.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_List.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_List.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WListPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dimension.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_List.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_List.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_List.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WListPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dimension.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_List.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Menu.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_MenuBar.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_MenuBar.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_MenuItem.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_CheckboxMenuItem.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Toolkit.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCheckboxMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DesktopProperties.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_MenuItem.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_CheckboxMenuItem.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Toolkit.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCheckboxMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DesktopProperties.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Menu.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h $(OBJDIR)/awt_Mlib.obj:: $(CLASSHDRDIR)/java_awt_image_BufferedImage.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/medialib/awt_ImagingLib.h ../../../src/share/native/sun/awt/medialib/mlib_image_get.h ../../../src/share/native/sun/awt/medialib/mlib_image_types.h ../../../src/share/native/sun/awt/medialib/mlib_status.h ../../../src/share/native/sun/awt/medialib/mlib_types.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Mlib.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_MouseEvent.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_MouseEvent.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_MouseEvent.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_MouseEvent.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_new.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_new.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_new.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_new.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Object.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Object.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Palette.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_CustomPaletteDef.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/img_util_md.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Palette.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_CustomPaletteDef.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/img_util_md.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Panel.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Panel.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Panel.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Panel.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h $(OBJDIR)/awt_parseImage.obj:: $(CLASSHDRDIR)/java_awt_color_ColorSpace.h $(CLASSHDRDIR)/java_awt_image_BufferedImage.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_image_ImagingLib.h $(CLASSHDRDIR)/sun_awt_image_IntegerComponentRaster.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/image/awt_parseImage.h ../../../src/share/native/sun/awt/image/imageInitIDs.h ../../../src/share/native/sun/awt/medialib/awt_ImagingLib.h ../../../src/share/native/sun/awt/medialib/mlib_image_get.h ../../../src/share/native/sun/awt/medialib/mlib_image_types.h ../../../src/share/native/sun/awt/medialib/mlib_status.h ../../../src/share/native/sun/awt/medialib/mlib_types.h ../../../src/share/native/sun/awt/medialib/safe_alloc.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/awt_Mlib.h -$(OBJDIR)/awt_Pen.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Pen.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_PopupMenu.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_PopupMenu.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPopupMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Event.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PopupMenu.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_PopupMenu.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_PopupMenu.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPopupMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Event.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PopupMenu.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_PrintControl.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintControl.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_PrintControl.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintControl.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_PrintDialog.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPrintDialog.h $(CLASSHDRDIR)/sun_awt_windows_WPrintDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintControl.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_PrintDialog.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPrintDialog.h $(CLASSHDRDIR)/sun_awt_windows_WPrintDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintControl.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_PrintJob.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPrinterJob.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintControl.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_PrintJob.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPrinterJob.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintControl.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Rectangle.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Rectangle.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Rectangle.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Rectangle.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Robot.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WRobotPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Robot.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Robot.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WRobotPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Robot.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Scrollbar.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Scrollbar.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WScrollbarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Scrollbar.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Scrollbar.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Scrollbar.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WScrollbarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Scrollbar.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_ScrollPane.obj:: $(CLASSHDRDIR)/java_awt_Adjustable.h $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_AdjustmentEvent.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Insets.h $(CLASSHDRDIR)/java_awt_Scrollbar.h $(CLASSHDRDIR)/java_awt_ScrollPane.h $(CLASSHDRDIR)/java_awt_ScrollPaneAdjustable.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WScrollbarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WScrollPanePeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Insets.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Panel.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Scrollbar.h ../../../src/windows/native/sun/windows/awt_ScrollPane.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_ScrollPane.obj:: $(CLASSHDRDIR)/java_awt_Adjustable.h $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_AdjustmentEvent.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Insets.h $(CLASSHDRDIR)/java_awt_Scrollbar.h $(CLASSHDRDIR)/java_awt_ScrollPaneAdjustable.h $(CLASSHDRDIR)/java_awt_ScrollPane.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WScrollbarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WScrollPanePeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Insets.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Panel.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Scrollbar.h ../../../src/windows/native/sun/windows/awt_ScrollPane.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_TextArea.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_TextArea.h $(CLASSHDRDIR)/java_awt_TextComponent.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextAreaPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_TextArea.h ../../../src/windows/native/sun/windows/awt_TextComponent.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_TextArea.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_TextArea.h $(CLASSHDRDIR)/java_awt_TextComponent.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextAreaPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_TextArea.h ../../../src/windows/native/sun/windows/awt_TextComponent.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_TextComponent.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_TextComponent.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_TextComponent.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_TextComponent.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_TextComponent.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_TextComponent.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_TextField.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_TextComponent.h $(CLASSHDRDIR)/java_awt_TextField.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextFieldPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_TextComponent.h ../../../src/windows/native/sun/windows/awt_TextField.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_TextField.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_TextComponent.h $(CLASSHDRDIR)/java_awt_TextField.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextFieldPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_TextComponent.h ../../../src/windows/native/sun/windows/awt_TextField.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Toolkit.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputMethodEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_List.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_ComponentPeer.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_PopupMenu.h $(CLASSHDRDIR)/java_awt_Toolkit.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WListPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPopupMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jawt.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jawt_md.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Clipboard.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Cursor.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DesktopProperties.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_DnDDS.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_DrawingSurface.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_InputEvent.h ../../../src/windows/native/sun/windows/awt_KeyEvent.h ../../../src/windows/native/sun/windows/awt_List.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_new.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PopupMenu.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/CmdIDList.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Toolkit.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_InputMethodEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_List.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_ComponentPeer.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_PopupMenu.h $(CLASSHDRDIR)/java_awt_Toolkit.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WListPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPopupMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jawt.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jawt_md.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Clipboard.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Cursor.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DesktopProperties.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_DnDDS.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_DrawingSurface.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_InputEvent.h ../../../src/windows/native/sun/windows/awt_KeyEvent.h ../../../src/windows/native/sun/windows/awt_List.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_new.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PopupMenu.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/CmdIDList.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/DllUtil.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_TrayIcon.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_ActionEvent.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_TrayIcon.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WTrayIconPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_TrayIcon.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_TrayIcon.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_ActionEvent.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_TrayIcon.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WTrayIconPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_TrayIcon.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Win32GraphicsConfig.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_image_DataBuffer.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_Win32GraphicsConfig.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsConfig.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Win32GraphicsConfig.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_image_DataBuffer.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_Win32GraphicsConfig.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsConfig.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Win32GraphicsDevice.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_color_ColorSpace.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_image_DataBuffer.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_Win32GraphicsDevice.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/awt/image/dither.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/img_util_md.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Win32GraphicsDevice.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_color_ColorSpace.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_image_DataBuffer.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_Win32GraphicsDevice.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/awt/image/dither.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/img_util_md.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Win32GraphicsEnv.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_Win32GraphicsEnvironment.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Win32GraphicsEnv.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_Win32GraphicsEnvironment.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/DllUtil.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Window.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Container.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_ComponentEvent.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Insets.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_BitmapUtil.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_IconCursor.h ../../../src/windows/native/sun/windows/awt_Insets.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Panel.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Window.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Container.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_ComponentEvent.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Insets.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_BitmapUtil.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_IconCursor.h ../../../src/windows/native/sun/windows/awt_Insets.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Panel.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/Blit.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_Blit.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/awt/utility/rect.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/BlitBg.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_BlitBg.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/BlitBg.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_BlitBg.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/awt/utility/rect.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/Blit.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_Blit.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/BufferedMaskBlit.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedMaskBlit.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedOpCodes.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntBgr.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/BufferedMaskBlit.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedMaskBlit.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedOpCodes.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntBgr.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/BufferedRenderPipe.obj:: $(CLASSHDRDIR)/sun_java2d_pipe_BufferedOpCodes.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedRenderPipe.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h +$(OBJDIR)/BufferedRenderPipe.obj:: $(CLASSHDRDIR)/sun_java2d_pipe_BufferedOpCodes.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedRenderPipe.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h $(OBJDIR)/BufImgSurfaceData.obj:: $(CLASSHDRDIR)/sun_awt_image_BufImgSurfaceData.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/image/BufImgSurfaceData.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/img_util_md.h @@ -160,62 +160,64 @@ $(OBJDIR)/ByteBinary2Bit.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../.. $(OBJDIR)/ByteBinary4Bit.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyByteBinary.h ../../../src/share/native/sun/java2d/loops/ByteBinary4Bit.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/ByteGray.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyByte.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/Index12Gray.h ../../../src/share/native/sun/java2d/loops/Index8Gray.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/ByteGray.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyByte.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/Index12Gray.h ../../../src/share/native/sun/java2d/loops/Index8Gray.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/ByteIndexed.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyByte.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/Index12Gray.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/ByteIndexed.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyByte.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/Index12Gray.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/CmdIDList.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/CmdIDList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/CmdIDList.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/CmdIDList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/ComCtl32Util.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/ComCtl32Util.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/D3DBlitLoops.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DBlitLoops.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntBgr.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/Ushort555Rgb.h ../../../src/share/native/sun/java2d/loops/Ushort565Rgb.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DBlitLoops.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/D3DBlitLoops.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DBlitLoops.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntBgr.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/Ushort555Rgb.h ../../../src/share/native/sun/java2d/loops/Ushort565Rgb.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DBlitLoops.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/D3DBufImgOps.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DBufImgOps.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/D3DBufImgOps.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DBufImgOps.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/D3DContext.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DBufImgOps.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DGlyphCache.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPaints.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DShaders.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DTextRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/D3DContext.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DBufImgOps.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DGlyphCache.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPaints.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DShaders.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DTextRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/D3DGlyphCache.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DGlyphCache.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DTextRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/D3DGlyphCache.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DGlyphCache.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DTextRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/D3DGraphicsDevice.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DGraphicsDevice.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DGraphicsDevice.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/D3DGraphicsDevice.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DGraphicsDevice.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DGraphicsDevice.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/D3DMaskBlit.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskBlit.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/D3DMaskBlit.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskBlit.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/D3DMaskCache.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/D3DMaskCache.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/D3DMaskFill.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DMaskFill.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskFill.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/D3DMaskFill.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DMaskFill.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskFill.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/D3DPaints.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPaints.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/D3DPaints.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPaints.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/D3DPipelineManager.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DBadHardware.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/D3DPipelineManager.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DBadHardware.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/D3DRenderer.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DRenderer.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedRenderPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/D3DRenderer.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DRenderer.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedRenderPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/D3DRenderQueue.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DBlitLoops.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedOpCodes.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedRenderPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DBlitLoops.h ../../../src/windows/native/sun/java2d/d3d/D3DBufImgOps.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskBlit.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskFill.h ../../../src/windows/native/sun/java2d/d3d/D3DPaints.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DTextRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/D3DRenderQueue.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DBlitLoops.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedOpCodes.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedRenderPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DBlitLoops.h ../../../src/windows/native/sun/java2d/d3d/D3DBufImgOps.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskBlit.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskFill.h ../../../src/windows/native/sun/java2d/d3d/D3DPaints.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DTextRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/D3DResourceManager.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPaints.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DTextRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/D3DResourceManager.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPaints.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DTextRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/D3DSurfaceData.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_BitmapUtil.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/D3DSurfaceData.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_BitmapUtil.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/D3DTextRenderer.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DTextRenderer.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DGlyphCache.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DTextRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/D3DTextRenderer.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DTextRenderer.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DGlyphCache.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DTextRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/D3DVertexCacher.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPaints.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/D3DVertexCacher.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPaints.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/DataBufferNative.obj:: $(CLASSHDRDIR)/sun_awt_image_DataBufferNative.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h +$(OBJDIR)/DataBufferNative.obj:: $(CLASSHDRDIR)/sun_awt_image_DataBufferNative.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h -$(OBJDIR)/debug_assert.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h +$(OBJDIR)/debug_assert.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h -$(OBJDIR)/debug_mem.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h +$(OBJDIR)/debug_mem.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h -$(OBJDIR)/debug_trace.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h +$(OBJDIR)/debug_trace.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h -$(OBJDIR)/debug_util.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h +$(OBJDIR)/debug_util.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h -$(OBJDIR)/Devices.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/Devices.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/stdhdrs.h $(OBJDIR)/Disposer.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/Disposer.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/jlong_md.h $(OBJDIR)/dither.obj:: ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/awt/image/dither.h ../../../src/windows/native/sun/windows/colordata.h +$(OBJDIR)/DllUtil.obj:: ../../../src/windows/native/sun/windows/DllUtil.h + $(OBJDIR)/DrawLine.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_DrawLine.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h $(OBJDIR)/DrawPath.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_DrawPath.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/DrawPath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/ProcessPath.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h @@ -230,27 +232,27 @@ $(OBJDIR)/FillRect.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR) $(OBJDIR)/FillSpans.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_FillSpans.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/FourByteAbgr.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/Any4Byte.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/FourByteAbgr.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/FourByteAbgr.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/Any4Byte.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/FourByteAbgr.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/FourByteAbgrPre.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/Any4Byte.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/FourByteAbgrPre.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/FourByteAbgrPre.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/Any4Byte.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/FourByteAbgrPre.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/GDIBlitLoops.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_windows_GDIBlitLoops.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/GDIBlitLoops.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_windows_GDIBlitLoops.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/GDIHashtable.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/GDIHashtable.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/GDIRenderer.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_geom_PathIterator.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_windows_GDIRenderer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/GDIRenderer.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_geom_PathIterator.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_windows_GDIRenderer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/GDIWindowSurfaceData.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_windows_GDIWindowSurfaceData.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/Disposer.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/awt/utility/rect.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/GDIWindowSurfaceData.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_windows_GDIWindowSurfaceData.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/Disposer.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h $(OBJDIR)/gifdecoder.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/jlong_md.h -$(OBJDIR)/GraphicsPrimitiveMgr.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_GraphicsPrimitiveMgr.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/awt/utility/rect.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/GraphicsPrimitiveMgr.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_GraphicsPrimitiveMgr.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/Hashtable.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/Hashtable.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h $(OBJDIR)/imageInitIDs.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/image/imageInitIDs.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/jlong_md.h -$(OBJDIR)/img_colors.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h +$(OBJDIR)/img_colors.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h $(OBJDIR)/img_globals.obj:: $(CLASSHDRDIR)/java_awt_image_DirectColorModel.h $(CLASSHDRDIR)/java_awt_image_IndexColorModel.h $(CLASSHDRDIR)/java_awt_Transparency.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/windows/javavm/export/jni_md.h @@ -260,90 +262,90 @@ $(OBJDIR)/Index8Gray.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src $(OBJDIR)/initIDs.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/jlong_md.h -$(OBJDIR)/IntArgb.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyInt.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/Index12Gray.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/IntArgbBm.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyInt.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/IntArgbBm.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyInt.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/IntArgb.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyInt.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/Index12Gray.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h $(OBJDIR)/IntArgbPre.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyInt.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/IntBgr.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyInt.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/Index12Gray.h ../../../src/share/native/sun/java2d/loops/Index8Gray.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntBgr.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/IntBgr.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyInt.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/Index12Gray.h ../../../src/share/native/sun/java2d/loops/Index8Gray.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntBgr.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/IntRgb.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyInt.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/Index12Gray.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/IntRgb.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyInt.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/Index12Gray.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/IntRgbx.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyInt.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/IntRgbx.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/IntRgbx.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyInt.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/IntRgbx.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/MaskBlit.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_MaskBlit.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/awt/utility/rect.h +$(OBJDIR)/MaskBlit.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_MaskBlit.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h $(OBJDIR)/MaskFill.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_MaskFill.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/MouseInfo.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/MouseInfo.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/ObjectList.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/ObjectList.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/OGLBlitLoops.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLBlitLoops.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLBlitLoops.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h +$(OBJDIR)/OGLBlitLoops.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLBlitLoops.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLBlitLoops.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h -$(OBJDIR)/OGLBufImgOps.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLBufImgOps.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h +$(OBJDIR)/OGLBufImgOps.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLBufImgOps.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h -$(OBJDIR)/OGLContext.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h ../../../src/windows/native/sun/awt/utility/rect.h +$(OBJDIR)/OGLContext.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h -$(OBJDIR)/OGLFuncs.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h +$(OBJDIR)/OGLFuncs.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h -$(OBJDIR)/OGLMaskBlit.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLMaskBlit.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h +$(OBJDIR)/OGLMaskBlit.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLMaskBlit.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h -$(OBJDIR)/OGLMaskFill.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLMaskFill.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLMaskFill.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/opengl/OGLVertexCache.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h +$(OBJDIR)/OGLMaskFill.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLMaskFill.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLMaskFill.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/opengl/OGLVertexCache.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h -$(OBJDIR)/OGLPaints.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedPaints.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLPaints.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h +$(OBJDIR)/OGLPaints.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedPaints.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLPaints.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h -$(OBJDIR)/OGLRenderer.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLRenderer.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedRenderPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderer.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h +$(OBJDIR)/OGLRenderer.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLRenderer.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedRenderPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderer.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h -$(OBJDIR)/OGLRenderQueue.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLBlitLoops.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedOpCodes.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedRenderPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLBlitLoops.h ../../../src/share/native/sun/java2d/opengl/OGLBufImgOps.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLMaskBlit.h ../../../src/share/native/sun/java2d/opengl/OGLMaskFill.h ../../../src/share/native/sun/java2d/opengl/OGLPaints.h ../../../src/share/native/sun/java2d/opengl/OGLRenderer.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/opengl/OGLTextRenderer.h ../../../src/share/native/sun/java2d/opengl/OGLVertexCache.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h +$(OBJDIR)/OGLRenderQueue.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLBlitLoops.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedOpCodes.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedRenderPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLBlitLoops.h ../../../src/share/native/sun/java2d/opengl/OGLBufImgOps.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLMaskBlit.h ../../../src/share/native/sun/java2d/opengl/OGLMaskFill.h ../../../src/share/native/sun/java2d/opengl/OGLPaints.h ../../../src/share/native/sun/java2d/opengl/OGLRenderer.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/opengl/OGLTextRenderer.h ../../../src/share/native/sun/java2d/opengl/OGLVertexCache.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h -$(OBJDIR)/OGLSurfaceData.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h +$(OBJDIR)/OGLSurfaceData.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h -$(OBJDIR)/OGLTextRenderer.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLTextRenderer.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/opengl/OGLTextRenderer.h ../../../src/share/native/sun/java2d/opengl/OGLVertexCache.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h +$(OBJDIR)/OGLTextRenderer.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLTextRenderer.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/opengl/OGLTextRenderer.h ../../../src/share/native/sun/java2d/opengl/OGLVertexCache.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h -$(OBJDIR)/OGLVertexCache.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLPaints.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/opengl/OGLVertexCache.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h +$(OBJDIR)/OGLVertexCache.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLPaints.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/opengl/OGLVertexCache.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h $(OBJDIR)/ProcessPath.obj:: $(CLASSHDRDIR)/java_awt_geom_PathIterator.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/loops/ProcessPath.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/Region.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/awt/utility/rect.h +$(OBJDIR)/Region.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/jlong_md.h $(OBJDIR)/RenderBuffer.obj:: $(CLASSHDRDIR)/sun_java2d_pipe_RenderBuffer.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/jlong_md.h -$(OBJDIR)/ScaledBlit.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_ScaledBlit.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/awt/utility/rect.h +$(OBJDIR)/ScaledBlit.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_ScaledBlit.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h $(OBJDIR)/ShapeSpanIterator.obj:: $(CLASSHDRDIR)/java_awt_geom_PathIterator.h $(CLASSHDRDIR)/sun_java2d_pipe_ShapeSpanIterator.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/pipe/PathConsumer2D.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/ShellFolder2.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/ShellFolder2.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h $(OBJDIR)/SpanClipRenderer.obj:: $(CLASSHDRDIR)/sun_java2d_pipe_RegionIterator.h $(CLASSHDRDIR)/sun_java2d_pipe_SpanClipRenderer.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/jlong_md.h $(OBJDIR)/SurfaceData.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/Disposer.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/jlong_md.h -$(OBJDIR)/ThemeReader.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_ThemeReader.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/ThemeReader.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_ThemeReader.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/ThreeByteBgr.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/Any3Byte.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/ThreeByteBgr.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/Any3Byte.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/Trace.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h +$(OBJDIR)/Trace.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h -$(OBJDIR)/TransformHelper.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_loops_TransformHelper.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/awt/utility/rect.h +$(OBJDIR)/TransformHelper.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_loops_TransformHelper.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/Ushort4444Argb.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyShort.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/Ushort4444Argb.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/Ushort4444Argb.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyShort.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/Ushort4444Argb.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/Ushort555Rgb.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyShort.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/Ushort555Rgb.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/Ushort555Rgb.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyShort.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/Ushort555Rgb.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/Ushort555Rgbx.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyShort.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/Ushort555Rgbx.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/Ushort555Rgbx.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyShort.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/Ushort555Rgbx.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/Ushort565Rgb.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyShort.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/Ushort4444Argb.h ../../../src/share/native/sun/java2d/loops/Ushort565Rgb.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/Ushort565Rgb.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyShort.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/Ushort4444Argb.h ../../../src/share/native/sun/java2d/loops/Ushort565Rgb.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/UshortGray.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyShort.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/UshortGray.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyShort.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/UshortIndexed.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyByte.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/Index12Gray.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/loops/UshortIndexed.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/UshortIndexed.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyByte.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/Index12Gray.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/loops/UshortIndexed.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/WGLGraphicsConfig.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_opengl_WGLGraphicsConfig.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h ../../../src/windows/native/sun/java2d/opengl/WGLGraphicsConfig.h ../../../src/windows/native/sun/java2d/opengl/WGLSurfaceData.h +$(OBJDIR)/WGLGraphicsConfig.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_opengl_WGLGraphicsConfig.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h ../../../src/windows/native/sun/java2d/opengl/WGLGraphicsConfig.h ../../../src/windows/native/sun/java2d/opengl/WGLSurfaceData.h -$(OBJDIR)/WGLSurfaceData.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_opengl_WGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h ../../../src/windows/native/sun/java2d/opengl/WGLGraphicsConfig.h ../../../src/windows/native/sun/java2d/opengl/WGLSurfaceData.h +$(OBJDIR)/WGLSurfaceData.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_opengl_WGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h ../../../src/windows/native/sun/java2d/opengl/WGLGraphicsConfig.h ../../../src/windows/native/sun/java2d/opengl/WGLSurfaceData.h -$(OBJDIR)/WindowsFlags.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/WindowsFlags.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/WPrinterJob.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintControl.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/WPrinterJob.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_PrintControl.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/stdhdrs.h diff --git a/jdk/make/sun/xawt/FILES_c_unix.gmk b/jdk/make/sun/xawt/FILES_c_unix.gmk index c40d146384f..604955e1e6e 100644 --- a/jdk/make/sun/xawt/FILES_c_unix.gmk +++ b/jdk/make/sun/xawt/FILES_c_unix.gmk @@ -78,4 +78,5 @@ FILES_c = \ awt_Plugin.c \ gtk2_interface.c \ swing_GTKEngine.c \ - swing_GTKStyle.c + swing_GTKStyle.c \ + rect.c diff --git a/jdk/make/sun/xawt/Makefile b/jdk/make/sun/xawt/Makefile index 4c56c5ea9a4..3cb408d9907 100644 --- a/jdk/make/sun/xawt/Makefile +++ b/jdk/make/sun/xawt/Makefile @@ -79,6 +79,7 @@ vpath %.c $(SHARE_SRC)/native/sun/java2d vpath %.c $(SHARE_SRC)/native/sun/java2d/loops vpath %.c $(SHARE_SRC)/native/sun/java2d/pipe vpath %.c $(SHARE_SRC)/native/sun/awt/medialib +vpath %.c $(SHARE_SRC)/native/sun/awt/utility vpath %.cpp $(SHARE_SRC)/native/sun/image vpath %.c $(SHARE_SRC)/native/sun/font vpath %.c $(PLATFORM_SRC)/native/sun/awt/robot_child @@ -274,6 +275,23 @@ ICONS = \ $(ICONS_PATH_PREFIX)/classes/sun/awt/X11/java-icon32.png \ $(ICONS_PATH_PREFIX)/classes/sun/awt/X11/java-icon48.png + +ICONPATH=$(PLATFORM_SRC)/classes/sun/awt/X11 + +ICONS += \ + $(ICONPATH)/security-icon-bw16.png \ + $(ICONPATH)/security-icon-interim16.png \ + $(ICONPATH)/security-icon-yellow16.png \ + $(ICONPATH)/security-icon-bw24.png \ + $(ICONPATH)/security-icon-interim24.png \ + $(ICONPATH)/security-icon-yellow24.png \ + $(ICONPATH)/security-icon-bw32.png \ + $(ICONPATH)/security-icon-interim32.png \ + $(ICONPATH)/security-icon-yellow32.png \ + $(ICONPATH)/security-icon-bw48.png \ + $(ICONPATH)/security-icon-interim48.png \ + $(ICONPATH)/security-icon-yellow48.png + TEMPDIR_CLASSES = $(TEMPDIR)/classes $(TEMPDIR_CLASSES)/sun/awt/X11/ToBin.class: ToBin.java diff --git a/jdk/make/sun/xawt/mapfile-vers b/jdk/make/sun/xawt/mapfile-vers index dcea098e5e7..2eef2391e8e 100644 --- a/jdk/make/sun/xawt/mapfile-vers +++ b/jdk/make/sun/xawt/mapfile-vers @@ -93,6 +93,8 @@ SUNWprivate_1.1 { Java_sun_awt_X11_XlibWrapper_XGetWMHints; Java_sun_awt_X11_XlibWrapper_XShapeQueryExtension; Java_sun_awt_X11_XlibWrapper_SetRectangularShape; + Java_sun_awt_X11_XlibWrapper_SetBitmapShape; + Java_sun_awt_X11_XlibWrapper_XConfigureWindow; Java_sun_awt_X11_XlibWrapper_SetZOrder; Java_sun_awt_X11_XToolkit_initIDs; Java_sun_awt_X11_XWindow_getNativeColor; diff --git a/jdk/src/share/classes/com/sun/awt/SecurityWarning.java b/jdk/src/share/classes/com/sun/awt/SecurityWarning.java new file mode 100644 index 00000000000..46dea38548d --- /dev/null +++ b/jdk/src/share/classes/com/sun/awt/SecurityWarning.java @@ -0,0 +1,169 @@ +/* + * Copyright 2008-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. 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. + */ + +package com.sun.awt; + +import java.awt.*; +import java.awt.geom.*; + +import sun.awt.AWTAccessor; + + +/** + * Security Warning control interface. + * + * This class provides a couple of methods that help a developer relocate + * the AWT security warning to an appropriate position relative to the current + * window size. A "top-level window" is an instance of the {@code Window} + * class (or its descendant, such as {@code JFrame}). The security warning + * is applied to all windows created by an untrusted code. All such windows + * have a non-null "warning string" (see {@link Window#getWarningString()}). + *

+ * WARNING: This class is an implementation detail and only meant + * for limited use outside of the core platform. This API may change + * drastically between update release, and it may even be + * removed or be moved to some other packages or classes. + */ +public final class SecurityWarning { + + /** + * The SecurityWarning class should not be instantiated + */ + private SecurityWarning() { + } + + /** + * Gets the size of the security warning. + * + * The returned value is not valid until the peer has been created. Before + * invoking this method a developer must call the {@link Window#pack()}, + * {@link Window#setVisible()}, or some other method that creates the peer. + * + * @param window the window to get the security warning size for + * + * @throws NullPointerException if the window argument is null + * @throws IllegalArgumentException if the window is trusted (i.e. + * the {@code getWarningString()} returns null) + */ + public static Dimension getSize(Window window) { + if (window == null) { + throw new NullPointerException( + "The window argument should not be null."); + } + if (window.getWarningString() == null) { + throw new IllegalArgumentException( + "The window must have a non-null warning string."); + } + // We don't check for a non-null peer since it may be destroyed + // after assigning a valid value to the security warning size. + + return AWTAccessor.getWindowAccessor().getSecurityWarningSize(window); + } + + /** + * Sets the position of the security warning. + *

+ * The {@code alignmentX} and {@code alignmentY} arguments specify the + * origin of the coordinate system used to calculate the position of the + * security warning. The values must be in the range [0.0f...1.0f]. The + * {@code 0.0f} value represents the left (top) edge of the rectangular + * bounds of the window. The {@code 1.0f} value represents the right + * (bottom) edge of the bounds. Whenever the size of the window changes, + * the origin of the coordinate system gets relocated accordingly. For + * convenience a developer may use the {@code Component.*_ALIGNMENT} + * constants to pass predefined values for these arguments. + *

+ * The {@code point} argument specifies the location of the security + * warning in the coordinate system described above. If both {@code x} and + * {@code y} coordinates of the point are equal to zero, the warning will + * be located right in the origin of the coordinate system. On the other + * hand, if both {@code alignmentX} and {@code alignmentY} are equal to + * zero (i.e. the origin of the coordinate system is placed at the top-left + * corner of the window), then the {@code point} argument represents the + * absolute location of the security warning relative to the location of + * the window. The "absolute" in this case means that the position of the + * security warning is not effected by resizing of the window. + *

+ * Note that the security warning managment code guarantees that: + *

    + *
  • The security warning cannot be located farther than two pixels from + * the rectangular bounds of the window (see {@link Window#getBounds}), and + *
  • The security warning is always visible on the screen. + *
+ * If either of the conditions is violated, the calculated position of the + * security warning is adjusted by the system to meet both these + * conditions. + *

+ * The default position of the security warning is in the upper-right + * corner of the window, two pixels to the right from the right edge. This + * corresponds to the following arguments passed to this method: + *

    + *
  • {@code alignmentX = Component.RIGHT_ALIGNMENT} + *
  • {@code alignmentY = Component.TOP_ALIGNMENT} + *
  • {@code point = (2, 0)} + *
+ * + * @param window the window to set the position of the security warning for + * @param alignmentX the horizontal origin of the coordinate system + * @param alignmentY the vertical origin of the coordinate system + * @param point the position of the security warning in the specified + * coordinate system + * + * @throws NullPointerException if the window argument is null + * @throws NullPointerException if the point argument is null + * @throws IllegalArgumentException if the window is trusted (i.e. + * the {@code getWarningString()} returns null + * @throws IllegalArgumentException if the alignmentX or alignmentY + * arguments are not within the range [0.0f ... 1.0f] + */ + public static void setPosition(Window window, Point2D point, + float alignmentX, float alignmentY) + { + if (window == null) { + throw new NullPointerException( + "The window argument should not be null."); + } + if (window.getWarningString() == null) { + throw new IllegalArgumentException( + "The window must have a non-null warning string."); + } + if (point == null) { + throw new NullPointerException( + "The point argument must not be null"); + } + if (alignmentX < 0.0f || alignmentX > 1.0f) { + throw new IllegalArgumentException( + "alignmentX must be in the range [0.0f ... 1.0f]."); + } + if (alignmentY < 0.0f || alignmentY > 1.0f) { + throw new IllegalArgumentException( + "alignmentY must be in the range [0.0f ... 1.0f]."); + } + + AWTAccessor.getWindowAccessor().setSecurityWarningPosition(window, + point, alignmentX, alignmentY); + } +} + diff --git a/jdk/src/share/classes/java/awt/Component.java b/jdk/src/share/classes/java/awt/Component.java index fe52ba2ed7f..03743332fc1 100644 --- a/jdk/src/share/classes/java/awt/Component.java +++ b/jdk/src/share/classes/java/awt/Component.java @@ -857,6 +857,10 @@ public abstract class Component implements ImageObserver, MenuContainer, public boolean canBeFocusOwner(Component comp) { return comp.canBeFocusOwner(); } + + public boolean isVisible_NoClientCode(Component comp) { + return comp.isVisible_NoClientCode(); + } }); } diff --git a/jdk/src/share/classes/java/awt/Window.java b/jdk/src/share/classes/java/awt/Window.java index 062870fe101..01d9ff59d00 100644 --- a/jdk/src/share/classes/java/awt/Window.java +++ b/jdk/src/share/classes/java/awt/Window.java @@ -25,6 +25,7 @@ package java.awt; import java.awt.event.*; +import java.awt.geom.Point2D; import java.awt.im.InputContext; import java.awt.image.BufferStrategy; import java.awt.image.BufferedImage; @@ -326,6 +327,23 @@ public class Window extends Container implements Accessible { transient boolean isTrayIconWindow = false; + /** + * These fields are initialized in the native peer code + * or via AWTAccessor's WindowAccessor. + */ + private transient volatile int securityWarningWidth = 0; + private transient volatile int securityWarningHeight = 0; + + /** + * These fields represent the desired location for the security + * warning if this window is untrusted. + * See com.sun.awt.SecurityWarning for more details. + */ + private transient double securityWarningPointX = 2.0; + private transient double securityWarningPointY = 0.0; + private transient float securityWarningAlignmentX = RIGHT_ALIGNMENT; + private transient float securityWarningAlignmentY = TOP_ALIGNMENT; + static { /* ensure that the necessary native libraries are loaded */ Toolkit.loadLibraries(); @@ -2881,6 +2899,13 @@ public class Window extends Container implements Accessible { shape = (Shape)f.get("shape", null); opacity = (Float)f.get("opacity", 1.0f); + this.securityWarningWidth = 0; + this.securityWarningHeight = 0; + this.securityWarningPointX = 2.0; + this.securityWarningPointY = 0.0; + this.securityWarningAlignmentX = RIGHT_ALIGNMENT; + this.securityWarningAlignmentY = TOP_ALIGNMENT; + deserializeResources(s); } @@ -3568,6 +3593,18 @@ public class Window extends Container implements Accessible { // ****************** END OF MIXING CODE ******************************** + // This method gets the window location/size as reported by the native + // system since the locally cached values may represent outdated data. + // NOTE: this method is invoked on the toolkit thread, and therefore + // is not supposed to become public/user-overridable. + private Point2D calculateSecurityWarningPosition(double x, double y, + double w, double h) + { + return new Point2D.Double( + x + w * securityWarningAlignmentX + securityWarningPointX, + y + h * securityWarningAlignmentY + securityWarningPointY); + } + static { AWTAccessor.setWindowAccessor(new AWTAccessor.WindowAccessor() { public float getOpacity(Window window) { @@ -3601,6 +3638,39 @@ public class Window extends Container implements Accessible { public void updateWindow(Window window, BufferedImage backBuffer) { window.updateWindow(backBuffer); } + + public Dimension getSecurityWarningSize(Window window) { + return new Dimension(window.securityWarningWidth, + window.securityWarningHeight); + } + + public void setSecurityWarningSize(Window window, int width, int height) + { + window.securityWarningWidth = width; + window.securityWarningHeight = height; + } + + public void setSecurityWarningPosition(Window window, + Point2D point, float alignmentX, float alignmentY) + { + window.securityWarningPointX = point.getX(); + window.securityWarningPointY = point.getY(); + window.securityWarningAlignmentX = alignmentX; + window.securityWarningAlignmentY = alignmentY; + + synchronized (window.getTreeLock()) { + WindowPeer peer = (WindowPeer)window.getPeer(); + if (peer != null) { + peer.repositionSecurityWarning(); + } + } + } + + public Point2D calculateSecurityWarningPosition(Window window, + double x, double y, double w, double h) + { + return window.calculateSecurityWarningPosition(x, y, w, h); + } }); // WindowAccessor } // static diff --git a/jdk/src/share/classes/java/awt/peer/WindowPeer.java b/jdk/src/share/classes/java/awt/peer/WindowPeer.java index 8a2589b9c8e..5cacef3c485 100644 --- a/jdk/src/share/classes/java/awt/peer/WindowPeer.java +++ b/jdk/src/share/classes/java/awt/peer/WindowPeer.java @@ -116,4 +116,9 @@ public interface WindowPeer extends ContainerPeer { * @see Window#setBackground(Color) */ void updateWindow(BufferedImage backBuffer); + + /** + * Instructs the peer to update the position of the security warning. + */ + void repositionSecurityWarning(); } diff --git a/jdk/src/share/classes/sun/awt/AWTAccessor.java b/jdk/src/share/classes/sun/awt/AWTAccessor.java index 8a3275e4b9b..a82ba314666 100644 --- a/jdk/src/share/classes/sun/awt/AWTAccessor.java +++ b/jdk/src/share/classes/sun/awt/AWTAccessor.java @@ -92,6 +92,12 @@ public final class AWTAccessor { * Determines if the component can gain focus. */ boolean canBeFocusOwner(Component comp); + + /** + * Returns whether the component is visible without invoking + * any client code. + */ + boolean isVisible_NoClientCode(Component comp); } /* @@ -127,6 +133,26 @@ public final class AWTAccessor { * Update the image of a non-opaque (translucent) window. */ void updateWindow(Window window, BufferedImage backBuffer); + + /** Get the size of the security warning. + */ + Dimension getSecurityWarningSize(Window w); + + /** + * Set the size of the security warning. + */ + void setSecurityWarningSize(Window w, int width, int height); + + /** Set the position of the security warning. + */ + void setSecurityWarningPosition(Window w, Point2D point, + float alignmentX, float alignmentY); + + /** Request to recalculate the new position of the security warning for + * the given window size/location as reported by the native system. + */ + Point2D calculateSecurityWarningPosition(Window window, + double x, double y, double w, double h); } /* diff --git a/jdk/src/share/classes/sun/awt/EmbeddedFrame.java b/jdk/src/share/classes/sun/awt/EmbeddedFrame.java index f636da47191..7b77862d5f7 100644 --- a/jdk/src/share/classes/sun/awt/EmbeddedFrame.java +++ b/jdk/src/share/classes/sun/awt/EmbeddedFrame.java @@ -592,5 +592,7 @@ public abstract class EmbeddedFrame extends Frame } public void updateWindow(BufferedImage backBuffer) { } + public void repositionSecurityWarning() { + } } } // class EmbeddedFrame diff --git a/jdk/src/solaris/classes/sun/awt/X11/InfoWindow.java b/jdk/src/solaris/classes/sun/awt/X11/InfoWindow.java new file mode 100644 index 00000000000..ea485b2be9f --- /dev/null +++ b/jdk/src/solaris/classes/sun/awt/X11/InfoWindow.java @@ -0,0 +1,495 @@ +/* + * Copyright 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. 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. + */ + +package sun.awt.X11; + +import java.awt.*; +import java.awt.event.*; +import java.awt.peer.TrayIconPeer; +import sun.awt.*; +import java.awt.image.*; +import java.text.BreakIterator; +import java.util.logging.Logger; +import java.util.logging.Level; +import java.util.concurrent.ArrayBlockingQueue; +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.lang.reflect.InvocationTargetException; + +/** + * An utility window class. This is a base class for Tooltip and Balloon. + */ +public abstract class InfoWindow extends Window { + private Container container; + private Closer closer; + + protected InfoWindow(Frame parent, Color borderColor) { + super(parent); + container = new Container() { + @Override + public Insets getInsets() { + return new Insets(1, 1, 1, 1); + } + }; + setLayout(new BorderLayout()); + setBackground(borderColor); + add(container, BorderLayout.CENTER); + container.setLayout(new BorderLayout()); + + closer = new Closer(); + } + + public Component add(Component c) { + container.add(c, BorderLayout.CENTER); + return c; + } + + protected void setCloser(Runnable action, int time) { + closer.set(action, time); + } + + // Must be executed on EDT. + protected void show(Point corner, int indent) { + assert SunToolkit.isDispatchThreadForAppContext(this); + + pack(); + + Dimension size = getSize(); + // TODO: When 6356322 is fixed we should get screen bounds in + // this way: eframe.getGraphicsConfiguration().getBounds(). + Dimension scrSize = Toolkit.getDefaultToolkit().getScreenSize(); + + if (corner.x < scrSize.width/2 && corner.y < scrSize.height/2) { // 1st square + setLocation(corner.x + indent, corner.y + indent); + + } else if (corner.x >= scrSize.width/2 && corner.y < scrSize.height/2) { // 2nd square + setLocation(corner.x - indent - size.width, corner.y + indent); + + } else if (corner.x < scrSize.width/2 && corner.y >= scrSize.height/2) { // 3rd square + setLocation(corner.x + indent, corner.y - indent - size.height); + + } else if (corner.x >= scrSize.width/2 && corner.y >= scrSize.height/2) { // 4th square + setLocation(corner.x - indent - size.width, corner.y - indent - size.height); + } + + super.show(); + closer.schedule(); + } + + public void hide() { + closer.close(); + } + + private class Closer implements Runnable { + Runnable action; + int time; + + public void run() { + doClose(); + } + + void set(Runnable action, int time) { + this.action = action; + this.time = time; + } + + void schedule() { + XToolkit.schedule(this, time); + } + + void close() { + XToolkit.remove(this); + doClose(); + } + + // WARNING: this method may be executed on Toolkit thread. + private void doClose() { + SunToolkit.executeOnEventHandlerThread(InfoWindow.this, new Runnable() { + public void run() { + InfoWindow.super.hide(); + invalidate(); + if (action != null) { + action.run(); + } + } + }); + } + } + + + private interface LiveArguments { + /** Whether the target of the InfoWindow is disposed. */ + boolean isDisposed(); + + /** The bounds of the target of the InfoWindow. */ + Rectangle getBounds(); + } + + public static class Tooltip extends InfoWindow { + + public interface LiveArguments extends InfoWindow.LiveArguments { + /** The tooltip to be displayed. */ + String getTooltipString(); + } + + private final Object target; + private final LiveArguments liveArguments; + + private final Label textLabel = new Label(""); + private final Runnable starter = new Runnable() { + public void run() { + display(); + }}; + + private final static int TOOLTIP_SHOW_TIME = 10000; + private final static int TOOLTIP_START_DELAY_TIME = 1000; + private final static int TOOLTIP_MAX_LENGTH = 64; + private final static int TOOLTIP_MOUSE_CURSOR_INDENT = 5; + private final static Color TOOLTIP_BACKGROUND_COLOR = new Color(255, 255, 220); + private final static Font TOOLTIP_TEXT_FONT = XWindow.getDefaultFont(); + + public Tooltip(Frame parent, Object target, + LiveArguments liveArguments) + { + super(parent, Color.black); + + this.target = target; + this.liveArguments = liveArguments; + + XTrayIconPeer.suppressWarningString(this); + + setCloser(null, TOOLTIP_SHOW_TIME); + textLabel.setBackground(TOOLTIP_BACKGROUND_COLOR); + textLabel.setFont(TOOLTIP_TEXT_FONT); + add(textLabel); + } + + /* + * WARNING: this method is executed on Toolkit thread! + */ + private void display() { + String tooltipString = liveArguments.getTooltipString(); + if (tooltipString == null) { + return; + } else if (tooltipString.length() > TOOLTIP_MAX_LENGTH) { + textLabel.setText(tooltipString.substring(0, TOOLTIP_MAX_LENGTH)); + } else { + textLabel.setText(tooltipString); + } + + // Execute on EDT to avoid deadlock (see 6280857). + SunToolkit.executeOnEventHandlerThread(target, new Runnable() { + public void run() { + if (liveArguments.isDisposed()) { + return; + } + Point pointer = (Point)AccessController.doPrivileged(new PrivilegedAction() { + public Object run() { + if (!isPointerOverTrayIcon(liveArguments.getBounds())) { + return null; + } + return MouseInfo.getPointerInfo().getLocation(); + } + }); + if (pointer == null) { + return; + } + show(new Point(pointer.x, pointer.y), TOOLTIP_MOUSE_CURSOR_INDENT); + } + }); + } + + public void enter() { + XToolkit.schedule(starter, TOOLTIP_START_DELAY_TIME); + } + + public void exit() { + XToolkit.remove(starter); + if (isVisible()) { + hide(); + } + } + + private boolean isPointerOverTrayIcon(Rectangle trayRect) { + Point p = MouseInfo.getPointerInfo().getLocation(); + return !(p.x < trayRect.x || p.x > (trayRect.x + trayRect.width) || + p.y < trayRect.y || p.y > (trayRect.y + trayRect.height)); + } + } + + public static class Balloon extends InfoWindow { + + public interface LiveArguments extends InfoWindow.LiveArguments { + /** The action to be performed upon clicking the baloon. */ + String getActionCommand(); + } + + private final LiveArguments liveArguments; + private final Object target; + + private final static int BALLOON_SHOW_TIME = 10000; + private final static int BALLOON_TEXT_MAX_LENGTH = 256; + private final static int BALLOON_WORD_LINE_MAX_LENGTH = 16; + private final static int BALLOON_WORD_LINE_MAX_COUNT = 4; + private final static int BALLOON_ICON_WIDTH = 32; + private final static int BALLOON_ICON_HEIGHT = 32; + private final static int BALLOON_TRAY_ICON_INDENT = 0; + private final static Color BALLOON_CAPTION_BACKGROUND_COLOR = new Color(200, 200 ,255); + private final static Font BALLOON_CAPTION_FONT = new Font(Font.DIALOG, Font.BOLD, 12); + + private Panel mainPanel = new Panel(); + private Panel captionPanel = new Panel(); + private Label captionLabel = new Label(""); + private Button closeButton = new Button("X"); + private Panel textPanel = new Panel(); + private XTrayIconPeer.IconCanvas iconCanvas = new XTrayIconPeer.IconCanvas(BALLOON_ICON_WIDTH, BALLOON_ICON_HEIGHT); + private Label[] lineLabels = new Label[BALLOON_WORD_LINE_MAX_COUNT]; + private ActionPerformer ap = new ActionPerformer(); + + private Image iconImage; + private Image errorImage; + private Image warnImage; + private Image infoImage; + private boolean gtkImagesLoaded; + + private Displayer displayer = new Displayer(); + + public Balloon(Frame parent, Object target, LiveArguments liveArguments) { + super(parent, new Color(90, 80 ,190)); + this.liveArguments = liveArguments; + this.target = target; + + XTrayIconPeer.suppressWarningString(this); + + setCloser(new Runnable() { + public void run() { + if (textPanel != null) { + textPanel.removeAll(); + textPanel.setSize(0, 0); + iconCanvas.setSize(0, 0); + XToolkit.awtLock(); + try { + displayer.isDisplayed = false; + XToolkit.awtLockNotifyAll(); + } finally { + XToolkit.awtUnlock(); + } + } + } + }, BALLOON_SHOW_TIME); + + add(mainPanel); + + captionLabel.setFont(BALLOON_CAPTION_FONT); + captionLabel.addMouseListener(ap); + + captionPanel.setLayout(new BorderLayout()); + captionPanel.add(captionLabel, BorderLayout.WEST); + captionPanel.add(closeButton, BorderLayout.EAST); + captionPanel.setBackground(BALLOON_CAPTION_BACKGROUND_COLOR); + captionPanel.addMouseListener(ap); + + closeButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + hide(); + } + }); + + mainPanel.setLayout(new BorderLayout()); + mainPanel.setBackground(Color.white); + mainPanel.add(captionPanel, BorderLayout.NORTH); + mainPanel.add(iconCanvas, BorderLayout.WEST); + mainPanel.add(textPanel, BorderLayout.CENTER); + + iconCanvas.addMouseListener(ap); + + for (int i = 0; i < BALLOON_WORD_LINE_MAX_COUNT; i++) { + lineLabels[i] = new Label(); + lineLabels[i].addMouseListener(ap); + lineLabels[i].setBackground(Color.white); + } + + displayer.start(); + } + + public void display(String caption, String text, String messageType) { + if (!gtkImagesLoaded) { + loadGtkImages(); + } + displayer.display(caption, text, messageType); + } + + private void _display(String caption, String text, String messageType) { + captionLabel.setText(caption); + + BreakIterator iter = BreakIterator.getWordInstance(); + if (text != null) { + iter.setText(text); + int start = iter.first(), end; + int nLines = 0; + + do { + end = iter.next(); + + if (end == BreakIterator.DONE || + text.substring(start, end).length() >= 50) + { + lineLabels[nLines].setText(text.substring(start, end == BreakIterator.DONE ? + iter.last() : end)); + textPanel.add(lineLabels[nLines++]); + start = end; + } + if (nLines == BALLOON_WORD_LINE_MAX_COUNT) { + if (end != BreakIterator.DONE) { + lineLabels[nLines - 1].setText( + new String(lineLabels[nLines - 1].getText() + " ...")); + } + break; + } + } while (end != BreakIterator.DONE); + + + textPanel.setLayout(new GridLayout(nLines, 1)); + } + + if ("ERROR".equals(messageType)) { + iconImage = errorImage; + } else if ("WARNING".equals(messageType)) { + iconImage = warnImage; + } else if ("INFO".equals(messageType)) { + iconImage = infoImage; + } else { + iconImage = null; + } + + if (iconImage != null) { + Dimension tpSize = textPanel.getSize(); + iconCanvas.setSize(BALLOON_ICON_WIDTH, (BALLOON_ICON_HEIGHT > tpSize.height ? + BALLOON_ICON_HEIGHT : tpSize.height)); + iconCanvas.validate(); + } + + SunToolkit.executeOnEventHandlerThread(target, new Runnable() { + public void run() { + if (liveArguments.isDisposed()) { + return; + } + Point parLoc = getParent().getLocationOnScreen(); + Dimension parSize = getParent().getSize(); + show(new Point(parLoc.x + parSize.width/2, parLoc.y + parSize.height/2), + BALLOON_TRAY_ICON_INDENT); + if (iconImage != null) { + iconCanvas.updateImage(iconImage); // call it after the show(..) above + } + } + }); + } + + public void dispose() { + displayer.interrupt(); + super.dispose(); + } + + private void loadGtkImages() { + if (!gtkImagesLoaded) { + errorImage = (Image)Toolkit.getDefaultToolkit().getDesktopProperty( + "gtk.icon.gtk-dialog-error.6.rtl"); + warnImage = (Image)Toolkit.getDefaultToolkit().getDesktopProperty( + "gtk.icon.gtk-dialog-warning.6.rtl"); + infoImage = (Image)Toolkit.getDefaultToolkit().getDesktopProperty( + "gtk.icon.gtk-dialog-info.6.rtl"); + gtkImagesLoaded = true; + } + } + + private class ActionPerformer extends MouseAdapter { + public void mouseClicked(MouseEvent e) { + // hide the balloon by any click + hide(); + if (e.getButton() == MouseEvent.BUTTON1) { + ActionEvent aev = new ActionEvent(target, ActionEvent.ACTION_PERFORMED, + liveArguments.getActionCommand(), + e.getWhen(), e.getModifiers()); + Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(aev); + } + } + } + + private class Displayer extends Thread { + final int MAX_CONCURRENT_MSGS = 10; + + ArrayBlockingQueue messageQueue = new ArrayBlockingQueue(MAX_CONCURRENT_MSGS); + boolean isDisplayed; + + Displayer() { + setDaemon(true); + } + + public void run() { + while (true) { + Message msg = null; + try { + msg = (Message)messageQueue.take(); + } catch (InterruptedException e) { + return; + } + + /* + * Wait till the previous message is displayed if any + */ + XToolkit.awtLock(); + try { + while (isDisplayed) { + try { + XToolkit.awtLockWait(); + } catch (InterruptedException e) { + return; + } + } + isDisplayed = true; + } finally { + XToolkit.awtUnlock(); + } + _display(msg.caption, msg.text, msg.messageType); + } + } + + void display(String caption, String text, String messageType) { + messageQueue.offer(new Message(caption, text, messageType)); + } + } + + private static class Message { + String caption, text, messageType; + + Message(String caption, String text, String messageType) { + this.caption = caption; + this.text = text; + this.messageType = messageType; + } + } + } +} + diff --git a/jdk/src/solaris/classes/sun/awt/X11/XDecoratedPeer.java b/jdk/src/solaris/classes/sun/awt/X11/XDecoratedPeer.java index c81bc2d9503..739713dd713 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XDecoratedPeer.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XDecoratedPeer.java @@ -451,7 +451,7 @@ abstract class XDecoratedPeer extends XWindowPeer { public Insets getInsets() { Insets in = copy(getRealInsets()); - in.top += getMenuBarHeight() + getWarningWindowHeight(); + in.top += getMenuBarHeight(); if (insLog.isLoggable(Level.FINEST)) { insLog.log(Level.FINEST, "Get insets returns {0}", new Object[] {in}); } @@ -802,6 +802,8 @@ abstract class XDecoratedPeer extends XWindowPeer { } reconfigureContentWindow(newDimensions); updateChildrenSizes(); + + repositionSecurityWarning(); } private void checkShellRectSize(Rectangle shellRect) { diff --git a/jdk/src/solaris/classes/sun/awt/X11/XKeyboardFocusManagerPeer.java b/jdk/src/solaris/classes/sun/awt/X11/XKeyboardFocusManagerPeer.java index 434de63ab2b..19c213441a0 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XKeyboardFocusManagerPeer.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XKeyboardFocusManagerPeer.java @@ -83,8 +83,25 @@ public class XKeyboardFocusManagerPeer extends KeyboardFocusManagerPeerImpl { public static void setCurrentNativeFocusedWindow(Window win) { if (focusLog.isLoggable(Level.FINER)) focusLog.finer("Setting current native focused window " + win); + XWindowPeer from = null, to = null; + synchronized(lock) { + if (currentFocusedWindow != null) { + from = (XWindowPeer)currentFocusedWindow.getPeer(); + } + currentFocusedWindow = win; + + if (currentFocusedWindow != null) { + to = (XWindowPeer)currentFocusedWindow.getPeer(); + } + } + + if (from != null) { + from.updateSecurityWarningVisibility(); + } + if (to != null) { + to.updateSecurityWarningVisibility(); } } diff --git a/jdk/src/solaris/classes/sun/awt/X11/XNETProtocol.java b/jdk/src/solaris/classes/sun/awt/X11/XNETProtocol.java index e145cd98206..1bc8829d9bc 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XNETProtocol.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XNETProtocol.java @@ -169,6 +169,34 @@ final class XNETProtocol extends XProtocol implements XStateProtocol, XLayerProt return ((layer == LAYER_ALWAYS_ON_TOP) || (layer == LAYER_NORMAL)) && doLayerProtocol(); } + public void requestState(XWindow window, XAtom state, boolean isAdd) { + XClientMessageEvent req = new XClientMessageEvent(); + try { + req.set_type((int)XConstants.ClientMessage); + req.set_window(window.getWindow()); + req.set_message_type(XA_NET_WM_STATE.getAtom()); + req.set_format(32); + req.set_data(0, isAdd ? _NET_WM_STATE_ADD : _NET_WM_STATE_REMOVE); + req.set_data(1, state.getAtom()); + // Fix for 6735584: req.data[2] must be set to 0 when only one property is changed + req.set_data(2, 0); + log.log(Level.FINE, "Setting _NET_STATE atom {0} on {1} for {2}", new Object[] {state, window, Boolean.valueOf(isAdd)}); + XToolkit.awtLock(); + try { + XlibWrapper.XSendEvent(XToolkit.getDisplay(), + XlibWrapper.RootWindow(XToolkit.getDisplay(), window.getScreenNumber()), + false, + XConstants.SubstructureRedirectMask | XConstants.SubstructureNotifyMask, + req.pData); + } + finally { + XToolkit.awtUnlock(); + } + } finally { + req.dispose(); + } + } + /** * Helper function to set/reset one state in NET_WM_STATE * If window is showing then it uses ClientMessage, otherwise adjusts NET_WM_STATE list @@ -181,31 +209,7 @@ final class XNETProtocol extends XProtocol implements XStateProtocol, XLayerProt new Object[] {Boolean.valueOf(window.isWithdrawn()), Boolean.valueOf(window.isVisible()), Boolean.valueOf(window.isMapped()), Boolean.valueOf(window.isShowing())}); if (window.isShowing()) { - XClientMessageEvent req = new XClientMessageEvent(); - try { - req.set_type((int)XConstants.ClientMessage); - req.set_window(window.getWindow()); - req.set_message_type(XA_NET_WM_STATE.getAtom()); - req.set_format(32); - req.set_data(0, (!set) ? _NET_WM_STATE_REMOVE : _NET_WM_STATE_ADD); - req.set_data(1, state.getAtom()); - // Fix for 6735584: req.data[2] must be set to 0 when only one property is changed - req.set_data(2, 0); - log.log(Level.FINE, "Setting _NET_STATE atom {0} on {1} for {2}", new Object[] {state, window, Boolean.valueOf(set)}); - XToolkit.awtLock(); - try { - XlibWrapper.XSendEvent(XToolkit.getDisplay(), - XlibWrapper.RootWindow(XToolkit.getDisplay(), window.getScreenNumber()), - false, - XConstants.SubstructureRedirectMask | XConstants.SubstructureNotifyMask, - req.pData); - } - finally { - XToolkit.awtUnlock(); - } - } finally { - req.dispose(); - } + requestState(window, state, set); } else { XAtomList net_wm_state = window.getNETWMState(); log.log(Level.FINE, "Current state on {0} is {1}", new Object[] {window, net_wm_state}); diff --git a/jdk/src/solaris/classes/sun/awt/X11/XTrayIconPeer.java b/jdk/src/solaris/classes/sun/awt/X11/XTrayIconPeer.java index ff690bf9d06..b1243abacf7 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XTrayIconPeer.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XTrayIconPeer.java @@ -38,15 +38,18 @@ import java.security.AccessController; import java.security.PrivilegedAction; import java.lang.reflect.InvocationTargetException; -public class XTrayIconPeer implements TrayIconPeer { +public class XTrayIconPeer implements TrayIconPeer, + InfoWindow.Balloon.LiveArguments, + InfoWindow.Tooltip.LiveArguments +{ private static final Logger ctrLog = Logger.getLogger("sun.awt.X11.XTrayIconPeer.centering"); TrayIcon target; TrayIconEventProxy eventProxy; XTrayIconEmbeddedFrame eframe; TrayIconCanvas canvas; - Balloon balloon; - Tooltip tooltip; + InfoWindow.Balloon balloon; + InfoWindow.Tooltip tooltip; PopupMenu popup; String tooltipString; boolean isTrayIconDisplayed; @@ -255,8 +258,8 @@ public class XTrayIconPeer implements TrayIconPeer { eframe.setVisible(true); updateImage(); - balloon = new Balloon(this, eframe); - tooltip = new Tooltip(this, eframe); + balloon = new InfoWindow.Balloon(eframe, target, this); + tooltip = new InfoWindow.Tooltip(eframe, target, this); addListeners(); } @@ -300,6 +303,10 @@ public class XTrayIconPeer implements TrayIconPeer { tooltipString = tooltip; } + public String getTooltipString() { + return tooltipString; + } + public void updateImage() { Runnable r = new Runnable() { public void run() { @@ -385,7 +392,7 @@ public class XTrayIconPeer implements TrayIconPeer { return eframe.getLocationOnScreen(); } - private Rectangle getBounds() { + public Rectangle getBounds() { Point loc = getLocationOnScreen(); return new Rectangle(loc.x, loc.y, loc.x + TRAY_ICON_WIDTH, loc.y + TRAY_ICON_HEIGHT); } @@ -399,10 +406,14 @@ public class XTrayIconPeer implements TrayIconPeer { return ((XEmbeddedFramePeer)eframe.getPeer()).getWindow(); } - boolean isDisposed() { + public boolean isDisposed() { return isDisposed; } + public String getActionCommand() { + return target.getActionCommand(); + } + static class TrayIconEventProxy implements MouseListener, MouseMotionListener { XTrayIconPeer xtiPeer; @@ -474,8 +485,8 @@ public class XTrayIconPeer implements TrayIconPeer { } static boolean isTrayIconStuffWindow(Window w) { - return (w instanceof Tooltip) || - (w instanceof Balloon) || + return (w instanceof InfoWindow.Tooltip) || + (w instanceof InfoWindow.Balloon) || (w instanceof XTrayIconEmbeddedFrame); } @@ -530,7 +541,7 @@ public class XTrayIconPeer implements TrayIconPeer { } } - static class IconCanvas extends Canvas { + public static class IconCanvas extends Canvas { volatile Image image; IconObserver observer; int width, height; @@ -608,429 +619,4 @@ public class XTrayIconPeer implements TrayIconPeer { } } } - - // *************************************** - // Classes for toolitp and balloon windows - // *************************************** - - static class Tooltip extends InfoWindow { - XTrayIconPeer xtiPeer; - Label textLabel = new Label(""); - Runnable starter = new Runnable() { - public void run() { - display(); - }}; - - final static int TOOLTIP_SHOW_TIME = 10000; - final static int TOOLTIP_START_DELAY_TIME = 1000; - final static int TOOLTIP_MAX_LENGTH = 64; - final static int TOOLTIP_MOUSE_CURSOR_INDENT = 5; - final static Color TOOLTIP_BACKGROUND_COLOR = new Color(255, 255, 220); - final static Font TOOLTIP_TEXT_FONT = XWindow.getDefaultFont(); - - Tooltip(XTrayIconPeer xtiPeer, Frame parent) { - super(parent, Color.black); - this.xtiPeer = xtiPeer; - - suppressWarningString(this); - - setCloser(null, TOOLTIP_SHOW_TIME); - textLabel.setBackground(TOOLTIP_BACKGROUND_COLOR); - textLabel.setFont(TOOLTIP_TEXT_FONT); - add(textLabel); - } - - /* - * WARNING: this method is executed on Toolkit thread! - */ - void display() { - String tip = xtiPeer.tooltipString; - if (tip == null) { - return; - } else if (tip.length() > TOOLTIP_MAX_LENGTH) { - textLabel.setText(tip.substring(0, TOOLTIP_MAX_LENGTH)); - } else { - textLabel.setText(tip); - } - - // Execute on EDT to avoid deadlock (see 6280857). - SunToolkit.executeOnEventHandlerThread(xtiPeer.target, new Runnable() { - public void run() { - if (xtiPeer.isDisposed()) { - return; - } - Point pointer = (Point)AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - if (!isPointerOverTrayIcon(xtiPeer.getBounds())) { - return null; - } - return MouseInfo.getPointerInfo().getLocation(); - } - }); - if (pointer == null) { - return; - } - show(new Point(pointer.x, pointer.y), TOOLTIP_MOUSE_CURSOR_INDENT); - } - }); - } - - void enter() { - XToolkit.schedule(starter, TOOLTIP_START_DELAY_TIME); - } - - void exit() { - XToolkit.remove(starter); - if (isVisible()) { - hide(); - } - } - - boolean isPointerOverTrayIcon(Rectangle trayRect) { - Point p = MouseInfo.getPointerInfo().getLocation(); - return !(p.x < trayRect.x || p.x > (trayRect.x + trayRect.width) || - p.y < trayRect.y || p.y > (trayRect.y + trayRect.height)); - } - } - - static class Balloon extends InfoWindow { - final static int BALLOON_SHOW_TIME = 10000; - final static int BALLOON_TEXT_MAX_LENGTH = 256; - final static int BALLOON_WORD_LINE_MAX_LENGTH = 16; - final static int BALLOON_WORD_LINE_MAX_COUNT = 4; - final static int BALLOON_ICON_WIDTH = 32; - final static int BALLOON_ICON_HEIGHT = 32; - final static int BALLOON_TRAY_ICON_INDENT = 0; - final static Color BALLOON_CAPTION_BACKGROUND_COLOR = new Color(200, 200 ,255); - final static Font BALLOON_CAPTION_FONT = new Font(Font.DIALOG, Font.BOLD, 12); - - XTrayIconPeer xtiPeer; - Panel mainPanel = new Panel(); - Panel captionPanel = new Panel(); - Label captionLabel = new Label(""); - Button closeButton = new Button("X"); - Panel textPanel = new Panel(); - IconCanvas iconCanvas = new IconCanvas(BALLOON_ICON_WIDTH, BALLOON_ICON_HEIGHT); - Label[] lineLabels = new Label[BALLOON_WORD_LINE_MAX_COUNT]; - ActionPerformer ap = new ActionPerformer(); - - Image iconImage; - Image errorImage; - Image warnImage; - Image infoImage; - boolean gtkImagesLoaded; - - Displayer displayer = new Displayer(); - - Balloon(final XTrayIconPeer xtiPeer, Frame parent) { - super(parent, new Color(90, 80 ,190)); - this.xtiPeer = xtiPeer; - - suppressWarningString(this); - - setCloser(new Runnable() { - public void run() { - if (textPanel != null) { - textPanel.removeAll(); - textPanel.setSize(0, 0); - iconCanvas.setSize(0, 0); - XToolkit.awtLock(); - try { - displayer.isDisplayed = false; - XToolkit.awtLockNotifyAll(); - } finally { - XToolkit.awtUnlock(); - } - } - } - }, BALLOON_SHOW_TIME); - - add(mainPanel); - - captionLabel.setFont(BALLOON_CAPTION_FONT); - captionLabel.addMouseListener(ap); - - captionPanel.setLayout(new BorderLayout()); - captionPanel.add(captionLabel, BorderLayout.WEST); - captionPanel.add(closeButton, BorderLayout.EAST); - captionPanel.setBackground(BALLOON_CAPTION_BACKGROUND_COLOR); - captionPanel.addMouseListener(ap); - - closeButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - hide(); - } - }); - - mainPanel.setLayout(new BorderLayout()); - mainPanel.setBackground(Color.white); - mainPanel.add(captionPanel, BorderLayout.NORTH); - mainPanel.add(iconCanvas, BorderLayout.WEST); - mainPanel.add(textPanel, BorderLayout.CENTER); - - iconCanvas.addMouseListener(ap); - - for (int i = 0; i < BALLOON_WORD_LINE_MAX_COUNT; i++) { - lineLabels[i] = new Label(); - lineLabels[i].addMouseListener(ap); - lineLabels[i].setBackground(Color.white); - } - - displayer.start(); - } - - void display(String caption, String text, String messageType) { - if (!gtkImagesLoaded) { - loadGtkImages(); - } - displayer.display(caption, text, messageType); - } - - private void _display(String caption, String text, String messageType) { - captionLabel.setText(caption); - - BreakIterator iter = BreakIterator.getWordInstance(); - if (text != null) { - iter.setText(text); - int start = iter.first(), end; - int nLines = 0; - - do { - end = iter.next(); - - if (end == BreakIterator.DONE || - text.substring(start, end).length() >= 50) - { - lineLabels[nLines].setText(text.substring(start, end == BreakIterator.DONE ? - iter.last() : end)); - textPanel.add(lineLabels[nLines++]); - start = end; - } - if (nLines == BALLOON_WORD_LINE_MAX_COUNT) { - if (end != BreakIterator.DONE) { - lineLabels[nLines - 1].setText( - new String(lineLabels[nLines - 1].getText() + " ...")); - } - break; - } - } while (end != BreakIterator.DONE); - - - textPanel.setLayout(new GridLayout(nLines, 1)); - } - - if ("ERROR".equals(messageType)) { - iconImage = errorImage; - } else if ("WARNING".equals(messageType)) { - iconImage = warnImage; - } else if ("INFO".equals(messageType)) { - iconImage = infoImage; - } else { - iconImage = null; - } - - if (iconImage != null) { - Dimension tpSize = textPanel.getSize(); - iconCanvas.setSize(BALLOON_ICON_WIDTH, (BALLOON_ICON_HEIGHT > tpSize.height ? - BALLOON_ICON_HEIGHT : tpSize.height)); - iconCanvas.validate(); - } - - SunToolkit.executeOnEventHandlerThread(xtiPeer.target, new Runnable() { - public void run() { - if (xtiPeer.isDisposed()) { - return; - } - Point parLoc = getParent().getLocationOnScreen(); - Dimension parSize = getParent().getSize(); - show(new Point(parLoc.x + parSize.width/2, parLoc.y + parSize.height/2), - BALLOON_TRAY_ICON_INDENT); - if (iconImage != null) { - iconCanvas.updateImage(iconImage); // call it after the show(..) above - } - } - }); - } - - public void dispose() { - displayer.interrupt(); - super.dispose(); - } - - void loadGtkImages() { - if (!gtkImagesLoaded) { - errorImage = (Image)Toolkit.getDefaultToolkit().getDesktopProperty( - "gtk.icon.gtk-dialog-error.6.rtl"); - warnImage = (Image)Toolkit.getDefaultToolkit().getDesktopProperty( - "gtk.icon.gtk-dialog-warning.6.rtl"); - infoImage = (Image)Toolkit.getDefaultToolkit().getDesktopProperty( - "gtk.icon.gtk-dialog-info.6.rtl"); - gtkImagesLoaded = true; - } - } - - class ActionPerformer extends MouseAdapter { - public void mouseClicked(MouseEvent e) { - // hide the balloon by any click - hide(); - if (e.getButton() == MouseEvent.BUTTON1) { - ActionEvent aev = new ActionEvent(xtiPeer.target, ActionEvent.ACTION_PERFORMED, - xtiPeer.target.getActionCommand(), - e.getWhen(), e.getModifiers()); - Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(aev); - } - } - } - - class Displayer extends Thread { - final int MAX_CONCURRENT_MSGS = 10; - - ArrayBlockingQueue messageQueue = new ArrayBlockingQueue(MAX_CONCURRENT_MSGS); - boolean isDisplayed; - - Displayer() { - setDaemon(true); - } - - public void run() { - while (true) { - Message msg = null; - try { - msg = (Message)messageQueue.take(); - } catch (InterruptedException e) { - return; - } - - /* - * Wait till the previous message is displayed if any - */ - XToolkit.awtLock(); - try { - while (isDisplayed) { - try { - XToolkit.awtLockWait(); - } catch (InterruptedException e) { - return; - } - } - isDisplayed = true; - } finally { - XToolkit.awtUnlock(); - } - _display(msg.caption, msg.text, msg.messageType); - } - } - - void display(String caption, String text, String messageType) { - messageQueue.offer(new Message(caption, text, messageType)); - } - } - - class Message { - String caption, text, messageType; - - Message(String caption, String text, String messageType) { - this.caption = caption; - this.text = text; - this.messageType = messageType; - } - } - } - - static class InfoWindow extends Window { - Container container; - Closer closer; - - InfoWindow(Frame parent, Color borderColor) { - super(parent); - container = new Container() { - public Insets getInsets() { - return new Insets(1, 1, 1, 1); - } - }; - setLayout(new BorderLayout()); - setBackground(borderColor); - add(container, BorderLayout.CENTER); - container.setLayout(new BorderLayout()); - - closer = new Closer(); - } - - public Component add(Component c) { - container.add(c, BorderLayout.CENTER); - return c; - } - - void setCloser(Runnable action, int time) { - closer.set(action, time); - } - - // Must be executed on EDT. - protected void show(Point corner, int indent) { - assert SunToolkit.isDispatchThreadForAppContext(InfoWindow.this); - - pack(); - - Dimension size = getSize(); - // TODO: When 6356322 is fixed we should get screen bounds in - // this way: eframe.getGraphicsConfiguration().getBounds(). - Dimension scrSize = Toolkit.getDefaultToolkit().getScreenSize(); - - if (corner.x < scrSize.width/2 && corner.y < scrSize.height/2) { // 1st square - setLocation(corner.x + indent, corner.y + indent); - - } else if (corner.x >= scrSize.width/2 && corner.y < scrSize.height/2) { // 2nd square - setLocation(corner.x - indent - size.width, corner.y + indent); - - } else if (corner.x < scrSize.width/2 && corner.y >= scrSize.height/2) { // 3rd square - setLocation(corner.x + indent, corner.y - indent - size.height); - - } else if (corner.x >= scrSize.width/2 && corner.y >= scrSize.height/2) { // 4th square - setLocation(corner.x - indent - size.width, corner.y - indent - size.height); - } - - InfoWindow.super.show(); - InfoWindow.this.closer.schedule(); - } - - public void hide() { - closer.close(); - } - - class Closer implements Runnable { - Runnable action; - int time; - - public void run() { - doClose(); - } - - void set(Runnable action, int time) { - this.action = action; - this.time = time; - } - - void schedule() { - XToolkit.schedule(this, time); - } - - void close() { - XToolkit.remove(this); - doClose(); - } - - // WARNING: this method may be executed on Toolkit thread. - private void doClose() { - SunToolkit.executeOnEventHandlerThread(InfoWindow.this, new Runnable() { - public void run() { - InfoWindow.super.hide(); - invalidate(); - if (action != null) { - action.run(); - } - } - }); - } - } - } } diff --git a/jdk/src/solaris/classes/sun/awt/X11/XWM.java b/jdk/src/solaris/classes/sun/awt/X11/XWM.java index c3adec9aa02..66ac1e0d7af 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XWM.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XWM.java @@ -896,7 +896,7 @@ final class XWM /* * Set MWM decorations. Set MWM functions depending on resizability. */ - static void setMotifDecor(XWindowPeer window, boolean resizable, int decorations, int functions) { + static void setMotifDecor(XWindow window, boolean resizable, int decorations, int functions) { /* Apparently some WMs don't implement MWM_*_ALL semantic correctly */ if ((decorations & MWMConstants.MWM_DECOR_ALL) != 0 && (decorations != MWMConstants.MWM_DECOR_ALL)) diff --git a/jdk/src/solaris/classes/sun/awt/X11/XWarningWindow.java b/jdk/src/solaris/classes/sun/awt/X11/XWarningWindow.java index f53034d0dc5..adb536440d4 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XWarningWindow.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XWarningWindow.java @@ -25,16 +25,194 @@ package sun.awt.X11; import java.awt.*; +import java.awt.event.*; +import java.awt.geom.Point2D; +import java.lang.ref.WeakReference; +import sun.java2d.SunGraphics2D; +import sun.java2d.pipe.Region; +import sun.awt.AWTAccessor; +import sun.awt.SunToolkit; class XWarningWindow extends XWindow { - final static int defaultHeight = 27; + private final static int showingDelay = 330; + private final static int hidingDelay = 2000; - Window ownerWindow; - XWarningWindow(Window ownerWindow, long parentWindow) { - super(ownerWindow, parentWindow); + private final Window ownerWindow; + private WeakReference ownerPeer; + + public final Window getOwnerWindow() { + return ownerWindow; + } + private long parentWindow; + + private final static String OWNER = "OWNER"; + + private static XIconInfo[][] icons; + + private InfoWindow.Tooltip tooltip; + + private static synchronized XIconInfo getSecurityIconInfo(int size, int num) { + if (icons == null) { + icons = new XIconInfo[4][3]; + if (XlibWrapper.dataModel == 32) { + icons[0][0] = new XIconInfo(XAWTIcon32_security_icon_bw16_png.security_icon_bw16_png); + icons[0][1] = new XIconInfo(XAWTIcon32_security_icon_interim16_png.security_icon_interim16_png); + icons[0][2] = new XIconInfo(XAWTIcon32_security_icon_yellow16_png.security_icon_yellow16_png); + icons[1][0] = new XIconInfo(XAWTIcon32_security_icon_bw24_png.security_icon_bw24_png); + icons[1][1] = new XIconInfo(XAWTIcon32_security_icon_interim24_png.security_icon_interim24_png); + icons[1][2] = new XIconInfo(XAWTIcon32_security_icon_yellow24_png.security_icon_yellow24_png); + icons[2][0] = new XIconInfo(XAWTIcon32_security_icon_bw32_png.security_icon_bw32_png); + icons[2][1] = new XIconInfo(XAWTIcon32_security_icon_interim32_png.security_icon_interim32_png); + icons[2][2] = new XIconInfo(XAWTIcon32_security_icon_yellow32_png.security_icon_yellow32_png); + icons[3][0] = new XIconInfo(XAWTIcon32_security_icon_bw48_png.security_icon_bw48_png); + icons[3][1] = new XIconInfo(XAWTIcon32_security_icon_interim48_png.security_icon_interim48_png); + icons[3][2] = new XIconInfo(XAWTIcon32_security_icon_yellow48_png.security_icon_yellow48_png); + } else { + icons[0][0] = new XIconInfo(XAWTIcon64_security_icon_bw16_png.security_icon_bw16_png); + icons[0][1] = new XIconInfo(XAWTIcon64_security_icon_interim16_png.security_icon_interim16_png); + icons[0][2] = new XIconInfo(XAWTIcon64_security_icon_yellow16_png.security_icon_yellow16_png); + icons[1][0] = new XIconInfo(XAWTIcon64_security_icon_bw24_png.security_icon_bw24_png); + icons[1][1] = new XIconInfo(XAWTIcon64_security_icon_interim24_png.security_icon_interim24_png); + icons[1][2] = new XIconInfo(XAWTIcon64_security_icon_yellow24_png.security_icon_yellow24_png); + icons[2][0] = new XIconInfo(XAWTIcon64_security_icon_bw32_png.security_icon_bw32_png); + icons[2][1] = new XIconInfo(XAWTIcon64_security_icon_interim32_png.security_icon_interim32_png); + icons[2][2] = new XIconInfo(XAWTIcon64_security_icon_yellow32_png.security_icon_yellow32_png); + icons[3][0] = new XIconInfo(XAWTIcon64_security_icon_bw48_png.security_icon_bw48_png); + icons[3][1] = new XIconInfo(XAWTIcon64_security_icon_interim48_png.security_icon_interim48_png); + icons[3][2] = new XIconInfo(XAWTIcon64_security_icon_yellow48_png.security_icon_yellow48_png); + } + } + final int sizeIndex = size % icons.length; + return icons[sizeIndex][num % icons[sizeIndex].length]; + } + + private volatile int currentIcon = 0; + + /* -1 - uninitialized yet + * 0 - 16x16 + * 1 - 24x24 + * 2 - 32x32 + * 3 - 48x48 + */ + private volatile int currentSize = -1; + + /** Indicates whether the shape of the window must be updated + */ + private volatile boolean sizeUpdated = true; + + private synchronized boolean updateIconSize() { + int newSize = currentSize; + + if (ownerWindow != null) { + Insets insets = ownerWindow.getInsets(); + int max = Math.max(insets.top, Math.max(insets.bottom, + Math.max(insets.left, insets.right))); + if (max < 24) { + newSize = 0; + } else if (max < 32) { + newSize = 1; + } else if (max < 48) { + newSize = 2; + } else { + newSize = 3; + } + } + if (newSize != currentSize) { + currentSize = newSize; + sizeUpdated = true; + } + return sizeUpdated; + } + + private synchronized XIconInfo getSecurityIconInfo() { + updateIconSize(); + return getSecurityIconInfo(currentSize, currentIcon); + } + + XWarningWindow(final Window ownerWindow, long parentWindow, XWindowPeer ownerPeer) { + super(new XCreateWindowParams(new Object[] { + TARGET, ownerWindow, + OWNER, Long.valueOf(parentWindow) + })); this.ownerWindow = ownerWindow; - xSetVisible(true); - toFront(); + this.parentWindow = parentWindow; + this.tooltip = new InfoWindow.Tooltip(null, getTarget(), + new InfoWindow.Tooltip.LiveArguments() { + public boolean isDisposed() { + return XWarningWindow.this.isDisposed(); + } + public Rectangle getBounds() { + return XWarningWindow.this.getBounds(); + } + public String getTooltipString() { + return XWarningWindow.this.ownerWindow.getWarningString(); + } + }); + this.ownerPeer = new WeakReference(ownerPeer); + } + + private void requestNoTaskbar() { + XNETProtocol netProtocol = XWM.getWM().getNETProtocol(); + if (netProtocol != null) { + netProtocol.requestState(this, netProtocol.XA_NET_WM_STATE_SKIP_TASKBAR, true); + } + } + + @Override + void postInit(XCreateWindowParams params) { + super.postInit(params); + XToolkit.awtLock(); + try { + XWM.setMotifDecor(this, false, 0, 0); + XWM.setOLDecor(this, false, 0); + + long parentWindow = ((Long)params.get(OWNER)).longValue(); + XlibWrapper.XSetTransientFor(XToolkit.getDisplay(), + getWindow(), parentWindow); + + XWMHints hints = getWMHints(); + hints.set_flags(hints.get_flags() | (int)XUtilConstants.InputHint | (int)XUtilConstants.StateHint); + hints.set_input(false); + hints.set_initial_state(XUtilConstants.NormalState); + XlibWrapper.XSetWMHints(XToolkit.getDisplay(), getWindow(), hints.pData); + + initWMProtocols(); + requestNoTaskbar(); + } finally { + XToolkit.awtUnlock(); + } + } + + private void updateWarningWindowBounds() { + XWindowPeer peer = ownerPeer.get(); + if (peer != null) { + synchronized (this) { + if (updateIconSize()) { + XIconInfo ico = getSecurityIconInfo(); + XToolkit.awtLock(); + try { + XlibWrapper.SetBitmapShape(XToolkit.getDisplay(), getWindow(), + ico.getWidth(), ico.getHeight(), ico.getIntData()); + } finally { + XToolkit.awtUnlock(); + } + sizeUpdated = false; + AWTAccessor.getWindowAccessor().setSecurityWarningSize( + ownerWindow, ico.getWidth(), ico.getHeight()); + } + } + peer.repositionSecurityWarning(); + } + } + + /** + * @param x,y,w,h coordinates of the untrusted window + */ + public void reposition(int x, int y, int w, int h) { + Point2D point = AWTAccessor.getWindowAccessor(). + calculateSecurityWarningPosition(ownerWindow, + x, y, w, h); + reshape((int)point.getX(), (int)point.getY(), getWidth(), getHeight()); } protected String getWMName() { @@ -49,33 +227,19 @@ class XWarningWindow extends XWindow { getFont()); } void paint(Graphics g, int x, int y, int width, int height) { - String warningString = getWarningString(); - Rectangle bounds = getBounds(); - bounds.x = 0; - bounds.y = 0; - Rectangle updateRect = new Rectangle(x, y, width, height); - if (updateRect.intersects(bounds)) { - Rectangle updateArea = updateRect.intersection(bounds); - g.setClip(updateArea); - g.setColor(getBackground()); - g.fillRect(updateArea.x, updateArea.y, updateArea.width, updateArea.height); - g.setColor(getColor()); - g.setFont(getFont()); - FontMetrics fm = g.getFontMetrics(); - int warningWidth = fm.stringWidth(warningString); - int w_x = (bounds.width - warningWidth)/2; - int w_y = (bounds.height + fm.getMaxAscent() - fm.getMaxDescent())/2; - g.drawString(warningString, w_x, w_y); - g.drawLine(bounds.x, bounds.y+bounds.height-1, bounds.x+bounds.width-1, bounds.y+bounds.height-1); - } + g.drawImage(getSecurityIconInfo().getImage(), 0, 0, null); } String getWarningString() { return ownerWindow.getWarningString(); } + int getWidth() { + return getSecurityIconInfo().getWidth(); + } + int getHeight() { - return defaultHeight; // should implement depending on Font + return getSecurityIconInfo().getHeight(); } Color getBackground() { @@ -97,6 +261,7 @@ class XWarningWindow extends XWindow { } } + @Override public void handleExposeEvent(XEvent xev) { super.handleExposeEvent(xev); @@ -105,18 +270,156 @@ class XWarningWindow extends XWindow { final int y = xe.get_y(); final int width = xe.get_width(); final int height = xe.get_height(); - EventQueue.invokeLater(new Runnable() { - public void run() { - Graphics g = getGraphics(); - try { - paint(g, x, y, width, height); - } finally { - g.dispose(); - } - } - }); + SunToolkit.executeOnEventHandlerThread(target, + new Runnable() { + public void run() { + Graphics g = getGraphics(); + try { + paint(g, x, y, width, height); + } finally { + g.dispose(); + } + } + }); } + + @Override protected boolean isEventDisabled(XEvent e) { return true; } + + /** Send a synthetic UnmapNotify in order to withdraw the window. + */ + private void withdraw() { + XEvent req = new XEvent(); + try { + long root; + XToolkit.awtLock(); + try { + root = XlibWrapper.RootWindow(XToolkit.getDisplay(), getScreenNumber()); + } + finally { + XToolkit.awtUnlock(); + } + + req.set_type(XConstants.UnmapNotify); + + XUnmapEvent umev = req.get_xunmap(); + + umev.set_event(root); + umev.set_window(getWindow()); + umev.set_from_configure(false); + + XToolkit.awtLock(); + try { + XlibWrapper.XSendEvent(XToolkit.getDisplay(), + root, + false, + XConstants.SubstructureRedirectMask | XConstants.SubstructureNotifyMask, + req.pData); + } + finally { + XToolkit.awtUnlock(); + } + } finally { + req.dispose(); + } + } + + @Override + protected void stateChanged(long time, int oldState, int newState) { + if (newState == XUtilConstants.IconicState) { + super.xSetVisible(false); + withdraw(); + } + } + + @Override + protected void setMouseAbove(boolean above) { + super.setMouseAbove(above); + XWindowPeer p = ownerPeer.get(); + if (p != null) { + p.updateSecurityWarningVisibility(); + } + } + + @Override + protected void enterNotify(long window) { + super.enterNotify(window); + if (window == getWindow()) { + tooltip.enter(); + } + } + + @Override + protected void leaveNotify(long window) { + super.leaveNotify(window); + if (window == getWindow()) { + tooltip.exit(); + } + } + + @Override + public void xSetVisible(boolean visible) { + super.xSetVisible(visible); + + // The _NET_WM_STATE_SKIP_TASKBAR got reset upon hiding/showing, + // so we request it every time whenever we change the visibility. + requestNoTaskbar(); + } + + private final Runnable hidingTask = new Runnable() { + public void run() { + xSetVisible(false); + } + }; + + private final Runnable showingTask = new Runnable() { + public void run() { + new Thread() { + public void run() { + if (!isVisible()) { + xSetVisible(true); + updateWarningWindowBounds(); + } + repaint(); + if (currentIcon > 0) { + currentIcon--; + XToolkit.schedule(showingTask, showingDelay); + } + }}.start(); + } + }; + + public void setSecurityWarningVisible(boolean visible) { + setSecurityWarningVisible(visible, true); + } + + public void setSecurityWarningVisible(boolean visible, boolean doSchedule) { + if (visible) { + XToolkit.remove(hidingTask); + XToolkit.remove(showingTask); + if (isVisible()) { + currentIcon = 0; + } else { + currentIcon = 3; + } + if (doSchedule) { + XToolkit.schedule(showingTask, 1); + } else { + showingTask.run(); + } + } else { + XToolkit.remove(showingTask); + XToolkit.remove(hidingTask); + if (!isVisible()) { + return; + } + if (doSchedule) { + XToolkit.schedule(hidingTask, hidingDelay); + } else { + hidingTask.run(); + } + } + } } diff --git a/jdk/src/solaris/classes/sun/awt/X11/XWindow.java b/jdk/src/solaris/classes/sun/awt/X11/XWindow.java index 5601273d879..63c71c5a7c4 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XWindow.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XWindow.java @@ -68,6 +68,15 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { int oldWidth = -1; int oldHeight = -1; + protected PropMwmHints mwm_hints; + protected static XAtom wm_protocols; + protected static XAtom wm_delete_window; + protected static XAtom wm_take_focus; + + private boolean stateChanged; // Indicates whether the value on savedState is valid + private int savedState; // Holds last known state of the top-level window + + XWindowAttributesData winAttr; protected X11GraphicsConfig graphicsConfig; protected AwtGraphicsConfigData graphicsConfigData; @@ -218,6 +227,20 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { } params.putIfNull(BACKING_STORE, XToolkit.getBackingStoreType()); + + XToolkit.awtLock(); + try { + if (wm_protocols == null) { + wm_protocols = XAtom.get("WM_PROTOCOLS"); + wm_delete_window = XAtom.get("WM_DELETE_WINDOW"); + wm_take_focus = XAtom.get("WM_TAKE_FOCUS"); + } + } + finally { + XToolkit.awtUnlock(); + } + winAttr = new XWindowAttributesData(); + savedState = XUtilConstants.WithdrawnState; } void postInit(XCreateWindowParams params) { @@ -832,12 +855,42 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { public native boolean x11inputMethodLookupString(long event, long [] keysymArray); native boolean haveCurrentX11InputMethodInstance(); + private boolean mouseAboveMe; + + public boolean isMouseAbove() { + synchronized (getStateLock()) { + return mouseAboveMe; + } + } + protected void setMouseAbove(boolean above) { + synchronized (getStateLock()) { + mouseAboveMe = above; + } + } + + protected void enterNotify(long window) { + if (window == getWindow()) { + setMouseAbove(true); + } + } + protected void leaveNotify(long window) { + if (window == getWindow()) { + setMouseAbove(false); + } + } + public void handleXCrossingEvent(XEvent xev) { super.handleXCrossingEvent(xev); XCrossingEvent xce = xev.get_xcrossing(); if (eventLog.isLoggable(Level.FINEST)) eventLog.finest(xce.toString()); + if (xce.get_type() == XConstants.EnterNotify) { + enterNotify(xce.get_window()); + } else { // LeaveNotify: + leaveNotify(xce.get_window()); + } + // Skip event If it was caused by a grab // This is needed because on displays with focus-follows-mouse on MousePress X system generates // two XCrossing events with mode != NormalNotify. First of them notifies that the mouse has left @@ -1133,6 +1186,55 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { } + /* + * XmNiconic and Map/UnmapNotify (that XmNiconic relies on) are + * unreliable, since mapping changes can happen for a virtual desktop + * switch or MacOS style shading that became quite popular under X as + * well. Yes, it probably should not be this way, as it violates + * ICCCM, but reality is that quite a lot of window managers abuse + * mapping state. + */ + int getWMState() { + if (stateChanged) { + stateChanged = false; + WindowPropertyGetter getter = + new WindowPropertyGetter(window, XWM.XA_WM_STATE, 0, 1, false, + XWM.XA_WM_STATE); + try { + int status = getter.execute(); + if (status != XConstants.Success || getter.getData() == 0) { + return savedState = XUtilConstants.WithdrawnState; + } + + if (getter.getActualType() != XWM.XA_WM_STATE.getAtom() && getter.getActualFormat() != 32) { + return savedState = XUtilConstants.WithdrawnState; + } + savedState = (int)Native.getCard32(getter.getData()); + } finally { + getter.dispose(); + } + } + return savedState; + } + + /** + * Override this methods to get notifications when top-level window state changes. The state is + * meant in terms of ICCCM: WithdrawnState, IconicState, NormalState + */ + protected void stateChanged(long time, int oldState, int newState) { + } + + @Override + public void handlePropertyNotify(XEvent xev) { + super.handlePropertyNotify(xev); + XPropertyEvent ev = xev.get_xproperty(); + if (ev.get_atom() == XWM.XA_WM_STATE.getAtom()) { + // State has changed, invalidate saved value + stateChanged = true; + stateChanged(ev.get_time(), savedState, getWMState()); + } + } + public void reshape(Rectangle bounds) { reshape(bounds.x, bounds.y, bounds.width, bounds.height); } @@ -1293,4 +1395,40 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { static native int getAWTKeyCodeForKeySym(int keysym); static native int getKeySymForAWTKeyCode(int keycode); + + /* These two methods are actually applicable to toplevel windows only. + * However, the functionality is required by both the XWindowPeer and + * XWarningWindow, both of which have the XWindow as a common ancestor. + * See XWM.setMotifDecor() for details. + */ + public PropMwmHints getMWMHints() { + if (mwm_hints == null) { + mwm_hints = new PropMwmHints(); + if (!XWM.XA_MWM_HINTS.getAtomData(getWindow(), mwm_hints.pData, MWMConstants.PROP_MWM_HINTS_ELEMENTS)) { + mwm_hints.zero(); + } + } + return mwm_hints; + } + + public void setMWMHints(PropMwmHints hints) { + mwm_hints = hints; + if (hints != null) { + XWM.XA_MWM_HINTS.setAtomData(getWindow(), mwm_hints.pData, MWMConstants.PROP_MWM_HINTS_ELEMENTS); + } + } + + protected final void initWMProtocols() { + wm_protocols.setAtomListProperty(this, getWMProtocols()); + } + + /** + * Returns list of protocols which should be installed on this window. + * Descendants can override this method to add class-specific protocols + */ + protected XAtomList getWMProtocols() { + // No protocols on simple window + return new XAtomList(); + } + } diff --git a/jdk/src/solaris/classes/sun/awt/X11/XWindowPeer.java b/jdk/src/solaris/classes/sun/awt/X11/XWindowPeer.java index 4f9fa56fd8f..41807dbf047 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XWindowPeer.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XWindowPeer.java @@ -67,16 +67,11 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, // should be synchronized on awtLock private static Set windows = new HashSet(); - static XAtom wm_protocols; - static XAtom wm_delete_window; - static XAtom wm_take_focus; - XWindowAttributesData winAttr; private boolean cachedFocusableWindow; XWarningWindow warningWindow; private boolean alwaysOnTop; - PropMwmHints mwm_hints; private boolean locationByPlatform; Dialog modalBlocker; @@ -93,8 +88,6 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, private boolean grab = false; // Whether to do a grab during showing private boolean isMapped = false; // Is this window mapped or not - private boolean stateChanged; // Indicates whether the value on savedState is valid - private int savedState; // Holds last known state of the top-level window private boolean mustControlStackPosition = false; // Am override-redirect not on top private XEventDispatcher rootPropertyEventDispatcher = null; @@ -141,25 +134,18 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, super.preInit(params); params.putIfNull(BIT_GRAVITY, Integer.valueOf(XConstants.NorthWestGravity)); - savedState = XUtilConstants.WithdrawnState; + long eventMask = 0; + if (params.containsKey(EVENT_MASK)) { + eventMask = ((Long)params.get(EVENT_MASK)); + } + eventMask |= XConstants.VisibilityChangeMask; + params.put(EVENT_MASK, eventMask); + XA_NET_WM_STATE = XAtom.get("_NET_WM_STATE"); - winAttr = new XWindowAttributesData(); params.put(OVERRIDE_REDIRECT, Boolean.valueOf(isOverrideRedirect())); - SunToolkit.awtLock(); - try { - windows.add(this); - if (wm_protocols == null) { - wm_protocols = XAtom.get("WM_PROTOCOLS"); - wm_delete_window = XAtom.get("WM_DELETE_WINDOW"); - wm_take_focus = XAtom.get("WM_TAKE_FOCUS"); - } - } - finally { - SunToolkit.awtUnlock(); - } cachedFocusableWindow = isFocusableWindow(); Font f = target.getFont(); @@ -192,20 +178,6 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, params.put(BOUNDS, constrainBounds(bounds.x, bounds.y, bounds.width, bounds.height)); } - private void initWMProtocols() { - wm_protocols.setAtomListProperty(this, getWMProtocols()); - } - - /** - * Returns list of protocols which should be installed on this window. - * Descendants can override this method to add class-specific protocols - */ - protected XAtomList getWMProtocols() { - // No protocols on simple window - return new XAtomList(); - } - - protected String getWMName() { String name = target.getName(); if (name == null || name.trim().equals("")) { @@ -259,7 +231,7 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, // accessSystemTray permission allows to display TrayIcon, TrayIcon tooltip // and TrayIcon balloon windows without a warning window. if (!WindowAccessor.isTrayIconWindow((Window)target)) { - warningWindow = new XWarningWindow((Window)target, getWindow()); + warningWindow = new XWarningWindow((Window)target, getWindow(), this); } } @@ -539,10 +511,15 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, } - if (!bounds.getSize().equals(oldBounds.getSize())) { + boolean isResized = !bounds.getSize().equals(oldBounds.getSize()); + boolean isMoved = !bounds.getLocation().equals(oldBounds.getLocation()); + if (isMoved || isResized) { + repositionSecurityWarning(); + } + if (isResized) { postEventToEventQueue(new ComponentEvent(getEventSource(), ComponentEvent.COMPONENT_RESIZED)); } - if (!bounds.getLocation().equals(oldBounds.getLocation())) { + if (isMoved) { postEventToEventQueue(new ComponentEvent(getEventSource(), ComponentEvent.COMPONENT_MOVED)); } } finally { @@ -565,7 +542,7 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, } public Insets getInsets() { - return new Insets(getWarningWindowHeight(), 0, 0, 0); + return new Insets(0, 0, 0, 0); } // NOTE: This method may be called by privileged threads. @@ -780,6 +757,7 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, * Overridden to check if we need to update our GraphicsDevice/Config * Added for 4934052. */ + @Override public void handleConfigureNotifyEvent(XEvent xev) { // TODO: We create an XConfigureEvent every time we override // handleConfigureNotify() - too many! @@ -793,8 +771,7 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, // there could be a race condition in which a ComponentListener could // see the old screen. super.handleConfigureNotifyEvent(xev); - // for 5085647: no applet warning window visible - updateChildrenSizes(); + repositionSecurityWarning(); } final void requestXFocus(long time) { @@ -1072,6 +1049,9 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, } updateFocusability(); promoteDefaultPosition(); + if (!vis && warningWindow != null) { + warningWindow.setSecurityWarningVisible(false, false); + } super.setVisible(vis); if (!vis && !isWithdrawn()) { // ICCCM, 4.1.4. Changing Window State: @@ -1101,6 +1081,7 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, if (isOverrideRedirect() && vis) { updateChildrenSizes(); } + repositionSecurityWarning(); } protected void suppressWmTakeFocus(boolean doSuppress) { @@ -1118,23 +1099,66 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, return 0; } - // The height of area used to display Applet's warning about securit - int getWarningWindowHeight() { - if (warningWindow != null) { - return warningWindow.getHeight(); - } else { - return 0; - } - } - // Called when shell changes its size and requires children windows // to update their sizes appropriately void updateChildrenSizes() { + } + + public void repositionSecurityWarning() { + // NOTE: On KWin if the window/border snapping option is enabled, + // the Java window may be swinging while it's being moved. + // This doesn't make the application unusable though looks quite ugly. + // Probobly we need to find some hint to assign to our Security + // Warning window in order to exclude it from the snapping option. + // We are not currently aware of existance of such a property. if (warningWindow != null) { - warningWindow.reshape(0, getMenuBarHeight(), getSize().width, warningWindow.getHeight()); + // We can't use the coordinates stored in the XBaseWindow since + // they are zeros for decorated frames. + int x = ComponentAccessor.getX(target); + int y = ComponentAccessor.getY(target); + int width = ComponentAccessor.getWidth(target); + int height = ComponentAccessor.getHeight(target); + warningWindow.reposition(x, y, width, height); } } + @Override + protected void setMouseAbove(boolean above) { + super.setMouseAbove(above); + updateSecurityWarningVisibility(); + } + + public void updateSecurityWarningVisibility() { + if (warningWindow == null) { + return; + } + + boolean show = false; + + int state = getWMState(); + + if (!isVisible()) { + return; // The warning window should already be hidden. + } + + // getWMState() always returns 0 (Withdrawn) for simple windows. Hence + // we ignore the state for such windows. + if (isVisible() && (state == XUtilConstants.NormalState || isSimpleWindow())) { + if (XKeyboardFocusManagerPeer.getCurrentNativeFocusedWindow() == + getTarget()) + { + show = true; + } + + if (isMouseAbove() || warningWindow.isMouseAbove()) + { + show = true; + } + } + + warningWindow.setSecurityWarningVisible(show); + } + boolean isOverrideRedirect() { return (XWM.getWMID() == XWM.OPENLOOK_WM ? true : false) || ((XToolkit)Toolkit.getDefaultToolkit()).isOverrideRedirect((Window)target) || @@ -1184,16 +1208,7 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, // if (ve.get_state() == XlibWrapper.VisibilityUnobscured) { // // raiseInputMethodWindow // } - } - - public void handlePropertyNotify(XEvent xev) { - super.handlePropertyNotify(xev); - XPropertyEvent ev = xev.get_xproperty(); - if (ev.get_atom() == XWM.XA_WM_STATE.getAtom()) { - // State has changed, invalidate saved value - stateChanged = true; - stateChanged(ev.get_time(), savedState, getWMState()); - } + repositionSecurityWarning(); } void handleRootPropertyNotify(XEvent xev) { @@ -1294,6 +1309,7 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, * Override this methods to get notifications when top-level window state changes. The state is * meant in terms of ICCCM: WithdrawnState, IconicState, NormalState */ + @Override protected void stateChanged(long time, int oldState, int newState) { // Fix for 6401700, 6412803 // If this window is modal blocked, it is put into the transient_for @@ -1307,38 +1323,8 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, for (ToplevelStateListener topLevelListenerTmp : toplevelStateListeners) { topLevelListenerTmp.stateChangedICCCM(oldState, newState); } - } - - /* - * XmNiconic and Map/UnmapNotify (that XmNiconic relies on) are - * unreliable, since mapping changes can happen for a virtual desktop - * switch or MacOS style shading that became quite popular under X as - * well. Yes, it probably should not be this way, as it violates - * ICCCM, but reality is that quite a lot of window managers abuse - * mapping state. - */ - int getWMState() { - if (stateChanged) { - stateChanged = false; - WindowPropertyGetter getter = - new WindowPropertyGetter(window, XWM.XA_WM_STATE, 0, 1, false, - XWM.XA_WM_STATE); - try { - int status = getter.execute(); - if (status != XConstants.Success || getter.getData() == 0) { - return savedState = XUtilConstants.WithdrawnState; - } - - if (getter.getActualType() != XWM.XA_WM_STATE.getAtom() && getter.getActualFormat() != 32) { - return savedState = XUtilConstants.WithdrawnState; - } - savedState = (int)Native.getCard32(getter.getData()); - } finally { - getter.dispose(); - } - } - return savedState; + updateSecurityWarningVisibility(); } boolean isWithdrawn() { diff --git a/jdk/src/solaris/classes/sun/awt/X11/XlibWrapper.java b/jdk/src/solaris/classes/sun/awt/X11/XlibWrapper.java index e20dfe731dc..e6a00a2f001 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XlibWrapper.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XlibWrapper.java @@ -156,6 +156,8 @@ Window w; static native void XLowerWindow(long display, long window); static native void XRestackWindows(long display, long windows, int length); + static native void XConfigureWindow(long display, long window, + long value_mask, long values); static native void XSetInputFocus(long display, long window); static native void XSetInputFocus2(long display, long window, long time); static native long XGetInputFocus(long display); @@ -533,6 +535,12 @@ static native String XSetLocaleModifiers(String modifier_list); static native void SetRectangularShape(long display, long window, int lox, int loy, int hix, int hiy, sun.java2d.pipe.Region region); + /** Each int in the bitmap array is one pixel with a 32-bit color: + * R, G, B, and Alpha. + */ + static native void SetBitmapShape(long display, long window, + int width, int height, int[] bitmap); + static native void SetZOrder(long display, long window, long above); /* Global memory area used for X lib parameter passing */ diff --git a/jdk/src/solaris/classes/sun/awt/X11/security-icon-bw16.png b/jdk/src/solaris/classes/sun/awt/X11/security-icon-bw16.png new file mode 100644 index 0000000000000000000000000000000000000000..98dcd0f4e77d099c6d344ed0a3cdb7287e838c14 GIT binary patch literal 463 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8nE^f_u7!n#FJ8R3dGqFzCr{qKeS7E5o$J@HKX~xq)TvVq z4Gs71-8*#X(9xquYinx{95^t2`t2A>(;FkCr*@=m0h`VW!9`&6DCaX^73+Ua4h*ckZ08ukYr~n>92v)Ya9ktgNO?nezYt|1E1~I{_VOToU9L4CIms7z*d@?E`A> z^>lFzskjw#B3$f{0gp?da>s_t)$hOX-TVJ&!(@Ru-wiMAZ0TS6^2>yeJErX7=J;e2 zuyA$h-ghDeTTaIo{}Y&X^>x6^hdj0p+n8U}Pmt(1Z@XxskAU){-zsWyik}!BREa%y zWj65rvg2f`kj^gAjr}oMoFA@ldSf9ofAX>z&8fVaZ_13X-(r23BKV)nfT2fNdXl2v SCl#Q>7(8A5T-G@yGywpg#P84m literal 0 HcmV?d00001 diff --git a/jdk/src/solaris/classes/sun/awt/X11/security-icon-bw24.png b/jdk/src/solaris/classes/sun/awt/X11/security-icon-bw24.png new file mode 100644 index 0000000000000000000000000000000000000000..5e5acae2e43758d7e27c5fd1238d53478f375ab1 GIT binary patch literal 682 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaANtU=qlmzFem6RtIr7}3CxT{vbApFVy1_U+pi78VN^E}TAn zdTD9t)vH(Q>gp;hD~}vGGIQq4*4EZ}^XAQ+JGZ>N{KSb96DCaP=;#m>6l`c{c<|ss zZ*Ol=QIU#@ijtC2adEM(u5NdC_tdFV7c5wC{`~ps>gw6EXIolYPMS1HQc}{|+FC+F zV#9_FOP4Mc6%}2*dUb7W?f(7y_w3oj&d#2fm$!cX`kgy>&YCrA^5n^9&YWRlV%ocR z?}`;G*x1<4o;|yD>sD@V?h6+#{Qv*|)bi?=K<@{Z1o;I6xl{!V8E;k`1RDOq)5S5Q z;#SVd=TV0hB-#?Us4ZX>GT!z5UiGeBTS{ktwwLl;;Ct)Cp9j@D^B(*-`nZw*!}AN9 z+JZDRyd2qF_g=ivEi~iKX0^l9KIO)P-@V>Lo6?`TJ!_Zgw;G49ARbRn{Eo z&jU^d{krthCV1A`IgY`hSI__abHLA-qqfPgZq3yj-JbRgS2bQgE`K>M<7)e!g}Z8X z_ar~@PjFiQU1I+;!BRQiM98svOeRJFH>=Nc(E44jW>SYMl2y;yqD`+rz9^b&ou?1KW@BUHqeqXPI(6#KojZJd ze3K_ne(>Odwzl^4>C=mfifn9bYHMrj>guemtrsp_c;du~)KpPXIeGHrj2SbQFJIo#(Q)k9v7Vlul9H0r(o%78@wT=$cX#*V;$k^D zxkry4UAlBhP*8B*ym<>2EU2ic@b&fW?(UvCb?VZkOD9a2ke{F5*Vi{`(j+!Ew#v%N z#fukrb#(~|3C*58n~RI9y1M$@xpQaEoS8Li*8KVNo0^(hT3VQxm_kBA{{R2~z^E__ z7S~e=8$DFzg*YT^vIyZq;169@gw2;t*(}#$w8LFhJx|_4~cw?{WYC zuX>JQp~`{EnbnEW;FXAV?34P zbMRyIn+ikvN*)EYLQEIgJFvEXInb?XH$4_y%0pwacO;lM$u#+k>T7X58J@NlMN z!$xTlkLAoCWbB(WdG5V1m#VEew#c8qQ0s z$UODhF|>-|Snl>YCW4`|J1mw?`}{LVPCu%k?LEUZm6Jl;Yz2?lU(I@3 z=DYcrqQ-W+D-n}YOtV+>IQ%`jXjj9BAFEw0`dv8RoHgm`P-04&`9c2x!~b{3{8v6* RDgcZz22WQ%mvv4FO#pE}tHJ;P literal 0 HcmV?d00001 diff --git a/jdk/src/solaris/classes/sun/awt/X11/security-icon-bw48.png b/jdk/src/solaris/classes/sun/awt/X11/security-icon-bw48.png new file mode 100644 index 0000000000000000000000000000000000000000..9615364226a9744814bd2ce673adba31ccb72c07 GIT binary patch literal 1137 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+7^?z&LR_z3zkcJ!jeGa*-Mo48_U+pR1qBZuK79ZF{hd2^ z9z1yP=FOXrA3wf*`}XeLyPrONx_0f_qeqW!-MaPS#fw+3UOj#K^!fAWPo6xvfB(L$ ztn9I4$Mp2{EG;cHH8qWmjoH}P=FOWYARut|?AZki7BDh0mX(#2mzSSBc~VkRvbwr@ z;lhOzCQLYb^r(=K(5X|WL`6j{EG!fi70;hPUsP0d`0!y>RaGu7u0w|oB_<~F^YfoL zae{+`gNKJ_`t<1~B_&IjE}b!B#;jShX3m^BXU?38iV7wsrYl#jFf%isK7IPgks}8W z9%Nx*adUG^O--FRaiW2NK}<}HtE=nd$B&O6KW=Sp?c?L)@9#ft+O+xe=lAyZ3JVL@ z*Vot8)$QNEKQAw@wzjspxp~s0Npt7UojiGRXJ=g((G^z<|~Hnz01%$_~Fva%8w1*N5>?d|QCE?sJEZOzTi?e6Zbs;X*eXlQC` zDl9Dg|Nnm~bHx&%y1J4ezhEGD-~huJyJtlV3{1?PE{-7;x29aVUUkbspy47b_jZ?e zor^WtlDiCBEF72=-|hW=uloJoPw(W`hB;m0$}C-1*7h_1k7U5P5N?D2EHm?F`=zJ( z&7Q*&dcbjmi3+Q;_nF4^5}!A+?b{)9q_*dvpXA2FVqe-`cNXXe7sRgLmBzVib6)7S z*@`a;v%lP6kKJr@eto~ZZ14KR$=gnwWwaaHUFI^nwEC`Igou|Tv)bMk*Vzwzc4__X zd-!~2=?3kBN%9hPT)U?oG_!l8_P@dN=iXdVpChX_w%$*0tUIoz)08nW=b!Wpb>}Sw z1qMEO^JX0smTcqaVmqy;^n;saYUa*>f{8(Xdi71-sa~-n9P=hF`Yit<=@pW8j>yr6TRmz;Khs#UUoenM7GSVilj;C8q~FuUF{I*F$cd|BhZO`|1G7Bt++F(a)c^WO#U+_Va_`RE zYUol~S>Ir>Ds`o>2G3#%XW1830sRNonk_%|w^_Jq_jYkB<}EFE=Cy3G&q(Rvm+yJH ztX;^dqIRPutBRyk#@_VFsG$$UVr#1>0G-C*>FVdQ&MBb@0PKeM-2eap literal 0 HcmV?d00001 diff --git a/jdk/src/solaris/classes/sun/awt/X11/security-icon-interim24.png b/jdk/src/solaris/classes/sun/awt/X11/security-icon-interim24.png new file mode 100644 index 0000000000000000000000000000000000000000..753a2adab88e4719cf3dbd4d1e2b65ba5df5c64c GIT binary patch literal 741 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaANtU=qlmzFem6RtIr7}3Cl#|vKH>3wy(8i?fM#Qw=WBr z)NH?HvH#tR69okYmrQYAIMMCK$&y1GLT7e4?OhYRa;Ddn%(0pDJl8k z$uiOtuI}|?MQi4G-#A%$;$Y#<6@i-; z`W;*!vVU#Jor|^8+8x)=^Vz<+P)t<7-dgq0p2|bp8_plAC@XNjcctO%vARu5lXtAm zOvRIP2Ihr^zprJHa51a7n{!*NVGlN zaxIK?$%A`b@AiJrn=5;3SJc$c_PorUO|zc6?=!#7tFkpA;4|Z^oHQd}r7f3UigB{| zD?JqCm{8NI`hMX&^TVIMS{E3dxjij$&h`g&u%-gS-JV@BImDm zzqD<1!#LI*FP?okb(cy)I-}w>J{i-d4W{f9tY+RAb z#l>~wWaZ=*`-AI4`S~~|G}`T78*=aRbUr@5oy!Az>um#lEw?WVxN)+CiHWJU)NAjW z;5(P=_N)q8Im2^Cr<1t2cy*E6{>@n%7x->ilDK)1->#KGx6W7JyWS)yD5$BadG~z( z$LDJfZ3taG%d05gPen!L=IQb!Q$6lonzC%Vr>DE2oSfX0Hixxyybr7kIlL?P*6EhM z2HUMm{AYDLFPa_|8DceKYAhQY+q{0)DZQDu&vh=C=w@SMV{2`=W?BCFc|NyJ*WWx< z_y7O@hEo?}fq|Y=666;QNSl*>~&9;~LB9O8#>a5@r^9Q^_K`XyVGx#^@cl`BI znZ(avQ*Ssg;WyWs(@#zRR-)yV`o&rdKH)p^Uhvc(Vi%L}DCRjxr(vNThupD)(W7U?G03(D*T zMV3~csg!)uoPFA|Pxh+m{4byjEFqnsjhqJS@VTNyIWo2VyV`5^0Kp>z{sD*`v zy}kXGEn94DZ7nS=muK(3Xgg_VXQvvuA`@kf4>Hv6OJ$-A#aQ~lin-W<8ab}i^1O|lwASF|Z<7`jl^-TbwaOYvUxK)oE+1sf zNjOu(DN0e&`ue&R@ZPHNRhU2`kd5>ICqVve*CiwGjyNAIg&{2;jkvuNyPd5%NVq5q z935+-Uyune%7lw#r*(n;-5w9*b)9ZCM(O(03ldAuMBISyVe}V zg+_l(3i;fKL;BNy;^Cd4Yim$v!==DsE890kei2_{iPpu-z!r#$7Rq271pMtq5cn4i zBi|sHMt#FF<_;<&fN12)Me~fGIqh>00s|!7^lNV%)a6CckB9wS0_&8v_RBzCxhRBN}!?LP8WcfDrYmn^YqlOe9%I- z!`_|n9(L;YkW-sc(_RStRUmm>cI;qZe^=z{wy>zUYXL({6YzQWEOj!{ab>M5_e@-D z$Q!-jDrG2f*AwZ;g8-}0fjaTB1FX9hc4NCkfgN`3j5k-};0Ifc9D2rJyLUfB2Ehut zeA+HmQ`&^T)N!{NAp2Lj4Pyrm^kH5>WIJ?--PEa0Cs3_xd55b@N7FFbvh&9vw|1NN znQ^@pv&zgP=aY8&U?sr=e3QbFEB3o7<_-;igLoqB z_my45jXj4OUp~tI6gv(+{EhzbTOw~}1Z*>3!hL7g%Gez_+ePX-^H~%A1^yg>a0#`E TcSGkJQ3v3B2|lgfVXS`v6_*LB literal 0 HcmV?d00001 diff --git a/jdk/src/solaris/classes/sun/awt/X11/security-icon-yellow16.png b/jdk/src/solaris/classes/sun/awt/X11/security-icon-yellow16.png new file mode 100644 index 0000000000000000000000000000000000000000..8dd91a92898a29c3b584f6474cf798a11980bc27 GIT binary patch literal 477 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8r2#%6u5+3g{(p7(|J&#Pd)xo7%>O?%`2SG*|6TR}ca8qv zR(pF*=kQ{N%NrT~KMsF;N^Z+^hJEuH-d>43zmDPUd8O6;3_E8t{D0&f%b#+r?&G*-J13ma7Lu7heOkJEUU2OPdqy?m;q`VwO{{R24midYu=wS1bAirQB zmkhul5IMISXhgTCi(^Q|t&kH}#SSY7xCUl<+_@WE{`9~7T7gS!=MK+}lnw~I-penr zy!>t)UnLRJ~bL)1i=1u?r literal 0 HcmV?d00001 diff --git a/jdk/src/solaris/classes/sun/awt/X11/security-icon-yellow24.png b/jdk/src/solaris/classes/sun/awt/X11/security-icon-yellow24.png new file mode 100644 index 0000000000000000000000000000000000000000..0a3205ff67c358e1f2e1d7475af9334a886710d1 GIT binary patch literal 749 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaANtU=qlmzFem6RtIr7}3C$ngKG%m0t||9^V^e`)srnbH5ZR{tOC{ePhK z|DO8)JF5ThsQ&JHgpJn`i67m0O!v6;j{~vn1KBshgHN(!?4C^N|teL=Y zaXrJaWekFXg6GyUT;0rYcrk;LlG5wTnvRy-uTQHi?`C*?*6`#?hS%rqUf(p>Gml~O zRED|D4D(wVu5V?yv5mpf((?bKfXf>hR`xRNU&!$KYV!Y=m9H;H9@(t$`m~&`uI{!O z3`;s0{=X=Yl$2c9&Y+^A(oi5OF3QEk#B~3%`R(JT4-cu_Kdy0Viz7ET_loJRw~q#& z-yO7iuHK{bM$_7@PHeDXXJ(!9Xr80Yh=_6K9}Z-#uL%Ln?0NoP1u@ zWFXP@Fhh1NQ&55ao$B{{)3-0)J@vCaH*;sxr04GY%&+shEUk(A%6RHb=xR$PmaMG| zoL*n^w#O+o9B2ESad7|6cG*8t1smQRo|P(lUBF)?y!BANq2PWd{qy$QqqygNk8?6O zR#@Nk;ZWhm2dp6(v;MvOy6@r26^fz@HC~;4-mEX`x$;0}>)C11FC*r1ZJ8~$@;m=e zliTSY_fPg7ezDB|!KVACTH9aTij}yNcI6K@zj;&9iH=|M9|>xm7BF2P$KI@NvskEP zlG>GbrC&PJH!&|!k$tIuXofnUo7&)*UIkK36nZeqtylq-`syHwR O7(8A5T-G@yGywn=bB$5} literal 0 HcmV?d00001 diff --git a/jdk/src/solaris/classes/sun/awt/X11/security-icon-yellow32.png b/jdk/src/solaris/classes/sun/awt/X11/security-icon-yellow32.png new file mode 100644 index 0000000000000000000000000000000000000000..6e178672b1fe8dad627f677ce8b656ca32dc7af0 GIT binary patch literal 866 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+7##zALR@DzGW`GH`Tvja|G)nKzq78TQR*SU;KJ z%^97!{qCBYn#Y$j?4HZ8e~s$J4GeECILvQlcyl#r`%H$jYZ;iBnBH9Uy1td+&6U{2 z9Soah$-cQ~zH>Ii@@@t>Ik^kll#VWCu(7dub4p1_Na)Q?!-P=z|1T>~uV&b`%KF+C zh64*37Pc{Lna*%y8^htn44b9`P1Y6{7r(NZ;mujIgDd2HJ!RjVl3O@S_y5Z(E-o$= z6_t*1xg(nu-dqZ1V`B^RQ>`e{e{)go{5l4E8+8FbWb>R>b$nnU`0#*&WtA4wROd~CRcaivClz>vTK{qzFf>2=%wI3o1d2ii MPgg&ebxsLQ0Oi)ZdjJ3c literal 0 HcmV?d00001 diff --git a/jdk/src/solaris/classes/sun/awt/X11/security-icon-yellow48.png b/jdk/src/solaris/classes/sun/awt/X11/security-icon-yellow48.png new file mode 100644 index 0000000000000000000000000000000000000000..fcbfd7ff567b6da2225d65603b63d5413fcc9001 GIT binary patch literal 1323 zcmdT?{WBDJ9R66^*0!5>-Ckp^l~rqHY45bGmlkcyO034^dPA1FUW9e2T#D#TL!HK@ zh)^hMlT1mML#0CAQWDl~`Id@^nsWEKy}7^Qo|)(K%=63VGtV=h!+` z`p9+a_%CVtx*67ISgjM5a@lHSa7>hPXLy_f#E~%(ig~`|cTdo~RAQK`+#AYL{&{#E(JQj%EO^OadLz&Ix-=Mn+MxWR}ya<6(qbJv3tkt^Z66ovelYSpQ zpC1~;6}j?t#a_(Rt>uxf7}Dunc^rBhgGgJ@r7RFQEx309BG=pQ-C=w8JoMcCq5U$D zR=@gl5F2UUse=3i@JAt#j*U47tZ$r#;jSg*`O^Gs*V|{oUpjYlgh$~)*dFa&ngM0U zpsf-zlUWoBrT8#dn$h;fS{fJ_kj|e+HSVO_g|x40t$-uDY{-Mf-XbPx=6QH{T+4yx zGH5J;GbvDV1R9ET*B!|tkFKjwlMA(Hpdbw{9MyH0M4q~zO@omkH$+&;?Zq2<-dB>N=Px3@A+zEkcl0G%%?X&N~oKK6SxUXb_`ZaG<)%t5| z!Mlp$V|?1WvE%j!;%2PqKVq97WZgJwo+%Xfg^(|`G`t+PTa~j&1!{TjPS-ptiIe$wYmD#4s9Vn0_EfLOg z{*)h)wqa@E=l2RWT`KOta9VYEVjwI10ln%1-ZuLU4Vei7% zU-WNkx7-*IXAN>?f6bDg6o^H_wUb#*$cF|N=@$}+@ z<0c&8?ekAMdwLo&?!{ekPYy0ol@=6~2GzC3$m+ET)voHZl^b9AI!RsX3Z2Ic8IBX1 z>9f< #include +#include "utility/rect.h" #if defined(DEBUG) || defined(INTERNAL_BUILD) static jmethodID lockIsHeldMID = NULL; @@ -303,6 +304,20 @@ JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XRestackWindows } +/* + * Class: XlibWrapper + * Method: XConfigureWindow + * Signature: (JJJJ)V + */ +JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XConfigureWindow +(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong value_mask, + jlong values) +{ + AWT_CHECK_HAVE_LOCK(); + XConfigureWindow((Display*)jlong_to_ptr(display), (Window)window, + (unsigned int)value_mask, (XWindowChanges*)jlong_to_ptr(values)); +} + /* * Class: XlibWrapper * Method: XSetInputFocus @@ -1973,3 +1988,49 @@ Java_sun_awt_X11_XlibWrapper_SetZOrder (Window)jlong_to_ptr(window), value_mask, &wc ); } + +/* + * Class: XlibWrapper + * Method: SetBitmapShape + */ +JNIEXPORT void JNICALL +Java_sun_awt_X11_XlibWrapper_SetBitmapShape +(JNIEnv *env, jclass clazz, jlong display, jlong window, + jint width, jint height, jintArray bitmap) +{ + jsize len; + jint *values; + jboolean isCopy = JNI_FALSE; + size_t worstBufferSize = (size_t)((width / 2 + 1) * height); + RECT_T * pRect; + + AWT_CHECK_HAVE_LOCK(); + + len = (*env)->GetArrayLength(env, bitmap); + if (len == 0 || len < width * height) { + return; + } + + values = (*env)->GetIntArrayElements(env, bitmap, &isCopy); + if (JNU_IsNull(env, values)) { + return; + } + + pRect = (RECT_T *)malloc(worstBufferSize * sizeof(RECT_T)); + + /* Note: the values[0] and values[1] are supposed to contain the width + * and height (see XIconInfo.getIntData() for details). So, we do +2. + */ + int numrects = BitmapToYXBandedRectangles(32, (int)width, (int)height, + (unsigned char *)(values + 2), pRect); + + XShapeCombineRectangles((Display *)jlong_to_ptr(display), (Window)jlong_to_ptr(window), + ShapeClip, 0, 0, pRect, numrects, ShapeSet, YXBanded); + XShapeCombineRectangles((Display *)jlong_to_ptr(display), (Window)jlong_to_ptr(window), + ShapeBounding, 0, 0, pRect, numrects, ShapeSet, YXBanded); + + free(pRect); + + (*env)->ReleaseIntArrayElements(env, bitmap, values, JNI_ABORT); +} + diff --git a/jdk/src/windows/classes/sun/awt/windows/WWindowPeer.java b/jdk/src/windows/classes/sun/awt/windows/WWindowPeer.java index b60cbd2f1ff..3c624020934 100644 --- a/jdk/src/windows/classes/sun/awt/windows/WWindowPeer.java +++ b/jdk/src/windows/classes/sun/awt/windows/WWindowPeer.java @@ -547,8 +547,10 @@ public class WWindowPeer extends WPanelPeer implements WindowPeer, private volatile int sysH = 0; Rectangle constrainBounds(int x, int y, int width, int height) { + GraphicsConfiguration gc = this.winGraphicsConfig; + // We don't restrict the setBounds() operation if the code is trusted. - if (!hasWarningWindow()) { + if (!hasWarningWindow() || gc == null) { return new Rectangle(x, y, width, height); } @@ -557,24 +559,24 @@ public class WWindowPeer extends WPanelPeer implements WindowPeer, int newW = width; int newH = height; - GraphicsConfiguration gc = ((Window)target).getGraphicsConfiguration(); Rectangle sB = gc.getBounds(); - Insets sIn = ((Window)target).getToolkit().getScreenInsets(gc); + Insets sIn = Toolkit.getDefaultToolkit().getScreenInsets(gc); int screenW = sB.width - sIn.left - sIn.right; int screenH = sB.height - sIn.top - sIn.bottom; // If it's undecorated or is not currently visible - if (!((Window)target).isVisible() || isTargetUndecorated()) { + if (!AWTAccessor.getComponentAccessor().isVisible_NoClientCode( + (Component)target) || isTargetUndecorated()) + { // Now check each point is within the visible part of the screen int screenX = sB.x + sIn.left; int screenY = sB.y + sIn.top; - // First make sure the size is withing the visible part of the screen + // First make sure the size is within the visible part of the screen if (newW > screenW) { newW = screenW; } - if (newH > screenH) { newH = screenH; } @@ -585,7 +587,6 @@ public class WWindowPeer extends WPanelPeer implements WindowPeer, } else if (newX + newW > screenX + screenW) { newX = screenX + screenW - newW; } - if (newY < screenY) { newY = screenY; } else if (newY + newH > screenY + screenH) { @@ -600,7 +601,6 @@ public class WWindowPeer extends WPanelPeer implements WindowPeer, if (newW > maxW) { newW = maxW; } - if (newH > maxH) { newH = maxH; } @@ -609,6 +609,8 @@ public class WWindowPeer extends WPanelPeer implements WindowPeer, return new Rectangle(newX, newY, newW, newH); } + public native void repositionSecurityWarning(); + @Override public void setBounds(int x, int y, int width, int height, int op) { Rectangle newBounds = constrainBounds(x, y, width, height); diff --git a/jdk/src/windows/native/sun/windows/ComCtl32Util.cpp b/jdk/src/windows/native/sun/windows/ComCtl32Util.cpp index ac69cf3af60..8ac9d764ab9 100644 --- a/jdk/src/windows/native/sun/windows/ComCtl32Util.cpp +++ b/jdk/src/windows/native/sun/windows/ComCtl32Util.cpp @@ -27,6 +27,7 @@ #include "ComCtl32Util.h" ComCtl32Util::ComCtl32Util() { + m_bToolTipControlInitialized = FALSE; } ComCtl32Util::~ComCtl32Util() { @@ -36,7 +37,8 @@ void ComCtl32Util::InitLibraries() { INITCOMMONCONTROLSEX iccex; memset(&iccex, 0, sizeof(INITCOMMONCONTROLSEX)); iccex.dwSize = sizeof(INITCOMMONCONTROLSEX); - ::InitCommonControlsEx(&iccex); + iccex.dwICC = ICC_TAB_CLASSES; + m_bToolTipControlInitialized = ::InitCommonControlsEx(&iccex); } WNDPROC ComCtl32Util::SubclassHWND(HWND hwnd, WNDPROC _WindowProc) { diff --git a/jdk/src/windows/native/sun/windows/ComCtl32Util.h b/jdk/src/windows/native/sun/windows/ComCtl32Util.h index e137b43d0df..64266770967 100644 --- a/jdk/src/windows/native/sun/windows/ComCtl32Util.h +++ b/jdk/src/windows/native/sun/windows/ComCtl32Util.h @@ -40,6 +40,10 @@ class ComCtl32Util void InitLibraries(); + INLINE BOOL IsToolTipControlInitialized() { + return m_bToolTipControlInitialized; + } + WNDPROC SubclassHWND(HWND hwnd, WNDPROC _WindowProc); // DefWindowProc is the same as returned from SubclassHWND void UnsubclassHWND(HWND hwnd, WNDPROC _WindowProc, WNDPROC _DefWindowProc); @@ -50,6 +54,8 @@ class ComCtl32Util ComCtl32Util(); ~ComCtl32Util(); + BOOL m_bToolTipControlInitialized; + // comctl32.dll version 6 window proc static LRESULT CALLBACK SharedWindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam, diff --git a/jdk/src/windows/native/sun/windows/DllUtil.cpp b/jdk/src/windows/native/sun/windows/DllUtil.cpp new file mode 100644 index 00000000000..0c7077144c0 --- /dev/null +++ b/jdk/src/windows/native/sun/windows/DllUtil.cpp @@ -0,0 +1,87 @@ +/* + * Copyright 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. 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. + */ + + +#include "DllUtil.h" + +// Disable warning about using this in the initializer list. +#pragma warning( disable : 4355) + +DllUtil::~DllUtil() +{ + if (module != NULL) { + ::FreeLibrary(module); + module = NULL; + } +} + +HMODULE DllUtil::GetModule() +{ + if (!module) { + module = ::LoadLibrary(name); + } + return module; +} + +FARPROC DllUtil::GetProcAddress(LPCSTR name) +{ + if (GetModule()) { + return ::GetProcAddress(GetModule(), name); + } + throw LibraryUnavailableException(); +} + +DwmAPI & DwmAPI::GetInstance() +{ + static DwmAPI dll; + return dll; +} + +DwmAPI::DwmAPI() : + DllUtil(_T("DWMAPI.DLL")), + DwmIsCompositionEnabledFunction((DllUtil*)this, "DwmIsCompositionEnabled"), + DwmGetWindowAttributeFunction((DllUtil*)this, "DwmGetWindowAttribute") +{ +} + +HRESULT DwmAPI::DwmIsCompositionEnabled(BOOL * pfEnabled) +{ + if (GetInstance().DwmIsCompositionEnabledFunction()) { + return GetInstance().DwmIsCompositionEnabledFunction()(pfEnabled); + } + throw FunctionUnavailableException(); +} + +HRESULT DwmAPI::DwmGetWindowAttribute(HWND hwnd, DWORD dwAttribute, + PVOID pvAttribute, DWORD cbAttribute) +{ + if (GetInstance().DwmGetWindowAttributeFunction()) { + return GetInstance().DwmGetWindowAttributeFunction()(hwnd, dwAttribute, + pvAttribute, cbAttribute); + } + throw FunctionUnavailableException(); +} + + diff --git a/jdk/src/windows/native/sun/windows/DllUtil.h b/jdk/src/windows/native/sun/windows/DllUtil.h new file mode 100644 index 00000000000..307d93d2b4f --- /dev/null +++ b/jdk/src/windows/native/sun/windows/DllUtil.h @@ -0,0 +1,97 @@ +/* + * Copyright 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. 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. + */ + +#ifndef DLLUTIL_H +#define DLLUTIL_H + +#include +#include + +/** + * Utility class to handle dynamically loadable libraries. + * + * NOTE: THIS CLASS IS NOT THREAD-SAFE! + */ +class DllUtil { + public: + class Exception {}; + class LibraryUnavailableException : public Exception {}; + class FunctionUnavailableException : public Exception {}; + + FARPROC GetProcAddress(LPCSTR name); + + protected: + DllUtil(const TCHAR * name) : name(name), module(NULL) {} + virtual ~DllUtil(); + + HMODULE GetModule(); + + template class Function { + public: + Function(DllUtil * dll, LPCSTR name) : + dll(dll), name(name), function(NULL) {} + + inline FunctionType operator () () { + if (!function) { + function = (FunctionType)dll->GetProcAddress(name); + } + return function; + } + + private: + DllUtil * const dll; + LPCSTR name; + + FunctionType function; + }; + + private: + const TCHAR * const name; + HMODULE module; +}; + +class DwmAPI : public DllUtil { + public: + // See DWMWINDOWATTRIBUTE enum in dwmapi.h + static const DWORD DWMWA_EXTENDED_FRAME_BOUNDS = 9; + + static HRESULT DwmIsCompositionEnabled(BOOL * pfEnabled); + static HRESULT DwmGetWindowAttribute(HWND hwnd, DWORD dwAttribute, + PVOID pvAttribute, DWORD cbAttribute); + + private: + static DwmAPI & GetInstance(); + DwmAPI(); + + typedef HRESULT (WINAPI *DwmIsCompositionEnabledType)(BOOL*); + Function DwmIsCompositionEnabledFunction; + + typedef HRESULT (WINAPI *DwmGetWindowAttributeType)(HWND hwnd, DWORD dwAttribute, + PVOID pvAttribute, DWORD cbAttribute); + Function DwmGetWindowAttributeFunction; +}; + +#endif // DLLUTIL_H + diff --git a/jdk/src/windows/native/sun/windows/awt.rc b/jdk/src/windows/native/sun/windows/awt.rc index aea8a5da0a9..2393b398cfc 100644 --- a/jdk/src/windows/native/sun/windows/awt.rc +++ b/jdk/src/windows/native/sun/windows/awt.rc @@ -35,6 +35,13 @@ HAND_CURSOR CURSOR DISCARDABLE "hand.cur" AWT_ICON ICON DISCARDABLE "awt.ico" CHECK_BITMAP BITMAP DISCARDABLE "check.bmp" +// Note: the number of icons used is specified in the +// securityWarningIconCounter constant in awt_Toolkit.cpp. +SECURITY_WARNING_0 ICON DISCARDABLE "security_warning_bw.ico" +SECURITY_WARNING_1 ICON DISCARDABLE "security_warning_int.ico" +SECURITY_WARNING_2 ICON DISCARDABLE "security_warning.ico" + + ///////////////////////////////////////////////////////////////////////////// // // Version diff --git a/jdk/src/windows/native/sun/windows/awt_Component.cpp b/jdk/src/windows/native/sun/windows/awt_Component.cpp index 97c7ad4605f..101095c585c 100644 --- a/jdk/src/windows/native/sun/windows/awt_Component.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Component.cpp @@ -260,8 +260,7 @@ AwtComponent::~AwtComponent() * the native one anymore. So we can safely destroy component's * handle. */ - AwtToolkit::DestroyComponentHWND(m_hwnd); - m_hwnd = NULL; + DestroyHWnd(); if (sm_getComponentCache == this) { sm_getComponentCache = NULL; @@ -575,6 +574,17 @@ AwtComponent::CreateHWnd(JNIEnv *env, LPCWSTR title, env->DeleteLocalRef(bkgrd); } +/* + * Destroy this window's HWND + */ +void AwtComponent::DestroyHWnd() { + if (m_hwnd != NULL) { + AwtToolkit::DestroyComponentHWND(m_hwnd); + //AwtToolkit::DestroyComponent(this); + m_hwnd = NULL; + } +} + /* * Returns hwnd for target on non Toolkit thread */ @@ -4470,7 +4480,7 @@ ret: void* AwtComponent::GetNativeFocusedWindow() { JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); AwtComponent *comp = - AwtComponent::GetComponent(AwtComponent::sm_focusedWindow); + AwtComponent::GetComponent(AwtComponent::GetFocusedWindow()); return (comp != NULL) ? comp->GetTargetAsGlobalRef(env) : NULL; } @@ -4571,7 +4581,7 @@ AwtComponent::SendKeyEventToFocusOwner(jint id, jlong when, * if focus owner is null, but focused window isn't * we will send key event to focused window */ - HWND hwndTarget = ((sm_focusOwner != NULL) ? sm_focusOwner : sm_focusedWindow); + HWND hwndTarget = ((sm_focusOwner != NULL) ? sm_focusOwner : AwtComponent::GetFocusedWindow()); if (hwndTarget == GetHWnd()) { SendKeyEvent(id, when, raw, cooked, modifiers, keyLocation, msg); @@ -5993,6 +6003,14 @@ void AwtComponent::PostUngrabEvent() { } } +void AwtComponent::SetFocusedWindow(HWND window) +{ + HWND old = sm_focusedWindow; + sm_focusedWindow = window; + + AwtWindow::FocusedWindowChanged(old, window); +} + /************************************************************************ * Component native methods */ diff --git a/jdk/src/windows/native/sun/windows/awt_Component.h b/jdk/src/windows/native/sun/windows/awt_Component.h index 3860c605018..9ebd0d412f6 100644 --- a/jdk/src/windows/native/sun/windows/awt_Component.h +++ b/jdk/src/windows/native/sun/windows/awt_Component.h @@ -137,12 +137,13 @@ public: virtual void RegisterClass(); virtual void UnregisterClass(); - void CreateHWnd(JNIEnv *env, LPCWSTR title, + virtual void CreateHWnd(JNIEnv *env, LPCWSTR title, DWORD windowStyle, DWORD windowExStyle, int x, int y, int w, int h, HWND hWndParent, HMENU hMenu, COLORREF colorForeground, COLORREF colorBackground, jobject peer); + virtual void DestroyHWnd(); void InitPeerGraphicsConfig(JNIEnv *env, jobject peer); virtual void Dispose(); @@ -670,8 +671,14 @@ public: static void _SetZOrder(void *param); static HWND sm_focusOwner; + +private: static HWND sm_focusedWindow; +public: + static inline HWND GetFocusedWindow() { return sm_focusedWindow; } + static void SetFocusedWindow(HWND window); + static void _SetFocus(void *param); static void *SetNativeFocusOwner(void *self); diff --git a/jdk/src/windows/native/sun/windows/awt_Dialog.cpp b/jdk/src/windows/native/sun/windows/awt_Dialog.cpp index 77f80b7fac6..147bcf711eb 100644 --- a/jdk/src/windows/native/sun/windows/awt_Dialog.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Dialog.cpp @@ -310,15 +310,20 @@ void AwtDialog::PopupOneDialog(HWND dialog, HWND blocker, BOOL isModalHook, HWND // no beep/flash if the mouse was clicked in the taskbar menu // or the dialog is currently inactive if (!isModalHook && !onTaskbar && (dialog == prevFGWindow)) { - ::MessageBeep(MB_OK); - // some heuristics: 3 times x 64 milliseconds - AwtWindow::FlashWindowEx(dialog, 3, 64, FLASHW_CAPTION); + AnimateModalBlocker(dialog); } ::BringWindowToTop(dialog); ::SetForegroundWindow(dialog); } } +void AwtDialog::AnimateModalBlocker(HWND window) +{ + ::MessageBeep(MB_OK); + // some heuristics: 3 times x 64 milliseconds + AwtWindow::FlashWindowEx(window, 3, 64, FLASHW_CAPTION); +} + LRESULT CALLBACK AwtDialog::MouseHookProc_NonTT(int nCode, WPARAM wParam, LPARAM lParam) { diff --git a/jdk/src/windows/native/sun/windows/awt_Dialog.h b/jdk/src/windows/native/sun/windows/awt_Dialog.h index 5f181e63422..a697a8c9b15 100644 --- a/jdk/src/windows/native/sun/windows/awt_Dialog.h +++ b/jdk/src/windows/native/sun/windows/awt_Dialog.h @@ -76,7 +76,7 @@ public: * Thus we don't have to perform any transitive (a blocker of a blocker) checks. */ INLINE virtual BOOL IsFocusedWindowModalBlocker() { - return (sm_focusedWindow != NULL) && (GetModalBlocker(sm_focusedWindow) == GetHWnd()); + return (AwtComponent::GetFocusedWindow() != NULL) && (GetModalBlocker(AwtComponent::GetFocusedWindow()) == GetHWnd()); } // finds and activates some window after the modal dialog is hidden @@ -132,6 +132,8 @@ public: // example on browser's thread when running in Java Plugin static LRESULT CALLBACK MouseHookProc_NonTT(int code, WPARAM wParam, LPARAM lParam); + + static void AnimateModalBlocker(HWND window); }; #endif /* AWT_DIALOG_H */ diff --git a/jdk/src/windows/native/sun/windows/awt_Frame.cpp b/jdk/src/windows/native/sun/windows/awt_Frame.cpp index 217b93cacc6..50f41d102ee 100644 --- a/jdk/src/windows/native/sun/windows/awt_Frame.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Frame.cpp @@ -361,8 +361,8 @@ LRESULT CALLBACK AwtFrame::ProxyWindowProc(HWND hwnd, UINT message, AwtWindow::SynthesizeWmActivate(FALSE, parent->GetHWnd(), NULL); } else if (sm_restoreFocusAndActivation) { - if (sm_focusedWindow != NULL) { - AwtWindow *focusedWindow = (AwtWindow*)GetComponent(sm_focusedWindow); + if (AwtComponent::GetFocusedWindow() != NULL) { + AwtWindow *focusedWindow = (AwtWindow*)GetComponent(AwtComponent::GetFocusedWindow()); if (focusedWindow != NULL) { // Will just silently restore native focus & activation. focusedWindow->AwtSetActiveWindow(); @@ -607,11 +607,6 @@ MsgRouting AwtFrame::WmNcMouseDown(WPARAM hitTest, int x, int y, int button) { return AwtWindow::WmNcMouseDown(hitTest, x, y, button); } -MsgRouting AwtFrame::WmWindowPosChanged(LPARAM windowPos) { - return mrDoDefault; -} - - // Override AwtWindow::Reshape() to handle minimized/maximized // frames (see 6525850, 4065534) void AwtFrame::Reshape(int x, int y, int width, int height) @@ -848,6 +843,11 @@ MsgRouting AwtFrame::WmGetMinMaxInfo(LPMINMAXINFO lpmmi) MsgRouting AwtFrame::WmSize(UINT type, int w, int h) { + currentWmSizeState = type; + if (currentWmSizeState == SIZE_MINIMIZED) { + UpdateSecurityWarningVisibility(); + } + if (m_ignoreWmSize) { return mrDoDefault; } @@ -941,7 +941,7 @@ MsgRouting AwtFrame::WmActivate(UINT nState, BOOL fMinimized, HWND opposite) return mrConsume; } type = java_awt_event_WindowEvent_WINDOW_GAINED_FOCUS; - sm_focusedWindow = GetHWnd(); + AwtComponent::SetFocusedWindow(GetHWnd()); } else { if (!::IsWindow(AwtWindow::GetModalBlocker(opposite))) { @@ -967,7 +967,7 @@ MsgRouting AwtFrame::WmActivate(UINT nState, BOOL fMinimized, HWND opposite) CheckRetainActualFocusedWindow(opposite); type = java_awt_event_WindowEvent_WINDOW_LOST_FOCUS; - sm_focusedWindow = NULL; + AwtComponent::SetFocusedWindow(NULL); sm_focusOwner = NULL; } } @@ -992,9 +992,9 @@ BOOL AwtFrame::CheckActivateActualFocusedWindow(HWND deactivatedOpositeHWnd) void AwtFrame::CheckRetainActualFocusedWindow(HWND activatedOpositeHWnd) { // If actual focused window is not this Frame - if (sm_focusedWindow != GetHWnd()) { + if (AwtComponent::GetFocusedWindow() != GetHWnd()) { // Make sure the actual focused window is an owned window of this frame - AwtWindow *focusedWindow = (AwtWindow *)AwtComponent::GetComponent(sm_focusedWindow); + AwtWindow *focusedWindow = (AwtWindow *)AwtComponent::GetComponent(AwtComponent::GetFocusedWindow()); if (focusedWindow != NULL && focusedWindow->GetOwningFrameOrDialog() == this) { // Check that the opposite window is not this frame, nor an owned window of this frame diff --git a/jdk/src/windows/native/sun/windows/awt_Frame.h b/jdk/src/windows/native/sun/windows/awt_Frame.h index 8c99dabc3a6..a5821329e6f 100644 --- a/jdk/src/windows/native/sun/windows/awt_Frame.h +++ b/jdk/src/windows/native/sun/windows/awt_Frame.h @@ -108,7 +108,6 @@ public: MsgRouting WmNcMouseDown(WPARAM hitTest, int x, int y, int button); MsgRouting WmNcMouseUp(WPARAM hitTest, int x, int y, int button); MsgRouting WmGetIcon(WPARAM iconType, LRESULT& retVal); - MsgRouting WmWindowPosChanged(LPARAM windowPos); MsgRouting WmShowWindow(BOOL show, UINT status); virtual MsgRouting WmSysCommand(UINT uCmdType, int xPos, int yPos); diff --git a/jdk/src/windows/native/sun/windows/awt_Toolkit.cpp b/jdk/src/windows/native/sun/windows/awt_Toolkit.cpp index c4292826a8e..4a7cc16c5fa 100644 --- a/jdk/src/windows/native/sun/windows/awt_Toolkit.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Toolkit.cpp @@ -56,6 +56,7 @@ #include "debug_mem.h" #include "ComCtl32Util.h" +#include "DllUtil.h" #include "D3DPipelineManager.h" @@ -334,6 +335,8 @@ AwtToolkit::AwtToolkit() { m_mouseDown = FALSE; m_hGetMessageHook = 0; + m_hMouseLLHook = 0; + m_lastWindowUnderMouse = NULL; m_timer = 0; m_cmdIDs = new AwtCmdIDList(); @@ -483,6 +486,7 @@ BOOL AwtToolkit::Dispose() { tk.UnregisterClass(); ::UnhookWindowsHookEx(tk.m_hGetMessageHook); + UninstallMouseLowLevelHook(); tk.m_mainThreadId = 0; @@ -960,6 +964,79 @@ LRESULT CALLBACK AwtToolkit::GetMessageFilter(int code, CATCH_BAD_ALLOC_RET(0); } +void AwtToolkit::InstallMouseLowLevelHook() +{ + // We need the low-level hook since we need to process mouse move + // messages outside of our windows. + m_hMouseLLHook = ::SetWindowsHookEx(WH_MOUSE_LL, + (HOOKPROC)MouseLowLevelHook, + GetModuleHandle(), NULL); + + // Reset the old value + m_lastWindowUnderMouse = NULL; +} + +void AwtToolkit::UninstallMouseLowLevelHook() +{ + if (m_hMouseLLHook != 0) { + ::UnhookWindowsHookEx(m_hMouseLLHook); + m_hMouseLLHook = 0; + } +} + +LRESULT CALLBACK AwtToolkit::MouseLowLevelHook(int code, + WPARAM wParam, LPARAM lParam) +{ + TRY; + + if (code >= 0 && wParam == WM_MOUSEMOVE) { + POINT pt = ((MSLLHOOKSTRUCT*)lParam)->pt; + + // We can't use GA_ROOTOWNER since in this case we'll go up to + // the root Java toplevel, not the actual owned toplevel. + HWND hwnd = ::GetAncestor(::WindowFromPoint(pt), GA_ROOT); + + AwtToolkit& tk = AwtToolkit::GetInstance(); + + if (tk.m_lastWindowUnderMouse != hwnd) { + AwtWindow *fw = NULL, *tw = NULL; + + if (tk.m_lastWindowUnderMouse) { + fw = (AwtWindow*) + AwtComponent::GetComponent(tk.m_lastWindowUnderMouse); + } + if (hwnd) { + tw = (AwtWindow*)AwtComponent::GetComponent(hwnd); + } + + tk.m_lastWindowUnderMouse = hwnd; + + if (fw) { + fw->UpdateSecurityWarningVisibility(); + } + // ... however, because we use GA_ROOT, we may find the warningIcon + // which is not a Java windows. + if (AwtWindow::IsWarningWindow(hwnd)) { + hwnd = ::GetParent(hwnd); + if (hwnd) { + tw = (AwtWindow*)AwtComponent::GetComponent(hwnd); + } + tk.m_lastWindowUnderMouse = hwnd; + } + if (tw) { + tw->UpdateSecurityWarningVisibility(); + } + + + } + } + + return ::CallNextHookEx(AwtToolkit::GetInstance().m_hMouseLLHook, code, + wParam, lParam); + + CATCH_BAD_ALLOC_RET(0); +} + /* * The main message loop */ @@ -1376,6 +1453,47 @@ HICON AwtToolkit::GetAwtIconSm() return defaultIconSm; } +HICON AwtToolkit::GetSecurityWarningIcon(UINT index, UINT w, UINT h) +{ + //Note: should not exceed 10 because of the current implementation. + static const int securityWarningIconCounter = 3; + + static HICON securityWarningIcon[securityWarningIconCounter] = {NULL, NULL, NULL};; + static UINT securityWarningIconWidth[securityWarningIconCounter] = {0, 0, 0}; + static UINT securityWarningIconHeight[securityWarningIconCounter] = {0, 0, 0}; + + index = AwtToolkit::CalculateWave(index, securityWarningIconCounter); + + if (securityWarningIcon[index] == NULL || + w != securityWarningIconWidth[index] || + h != securityWarningIconHeight[index]) + { + if (securityWarningIcon[index] != NULL) + { + ::DestroyIcon(securityWarningIcon[index]); + } + + static const wchar_t securityWarningIconName[] = L"SECURITY_WARNING_"; + wchar_t iconResourceName[sizeof(securityWarningIconName) + 2]; + ::ZeroMemory(iconResourceName, sizeof(iconResourceName)); + wcscpy(iconResourceName, securityWarningIconName); + + wchar_t strIndex[2]; + ::ZeroMemory(strIndex, sizeof(strIndex)); + strIndex[0] = L'0' + index; + + wcscat(iconResourceName, strIndex); + + securityWarningIcon[index] = (HICON)::LoadImage(GetModuleHandle(), + iconResourceName, + IMAGE_ICON, w, h, LR_DEFAULTCOLOR); + securityWarningIconWidth[index] = w; + securityWarningIconHeight[index] = h; + } + + return securityWarningIcon[index]; +} + void AwtToolkit::SetHeapCheck(long flag) { if (flag) { printf("heap checking not supported with this build\n"); @@ -1428,6 +1546,49 @@ JNIEnv* AwtToolkit::GetEnv() { (JNIEnv*)JNU_GetEnv(jvm, JNI_VERSION_1_2) : m_env; } +BOOL AwtToolkit::GetScreenInsets(int screenNum, RECT * rect) +{ + /* if primary display */ + if (screenNum == 0) { + RECT rRW; + if (::SystemParametersInfo(SPI_GETWORKAREA,0,(void *) &rRW,0) == TRUE) { + rect->top = rRW.top; + rect->left = rRW.left; + rect->bottom = ::GetSystemMetrics(SM_CYSCREEN) - rRW.bottom; + rect->right = ::GetSystemMetrics(SM_CXSCREEN) - rRW.right; + return TRUE; + } + } + /* if additional display */ + else { + MONITORINFO *miInfo; + miInfo = AwtWin32GraphicsDevice::GetMonitorInfo(screenNum); + if (miInfo) { + rect->top = miInfo->rcWork.top - miInfo->rcMonitor.top; + rect->left = miInfo->rcWork.left - miInfo->rcMonitor.left; + rect->bottom = miInfo->rcMonitor.bottom - miInfo->rcWork.bottom; + rect->right = miInfo->rcMonitor.right - miInfo->rcWork.right; + return TRUE; + } + } + return FALSE; +} + + +void AwtToolkit::GetWindowRect(HWND hWnd, LPRECT lpRect) +{ + try { + if (S_OK == DwmAPI::DwmGetWindowAttribute(hWnd, + DwmAPI::DWMWA_EXTENDED_FRAME_BOUNDS, + lpRect, sizeof(*lpRect))) + { + return; + } + } catch (const DllUtil::Exception &) {} + + ::GetWindowRect(hWnd, lpRect); +} + /************************************************************************ * Toolkit native methods */ @@ -1756,7 +1917,6 @@ Java_sun_awt_windows_WToolkit_getScreenHeight(JNIEnv *env, jobject self) CATCH_BAD_ALLOC_RET(0); } - /* * Class: sun_awt_windows_WToolkit * Method: getSreenInsets @@ -1768,34 +1928,17 @@ Java_sun_awt_windows_WToolkit_getScreenInsets(JNIEnv *env, jint screen) { jobject insets = NULL; - RECT rRW; - LPMONITORINFO miInfo; + RECT rect; TRY; -/* if primary display */ - if (screen == 0) { - if (::SystemParametersInfo(SPI_GETWORKAREA,0,(void *) &rRW,0) == TRUE) { - insets = env->NewObject(env->FindClass("java/awt/Insets"), - AwtToolkit::insetsMID, - rRW.top, - rRW.left, - ::GetSystemMetrics(SM_CYSCREEN) - rRW.bottom, - ::GetSystemMetrics(SM_CXSCREEN) - rRW.right); - } - } - -/* if additional display */ - else { - miInfo = AwtWin32GraphicsDevice::GetMonitorInfo(screen); - if (miInfo) { - insets = env->NewObject(env->FindClass("java/awt/Insets"), + if (AwtToolkit::GetScreenInsets(screen, &rect)) { + insets = env->NewObject(env->FindClass("java/awt/Insets"), AwtToolkit::insetsMID, - miInfo->rcWork.top - miInfo->rcMonitor.top, - miInfo->rcWork.left - miInfo->rcMonitor.left, - miInfo->rcMonitor.bottom - miInfo->rcWork.bottom, - miInfo->rcMonitor.right - miInfo->rcWork.right); - } + rect.top, + rect.left, + rect.bottom, + rect.right); } if (safe_ExceptionOccurred(env)) { diff --git a/jdk/src/windows/native/sun/windows/awt_Toolkit.h b/jdk/src/windows/native/sun/windows/awt_Toolkit.h index d76546fa4eb..3bb07712a19 100644 --- a/jdk/src/windows/native/sun/windows/awt_Toolkit.h +++ b/jdk/src/windows/native/sun/windows/awt_Toolkit.h @@ -210,6 +210,8 @@ public: LPARAM lParam); static LRESULT CALLBACK ForegroundIdleFilter(int code, WPARAM wParam, LPARAM lParam); + static LRESULT CALLBACK MouseLowLevelHook(int code, WPARAM wParam, + LPARAM lParam); INLINE static AwtToolkit& GetInstance() { return theInstance; } INLINE void SetPeer(JNIEnv *env, jobject wToolkit) { @@ -311,6 +313,30 @@ public: HICON GetAwtIcon(); HICON GetAwtIconSm(); + // Calculate a wave-like value out of the integer 'value' and + // the specified period. + // The argument 'value' is an integer 0, 1, 2, ... *infinity*. + // + // Examples: + // Period == 3 + // Generated sequence: 0 1 2 1 0 ..... + // + // Period == 4 + // Generated sequence: 0 1 2 3 2 1 0 ..... + static inline UINT CalculateWave(UINT value, const UINT period) { + if (period < 2) { + return 0; + } + // -2 is necessary to avoid repeating extreme values (0 and period-1) + value %= period * 2 -2; + if (value >= period) { + value = period * 2 -2 - value; + } + return value; + } + + HICON GetSecurityWarningIcon(UINT index, UINT w, UINT h); + /* Turns on/off dialog modality for the system. */ INLINE AwtDialog* SetModal(AwtDialog* frame) { AwtDialog* previousDialog = m_pModalDialog; @@ -368,6 +394,7 @@ private: BOOL m_mouseDown; HHOOK m_hGetMessageHook; + HHOOK m_hMouseLLHook; UINT_PTR m_timer; class AwtCmdIDList* m_cmdIDs; @@ -411,6 +438,24 @@ public: public: static void SetEnv(JNIEnv *env); static JNIEnv* GetEnv(); + + static BOOL GetScreenInsets(int screenNum, RECT * rect); + + // If the DWM is active, this function uses + // DwmGetWindowAttribute()/DWMWA_EXTENDED_FRAME_BOUNDS. + // Otherwise, fall back to regular ::GetWindowRect(). + // See 6711576 for more details. + static void GetWindowRect(HWND hWnd, LPRECT lpRect); + + private: + // The window handle of a toplevel window last seen under the mouse cursor. + // See MouseLowLevelHook() for details. + HWND m_lastWindowUnderMouse; + public: + HWND GetWindowUnderMouse() { return m_lastWindowUnderMouse; } + + void InstallMouseLowLevelHook(); + void UninstallMouseLowLevelHook(); }; /* diff --git a/jdk/src/windows/native/sun/windows/awt_Win32GraphicsEnv.cpp b/jdk/src/windows/native/sun/windows/awt_Win32GraphicsEnv.cpp index 1617d54e657..150ff8f075c 100644 --- a/jdk/src/windows/native/sun/windows/awt_Win32GraphicsEnv.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Win32GraphicsEnv.cpp @@ -29,6 +29,7 @@ #include "awt_Win32GraphicsDevice.h" #include "Devices.h" #include "WindowsFlags.h" +#include "DllUtil.h" BOOL DWMIsCompositionEnabled(); @@ -89,13 +90,8 @@ void DWMResetCompositionEnabled() { /** * Returns true if dwm composition is enabled, false if it is not applicable * (if the OS is not Vista) or dwm composition is disabled. - * - * Note: since DWM composition state changes are very rare we load/unload the - * dll on every change. */ BOOL DWMIsCompositionEnabled() { - typedef HRESULT (WINAPI DwmIsCompositionEnabledFunc)(BOOL*); - // cheaper to check than whether it's vista or not if (dwmIsCompositionEnabled != DWM_COMP_UNDEFINED) { return (BOOL)dwmIsCompositionEnabled; @@ -107,32 +103,22 @@ BOOL DWMIsCompositionEnabled() { } BOOL bRes = FALSE; - HMODULE hDwmApiDll = ::LoadLibrary(TEXT("dwmapi.dll")); - if (hDwmApiDll != NULL) { - DwmIsCompositionEnabledFunc *lpDwmIsCompEnabled = - (DwmIsCompositionEnabledFunc*) - GetProcAddress(hDwmApiDll, "DwmIsCompositionEnabled"); - if (lpDwmIsCompEnabled != NULL) { - BOOL bEnabled; - HRESULT res = lpDwmIsCompEnabled(&bEnabled); - if (SUCCEEDED(res)) { - bRes = bEnabled; - J2dTraceLn1(J2D_TRACE_VERBOSE, " composition enabled: %d",bRes); - } else { - J2dTraceLn1(J2D_TRACE_ERROR, - "IsDWMCompositionEnabled: error %x when detecting"\ - "if composition is enabled", res); - } + try { + BOOL bEnabled; + HRESULT res = DwmAPI::DwmIsCompositionEnabled(&bEnabled); + if (SUCCEEDED(res)) { + bRes = bEnabled; + J2dTraceLn1(J2D_TRACE_VERBOSE, " composition enabled: %d",bRes); } else { - J2dTraceLn(J2D_TRACE_ERROR, - "IsDWMCompositionEnabled: no DwmIsCompositionEnabled() "\ - "in dwmapi.dll"); + J2dTraceLn1(J2D_TRACE_ERROR, + "IsDWMCompositionEnabled: error %x when detecting"\ + "if composition is enabled", res); } - ::FreeLibrary(hDwmApiDll); - } else { + } catch (const DllUtil::Exception &) { J2dTraceLn(J2D_TRACE_ERROR, - "IsDWMCompositionEnabled: error opening dwmapi.dll"); + "IsDWMCompositionEnabled: no DwmIsCompositionEnabled() "\ + "in dwmapi.dll or dwmapi.dll cannot be loaded"); } dwmIsCompositionEnabled = bRes; diff --git a/jdk/src/windows/native/sun/windows/awt_Window.cpp b/jdk/src/windows/native/sun/windows/awt_Window.cpp index 0e9f0378313..88bcd8ecc45 100644 --- a/jdk/src/windows/native/sun/windows/awt_Window.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Window.cpp @@ -30,6 +30,7 @@ #include "awt_Component.h" #include "awt_Container.h" #include "awt_Frame.h" +#include "awt_Dialog.h" #include "awt_Insets.h" #include "awt_Panel.h" #include "awt_Toolkit.h" @@ -37,6 +38,7 @@ #include "awt_Win32GraphicsDevice.h" #include "awt_BitmapUtil.h" #include "awt_IconCursor.h" +#include "ComCtl32Util.h" #include "java_awt_Insets.h" #include @@ -136,6 +138,11 @@ struct RequestWindowFocusStruct { jobject component; jboolean isMouseEventCause; }; +// struct for _RepositionSecurityWarning() method +struct RepositionSecurityWarningStruct { + jobject window; +}; + /************************************************************************ * AwtWindow fields @@ -144,17 +151,23 @@ struct RequestWindowFocusStruct { jfieldID AwtWindow::warningStringID; jfieldID AwtWindow::locationByPlatformID; jfieldID AwtWindow::autoRequestFocusID; +jfieldID AwtWindow::securityWarningWidthID; +jfieldID AwtWindow::securityWarningHeightID; jfieldID AwtWindow::sysXID; jfieldID AwtWindow::sysYID; jfieldID AwtWindow::sysWID; jfieldID AwtWindow::sysHID; +jmethodID AwtWindow::getWarningStringMID; +jmethodID AwtWindow::calculateSecurityWarningPositionMID; + int AwtWindow::ms_instanceCounter = 0; HHOOK AwtWindow::ms_hCBTFilter; AwtWindow * AwtWindow::m_grabbedWindow = NULL; HWND AwtWindow::sm_retainingHierarchyZOrderInShow = NULL; BOOL AwtWindow::sm_resizing = FALSE; +UINT AwtWindow::untrustedWindowsCounter = 0; /************************************************************************ * AwtWindow class methods @@ -189,11 +202,30 @@ AwtWindow::AwtWindow() { m_opaque = TRUE; m_opacity = 0xff; + + warningString = NULL; + warningWindow = NULL; + securityTooltipWindow = NULL; + securityWarningAnimationStage = 0; + currentWmSizeState = SIZE_RESTORED; + + hContentBitmap = NULL; + ::InitializeCriticalSection(&contentBitmapCS); } AwtWindow::~AwtWindow() { + if (warningString != NULL) { + delete [] warningString; + } + ::EnterCriticalSection(&contentBitmapCS); + if (hContentBitmap != NULL) { + ::DeleteObject(hContentBitmap); + hContentBitmap = NULL; + } + ::LeaveCriticalSection(&contentBitmapCS); + ::DeleteCriticalSection(&contentBitmapCS); } void AwtWindow::Dispose() @@ -232,10 +264,10 @@ AwtWindow::Grab() { } m_grabbed = TRUE; m_grabbedWindow = this; - if (sm_focusedWindow == NULL && IsFocusableWindow()) { + if (AwtComponent::GetFocusedWindow() == NULL && IsFocusableWindow()) { // we shouldn't perform grab in this case (see 4841881 & 6539458) Ungrab(); - } else if (GetHWnd() != sm_focusedWindow) { + } else if (GetHWnd() != AwtComponent::GetFocusedWindow()) { _ToFront(env->NewGlobalRef(GetPeer(env))); // Global ref was deleted in _ToFront } @@ -329,12 +361,40 @@ MsgRouting AwtWindow::WmWindowPosChanging(LPARAM windowPos) { return mrDoDefault; } +void AwtWindow::RepositionSecurityWarning(JNIEnv *env) +{ + RECT rect; + CalculateWarningWindowBounds(env, &rect); + + ::SetWindowPos(warningWindow, HWND_NOTOPMOST, + rect.left, rect.top, + rect.right - rect.left, rect.bottom - rect.top, + SWP_ASYNCWINDOWPOS | SWP_NOACTIVATE | SWP_NOZORDER + ); +} + MsgRouting AwtWindow::WmWindowPosChanged(LPARAM windowPos) { - if (IsRetainingHierarchyZOrder() && ((WINDOWPOS *)windowPos)->flags & SWP_SHOWWINDOW) { + WINDOWPOS * wp = (WINDOWPOS *)windowPos; + + if (IsRetainingHierarchyZOrder() && wp->flags & SWP_SHOWWINDOW) { // By this time all the windows from the hierarchy are already notified about z-order change. // Thus we may and we should reset the trigger in order not to affect other changes. sm_retainingHierarchyZOrderInShow = NULL; } + + // Reposition the warning window + if (IsUntrusted() && warningWindow != NULL) { + if (wp->flags & SWP_HIDEWINDOW) { + UpdateSecurityWarningVisibility(); + } + + RepositionSecurityWarning((JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2)); + + if (wp->flags & SWP_SHOWWINDOW) { + UpdateSecurityWarningVisibility(); + } + } + return mrDoDefault; } @@ -354,21 +414,597 @@ void AwtWindow::FillClassInfo(WNDCLASSEX *lpwc) lpwc->cbWndExtra = DLGWINDOWEXTRA; } +bool AwtWindow::IsWarningWindow(HWND hWnd) +{ + const UINT len = 128; + TCHAR windowClassName[len]; + + ::RealGetWindowClass(hWnd, windowClassName, len); + return 0 == _tcsncmp(windowClassName, + AwtWindow::GetWarningWindowClassName(), len); +} + LRESULT CALLBACK AwtWindow::CBTFilter(int nCode, WPARAM wParam, LPARAM lParam) { if (nCode == HCBT_ACTIVATE || nCode == HCBT_SETFOCUS) { - AwtComponent *comp = AwtComponent::GetComponent((HWND)wParam); + HWND hWnd = (HWND)wParam; + AwtComponent *comp = AwtComponent::GetComponent(hWnd); - if (comp != NULL && comp->IsTopLevel()) { - AwtWindow* win = (AwtWindow*)comp; - if (!win->IsFocusableWindow() || win->m_filterFocusAndActivation) { - return 1; // Don't change focus/activation. + if (comp == NULL) { + // Check if it's a security warning icon + // See: 5091224, 6181725, 6732583 + if (AwtWindow::IsWarningWindow(hWnd)) { + return 1; + } + } else { + if (comp->IsTopLevel()) { + AwtWindow* win = (AwtWindow*)comp; + + if (!win->IsFocusableWindow() || + win->m_filterFocusAndActivation) + { + return 1; // Don't change focus/activation. + } } } } return ::CallNextHookEx(AwtWindow::ms_hCBTFilter, nCode, wParam, lParam); } +void AwtWindow::InitSecurityWarningSize(JNIEnv *env) +{ + warningWindowWidth = ::GetSystemMetrics(SM_CXSMICON); + warningWindowHeight = ::GetSystemMetrics(SM_CYSMICON); + + jobject target = GetTarget(env); + + env->SetIntField(target, AwtWindow::securityWarningWidthID, + warningWindowWidth); + env->SetIntField(target, AwtWindow::securityWarningHeightID, + warningWindowHeight); + + env->DeleteLocalRef(target); +} + +void AwtWindow::CreateHWnd(JNIEnv *env, LPCWSTR title, + DWORD windowStyle, + DWORD windowExStyle, + int x, int y, int w, int h, + HWND hWndParent, HMENU hMenu, + COLORREF colorForeground, + COLORREF colorBackground, + jobject peer) +{ + // Retrieve the warning string + // Note: we need to get it before CreateHWnd() happens because + // the isUntrusted() method may be invoked while the HWND + // is being created in response to some window messages. + jobject target = env->GetObjectField(peer, AwtObject::targetID); + jstring javaWarningString = + (jstring)env->CallObjectMethod(target, AwtWindow::getWarningStringMID); + + if (javaWarningString != NULL) { + size_t length = env->GetStringLength(javaWarningString) + 1; + warningString = new WCHAR[length]; + env->GetStringRegion(javaWarningString, 0, + static_cast(length - 1), warningString); + warningString[length-1] = L'\0'; + + env->DeleteLocalRef(javaWarningString); + } + env->DeleteLocalRef(target); + + AwtCanvas::CreateHWnd(env, title, + windowStyle, + windowExStyle, + x, y, w, h, + hWndParent, hMenu, + colorForeground, + colorBackground, + peer); + + // Now we need to create the warning window. + CreateWarningWindow(env); +} + +void AwtWindow::CreateWarningWindow(JNIEnv *env) +{ + if (!IsUntrusted()) { + return; + } + + if (++AwtWindow::untrustedWindowsCounter == 1) { + AwtToolkit::GetInstance().InstallMouseLowLevelHook(); + } + + InitSecurityWarningSize(env); + + RECT rect; + CalculateWarningWindowBounds(env, &rect); + + RegisterWarningWindowClass(); + warningWindow = ::CreateWindowEx( + WS_EX_NOACTIVATE | WS_EX_LAYERED, + GetWarningWindowClassName(), + warningString, + WS_POPUP, + rect.left, rect.top, + rect.right - rect.left, rect.bottom - rect.top, + GetHWnd(), // owner + NULL, // menu + AwtToolkit::GetInstance().GetModuleHandle(), + NULL // lParam + ); + if (warningWindow == NULL) { + //XXX: actually this is bad... We didn't manage to create the widow. + return; + } + + HICON hIcon = GetSecurityWarningIcon(); + + ICONINFO ii; + ::GetIconInfo(hIcon, &ii); + + //Note: we assume that every security icon has exactly the same shape. + HRGN rgn = BitmapUtil::BitmapToRgn(ii.hbmColor); + if (rgn) { + ::SetWindowRgn(warningWindow, rgn, TRUE); + } + + // Now we need to create the tooltip control for this window. + if (!ComCtl32Util::GetInstance().IsToolTipControlInitialized()) { + return; + } + + securityTooltipWindow = ::CreateWindowEx( + WS_EX_TOPMOST, + TOOLTIPS_CLASS, + NULL, + WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, + warningWindow, + NULL, + AwtToolkit::GetInstance().GetModuleHandle(), + NULL + ); + + ::SetWindowPos(securityTooltipWindow, + HWND_TOPMOST, 0, 0, 0, 0, + SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); + + + // We currently don't expect changing the size of the window, + // hence we may not care of updating the TOOL position/size. + ::GetClientRect(warningWindow, &rect); + + TOOLINFO ti; + + ti.cbSize = sizeof(ti); + ti.uFlags = TTF_SUBCLASS; + ti.hwnd = warningWindow; + ti.hinst = AwtToolkit::GetInstance().GetModuleHandle(); + ti.uId = 0; + ti.lpszText = warningString; + ti.rect.left = rect.left; + ti.rect.top = rect.top; + ti.rect.right = rect.right; + ti.rect.bottom = rect.bottom; + + ::SendMessage(securityTooltipWindow, TTM_ADDTOOL, + 0, (LPARAM) (LPTOOLINFO) &ti); +} + +void AwtWindow::DestroyWarningWindow() +{ + if (!IsUntrusted()) { + return; + } + if (--AwtWindow::untrustedWindowsCounter == 0) { + AwtToolkit::GetInstance().UninstallMouseLowLevelHook(); + } + if (warningWindow != NULL) { + // Note that the warningWindow is an owned window, and hence + // it would be destroyed automatically. However, the window + // class may only be unregistered if there's no any single + // window left using this class. Thus, we're destroying the + // warning window manually. Note that the tooltip window + // will be destroyed automatically because it's an owned + // window as well. + ::DestroyWindow(warningWindow); + warningWindow = NULL; + securityTooltipWindow = NULL; + UnregisterWarningWindowClass(); + } +} + +void AwtWindow::DestroyHWnd() +{ + DestroyWarningWindow(); + AwtCanvas::DestroyHWnd(); +} + +LPCTSTR AwtWindow::GetWarningWindowClassName() +{ + return TEXT("SunAwtWarningWindow"); +} + +void AwtWindow::FillWarningWindowClassInfo(WNDCLASS *lpwc) +{ + lpwc->style = 0L; + lpwc->lpfnWndProc = (WNDPROC)WarningWindowProc; + lpwc->cbClsExtra = 0; + lpwc->cbWndExtra = 0; + lpwc->hInstance = AwtToolkit::GetInstance().GetModuleHandle(), + lpwc->hIcon = AwtToolkit::GetInstance().GetAwtIcon(); + lpwc->hCursor = ::LoadCursor(NULL, IDC_ARROW); + lpwc->hbrBackground = NULL; + lpwc->lpszMenuName = NULL; + lpwc->lpszClassName = AwtWindow::GetWarningWindowClassName(); +} + +void AwtWindow::RegisterWarningWindowClass() +{ + WNDCLASS wc; + + ::ZeroMemory(&wc, sizeof(wc)); + + if (!::GetClassInfo(AwtToolkit::GetInstance().GetModuleHandle(), + AwtWindow::GetWarningWindowClassName(), &wc)) + { + AwtWindow::FillWarningWindowClassInfo(&wc); + ATOM atom = ::RegisterClass(&wc); + DASSERT(atom != 0); + } +} + +void AwtWindow::UnregisterWarningWindowClass() +{ + ::UnregisterClass(AwtWindow::GetWarningWindowClassName(), AwtToolkit::GetInstance().GetModuleHandle()); +} + +HICON AwtWindow::GetSecurityWarningIcon() +{ + HICON ico = AwtToolkit::GetInstance().GetSecurityWarningIcon(securityWarningAnimationStage, + warningWindowWidth, warningWindowHeight); + return ico; +} + +// This function calculates the bounds of the warning window and stores them +// into the RECT structure pointed by the argument rect. +void AwtWindow::CalculateWarningWindowBounds(JNIEnv *env, LPRECT rect) +{ + RECT windowBounds; + AwtToolkit::GetWindowRect(GetHWnd(), &windowBounds); + + jobject target = GetTarget(env); + jobject point2D = env->CallObjectMethod(target, + calculateSecurityWarningPositionMID, + (jdouble)windowBounds.left, (jdouble)windowBounds.top, + (jdouble)(windowBounds.right - windowBounds.left), + (jdouble)(windowBounds.bottom - windowBounds.top)); + env->DeleteLocalRef(target); + + static jclass point2DClassID = NULL; + static jmethodID point2DGetXMID = NULL; + static jmethodID point2DGetYMID = NULL; + + if (point2DClassID == NULL) { + jclass point2DClassIDLocal = env->FindClass("java/awt/geom/Point2D"); + point2DClassID = (jclass)env->NewGlobalRef(point2DClassIDLocal); + env->DeleteLocalRef(point2DClassIDLocal); + } + + if (point2DGetXMID == NULL) { + point2DGetXMID = env->GetMethodID(point2DClassID, "getX", "()D"); + } + if (point2DGetYMID == NULL) { + point2DGetYMID = env->GetMethodID(point2DClassID, "getY", "()D"); + } + + + int x = (int)env->CallDoubleMethod(point2D, point2DGetXMID); + int y = (int)env->CallDoubleMethod(point2D, point2DGetYMID); + + env->DeleteLocalRef(point2D); + + //Make sure the warning is not far from the window bounds + x = max(x, windowBounds.left - (int)warningWindowWidth - 2); + x = min(x, windowBounds.right + (int)warningWindowWidth + 2); + + y = max(y, windowBounds.top - (int)warningWindowHeight - 2); + y = min(y, windowBounds.bottom + (int)warningWindowHeight + 2); + + // Now make sure the warning window is visible on the screen + HMONITOR hmon = MonitorFromWindow(GetHWnd(), MONITOR_DEFAULTTOPRIMARY); + DASSERT(hmon != NULL); + + RECT monitorBounds; + RECT monitorInsets; + + MonitorBounds(hmon, &monitorBounds); + if (!AwtToolkit::GetScreenInsets(m_screenNum, &monitorInsets)) { + ::ZeroMemory(&monitorInsets, sizeof(monitorInsets)); + } + + x = max(x, monitorBounds.left + monitorInsets.left); + x = min(x, monitorBounds.right - monitorInsets.right - (int)warningWindowWidth); + + y = max(y, monitorBounds.top + monitorInsets.top); + y = min(y, monitorBounds.bottom - monitorInsets.bottom - (int)warningWindowHeight); + + rect->left = x; + rect->top = y; + rect->right = rect->left + warningWindowWidth; + rect->bottom = rect->top + warningWindowHeight; +} + +LRESULT CALLBACK AwtWindow::WarningWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch (uMsg) { + case WM_PAINT: + PaintWarningWindow(hwnd); + return 0; + + case WM_MOUSEACTIVATE: + { + // Retrive the owner of the warning window. + HWND javaWindow = ::GetParent(hwnd); + if (javaWindow) { + // If the window is blocked by a modal dialog, substitute + // its handle with the topmost blocker. + HWND topmostBlocker = GetTopmostModalBlocker(javaWindow); + if (::IsWindow(topmostBlocker)) { + javaWindow = topmostBlocker; + } + + ::BringWindowToTop(javaWindow); + + AwtWindow * window = + (AwtWindow*)AwtComponent::GetComponent(javaWindow); + if (window == NULL) { + // Quite unlikely to go into here, but it's way better + // than getting a crash. + ::SetForegroundWindow(javaWindow); + } else { + // Activate the window if it is focusable and inactive + if (window->IsFocusableWindow() && + javaWindow != ::GetActiveWindow()) { + ::SetForegroundWindow(javaWindow); + } else { + // ...otherwise just start the animation. + window->StartSecurityAnimation(akShow); + } + } + + // In every case if there's a top-most blocker, we need to + // enable modal animation. + if (::IsWindow(topmostBlocker)) { + AwtDialog::AnimateModalBlocker(topmostBlocker); + } + } + return MA_NOACTIVATEANDEAT; + } + } + return ::DefWindowProc(hwnd, uMsg, wParam, lParam); +} + +void AwtWindow::PaintWarningWindow(HWND warningWindow) +{ + RECT updateRect; + + if (!::GetUpdateRect(warningWindow, &updateRect, FALSE)) { + // got nothing to update + return; + } + + PAINTSTRUCT ps; + HDC hdc = ::BeginPaint(warningWindow, &ps); + if (hdc == NULL) { + // indicates an error + return; + } + + PaintWarningWindow(warningWindow, hdc); + + ::EndPaint(warningWindow, &ps); +} + +void AwtWindow::PaintWarningWindow(HWND warningWindow, HDC hdc) +{ + HWND javaWindow = ::GetParent(warningWindow); + + AwtWindow * window = (AwtWindow*)AwtComponent::GetComponent(javaWindow); + if (window == NULL) { + return; + } + + ::DrawIconEx(hdc, 0, 0, window->GetSecurityWarningIcon(), + window->warningWindowWidth, window->warningWindowHeight, + 0, NULL, DI_NORMAL); +} + +static const UINT_PTR IDT_AWT_SECURITYANIMATION = 0x102; + +// Approximately 6 times a second. 0.75 seconds total. +static const UINT securityAnimationTimerElapse = 150; +static const UINT securityAnimationMaxIterations = 5; + +void AwtWindow::RepaintWarningWindow() +{ + HDC hdc = ::GetDC(warningWindow); + PaintWarningWindow(warningWindow, hdc); + ::ReleaseDC(warningWindow, hdc); +} + +void AwtWindow::StartSecurityAnimation(AnimationKind kind) +{ + if (!IsUntrusted()) { + return; + } + if (warningWindow == NULL) { + return; + } + + securityAnimationKind = kind; + + securityWarningAnimationStage = 1; + ::SetTimer(GetHWnd(), IDT_AWT_SECURITYANIMATION, + securityAnimationTimerElapse, NULL); + + if (securityAnimationKind == akShow) { + ::SetWindowPos(warningWindow, HWND_NOTOPMOST, 0, 0, 0, 0, + SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE | + SWP_SHOWWINDOW); + + ::SetLayeredWindowAttributes(warningWindow, RGB(0, 0, 0), + 0xFF, LWA_ALPHA); + ::RedrawWindow(warningWindow, NULL, NULL, + RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN); + } +} + +void AwtWindow::StopSecurityAnimation() +{ + if (!IsUntrusted()) { + return; + } + if (warningWindow == NULL) { + return; + } + + securityWarningAnimationStage = 0; + ::KillTimer(GetHWnd(), IDT_AWT_SECURITYANIMATION); + + switch (securityAnimationKind) { + case akHide: + case akPreHide: + ::SetWindowPos(warningWindow, HWND_NOTOPMOST, 0, 0, 0, 0, + SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE | + SWP_HIDEWINDOW); + break; + case akShow: + RepaintWarningWindow(); + break; + } + + securityAnimationKind = akNone; +} + +MsgRouting AwtWindow::WmTimer(UINT_PTR timerID) +{ + if (timerID != IDT_AWT_SECURITYANIMATION) { + return mrPassAlong; + } + + if (securityWarningAnimationStage == 0) { + return mrConsume; + } + + securityWarningAnimationStage++; + if (securityWarningAnimationStage >= securityAnimationMaxIterations) { + if (securityAnimationKind == akPreHide) { + // chain real hiding + StartSecurityAnimation(akHide); + } else { + StopSecurityAnimation(); + } + } else { + switch (securityAnimationKind) { + case akHide: + { + BYTE opacity = ((int)0xFF * + (securityAnimationMaxIterations - + securityWarningAnimationStage)) / + securityAnimationMaxIterations; + ::SetLayeredWindowAttributes(warningWindow, + RGB(0, 0, 0), opacity, LWA_ALPHA); + } + break; + case akShow: + case akNone: // quite unlikely, but quite safe + RepaintWarningWindow(); + break; + } + } + + return mrConsume; +} + +// The security warning is visible if: +// 1. The window has the keyboard window focus, OR +// 2. The mouse pointer is located within the window bounds, +// or within the security warning icon. +void AwtWindow::UpdateSecurityWarningVisibility() +{ + if (!IsUntrusted()) { + return; + } + if (warningWindow == NULL) { + return; + } + + bool show = false; + + if (IsVisible() && currentWmSizeState != SIZE_MINIMIZED) { + if (AwtComponent::GetFocusedWindow() == GetHWnd()) { + show = true; + } + + HWND hwnd = AwtToolkit::GetInstance().GetWindowUnderMouse(); + if (hwnd == GetHWnd()) { + show = true; + } + if (hwnd == warningWindow) { + show = true; + } + } + + if (show && (!::IsWindowVisible(warningWindow) || + securityAnimationKind == akHide || + securityAnimationKind == akPreHide)) { + StartSecurityAnimation(akShow); + } + if (!show && ::IsWindowVisible(warningWindow)) { + StartSecurityAnimation(akPreHide); + } +} + +void AwtWindow::FocusedWindowChanged(HWND from, HWND to) +{ + AwtWindow * fw = (AwtWindow *)AwtComponent::GetComponent(from); + AwtWindow * tw = (AwtWindow *)AwtComponent::GetComponent(to); + + if (fw != NULL) { + fw->UpdateSecurityWarningVisibility(); + } + if (tw != NULL) { + tw->UpdateSecurityWarningVisibility(); + + // Flash on receiving the keyboard focus even if the warning + // has already been shown (e.g. by hovering with the mouse) + tw->StartSecurityAnimation(akShow); + } +} + +void AwtWindow::_RepositionSecurityWarning(void* param) +{ + JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); + + RepositionSecurityWarningStruct *rsws = + (RepositionSecurityWarningStruct *)param; + jobject self = rsws->window; + + PDATA pData; + JNI_CHECK_PEER_GOTO(self, ret); + AwtWindow *window = (AwtWindow *)pData; + + window->RepositionSecurityWarning(env); + + ret: + env->DeleteGlobalRef(self); + delete rsws; +} + /* Create a new AwtWindow object and window. */ AwtWindow* AwtWindow::Create(jobject self, jobject parent) { @@ -648,23 +1284,6 @@ BOOL AwtWindow::UpdateInsets(jobject insets) ::GetClientRect(GetHWnd(), &inside); ::GetWindowRect(GetHWnd(), &outside); - jobject target = GetTarget(env); - jstring warningString = - (jstring)(env)->GetObjectField(target, AwtWindow::warningStringID); - if (warningString != NULL) { - ::CopyRect(&inside, &outside); - DefWindowProc(WM_NCCALCSIZE, FALSE, (LPARAM)&inside); - /* - * Fix for BugTraq ID 4304024. - * Calculate client rectangle in client coordinates. - */ - VERIFY(::OffsetRect(&inside, -inside.left, -inside.top)); - extraBottomInsets = ::GetSystemMetrics(SM_CYCAPTION) + - ((GetStyle() & WS_THICKFRAME) ? 2 : -2); - } - env->DeleteLocalRef(target); - env->DeleteLocalRef(warningString); - /* Update our inset member */ if (outside.right - outside.left > 0 && outside.bottom - outside.top > 0) { ::MapWindowPoints(GetHWnd(), 0, (LPPOINT)&inside, 2); @@ -939,13 +1558,14 @@ BOOL AwtWindow::AwtSetActiveWindow(BOOL isMouseEventCause, UINT hittest) } } - if (sm_focusedWindow != GetHWnd()) { - if (sm_focusedWindow != NULL) { + const HWND focusedWindow = AwtComponent::GetFocusedWindow(); + if (focusedWindow != GetHWnd()) { + if (focusedWindow != NULL) { // Deactivate the old focused window - AwtWindow::SynthesizeWmActivate(FALSE, sm_focusedWindow, GetHWnd()); + AwtWindow::SynthesizeWmActivate(FALSE, focusedWindow, GetHWnd()); } // Activate the new focused window. - AwtWindow::SynthesizeWmActivate(TRUE, GetHWnd(), sm_focusedWindow); + AwtWindow::SynthesizeWmActivate(TRUE, GetHWnd(), focusedWindow); } return TRUE; } @@ -956,7 +1576,7 @@ MsgRouting AwtWindow::WmActivate(UINT nState, BOOL fMinimized, HWND opposite) if (nState != WA_INACTIVE) { type = java_awt_event_WindowEvent_WINDOW_GAINED_FOCUS; - sm_focusedWindow = GetHWnd(); + AwtComponent::SetFocusedWindow(GetHWnd()); } else { // The owner is not necassarily getting WM_ACTIVATE(WA_INACTIVE). // So, initiate retaining the actualFocusedWindow. @@ -969,7 +1589,7 @@ MsgRouting AwtWindow::WmActivate(UINT nState, BOOL fMinimized, HWND opposite) m_grabbedWindow->Ungrab(); } type = java_awt_event_WindowEvent_WINDOW_LOST_FOCUS; - sm_focusedWindow = NULL; + AwtComponent::SetFocusedWindow(NULL); sm_focusOwner = NULL; } @@ -1007,7 +1627,7 @@ MsgRouting AwtWindow::WmShowWindow(BOOL show, UINT status) HWND hwndSelf = GetHWnd(); HWND hwndOwner = ::GetParent(hwndSelf); - if (!show && IsSimpleWindow() && hwndSelf == sm_focusedWindow && + if (!show && IsSimpleWindow() && hwndSelf == AwtComponent::GetFocusedWindow() && hwndOwner != NULL && ::IsWindowVisible(hwndOwner)) { AwtFrame *owner = (AwtFrame*)AwtComponent::GetComponent(hwndOwner); @@ -1112,7 +1732,10 @@ MsgRouting AwtWindow::WmSizing() */ MsgRouting AwtWindow::WmSize(UINT type, int w, int h) { + currentWmSizeState = type; + if (type == SIZE_MINIMIZED) { + UpdateSecurityWarningVisibility(); return mrDoDefault; } @@ -1176,103 +1799,18 @@ MsgRouting AwtWindow::WmNcCalcSize(BOOL fCalcValidRects, if (env->EnsureLocalCapacity(2) < 0) { return mrConsume; } - jobject target = GetTarget(env); - jstring warningString = - (jstring)(env)->GetObjectField(target, AwtWindow::warningStringID); - if (warningString != NULL) { - RECT r; - ::CopyRect(&r, &lpncsp->rgrc[0]); - retVal = static_cast(DefWindowProc(WM_NCCALCSIZE, fCalcValidRects, - reinterpret_cast(lpncsp))); - - /* Adjust non-client area for warning banner space. */ - m_warningRect.left = lpncsp->rgrc[0].left; - m_warningRect.right = lpncsp->rgrc[0].right; - m_warningRect.bottom = lpncsp->rgrc[0].bottom; - m_warningRect.top = - m_warningRect.bottom - ::GetSystemMetrics(SM_CYCAPTION); - if (GetStyle() & WS_THICKFRAME) { - m_warningRect.top -= 2; - } else { - m_warningRect.top += 2; - } - - lpncsp->rgrc[0].bottom = (m_warningRect.top >= lpncsp->rgrc[0].top) - ? m_warningRect.top - : lpncsp->rgrc[0].top; - - /* Convert to window-relative coordinates. */ - ::OffsetRect(&m_warningRect, -r.left, -r.top); - - /* Notify target of Insets change. */ - if (HasValidRect()) { - UpdateInsets(NULL); - } - - mrRetVal = mrConsume; - } else { - // WM_NCCALCSIZE is usually in response to a resize, but - // also can be triggered by SetWindowPos(SWP_FRAMECHANGED), - // which means the insets will have changed - rnk 4/7/1998 - retVal = static_cast(DefWindowProc( - WM_NCCALCSIZE, fCalcValidRects, reinterpret_cast(lpncsp))); - if (HasValidRect()) { - UpdateInsets(NULL); - } - mrRetVal = mrConsume; + // WM_NCCALCSIZE is usually in response to a resize, but + // also can be triggered by SetWindowPos(SWP_FRAMECHANGED), + // which means the insets will have changed - rnk 4/7/1998 + retVal = static_cast(DefWindowProc( + WM_NCCALCSIZE, fCalcValidRects, reinterpret_cast(lpncsp))); + if (HasValidRect()) { + UpdateInsets(NULL); } - env->DeleteLocalRef(target); - env->DeleteLocalRef(warningString); + mrRetVal = mrConsume; return mrRetVal; } -MsgRouting AwtWindow::WmNcPaint(HRGN hrgn) -{ - DefWindowProc(WM_NCPAINT, (WPARAM)hrgn, 0); - - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - if (env->EnsureLocalCapacity(2) < 0) { - return mrConsume; - } - jobject target = GetTarget(env); - jstring warningString = - (jstring)(env)->GetObjectField(target, AwtWindow::warningStringID); - if (warningString != NULL) { - RECT r; - ::CopyRect(&r, &m_warningRect); - HDC hDC = ::GetWindowDC(GetHWnd()); - DASSERT(hDC); - int iSaveDC = ::SaveDC(hDC); - VERIFY(::SelectClipRgn(hDC, NULL) != NULL); - VERIFY(::FillRect(hDC, &m_warningRect, (HBRUSH)::GetStockObject(BLACK_BRUSH))); - - if (GetStyle() & WS_THICKFRAME) { - /* draw edge */ - VERIFY(::DrawEdge(hDC, &r, EDGE_RAISED, BF_TOP)); - r.top += 2; - VERIFY(::DrawEdge(hDC, &r, EDGE_SUNKEN, BF_RECT)); - ::InflateRect(&r, -2, -2); - } - - /* draw warning text */ - LPCWSTR text = JNU_GetStringPlatformChars(env, warningString, NULL); - VERIFY(::SetBkColor(hDC, ::GetSysColor(COLOR_BTNFACE)) != CLR_INVALID); - VERIFY(::SetTextColor(hDC, ::GetSysColor(COLOR_BTNTEXT)) != CLR_INVALID); - VERIFY(::SelectObject(hDC, ::GetStockObject(DEFAULT_GUI_FONT)) != NULL); - VERIFY(::SetTextAlign(hDC, TA_LEFT | TA_BOTTOM) != GDI_ERROR); - VERIFY(::ExtTextOut(hDC, r.left+2, r.bottom-1, - ETO_CLIPPED | ETO_OPAQUE, - &r, text, static_cast(wcslen(text)), NULL)); - VERIFY(::RestoreDC(hDC, iSaveDC)); - ::ReleaseDC(GetHWnd(), hDC); - JNU_ReleaseStringPlatformChars(env, warningString, text); - } - - env->DeleteLocalRef(target); - env->DeleteLocalRef(warningString); - return mrConsume; -} - MsgRouting AwtWindow::WmNcHitTest(UINT x, UINT y, LRESULT& retVal) { // If this window is blocked by modal dialog, return HTCLIENT for any point of it. @@ -1498,6 +2036,19 @@ void AwtWindow::SetAndActivateModalBlocker(HWND window, HWND blocker) { } } +HWND AwtWindow::GetTopmostModalBlocker(HWND window) +{ + HWND ret, blocker = NULL; + + do { + ret = blocker; + blocker = AwtWindow::GetModalBlocker(window); + window = blocker; + } while (::IsWindow(blocker)); + + return ret; +} + void AwtWindow::FlashWindowEx(HWND hWnd, UINT count, DWORD timeout, DWORD flags) { FLASHWINFO fi; fi.cbSize = sizeof(fi); @@ -2410,8 +2961,16 @@ Java_java_awt_Window_initIDs(JNIEnv *env, jclass cls) env->GetFieldID(cls, "warningString", "Ljava/lang/String;"); AwtWindow::locationByPlatformID = env->GetFieldID(cls, "locationByPlatform", "Z"); + AwtWindow::securityWarningWidthID = + env->GetFieldID(cls, "securityWarningWidth", "I"); + AwtWindow::securityWarningHeightID = + env->GetFieldID(cls, "securityWarningHeight", "I"); + AwtWindow::getWarningStringMID = + env->GetMethodID(cls, "getWarningString", "()Ljava/lang/String;"); AwtWindow::autoRequestFocusID = env->GetFieldID(cls, "autoRequestFocus", "Z"); + AwtWindow::calculateSecurityWarningPositionMID = + env->GetMethodID(cls, "calculateSecurityWarningPosition", "(DDDD)Ljava/awt/geom/Point2D;"); CATCH_BAD_ALLOC; } @@ -2956,4 +3515,26 @@ JNIEXPORT jboolean JNICALL Java_sun_awt_windows_WWindowPeer_requestWindowFocus CATCH_BAD_ALLOC_RET(JNI_FALSE); } +/* + * Class: sun_awt_windows_WWindowPeer + * Method: repositionSecurityWarning + * Signature: ()V + */ +JNIEXPORT void JNICALL +Java_sun_awt_windows_WWindowPeer_repositionSecurityWarning(JNIEnv *env, + jobject self) +{ + TRY; + + RepositionSecurityWarningStruct *rsws = + new RepositionSecurityWarningStruct; + rsws->window = env->NewGlobalRef(self); + + AwtToolkit::GetInstance().InvokeFunction( + AwtWindow::_RepositionSecurityWarning, rsws); + // global refs and mds are deleted in _RepositionSecurityWarning + + CATCH_BAD_ALLOC; +} + } /* extern "C" */ diff --git a/jdk/src/windows/native/sun/windows/awt_Window.h b/jdk/src/windows/native/sun/windows/awt_Window.h index 339080c55f0..bf43150a7e8 100644 --- a/jdk/src/windows/native/sun/windows/awt_Window.h +++ b/jdk/src/windows/native/sun/windows/awt_Window.h @@ -54,6 +54,8 @@ public: static jfieldID locationByPlatformID; static jfieldID screenID; /* screen number passed over from WindowPeer */ static jfieldID autoRequestFocusID; + static jfieldID securityWarningWidthID; + static jfieldID securityWarningHeightID; // The coordinates at the peer. static jfieldID sysXID; @@ -61,6 +63,9 @@ public: static jfieldID sysWID; static jfieldID sysHID; + static jmethodID getWarningStringMID; + static jmethodID calculateSecurityWarningPositionMID; + AwtWindow(); virtual ~AwtWindow(); @@ -150,6 +155,8 @@ public: static void SetModalBlocker(HWND window, HWND blocker); static void SetAndActivateModalBlocker(HWND window, HWND blocker); + static HWND GetTopmostModalBlocker(HWND window); + /* * Windows message handler functions */ @@ -166,13 +173,13 @@ public: virtual MsgRouting WmSettingChange(UINT wFlag, LPCTSTR pszSection); virtual MsgRouting WmNcCalcSize(BOOL fCalcValidRects, LPNCCALCSIZE_PARAMS lpncsp, LRESULT& retVal); - virtual MsgRouting WmNcPaint(HRGN hrgn); virtual MsgRouting WmNcHitTest(UINT x, UINT y, LRESULT& retVal); virtual MsgRouting WmNcMouseDown(WPARAM hitTest, int x, int y, int button); virtual MsgRouting WmGetIcon(WPARAM iconType, LRESULT& retVal); virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam); virtual MsgRouting WmWindowPosChanging(LPARAM windowPos); virtual MsgRouting WmWindowPosChanged(LPARAM windowPos); + virtual MsgRouting WmTimer(UINT_PTR timerID); virtual MsgRouting HandleEvent(MSG *msg, BOOL synthetic); virtual void WindowResized(); @@ -221,11 +228,22 @@ public: static void _SetOpacity(void* param); static void _SetOpaque(void* param); static void _UpdateWindow(void* param); + static void _RepositionSecurityWarning(void* param); inline static BOOL IsResizing() { return sm_resizing; } + virtual void CreateHWnd(JNIEnv *env, LPCWSTR title, + DWORD windowStyle, DWORD windowExStyle, + int x, int y, int w, int h, + HWND hWndParent, HMENU hMenu, + COLORREF colorForeground, COLORREF colorBackground, + jobject peer); + virtual void DestroyHWnd(); + + static void FocusedWindowChanged(HWND from, HWND to); + private: static int ms_instanceCounter; static HHOOK ms_hCBTFilter; @@ -267,9 +285,56 @@ private: UINT contentWidth; UINT contentHeight; - void RedrawWindow(); void SetTranslucency(BYTE opacity, BOOL opaque); + void UpdateWindow(int width, int height, HBITMAP hBitmap); void UpdateWindowImpl(int width, int height, HBITMAP hBitmap); + void RedrawWindow(); + + static UINT untrustedWindowsCounter; + + WCHAR * warningString; + + // The warning icon + HWND warningWindow; + // The tooltip that appears when hovering the icon + HWND securityTooltipWindow; + + UINT warningWindowWidth; + UINT warningWindowHeight; + void InitSecurityWarningSize(JNIEnv *env); + HICON GetSecurityWarningIcon(); + + void CreateWarningWindow(JNIEnv *env); + void DestroyWarningWindow(); + static LPCTSTR GetWarningWindowClassName(); + void FillWarningWindowClassInfo(WNDCLASS *lpwc); + void RegisterWarningWindowClass(); + void UnregisterWarningWindowClass(); + static LRESULT CALLBACK WarningWindowProc( + HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + + static void PaintWarningWindow(HWND warningWindow); + static void PaintWarningWindow(HWND warningWindow, HDC hdc); + void RepaintWarningWindow(); + void CalculateWarningWindowBounds(JNIEnv *env, LPRECT rect); + + void AnimateSecurityWarning(bool enable); + UINT securityWarningAnimationStage; + + enum AnimationKind { + akNone, akShow, akPreHide, akHide + }; + + AnimationKind securityAnimationKind; + + void StartSecurityAnimation(AnimationKind kind); + void StopSecurityAnimation(); + + void RepositionSecurityWarning(JNIEnv *env); + +public: + void UpdateSecurityWarningVisibility(); + static bool IsWarningWindow(HWND hWnd); protected: BOOL m_isResizable; @@ -284,6 +349,12 @@ protected: virtual void FillBackground(HDC hMemoryDC, SIZE &size); virtual void FillAlpha(void *bitmapBits, SIZE &size, BYTE alpha); + inline BOOL IsUntrusted() { + return warningString != NULL; + } + + UINT currentWmSizeState; + private: int m_screenNum; diff --git a/jdk/src/windows/native/sun/windows/security_warning.ico b/jdk/src/windows/native/sun/windows/security_warning.ico new file mode 100644 index 0000000000000000000000000000000000000000..67793ed82648ad9f6f9164075ecbd60e1555da51 GIT binary patch literal 17542 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 literal 0 HcmV?d00001 diff --git a/jdk/src/windows/native/sun/windows/security_warning_bw.ico b/jdk/src/windows/native/sun/windows/security_warning_bw.ico new file mode 100644 index 0000000000000000000000000000000000000000..68a1824a2f529c830407f433863b101338c8478d GIT binary patch literal 17542 zcmdU$S&U836UUnoGxlBV`x=DA10fzH z#Mt*GVqeD=BK9W_qW|Y}?$rJFZD+l6?&UY~Ro&IqU3JdA_jFZt9i^(N8md(*<W^8@7_hmph1Il{rdG? z(2g?~U8Zi@)2C0@H*en5Z{NO+gmL4>>5d&cx}Y6(9y-uv>!&|s#ti-X_3Oykzkk05 zaps`IOEWJco7K)4jj-Rsyu54>1J%soH_c^ zrAzwRvuB~GSFfH1QDj+@wZrr?URGA7pFDXIit5#?YY;`2HKXW8X5PGc`oe_^`tjq( zzBqdHX!`e0J4lwbSTm}Ar^H!`_;rZE)7%@UOZrs=fZLiOtxmD54+*PYq>GS8$>qn0s zWnk#gp}Iwj7A|Pp3FxFWt6nTNku#{me;1H*2h2yY{!|L8nfg zv7_xzx?t+qP}f zSFT+7&F6r}Sg!T6{*E0xbVWr)2H@pGH#&Ci+?nAg;@82;mwxo@+OCqo>PC$k zxjsoyT+Ujo$^Dl<;?p;8-uQxNy!buWu3ht$V-2rZH%g3q;=~Dk?%cV+7&s`FCC>BP zBjNL%xPAL}piEG#NGxaiBI0`p?cTk+9y@ky+9wgdQ09ikgY)Ol_l@a@IniPId}f=u z@_G8vg$ozD_t?vCC$7V%^%~=IVXoi0Cf_T5I(6!lu2ZLuZqlU5Z!uNecnQBxo*5GN zkdKkPl<LrH!Gi~N)22;bu>Y9%2-&dp>~Z1*Grl25(xy!t7l#fV zO2-w*WE)cu3&{6_??&g&on0J0d^pXoO1vPxIWYjfe~%tLT%0_4(tXY);gjQ6%kSs- z@#FgR>C@?c5Tot&eP=yM7RYfj-sFn)+RDE6iQl$!L`8U^Tfpe93r`_|S zV&_ZM%0bw95$7h^fbT56N_ly?zI*qs{`BcnBp}Ni=90T-?|lFMeJn6X^8S84Mzdzk z^zh-sJ$(w(m*5#`e$VCm&Yrq{{rdFxU--z{xo2eMc_Q@Kv19HTg!F}a?bYNo&F41x zp8*2~=rLo)q@UUFknziZvOmh+1nt?gr|UPEyrBFc`89L@>(HTt?$@thdQHZ{a&TsD zi~B!#@ZhxlQT7|2_mZn_-@d(@6JoD{7c~zg&-VWP`)hJ}-1j)obbL}XFG4$RE`sNz zJe#w5W)cJQJp*v@Z&{W{-u4OP`AxfJZ@Tq|x}L{LtJ_=LE&TD58}Xu}Jd6K4!tu^HRt zkNizsU&&9NT#cN$3WetO2P>#tQ8#r*FE-o(406bGB+cq|ee<`*L z81tFo5NHDe30*QPUP&UAe{iGBYTioc0%w!L0`a<38- z{Vg=C9?858VmQ;!56bc8V+>pDxYD%Ot4&@x>ICZHW88#We{>Fu_*On zlJB+Ys8OTbnl;W4Xxrma`q|WznfB8r4{g`XMCr3_3R4rd`| z{y$0^n`_jl;evLQIi?Ic{qjk+jbVMxam-v(ly<|04bwg-?I?3hnW$$+VYV~Ac=2L4 z|K(M8=f|s6tClw5C+Ec{pN7sTwndfkIwSMa4UZZZsd*F%&rjaw2jvo@+H1=#UAiRxM~-8!m#lrx>SYJ<9d!*R;CacKyll>8y=)BP`PHeK zdk<#=a&|1#J})rkX>)#%R2^%O{fwDs0k$3VhYT5#5&IGg!}F3AUX(M0FuS6TuUWGu zeHP*6#|#@bOt)^`Is@>$WZ~iGux3>KNyu>yZ~BR5yQHK` zZQF@skWET&lIu_p5SA~^re+{X8-v!e-xsiR*W{3MQOgx%Q`|AL?##CTZ?~Omr6z=$ zHaT+;3NPDwk+}D;s`Aw1iQPhTRijr`TfOFED>b|FzBcWDll@$i)CdXny3QncWh`RU z8u_g$aze`yq#mh~RzRsss-(_)EY6!OPJL1(b>3%j-e_^^lq#w7UW;I0JL>5Rt#H)S7wRZ3qA%1@+>*XfUaX-nR9>(V%2)iUcR9(loxR53*}`T`a*djhrUo=&Qa=rl`>vm literal 0 HcmV?d00001 diff --git a/jdk/src/windows/native/sun/windows/security_warning_int.ico b/jdk/src/windows/native/sun/windows/security_warning_int.ico new file mode 100644 index 0000000000000000000000000000000000000000..d773dca9e643c9916849428fc601ed4f856cee6b GIT binary patch literal 17542 zcmdU0X>b(B6>boP2vA6n5Dpio!59;+!bu^J5C{%q0ls5a_bF3=#qfaH{x0@$$Z2^)frm%+4NK3b{V@>(}qv zwV3Jm`n3?XL>Ce(*cmBAybz*!bJu+7uY|bIyhsMt->W0Utd>Ib=us`-QHYY( zLcGp8Y(n&BK+ftXI&mev2q2~yM;iV8o9`&Ku$0z6`d>%@U+@XvG0qRA?{yD!{ z*tYVGwLxhcY4+)>w7BH1SJZ11L4X}u*o19w{;@td{UcgbT<#UMYu6^gjx222@eP^y zjLkITmPDMR&OQe)iP5|+P07C)~zc6+DaC-eDMw0 zq1oGL`VW`MapjI7{urX@$esY{Hpp4=QH@bA`LRx6o5>H(v=mg6@?2O)ekg|TNaHChR zUZjO~4YI-X4O?TjeMyV>J6KzKPhv`17DY!#OMq5<$UrvO{$X$IjzhHJ+I>qvrY3yD z=D1J)Ma#|>(#O{;4S_Yt)RceN9lz@v+IpkX5Ll~8-_rl?!<2rmn0DN%@&I__d99}X z!~R=){!P1oe&7M{Lg5=e680XUtRG8g@9hT?pur23e;LE)xwMD<0|`ur(l>lf_~Iz7 zxlkejI@JDU4Ev7J1V$jfohT1f|9}Q^g$M&mg$M_#gopqh3(*F6!YL#0R0s#a0g!~V z77>se=0a&W5l|K3!s9kXz>`=Po;nD13NCF3E?;=9Q^atcq9(wu1#KGNfI0wdx~#i?BR@^QQ)P*riO2ISWncrgw6QCC;K~iO?D{=Z%sGCJoEJ+>*P#m=%AS5iE;lEyfKqusWQ6un z(KPTMvkccD4_$BhV0^|FN+~Kg1aeOJFk6SNK4$%VNY*x)V+OGI7yL>e{ud#LRu)y7`bXi_sf@%qRb(q%#GSSyDmoXK$jYs3?h~ zBc~(}Ymo6~$7&t>>YShMNjMK3qtv5k-1A`UxyS9q-n!_yy*+qXvx?2`+W6hy(q`T} zYXP2JeQ$EugJzsBrtLSYBtQpyUy6OE+WXeTo-={>a@o9}1wecI%>Jxn&*tmC&G~Gb zCO`wZB21!GgbScbL`XaqZ3OT{#7aCB4grw*FNrDOyK3Afd0rIBAEqtC+j)^ZH^JG7 zkHB|@y$be3Dg5rwy7$l)APXJnqIU1NSVXJJs(b=;RNddK&ffHuSLpZS5)9w_+Pwto z$aBvY(9&xa9(dcinBL9a;K73oWc9UYSB>{B*KVKTZ(K)RaE_np8Xjn)cQtC7Gfw1t zyd&R;A5H^4nCZcTj9LBD^?rO--|WEe+_XxA3zW@aLI{9C$T9ZvlVvVLQ(yr#o8|0yK~t z=0a(>5I|Lg3y<3f0X&Iy;iUlGY<{*Qw+!W(crbh+W_7N=rs@&BjF9yLXFARNK992RKYXcxnEP?;_&0#} z^~)B&s-+&nR;^kRpuw}!@nuc+RdCFRUHzbblX>?+P%v`t z0{5A#I(r2#SoXEGCU^Y2-*a9p_GzzYwm0k%Ka?UPBRv3~nY=H2#HjX{Dt0xZ#+81j zGGGjt_$O-Bs+9-83x;id9ZtoLaX@M|&CAQDw4W;j!n|Xr=*>QTsC)PB5}?5g*e=J0 z7_~9$X|p}QFTFF6P5$o{nw*g%0oqr6BYACZp^sb5Y^`V&8&uN^f{2j%{+Pex%^I_2Zm~nSoC?NQQTS{>dHnnW4pXW&M%N>0-){c z8Od4IxV15B=|O3mXyL_cwtB9N`m#nWScJb-3D8C|c6f*Zv1ntnOB?0>`kdcv9yfKC zd;b91OwJqMsHR{${#75-{2#BG*8k1U1;Fq7&U>)*KdprDOptax_Mj_kxgGXrXB##N(XEHoXc9p zYP2?T)8{nzbRjL_URg5?@ck(K&;$CGv)O{WOsF%YWHte1s8O0F@54{R$1$Sic z0(u%0x^?SDMo{Z&gl?ey4gtl#?JG*;K4@)EHfU|XwwBh*L3a$>2qcC;b#eZeSy<-o z@j&m#m`RhVckkXF08jOWV1$k@XNQ5tX{JB+)2}Hhuh89>j{fu|+_RGK*D2JmUq1=Z z;HlnqjL?CuncYzG(f5+W=ep`#)!UeH^>)yDWrFcJaR%(*zNt;zvu_8G_4V917;#$J zKz~qn;T^+%f9*X0$ON;O$SNjZ*2aH!n3A{`K%K3djgWz?FSbJ^i++H0MP>BK%}PUH z&7Youkj20EKa|4H71bA}AF=ip%Y-T(fBc}=Y*R@&?c{qOT4d(m2>IOyzvAcq5GVhQ ztKK;^g6D6)h(B=zqJw_CoGZ87_dY<^RF7UDahmDkp2+O)FHq*C>k^<})ZG!Y7`^dT zkB}O@$@{zRgrcU`$jpwCQ)4a!(T`L;mSRL-QuWC9SokIj_a{}4e4mAHv~ZtN^~m>H z_~4)Wm8wU+-@-Rs1ouz6M){E9U+&S#VPdYvTy~GS8cW$d=4xce5tyry9k;<;jks8Y rxf<048#Q9h1GsPlo*Hra26Hvy0uJVC#AO`J)rbo@n5z+&bA Date: Thu, 26 Mar 2009 08:51:32 -0700 Subject: [PATCH 194/292] 6822263: G1: JVMTI heap iteration fails Make object_iterate() traverse the perm gen Reviewed-by: apetrusenko, tonyp --- .../gc_implementation/g1/g1CollectedHeap.cpp | 17 +++++++++++++---- .../gc_implementation/g1/g1CollectedHeap.hpp | 19 +++++++++++++++---- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp index a1e0262382c..fb4a0c79868 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp @@ -1722,14 +1722,20 @@ public: } }; -void G1CollectedHeap::oop_iterate(OopClosure* cl) { +void G1CollectedHeap::oop_iterate(OopClosure* cl, bool do_perm) { IterateOopClosureRegionClosure blk(_g1_committed, cl); _hrs->iterate(&blk); + if (do_perm) { + perm_gen()->oop_iterate(cl); + } } -void G1CollectedHeap::oop_iterate(MemRegion mr, OopClosure* cl) { +void G1CollectedHeap::oop_iterate(MemRegion mr, OopClosure* cl, bool do_perm) { IterateOopClosureRegionClosure blk(mr, cl); _hrs->iterate(&blk); + if (do_perm) { + perm_gen()->oop_iterate(cl); + } } // Iterates an ObjectClosure over all objects within a HeapRegion. @@ -1746,9 +1752,12 @@ public: } }; -void G1CollectedHeap::object_iterate(ObjectClosure* cl) { +void G1CollectedHeap::object_iterate(ObjectClosure* cl, bool do_perm) { IterateObjectClosureRegionClosure blk(cl); _hrs->iterate(&blk); + if (do_perm) { + perm_gen()->object_iterate(cl); + } } void G1CollectedHeap::object_iterate_since_last_GC(ObjectClosure* cl) { @@ -2375,7 +2384,7 @@ G1CollectedHeap::checkConcurrentMark() { VerifyMarkedObjsClosure verifycl(this); // MutexLockerEx x(getMarkBitMapLock(), // Mutex::_no_safepoint_check_flag); - object_iterate(&verifycl); + object_iterate(&verifycl, false); } void G1CollectedHeap::do_sync_mark() { diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp index 9a3b0b6d9e9..c0eca678db8 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp @@ -865,14 +865,25 @@ public: // Iterate over all the ref-containing fields of all objects, calling // "cl.do_oop" on each. - virtual void oop_iterate(OopClosure* cl); + virtual void oop_iterate(OopClosure* cl) { + oop_iterate(cl, true); + } + void oop_iterate(OopClosure* cl, bool do_perm); // Same as above, restricted to a memory region. - virtual void oop_iterate(MemRegion mr, OopClosure* cl); + virtual void oop_iterate(MemRegion mr, OopClosure* cl) { + oop_iterate(mr, cl, true); + } + void oop_iterate(MemRegion mr, OopClosure* cl, bool do_perm); // Iterate over all objects, calling "cl.do_object" on each. - virtual void object_iterate(ObjectClosure* cl); - virtual void safe_object_iterate(ObjectClosure* cl) { object_iterate(cl); } + virtual void object_iterate(ObjectClosure* cl) { + object_iterate(cl, true); + } + virtual void safe_object_iterate(ObjectClosure* cl) { + object_iterate(cl, true); + } + void object_iterate(ObjectClosure* cl, bool do_perm); // Iterate over all objects allocated since the last collection, calling // "cl.do_object" on each. The heap must have been initialized properly From b63d6d68d93ebc34f8b4091a752eba86ff575fc2 Mon Sep 17 00:00:00 2001 From: Doug Lea Date: Thu, 26 Mar 2009 11:59:07 -0700 Subject: [PATCH 195/292] 6801020: Concurrent Semaphore release may cause some require thread not signaled Introduce PROPAGATE waitStatus Reviewed-by: martin --- .../locks/AbstractQueuedLongSynchronizer.java | 141 +++++++++++++----- .../locks/AbstractQueuedSynchronizer.java | 141 +++++++++++++----- .../concurrent/Semaphore/RacingReleases.java | 116 ++++++++++++++ 3 files changed, 320 insertions(+), 78 deletions(-) create mode 100644 jdk/test/java/util/concurrent/Semaphore/RacingReleases.java diff --git a/jdk/src/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java b/jdk/src/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java index a7f048e8bdb..68135015c29 100644 --- a/jdk/src/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java +++ b/jdk/src/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java @@ -166,6 +166,11 @@ public abstract class AbstractQueuedLongSynchronizer static final int SIGNAL = -1; /** waitStatus value to indicate thread is waiting on condition */ static final int CONDITION = -2; + /** + * waitStatus value to indicate the next acquireShared should + * unconditionally propagate + */ + static final int PROPAGATE = -3; /** * Status field, taking on only the values: @@ -180,10 +185,16 @@ public abstract class AbstractQueuedLongSynchronizer * Nodes never leave this state. In particular, * a thread with cancelled node never again blocks. * CONDITION: This node is currently on a condition queue. - * It will not be used as a sync queue node until - * transferred. (Use of this value here - * has nothing to do with the other uses - * of the field, but simplifies mechanics.) + * It will not be used as a sync queue node + * until transferred, at which time the status + * will be set to 0. (Use of this value here has + * nothing to do with the other uses of the + * field, but simplifies mechanics.) + * PROPAGATE: A releaseShared should be propagated to other + * nodes. This is set (for head node only) in + * doReleaseShared to ensure propagation + * continues, even if other operations have + * since intervened. * 0: None of the above * * The values are arranged numerically to simplify use. @@ -403,10 +414,13 @@ public abstract class AbstractQueuedLongSynchronizer */ private void unparkSuccessor(Node node) { /* - * Try to clear status in anticipation of signalling. It is - * OK if this fails or if status is changed by waiting thread. + * If status is negative (i.e., possibly needing signal) try + * to clear in anticipation of signalling. It is OK if this + * fails or if status is changed by waiting thread. */ - compareAndSetWaitStatus(node, Node.SIGNAL, 0); + int ws = node.waitStatus; + if (ws < 0) + compareAndSetWaitStatus(node, ws, 0); /* * Thread to unpark is held in successor, which is normally @@ -425,24 +439,71 @@ public abstract class AbstractQueuedLongSynchronizer LockSupport.unpark(s.thread); } + /** + * Release action for shared mode -- signal successor and ensure + * propagation. (Note: For exclusive mode, release just amounts + * to calling unparkSuccessor of head if it needs signal.) + */ + private void doReleaseShared() { + /* + * Ensure that a release propagates, even if there are other + * in-progress acquires/releases. This proceeds in the usual + * way of trying to unparkSuccessor of head if it needs + * signal. But if it does not, status is set to PROPAGATE to + * ensure that upon release, propagation continues. + * Additionally, we must loop in case a new node is added + * while we are doing this. Also, unlike other uses of + * unparkSuccessor, we need to know if CAS to reset status + * fails, if so rechecking. + */ + for (;;) { + Node h = head; + if (h != null && h != tail) { + int ws = h.waitStatus; + if (ws == Node.SIGNAL) { + if (!compareAndSetWaitStatus(h, Node.SIGNAL, 0)) + continue; // loop to recheck cases + unparkSuccessor(h); + } + else if (ws == 0 && + !compareAndSetWaitStatus(h, 0, Node.PROPAGATE)) + continue; // loop on failed CAS + } + if (h == head) // loop if head changed + break; + } + } + /** * Sets head of queue, and checks if successor may be waiting - * in shared mode, if so propagating if propagate > 0. + * in shared mode, if so propagating if either propagate > 0 or + * PROPAGATE status was set. * - * @param pred the node holding waitStatus for node * @param node the node * @param propagate the return value from a tryAcquireShared */ private void setHeadAndPropagate(Node node, long propagate) { + Node h = head; // Record old head for check below setHead(node); - if (propagate > 0 && node.waitStatus != 0) { - /* - * Don't bother fully figuring out successor. If it - * looks null, call unparkSuccessor anyway to be safe. - */ + /* + * Try to signal next queued node if: + * Propagation was indicated by caller, + * or was recorded (as h.waitStatus) by a previous operation + * (note: this uses sign-check of waitStatus because + * PROPAGATE status may transition to SIGNAL.) + * and + * The next node is waiting in shared mode, + * or we don't know, because it appears null + * + * The conservatism in both of these checks may cause + * unnecessary wake-ups, but only when there are multiple + * racing acquires/releases, so most need signals now or soon + * anyway. + */ + if (propagate > 0 || h == null || h.waitStatus < 0) { Node s = node.next; if (s == null || s.isShared()) - unparkSuccessor(node); + doReleaseShared(); } } @@ -465,23 +526,27 @@ public abstract class AbstractQueuedLongSynchronizer while (pred.waitStatus > 0) node.prev = pred = pred.prev; - // Getting this before setting waitStatus ensures staleness + // predNext is the apparent node to unsplice. CASes below will + // fail if not, in which case, we lost race vs another cancel + // or signal, so no further action is necessary. Node predNext = pred.next; - // Can use unconditional write instead of CAS here + // Can use unconditional write instead of CAS here. + // After this atomic step, other Nodes can skip past us. + // Before, we are free of interference from other threads. node.waitStatus = Node.CANCELLED; - // If we are the tail, remove ourselves + // If we are the tail, remove ourselves. if (node == tail && compareAndSetTail(node, pred)) { compareAndSetNext(pred, predNext, null); } else { - // If "active" predecessor found... - if (pred != head - && (pred.waitStatus == Node.SIGNAL - || compareAndSetWaitStatus(pred, 0, Node.SIGNAL)) - && pred.thread != null) { - - // If successor is active, set predecessor's next link + // If successor needs signal, try to set pred's next-link + // so it will get one. Otherwise wake it up to propagate. + int ws; + if (pred != head && + ((ws = pred.waitStatus) == Node.SIGNAL || + (ws <= 0 && compareAndSetWaitStatus(pred, ws, Node.SIGNAL))) && + pred.thread != null) { Node next = node.next; if (next != null && next.waitStatus <= 0) compareAndSetNext(pred, predNext, next); @@ -503,14 +568,14 @@ public abstract class AbstractQueuedLongSynchronizer * @return {@code true} if thread should block */ private static boolean shouldParkAfterFailedAcquire(Node pred, Node node) { - int s = pred.waitStatus; - if (s < 0) + int ws = pred.waitStatus; + if (ws == Node.SIGNAL) /* * This node has already set status asking a release * to signal it, so it can safely park. */ return true; - if (s > 0) { + if (ws > 0) { /* * Predecessor was cancelled. Skip over predecessors and * indicate retry. @@ -519,14 +584,14 @@ public abstract class AbstractQueuedLongSynchronizer node.prev = pred = pred.prev; } while (pred.waitStatus > 0); pred.next = node; - } - else + } else { /* - * Indicate that we need a signal, but don't park yet. Caller - * will need to retry to make sure it cannot acquire before - * parking. + * waitStatus must be 0 or PROPAGATE. Indicate that we + * need a signal, but don't park yet. Caller will need to + * retry to make sure it cannot acquire before parking. */ - compareAndSetWaitStatus(pred, 0, Node.SIGNAL); + compareAndSetWaitStatus(pred, ws, Node.SIGNAL); + } return false; } @@ -1046,9 +1111,7 @@ public abstract class AbstractQueuedLongSynchronizer */ public final boolean releaseShared(long arg) { if (tryReleaseShared(arg)) { - Node h = head; - if (h != null && h.waitStatus != 0) - unparkSuccessor(h); + doReleaseShared(); return true; } return false; @@ -1390,8 +1453,8 @@ public abstract class AbstractQueuedLongSynchronizer * case the waitStatus can be transiently and harmlessly wrong). */ Node p = enq(node); - int c = p.waitStatus; - if (c > 0 || !compareAndSetWaitStatus(p, c, Node.SIGNAL)) + int ws = p.waitStatus; + if (ws > 0 || !compareAndSetWaitStatus(p, ws, Node.SIGNAL)) LockSupport.unpark(node.thread); return true; } diff --git a/jdk/src/share/classes/java/util/concurrent/locks/AbstractQueuedSynchronizer.java b/jdk/src/share/classes/java/util/concurrent/locks/AbstractQueuedSynchronizer.java index 39219bb5fd9..8de1cad1d50 100644 --- a/jdk/src/share/classes/java/util/concurrent/locks/AbstractQueuedSynchronizer.java +++ b/jdk/src/share/classes/java/util/concurrent/locks/AbstractQueuedSynchronizer.java @@ -389,6 +389,11 @@ public abstract class AbstractQueuedSynchronizer static final int SIGNAL = -1; /** waitStatus value to indicate thread is waiting on condition */ static final int CONDITION = -2; + /** + * waitStatus value to indicate the next acquireShared should + * unconditionally propagate + */ + static final int PROPAGATE = -3; /** * Status field, taking on only the values: @@ -403,10 +408,16 @@ public abstract class AbstractQueuedSynchronizer * Nodes never leave this state. In particular, * a thread with cancelled node never again blocks. * CONDITION: This node is currently on a condition queue. - * It will not be used as a sync queue node until - * transferred. (Use of this value here - * has nothing to do with the other uses - * of the field, but simplifies mechanics.) + * It will not be used as a sync queue node + * until transferred, at which time the status + * will be set to 0. (Use of this value here has + * nothing to do with the other uses of the + * field, but simplifies mechanics.) + * PROPAGATE: A releaseShared should be propagated to other + * nodes. This is set (for head node only) in + * doReleaseShared to ensure propagation + * continues, even if other operations have + * since intervened. * 0: None of the above * * The values are arranged numerically to simplify use. @@ -626,10 +637,13 @@ public abstract class AbstractQueuedSynchronizer */ private void unparkSuccessor(Node node) { /* - * Try to clear status in anticipation of signalling. It is - * OK if this fails or if status is changed by waiting thread. + * If status is negative (i.e., possibly needing signal) try + * to clear in anticipation of signalling. It is OK if this + * fails or if status is changed by waiting thread. */ - compareAndSetWaitStatus(node, Node.SIGNAL, 0); + int ws = node.waitStatus; + if (ws < 0) + compareAndSetWaitStatus(node, ws, 0); /* * Thread to unpark is held in successor, which is normally @@ -648,24 +662,71 @@ public abstract class AbstractQueuedSynchronizer LockSupport.unpark(s.thread); } + /** + * Release action for shared mode -- signal successor and ensure + * propagation. (Note: For exclusive mode, release just amounts + * to calling unparkSuccessor of head if it needs signal.) + */ + private void doReleaseShared() { + /* + * Ensure that a release propagates, even if there are other + * in-progress acquires/releases. This proceeds in the usual + * way of trying to unparkSuccessor of head if it needs + * signal. But if it does not, status is set to PROPAGATE to + * ensure that upon release, propagation continues. + * Additionally, we must loop in case a new node is added + * while we are doing this. Also, unlike other uses of + * unparkSuccessor, we need to know if CAS to reset status + * fails, if so rechecking. + */ + for (;;) { + Node h = head; + if (h != null && h != tail) { + int ws = h.waitStatus; + if (ws == Node.SIGNAL) { + if (!compareAndSetWaitStatus(h, Node.SIGNAL, 0)) + continue; // loop to recheck cases + unparkSuccessor(h); + } + else if (ws == 0 && + !compareAndSetWaitStatus(h, 0, Node.PROPAGATE)) + continue; // loop on failed CAS + } + if (h == head) // loop if head changed + break; + } + } + /** * Sets head of queue, and checks if successor may be waiting - * in shared mode, if so propagating if propagate > 0. + * in shared mode, if so propagating if either propagate > 0 or + * PROPAGATE status was set. * - * @param pred the node holding waitStatus for node * @param node the node * @param propagate the return value from a tryAcquireShared */ private void setHeadAndPropagate(Node node, int propagate) { + Node h = head; // Record old head for check below setHead(node); - if (propagate > 0 && node.waitStatus != 0) { - /* - * Don't bother fully figuring out successor. If it - * looks null, call unparkSuccessor anyway to be safe. - */ + /* + * Try to signal next queued node if: + * Propagation was indicated by caller, + * or was recorded (as h.waitStatus) by a previous operation + * (note: this uses sign-check of waitStatus because + * PROPAGATE status may transition to SIGNAL.) + * and + * The next node is waiting in shared mode, + * or we don't know, because it appears null + * + * The conservatism in both of these checks may cause + * unnecessary wake-ups, but only when there are multiple + * racing acquires/releases, so most need signals now or soon + * anyway. + */ + if (propagate > 0 || h == null || h.waitStatus < 0) { Node s = node.next; if (s == null || s.isShared()) - unparkSuccessor(node); + doReleaseShared(); } } @@ -688,23 +749,27 @@ public abstract class AbstractQueuedSynchronizer while (pred.waitStatus > 0) node.prev = pred = pred.prev; - // Getting this before setting waitStatus ensures staleness + // predNext is the apparent node to unsplice. CASes below will + // fail if not, in which case, we lost race vs another cancel + // or signal, so no further action is necessary. Node predNext = pred.next; - // Can use unconditional write instead of CAS here + // Can use unconditional write instead of CAS here. + // After this atomic step, other Nodes can skip past us. + // Before, we are free of interference from other threads. node.waitStatus = Node.CANCELLED; - // If we are the tail, remove ourselves + // If we are the tail, remove ourselves. if (node == tail && compareAndSetTail(node, pred)) { compareAndSetNext(pred, predNext, null); } else { - // If "active" predecessor found... - if (pred != head - && (pred.waitStatus == Node.SIGNAL - || compareAndSetWaitStatus(pred, 0, Node.SIGNAL)) - && pred.thread != null) { - - // If successor is active, set predecessor's next link + // If successor needs signal, try to set pred's next-link + // so it will get one. Otherwise wake it up to propagate. + int ws; + if (pred != head && + ((ws = pred.waitStatus) == Node.SIGNAL || + (ws <= 0 && compareAndSetWaitStatus(pred, ws, Node.SIGNAL))) && + pred.thread != null) { Node next = node.next; if (next != null && next.waitStatus <= 0) compareAndSetNext(pred, predNext, next); @@ -726,14 +791,14 @@ public abstract class AbstractQueuedSynchronizer * @return {@code true} if thread should block */ private static boolean shouldParkAfterFailedAcquire(Node pred, Node node) { - int s = pred.waitStatus; - if (s < 0) + int ws = pred.waitStatus; + if (ws == Node.SIGNAL) /* * This node has already set status asking a release * to signal it, so it can safely park. */ return true; - if (s > 0) { + if (ws > 0) { /* * Predecessor was cancelled. Skip over predecessors and * indicate retry. @@ -742,14 +807,14 @@ public abstract class AbstractQueuedSynchronizer node.prev = pred = pred.prev; } while (pred.waitStatus > 0); pred.next = node; - } - else + } else { /* - * Indicate that we need a signal, but don't park yet. Caller - * will need to retry to make sure it cannot acquire before - * parking. + * waitStatus must be 0 or PROPAGATE. Indicate that we + * need a signal, but don't park yet. Caller will need to + * retry to make sure it cannot acquire before parking. */ - compareAndSetWaitStatus(pred, 0, Node.SIGNAL); + compareAndSetWaitStatus(pred, ws, Node.SIGNAL); + } return false; } @@ -1269,9 +1334,7 @@ public abstract class AbstractQueuedSynchronizer */ public final boolean releaseShared(int arg) { if (tryReleaseShared(arg)) { - Node h = head; - if (h != null && h.waitStatus != 0) - unparkSuccessor(h); + doReleaseShared(); return true; } return false; @@ -1613,8 +1676,8 @@ public abstract class AbstractQueuedSynchronizer * case the waitStatus can be transiently and harmlessly wrong). */ Node p = enq(node); - int c = p.waitStatus; - if (c > 0 || !compareAndSetWaitStatus(p, c, Node.SIGNAL)) + int ws = p.waitStatus; + if (ws > 0 || !compareAndSetWaitStatus(p, ws, Node.SIGNAL)) LockSupport.unpark(node.thread); return true; } diff --git a/jdk/test/java/util/concurrent/Semaphore/RacingReleases.java b/jdk/test/java/util/concurrent/Semaphore/RacingReleases.java new file mode 100644 index 00000000000..c1c573f443f --- /dev/null +++ b/jdk/test/java/util/concurrent/Semaphore/RacingReleases.java @@ -0,0 +1,116 @@ +/* + * 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. + */ + +/* + * This file is available under and governed by the GNU General Public + * License version 2 only, as published by the Free Software Foundation. + * However, the following notice accompanied the original version of this + * file: + * + * Written by Doug Lea with assistance from members of JCP JSR-166 + * Expert Group and released to the public domain, as explained at + * http://creativecommons.org/licenses/publicdomain + */ + +/* + * @test + * @bug 6801020 6803402 + * @summary Try to tickle race conditions in + * AbstractQueuedSynchronizer "shared" code + */ + +import java.util.concurrent.Semaphore; + +public class RacingReleases { + + /** Increase this for better chance of tickling races */ + static final int iterations = 1000; + + public static void test(final boolean fair, + final boolean interruptibly) + throws Throwable { + for (int i = 0; i < iterations; i++) { + final Semaphore sem = new Semaphore(0, fair); + final Throwable[] badness = new Throwable[1]; + Runnable blocker = interruptibly ? + new Runnable() { + public void run() { + try { + sem.acquire(); + } catch (Throwable t) { + badness[0] = t; + throw new Error(t); + }}} + : + new Runnable() { + public void run() { + try { + sem.acquireUninterruptibly(); + } catch (Throwable t) { + badness[0] = t; + throw new Error(t); + }}}; + + Thread b1 = new Thread(blocker); + Thread b2 = new Thread(blocker); + Runnable signaller = new Runnable() { + public void run() { + try { + sem.release(); + } catch (Throwable t) { + badness[0] = t; + throw new Error(t); + }}}; + Thread s1 = new Thread(signaller); + Thread s2 = new Thread(signaller); + Thread[] threads = { b1, b2, s1, s2 }; + java.util.Collections.shuffle(java.util.Arrays.asList(threads)); + for (Thread thread : threads) + thread.start(); + for (Thread thread : threads) { + thread.join(60 * 1000); + if (thread.isAlive()) + throw new Error + (String.format + ("Semaphore stuck: permits %d, thread waiting %s%n", + sem.availablePermits(), + sem.hasQueuedThreads() ? "true" : "false")); + } + if (badness[0] != null) + throw new Error(badness[0]); + if (sem.availablePermits() != 0) + throw new Error(String.valueOf(sem.availablePermits())); + if (sem.hasQueuedThreads()) + throw new Error(String.valueOf(sem.hasQueuedThreads())); + if (sem.getQueueLength() != 0) + throw new Error(String.valueOf(sem.getQueueLength())); + if (sem.isFair() != fair) + throw new Error(String.valueOf(sem.isFair())); + } + } + + public static void main(String[] args) throws Throwable { + for (boolean fair : new boolean[] { true, false }) + for (boolean interruptibly : new boolean[] { true, false }) + test(fair, interruptibly); + } +} From 134debb0ba7e772ea8c54f500d052a22f869a67f Mon Sep 17 00:00:00 2001 From: Tom Rodriguez Date: Thu, 26 Mar 2009 14:31:45 -0700 Subject: [PATCH 196/292] 6822204: volatile fences should prefer lock:addl to actual mfence instructions Reviewed-by: kvn, phh --- .../src/cpu/sparc/vm/stubGenerator_sparc.cpp | 16 ------- hotspot/src/cpu/x86/vm/assembler_x86.cpp | 24 ++-------- hotspot/src/cpu/x86/vm/assembler_x86.hpp | 24 ++++++---- .../src/cpu/x86/vm/stubGenerator_x86_64.cpp | 2 +- hotspot/src/cpu/x86/vm/x86_32.ad | 46 ++++++++---------- hotspot/src/cpu/x86/vm/x86_64.ad | 48 ++++++------------- .../os_cpu/linux_sparc/vm/os_linux_sparc.hpp | 2 - .../vm/orderAccess_linux_x86.inline.hpp | 5 +- .../vm/orderAccess_solaris_sparc.inline.hpp | 12 ----- .../solaris_sparc/vm/os_solaris_sparc.cpp | 16 ------- .../solaris_sparc/vm/os_solaris_sparc.hpp | 2 - .../vm/orderAccess_solaris_x86.inline.hpp | 5 +- .../os_cpu/solaris_x86/vm/os_solaris_x86.cpp | 16 ------- .../os_cpu/solaris_x86/vm/os_solaris_x86.hpp | 2 - .../vm/orderAccess_windows_x86.inline.hpp | 2 +- .../os_cpu/windows_x86/vm/os_windows_x86.cpp | 17 ------- .../os_cpu/windows_x86/vm/os_windows_x86.hpp | 5 -- hotspot/src/share/vm/includeDB_core | 2 + hotspot/src/share/vm/runtime/orderAccess.cpp | 12 +++++ hotspot/src/share/vm/runtime/orderAccess.hpp | 6 +++ 20 files changed, 81 insertions(+), 183 deletions(-) diff --git a/hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp b/hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp index e4a3806da86..62c201605e5 100644 --- a/hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp +++ b/hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp @@ -817,21 +817,6 @@ class StubGenerator: public StubCodeGenerator { Label _atomic_add_stub; // called from other stubs - // Support for void OrderAccess::fence(). - // - address generate_fence() { - StubCodeMark mark(this, "StubRoutines", "fence"); - address start = __ pc(); - - __ membar(Assembler::Membar_mask_bits(Assembler::LoadLoad | Assembler::LoadStore | - Assembler::StoreLoad | Assembler::StoreStore)); - __ retl(false); - __ delayed()->nop(); - - return start; - } - - //------------------------------------------------------------------------------------------------------------------------ // The following routine generates a subroutine to throw an asynchronous // UnknownError when an unsafe access gets a fault that could not be @@ -2861,7 +2846,6 @@ class StubGenerator: public StubCodeGenerator { StubRoutines::_atomic_cmpxchg_ptr_entry = StubRoutines::_atomic_cmpxchg_entry; StubRoutines::_atomic_cmpxchg_long_entry = generate_atomic_cmpxchg_long(); StubRoutines::_atomic_add_ptr_entry = StubRoutines::_atomic_add_entry; - StubRoutines::_fence_entry = generate_fence(); #endif // COMPILER2 !=> _LP64 } diff --git a/hotspot/src/cpu/x86/vm/assembler_x86.cpp b/hotspot/src/cpu/x86/vm/assembler_x86.cpp index 351ae044728..dbf2f2b664a 100644 --- a/hotspot/src/cpu/x86/vm/assembler_x86.cpp +++ b/hotspot/src/cpu/x86/vm/assembler_x86.cpp @@ -1438,26 +1438,12 @@ void Assembler::lock() { } } -// Serializes memory. +// Emit mfence instruction void Assembler::mfence() { - // Memory barriers are only needed on multiprocessors - if (os::is_MP()) { - if( LP64_ONLY(true ||) VM_Version::supports_sse2() ) { - emit_byte( 0x0F ); // MFENCE; faster blows no regs - emit_byte( 0xAE ); - emit_byte( 0xF0 ); - } else { - // All usable chips support "locked" instructions which suffice - // as barriers, and are much faster than the alternative of - // using cpuid instruction. We use here a locked add [esp],0. - // This is conveniently otherwise a no-op except for blowing - // flags (which we save and restore.) - pushf(); // Save eflags register - lock(); - addl(Address(rsp, 0), 0);// Assert the lock# signal here - popf(); // Restore eflags register - } - } + NOT_LP64(assert(VM_Version::supports_sse2(), "unsupported");) + emit_byte( 0x0F ); + emit_byte( 0xAE ); + emit_byte( 0xF0 ); } void Assembler::mov(Register dst, Register src) { diff --git a/hotspot/src/cpu/x86/vm/assembler_x86.hpp b/hotspot/src/cpu/x86/vm/assembler_x86.hpp index 4dfe7fec22e..a5efad8d22b 100644 --- a/hotspot/src/cpu/x86/vm/assembler_x86.hpp +++ b/hotspot/src/cpu/x86/vm/assembler_x86.hpp @@ -1068,15 +1068,23 @@ private: LoadLoad = 1 << 0 }; - // Serializes memory. + // Serializes memory and blows flags void membar(Membar_mask_bits order_constraint) { - // We only have to handle StoreLoad and LoadLoad - if (order_constraint & StoreLoad) { - // MFENCE subsumes LFENCE - mfence(); - } /* [jk] not needed currently: else if (order_constraint & LoadLoad) { - lfence(); - } */ + if (os::is_MP()) { + // We only have to handle StoreLoad + if (order_constraint & StoreLoad) { + // All usable chips support "locked" instructions which suffice + // as barriers, and are much faster than the alternative of + // using cpuid instruction. We use here a locked add [esp],0. + // This is conveniently otherwise a no-op except for blowing + // flags. + // Any change to this code may need to revisit other places in + // the code where this idiom is used, in particular the + // orderAccess code. + lock(); + addl(Address(rsp, 0), 0);// Assert the lock# signal here + } + } } void mfence(); diff --git a/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp b/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp index 73d60542a4d..ec322b527d1 100644 --- a/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp +++ b/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp @@ -637,7 +637,7 @@ class StubGenerator: public StubCodeGenerator { address generate_orderaccess_fence() { StubCodeMark mark(this, "StubRoutines", "orderaccess_fence"); address start = __ pc(); - __ mfence(); + __ membar(Assembler::StoreLoad); __ ret(0); return start; diff --git a/hotspot/src/cpu/x86/vm/x86_32.ad b/hotspot/src/cpu/x86/vm/x86_32.ad index 479adb1cbfd..cd64cfbf9f2 100644 --- a/hotspot/src/cpu/x86/vm/x86_32.ad +++ b/hotspot/src/cpu/x86/vm/x86_32.ad @@ -4288,24 +4288,6 @@ encode %{ emit_opcode(cbuf, 0xC8 + $src2$$reg); %} - enc_class enc_membar_acquire %{ - // Doug Lea believes this is not needed with current Sparcs and TSO. - // MacroAssembler masm(&cbuf); - // masm.membar(); - %} - - enc_class enc_membar_release %{ - // Doug Lea believes this is not needed with current Sparcs and TSO. - // MacroAssembler masm(&cbuf); - // masm.membar(); - %} - - enc_class enc_membar_volatile %{ - MacroAssembler masm(&cbuf); - masm.membar(Assembler::Membar_mask_bits(Assembler::StoreLoad | - Assembler::StoreStore)); - %} - // Atomically load the volatile long enc_class enc_loadL_volatile( memory mem, stackSlotL dst ) %{ emit_opcode(cbuf,0xDF); @@ -7498,9 +7480,9 @@ instruct membar_acquire() %{ ins_cost(400); size(0); - format %{ "MEMBAR-acquire" %} - ins_encode( enc_membar_acquire ); - ins_pipe(pipe_slow); + format %{ "MEMBAR-acquire ! (empty encoding)" %} + ins_encode(); + ins_pipe(empty); %} instruct membar_acquire_lock() %{ @@ -7519,9 +7501,9 @@ instruct membar_release() %{ ins_cost(400); size(0); - format %{ "MEMBAR-release" %} - ins_encode( enc_membar_release ); - ins_pipe(pipe_slow); + format %{ "MEMBAR-release ! (empty encoding)" %} + ins_encode( ); + ins_pipe(empty); %} instruct membar_release_lock() %{ @@ -7535,12 +7517,22 @@ instruct membar_release_lock() %{ ins_pipe(empty); %} -instruct membar_volatile() %{ +instruct membar_volatile(eFlagsReg cr) %{ match(MemBarVolatile); + effect(KILL cr); ins_cost(400); - format %{ "MEMBAR-volatile" %} - ins_encode( enc_membar_volatile ); + format %{ + $$template + if (os::is_MP()) { + $$emit$$"LOCK ADDL [ESP + #0], 0\t! membar_volatile" + } else { + $$emit$$"MEMBAR-volatile ! (empty encoding)" + } + %} + ins_encode %{ + __ membar(Assembler::StoreLoad); + %} ins_pipe(pipe_slow); %} diff --git a/hotspot/src/cpu/x86/vm/x86_64.ad b/hotspot/src/cpu/x86/vm/x86_64.ad index 0705c2a009e..ae23fef1114 100644 --- a/hotspot/src/cpu/x86/vm/x86_64.ad +++ b/hotspot/src/cpu/x86/vm/x86_64.ad @@ -4162,33 +4162,6 @@ encode %{ // done: %} - enc_class enc_membar_acquire - %{ - // [jk] not needed currently, if you enable this and it really - // emits code don't forget to the remove the "size(0)" line in - // membar_acquire() - // MacroAssembler masm(&cbuf); - // masm.membar(Assembler::Membar_mask_bits(Assembler::LoadStore | - // Assembler::LoadLoad)); - %} - - enc_class enc_membar_release - %{ - // [jk] not needed currently, if you enable this and it really - // emits code don't forget to the remove the "size(0)" line in - // membar_release() - // MacroAssembler masm(&cbuf); - // masm.membar(Assembler::Membar_mask_bits(Assembler::LoadStore | - // Assembler::StoreStore)); - %} - - enc_class enc_membar_volatile - %{ - MacroAssembler masm(&cbuf); - masm.membar(Assembler::Membar_mask_bits(Assembler::StoreLoad | - Assembler::StoreStore)); - %} - // Safepoint Poll. This polls the safepoint page, and causes an // exception if it is not readable. Unfortunately, it kills // RFLAGS in the process. @@ -7458,7 +7431,7 @@ instruct membar_acquire() ins_cost(0); size(0); - format %{ "MEMBAR-acquire" %} + format %{ "MEMBAR-acquire ! (empty encoding)" %} ins_encode(); ins_pipe(empty); %} @@ -7481,7 +7454,7 @@ instruct membar_release() ins_cost(0); size(0); - format %{ "MEMBAR-release" %} + format %{ "MEMBAR-release ! (empty encoding)" %} ins_encode(); ins_pipe(empty); %} @@ -7498,13 +7471,22 @@ instruct membar_release_lock() ins_pipe(empty); %} -instruct membar_volatile() -%{ +instruct membar_volatile(rFlagsReg cr) %{ match(MemBarVolatile); + effect(KILL cr); ins_cost(400); - format %{ "MEMBAR-volatile" %} - ins_encode(enc_membar_volatile); + format %{ + $$template + if (os::is_MP()) { + $$emit$$"lock addl [rsp + #0], 0\t! membar_volatile" + } else { + $$emit$$"MEMBAR-volatile ! (empty encoding)" + } + %} + ins_encode %{ + __ membar(Assembler::StoreLoad); + %} ins_pipe(pipe_slow); %} diff --git a/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.hpp b/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.hpp index 4c74a6af6ab..865cd1ce0f1 100644 --- a/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.hpp +++ b/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.hpp @@ -29,13 +29,11 @@ static jint (*atomic_cmpxchg_func) (jint, volatile jint*, jint); static jlong (*atomic_cmpxchg_long_func)(jlong, volatile jlong*, jlong); static jint (*atomic_add_func) (jint, volatile jint*); - static void (*fence_func) (); static jint atomic_xchg_bootstrap (jint, volatile jint*); static jint atomic_cmpxchg_bootstrap (jint, volatile jint*, jint); static jlong atomic_cmpxchg_long_bootstrap(jlong, volatile jlong*, jlong); static jint atomic_add_bootstrap (jint, volatile jint*); - static void fence_bootstrap (); static void setup_fpu() {} diff --git a/hotspot/src/os_cpu/linux_x86/vm/orderAccess_linux_x86.inline.hpp b/hotspot/src/os_cpu/linux_x86/vm/orderAccess_linux_x86.inline.hpp index 2b5f3ec0ac5..9777b0a131d 100644 --- a/hotspot/src/os_cpu/linux_x86/vm/orderAccess_linux_x86.inline.hpp +++ b/hotspot/src/os_cpu/linux_x86/vm/orderAccess_linux_x86.inline.hpp @@ -44,11 +44,12 @@ inline void OrderAccess::release() { inline void OrderAccess::fence() { if (os::is_MP()) { + // always use locked addl since mfence is sometimes expensive #ifdef AMD64 - __asm__ __volatile__ ("mfence":::"memory"); + __asm__ volatile ("lock; addl $0,0(%%rsp)" : : : "cc", "memory"); #else __asm__ volatile ("lock; addl $0,0(%%esp)" : : : "cc", "memory"); -#endif // AMD64 +#endif } } diff --git a/hotspot/src/os_cpu/solaris_sparc/vm/orderAccess_solaris_sparc.inline.hpp b/hotspot/src/os_cpu/solaris_sparc/vm/orderAccess_solaris_sparc.inline.hpp index c80d89157e4..5e27aefb977 100644 --- a/hotspot/src/os_cpu/solaris_sparc/vm/orderAccess_solaris_sparc.inline.hpp +++ b/hotspot/src/os_cpu/solaris_sparc/vm/orderAccess_solaris_sparc.inline.hpp @@ -60,22 +60,10 @@ inline void OrderAccess::release() { dummy = 0; } -#if defined(COMPILER2) || defined(_LP64) - inline void OrderAccess::fence() { _OrderAccess_fence(); } -#else // defined(COMPILER2) || defined(_LP64) - -inline void OrderAccess::fence() { - if (os::is_MP()) { - (*os::fence_func)(); - } -} - -#endif // defined(COMPILER2) || defined(_LP64) - #endif // _GNU_SOURCE inline jbyte OrderAccess::load_acquire(volatile jbyte* p) { return *p; } diff --git a/hotspot/src/os_cpu/solaris_sparc/vm/os_solaris_sparc.cpp b/hotspot/src/os_cpu/solaris_sparc/vm/os_solaris_sparc.cpp index 802934511af..44b67e9d035 100644 --- a/hotspot/src/os_cpu/solaris_sparc/vm/os_solaris_sparc.cpp +++ b/hotspot/src/os_cpu/solaris_sparc/vm/os_solaris_sparc.cpp @@ -619,7 +619,6 @@ typedef jint xchg_func_t (jint, volatile jint*); typedef jint cmpxchg_func_t (jint, volatile jint*, jint); typedef jlong cmpxchg_long_func_t(jlong, volatile jlong*, jlong); typedef jint add_func_t (jint, volatile jint*); -typedef void fence_func_t (); jint os::atomic_xchg_bootstrap(jint exchange_value, volatile jint* dest) { // try to use the stub: @@ -681,25 +680,10 @@ jint os::atomic_add_bootstrap(jint add_value, volatile jint* dest) { return (*dest) += add_value; } -void os::fence_bootstrap() { - // try to use the stub: - fence_func_t* func = CAST_TO_FN_PTR(fence_func_t*, StubRoutines::fence_entry()); - - if (func != NULL) { - os::fence_func = func; - (*func)(); - return; - } - assert(Threads::number_of_threads() == 0, "for bootstrap only"); - - // don't have to do anything for a single thread -} - xchg_func_t* os::atomic_xchg_func = os::atomic_xchg_bootstrap; cmpxchg_func_t* os::atomic_cmpxchg_func = os::atomic_cmpxchg_bootstrap; cmpxchg_long_func_t* os::atomic_cmpxchg_long_func = os::atomic_cmpxchg_long_bootstrap; add_func_t* os::atomic_add_func = os::atomic_add_bootstrap; -fence_func_t* os::fence_func = os::fence_bootstrap; #endif // !_LP64 && !COMPILER2 diff --git a/hotspot/src/os_cpu/solaris_sparc/vm/os_solaris_sparc.hpp b/hotspot/src/os_cpu/solaris_sparc/vm/os_solaris_sparc.hpp index f522b038507..62fee83dd25 100644 --- a/hotspot/src/os_cpu/solaris_sparc/vm/os_solaris_sparc.hpp +++ b/hotspot/src/os_cpu/solaris_sparc/vm/os_solaris_sparc.hpp @@ -29,13 +29,11 @@ static jint (*atomic_cmpxchg_func) (jint, volatile jint*, jint); static jlong (*atomic_cmpxchg_long_func)(jlong, volatile jlong*, jlong); static jint (*atomic_add_func) (jint, volatile jint*); - static void (*fence_func) (); static jint atomic_xchg_bootstrap (jint, volatile jint*); static jint atomic_cmpxchg_bootstrap (jint, volatile jint*, jint); static jlong atomic_cmpxchg_long_bootstrap(jlong, volatile jlong*, jlong); static jint atomic_add_bootstrap (jint, volatile jint*); - static void fence_bootstrap (); static void setup_fpu() {} diff --git a/hotspot/src/os_cpu/solaris_x86/vm/orderAccess_solaris_x86.inline.hpp b/hotspot/src/os_cpu/solaris_x86/vm/orderAccess_solaris_x86.inline.hpp index ed8486f746f..bf4d97d21b4 100644 --- a/hotspot/src/os_cpu/solaris_x86/vm/orderAccess_solaris_x86.inline.hpp +++ b/hotspot/src/os_cpu/solaris_x86/vm/orderAccess_solaris_x86.inline.hpp @@ -61,11 +61,8 @@ extern "C" { #endif // AMD64 } inline void _OrderAccess_fence() { -#ifdef AMD64 - __asm__ __volatile__ ("mfence":::"memory"); -#else + // Always use locked addl since mfence is sometimes expensive __asm__ volatile ("lock; addl $0,0(%%esp)" : : : "cc", "memory"); -#endif // AMD64 } } diff --git a/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp b/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp index e6b1edca5a4..59ed458b23f 100644 --- a/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp +++ b/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp @@ -794,7 +794,6 @@ typedef jint xchg_func_t (jint, volatile jint*); typedef jint cmpxchg_func_t (jint, volatile jint*, jint); typedef jlong cmpxchg_long_func_t(jlong, volatile jlong*, jlong); typedef jint add_func_t (jint, volatile jint*); -typedef void fence_func_t (); jint os::atomic_xchg_bootstrap(jint exchange_value, volatile jint* dest) { // try to use the stub: @@ -856,25 +855,10 @@ jint os::atomic_add_bootstrap(jint add_value, volatile jint* dest) { return (*dest) += add_value; } -void os::fence_bootstrap() { - // try to use the stub: - fence_func_t* func = CAST_TO_FN_PTR(fence_func_t*, StubRoutines::fence_entry()); - - if (func != NULL) { - os::fence_func = func; - (*func)(); - return; - } - assert(Threads::number_of_threads() == 0, "for bootstrap only"); - - // don't have to do anything for a single thread -} - xchg_func_t* os::atomic_xchg_func = os::atomic_xchg_bootstrap; cmpxchg_func_t* os::atomic_cmpxchg_func = os::atomic_cmpxchg_bootstrap; cmpxchg_long_func_t* os::atomic_cmpxchg_long_func = os::atomic_cmpxchg_long_bootstrap; add_func_t* os::atomic_add_func = os::atomic_add_bootstrap; -fence_func_t* os::fence_func = os::fence_bootstrap; extern "C" _solaris_raw_setup_fpu(address ptr); void os::setup_fpu() { diff --git a/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.hpp b/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.hpp index fd5707cbe37..3a02d11965d 100644 --- a/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.hpp +++ b/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.hpp @@ -32,13 +32,11 @@ static jint (*atomic_cmpxchg_func) (jint, volatile jint*, jint); static jlong (*atomic_cmpxchg_long_func)(jlong, volatile jlong*, jlong); static jint (*atomic_add_func) (jint, volatile jint*); - static void (*fence_func) (); static jint atomic_xchg_bootstrap (jint, volatile jint*); static jint atomic_cmpxchg_bootstrap (jint, volatile jint*, jint); static jlong atomic_cmpxchg_long_bootstrap(jlong, volatile jlong*, jlong); static jint atomic_add_bootstrap (jint, volatile jint*); - static void fence_bootstrap (); static void setup_fpu(); #endif // AMD64 diff --git a/hotspot/src/os_cpu/windows_x86/vm/orderAccess_windows_x86.inline.hpp b/hotspot/src/os_cpu/windows_x86/vm/orderAccess_windows_x86.inline.hpp index b0a98bb0bab..1e53ed1aaa1 100644 --- a/hotspot/src/os_cpu/windows_x86/vm/orderAccess_windows_x86.inline.hpp +++ b/hotspot/src/os_cpu/windows_x86/vm/orderAccess_windows_x86.inline.hpp @@ -46,7 +46,7 @@ inline void OrderAccess::release() { inline void OrderAccess::fence() { #ifdef AMD64 - (*os::fence_func)(); + StubRoutines_fence(); #else if (os::is_MP()) { __asm { diff --git a/hotspot/src/os_cpu/windows_x86/vm/os_windows_x86.cpp b/hotspot/src/os_cpu/windows_x86/vm/os_windows_x86.cpp index 27b6af946d6..e322f5fd1e8 100644 --- a/hotspot/src/os_cpu/windows_x86/vm/os_windows_x86.cpp +++ b/hotspot/src/os_cpu/windows_x86/vm/os_windows_x86.cpp @@ -196,7 +196,6 @@ typedef jint cmpxchg_func_t (jint, volatile jint*, jint); typedef jlong cmpxchg_long_func_t (jlong, volatile jlong*, jlong); typedef jint add_func_t (jint, volatile jint*); typedef intptr_t add_ptr_func_t (intptr_t, volatile intptr_t*); -typedef void fence_func_t (); #ifdef AMD64 @@ -292,27 +291,11 @@ intptr_t os::atomic_add_ptr_bootstrap(intptr_t add_value, volatile intptr_t* des return (*dest) += add_value; } -void os::fence_bootstrap() { - // try to use the stub: - fence_func_t* func = CAST_TO_FN_PTR(fence_func_t*, StubRoutines::fence_entry()); - - if (func != NULL) { - os::fence_func = func; - (*func)(); - return; - } - assert(Threads::number_of_threads() == 0, "for bootstrap only"); - - // don't have to do anything for a single thread -} - - xchg_func_t* os::atomic_xchg_func = os::atomic_xchg_bootstrap; xchg_ptr_func_t* os::atomic_xchg_ptr_func = os::atomic_xchg_ptr_bootstrap; cmpxchg_func_t* os::atomic_cmpxchg_func = os::atomic_cmpxchg_bootstrap; add_func_t* os::atomic_add_func = os::atomic_add_bootstrap; add_ptr_func_t* os::atomic_add_ptr_func = os::atomic_add_ptr_bootstrap; -fence_func_t* os::fence_func = os::fence_bootstrap; #endif // AMD64 diff --git a/hotspot/src/os_cpu/windows_x86/vm/os_windows_x86.hpp b/hotspot/src/os_cpu/windows_x86/vm/os_windows_x86.hpp index d7578101677..1e0c6b334b5 100644 --- a/hotspot/src/os_cpu/windows_x86/vm/os_windows_x86.hpp +++ b/hotspot/src/os_cpu/windows_x86/vm/os_windows_x86.hpp @@ -35,9 +35,6 @@ static jint (*atomic_add_func) (jint, volatile jint*); static intptr_t (*atomic_add_ptr_func) (intptr_t, volatile intptr_t*); - static void (*fence_func) (); - - static jint atomic_xchg_bootstrap (jint, volatile jint*); static intptr_t atomic_xchg_ptr_bootstrap (intptr_t, volatile intptr_t*); @@ -53,8 +50,6 @@ #ifdef AMD64 static jint atomic_add_bootstrap (jint, volatile jint*); static intptr_t atomic_add_ptr_bootstrap (intptr_t, volatile intptr_t*); - - static void fence_bootstrap (); #endif // AMD64 static void setup_fpu(); diff --git a/hotspot/src/share/vm/includeDB_core b/hotspot/src/share/vm/includeDB_core index b75a1ab39a8..a88800f29f0 100644 --- a/hotspot/src/share/vm/includeDB_core +++ b/hotspot/src/share/vm/includeDB_core @@ -3154,6 +3154,8 @@ oopsHierarchy.cpp thread.hpp oopsHierarchy.cpp thread_.inline.hpp orderAccess.cpp orderAccess.hpp +orderAccess.cpp stubRoutines.hpp +orderAccess.cpp thread.hpp orderAccess.hpp allocation.hpp orderAccess.hpp os.hpp diff --git a/hotspot/src/share/vm/runtime/orderAccess.cpp b/hotspot/src/share/vm/runtime/orderAccess.cpp index 392b5978126..1e66d6258f5 100644 --- a/hotspot/src/share/vm/runtime/orderAccess.cpp +++ b/hotspot/src/share/vm/runtime/orderAccess.cpp @@ -26,3 +26,15 @@ # include "incls/_orderAccess.cpp.incl" volatile intptr_t OrderAccess::dummy = 0; + +void OrderAccess::StubRoutines_fence() { + // Use a stub if it exists. It may not exist during bootstrap so do + // nothing in that case but assert if no fence code exists after threads have been created + void (*func)() = CAST_TO_FN_PTR(void (*)(), StubRoutines::fence_entry()); + + if (func != NULL) { + (*func)(); + return; + } + assert(Threads::number_of_threads() == 0, "for bootstrap only"); +} diff --git a/hotspot/src/share/vm/runtime/orderAccess.hpp b/hotspot/src/share/vm/runtime/orderAccess.hpp index c51a9229735..d6b83466da5 100644 --- a/hotspot/src/share/vm/runtime/orderAccess.hpp +++ b/hotspot/src/share/vm/runtime/orderAccess.hpp @@ -300,4 +300,10 @@ class OrderAccess : AllStatic { // In order to force a memory access, implementations may // need a volatile externally visible dummy variable. static volatile intptr_t dummy; + + private: + // This is a helper that invokes the StubRoutines::fence_entry() + // routine if it exists, It should only be used by platforms that + // don't another way to do the inline eassembly. + static void StubRoutines_fence(); }; From 68cf08d2c36e55b68aa5aea0b30fedceba4582c6 Mon Sep 17 00:00:00 2001 From: Vladimir Kozlov Date: Thu, 26 Mar 2009 15:04:55 -0700 Subject: [PATCH 197/292] 6810845: Performance regression in mpegaudio on x64 Used the outer loop frequency in frequencies checks in RA. Reviewed-by: never, twisti --- hotspot/src/share/vm/opto/block.hpp | 2 ++ hotspot/src/share/vm/opto/c2_globals.hpp | 4 ++-- hotspot/src/share/vm/opto/chaitin.cpp | 3 +++ hotspot/src/share/vm/opto/chaitin.hpp | 4 ++++ hotspot/src/share/vm/opto/coalesce.cpp | 4 ++-- hotspot/src/share/vm/opto/gcm.cpp | 12 ++++++++++++ hotspot/src/share/vm/opto/machnode.cpp | 5 +++++ 7 files changed, 30 insertions(+), 4 deletions(-) diff --git a/hotspot/src/share/vm/opto/block.hpp b/hotspot/src/share/vm/opto/block.hpp index f4c46ba2a50..aac5105d66a 100644 --- a/hotspot/src/share/vm/opto/block.hpp +++ b/hotspot/src/share/vm/opto/block.hpp @@ -371,6 +371,7 @@ class PhaseCFG : public Phase { Block *_broot; // Basic block of root uint _rpo_ctr; CFGLoop* _root_loop; + float _outer_loop_freq; // Outmost loop frequency // Per node latency estimation, valid only during GCM GrowableArray _node_latency; @@ -537,6 +538,7 @@ class CFGLoop : public CFGElement { void compute_loop_depth(int depth); void compute_freq(); // compute frequency with loop assuming head freq 1.0f void scale_freq(); // scale frequency by loop trip count (including outer loops) + float outer_loop_freq() const; // frequency of outer loop bool in_loop_nest(Block* b); float trip_count() const { return 1.0f / _exit_prob; } virtual bool is_loop() { return true; } diff --git a/hotspot/src/share/vm/opto/c2_globals.hpp b/hotspot/src/share/vm/opto/c2_globals.hpp index 6734321d8da..425a66a42c2 100644 --- a/hotspot/src/share/vm/opto/c2_globals.hpp +++ b/hotspot/src/share/vm/opto/c2_globals.hpp @@ -391,7 +391,7 @@ product(intx, EliminateAllocationArraySizeLimit, 64, \ "Array size (number of elements) limit for scalar replacement") \ \ - product(bool, UseOptoBiasInlining, true, \ + product(bool, UseOptoBiasInlining, true, \ "Generate biased locking code in C2 ideal graph") \ \ product(intx, ValueSearchLimit, 1000, \ @@ -410,7 +410,7 @@ "Miniumum %% of a successor (predecessor) for which block layout "\ "a will allow a fork (join) in a single chain") \ \ - product(bool, BlockLayoutRotateLoops, false, \ + product(bool, BlockLayoutRotateLoops, true, \ "Allow back branches to be fall throughs in the block layour") \ C2_FLAGS(DECLARE_DEVELOPER_FLAG, DECLARE_PD_DEVELOPER_FLAG, DECLARE_PRODUCT_FLAG, DECLARE_PD_PRODUCT_FLAG, DECLARE_DIAGNOSTIC_FLAG, DECLARE_NOTPRODUCT_FLAG) diff --git a/hotspot/src/share/vm/opto/chaitin.cpp b/hotspot/src/share/vm/opto/chaitin.cpp index e890c4ae3ce..4ad220d41f5 100644 --- a/hotspot/src/share/vm/opto/chaitin.cpp +++ b/hotspot/src/share/vm/opto/chaitin.cpp @@ -149,6 +149,9 @@ PhaseChaitin::PhaseChaitin(uint unique, PhaseCFG &cfg, Matcher &matcher) #endif { NOT_PRODUCT( Compile::TracePhase t3("ctorChaitin", &_t_ctorChaitin, TimeCompiler); ) + + _high_frequency_lrg = MIN2(float(OPTO_LRG_HIGH_FREQ), _cfg._outer_loop_freq); + uint i,j; // Build a list of basic blocks, sorted by frequency _blks = NEW_RESOURCE_ARRAY( Block *, _cfg._num_blocks ); diff --git a/hotspot/src/share/vm/opto/chaitin.hpp b/hotspot/src/share/vm/opto/chaitin.hpp index 0de7dd41eaa..1cea37e34d1 100644 --- a/hotspot/src/share/vm/opto/chaitin.hpp +++ b/hotspot/src/share/vm/opto/chaitin.hpp @@ -338,6 +338,8 @@ class PhaseChaitin : public PhaseRegAlloc { Block **_blks; // Array of blocks sorted by frequency for coalescing + float _high_frequency_lrg; // Frequency at which LRG will be spilled for debug info + #ifndef PRODUCT bool _trace_spilling; #endif @@ -360,6 +362,8 @@ public: uint n2lidx( const Node *n ) const { return _names[n->_idx]; } + float high_frequency_lrg() const { return _high_frequency_lrg; } + #ifndef PRODUCT bool trace_spilling() const { return _trace_spilling; } #endif diff --git a/hotspot/src/share/vm/opto/coalesce.cpp b/hotspot/src/share/vm/opto/coalesce.cpp index 52c00992719..99584ca165c 100644 --- a/hotspot/src/share/vm/opto/coalesce.cpp +++ b/hotspot/src/share/vm/opto/coalesce.cpp @@ -473,7 +473,7 @@ void PhaseAggressiveCoalesce::insert_copies( Matcher &matcher ) { } // End of is two-adr // Insert a copy at a debug use for a lrg which has high frequency - if( (b->_freq < OPTO_DEBUG_SPLIT_FREQ) && n->is_MachSafePoint() ) { + if( b->_freq < OPTO_DEBUG_SPLIT_FREQ || b->is_uncommon(_phc._cfg._bbs) ) { // Walk the debug inputs to the node and check for lrg freq JVMState* jvms = n->jvms(); uint debug_start = jvms ? jvms->debug_start() : 999999; @@ -487,7 +487,7 @@ void PhaseAggressiveCoalesce::insert_copies( Matcher &matcher ) { LRG &lrg = lrgs(nidx); // If this lrg has a high frequency use/def - if( lrg._maxfreq >= OPTO_LRG_HIGH_FREQ ) { + if( lrg._maxfreq >= _phc.high_frequency_lrg() ) { // If the live range is also live out of this block (like it // would be for a fast/slow idiom), the normal spill mechanism // does an excellent job. If it is not live out of this block diff --git a/hotspot/src/share/vm/opto/gcm.cpp b/hotspot/src/share/vm/opto/gcm.cpp index 85263fcb389..df648455117 100644 --- a/hotspot/src/share/vm/opto/gcm.cpp +++ b/hotspot/src/share/vm/opto/gcm.cpp @@ -1374,6 +1374,9 @@ void PhaseCFG::Estimate_Block_Frequency() { _root_loop->_freq = 1.0; _root_loop->scale_freq(); + // Save outmost loop frequency for LRG frequency threshold + _outer_loop_freq = _root_loop->outer_loop_freq(); + // force paths ending at uncommon traps to be infrequent if (!C->do_freq_based_layout()) { Block_List worklist; @@ -1898,6 +1901,7 @@ bool CFGLoop::in_loop_nest(Block* b) { // Do a top down traversal of loop tree (visit outer loops first.) void CFGLoop::scale_freq() { float loop_freq = _freq * trip_count(); + _freq = loop_freq; for (int i = 0; i < _members.length(); i++) { CFGElement* s = _members.at(i); float block_freq = s->_freq * loop_freq; @@ -1912,6 +1916,14 @@ void CFGLoop::scale_freq() { } } +// Frequency of outer loop +float CFGLoop::outer_loop_freq() const { + if (_child != NULL) { + return _child->_freq; + } + return _freq; +} + #ifndef PRODUCT //------------------------------dump_tree-------------------------------------- void CFGLoop::dump_tree() const { diff --git a/hotspot/src/share/vm/opto/machnode.cpp b/hotspot/src/share/vm/opto/machnode.cpp index adb7ecb98ba..b7357f86ab6 100644 --- a/hotspot/src/share/vm/opto/machnode.cpp +++ b/hotspot/src/share/vm/opto/machnode.cpp @@ -340,6 +340,10 @@ const class TypePtr *MachNode::adr_type() const { if (base == NodeSentinel) return TypePtr::BOTTOM; const Type* t = base->bottom_type(); + if (UseCompressedOops && Universe::narrow_oop_shift() == 0) { + // 32-bit unscaled narrow oop can be the base of any address expression + t = t->make_ptr(); + } if (t->isa_intptr_t() && offset != 0 && offset != Type::OffsetBot) { // We cannot assert that the offset does not look oop-ish here. // Depending on the heap layout the cardmark base could land @@ -353,6 +357,7 @@ const class TypePtr *MachNode::adr_type() const { // be conservative if we do not recognize the type if (tp == NULL) { + assert(false, "this path may produce not optimal code"); return TypePtr::BOTTOM; } assert(tp->base() != Type::AnyPtr, "not a bare pointer"); From ab419e86a9333761e8a5dac71174dddd8090d249 Mon Sep 17 00:00:00 2001 From: Kelly O'Hair Date: Thu, 26 Mar 2009 16:48:03 -0700 Subject: [PATCH 198/292] 6822913: Consolidate make/jprt.config files, let JPRT manage this file make it optional in repos Reviewed-by: tbell --- jaxp/make/jprt.config | 241 ------------------------------------------ 1 file changed, 241 deletions(-) delete mode 100644 jaxp/make/jprt.config diff --git a/jaxp/make/jprt.config b/jaxp/make/jprt.config deleted file mode 100644 index 90200b1bc41..00000000000 --- a/jaxp/make/jprt.config +++ /dev/null @@ -1,241 +0,0 @@ -#!echo "This is not a shell script" -############################################################################# -# -# Copyright 2006 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. -# -############################################################################# -# -# JPRT shell configuration for building. -# -# Input environment variables: -# ALT_BOOTDIR -# ALT_SLASH_JAVA -# ALT_JDK_IMPORT_PATH -# Windows Only: -# PATH -# PROCESSOR_IDENTIFIER -# ROOTDIR -# -# Output variable settings: -# make Full path to GNU make -# -# Output environment variables: -# PATH -# Windows Only: -# ALT_DEVTOOLS_PATH (To avoid the C:/UTILS default) -# -# After JDK6, most settings will be found via ALT_SLASH_JAVA or -# by way of other system environment variables. If this was JDK5 -# or an older JDK, you might need to export more ALT_* variables. -# -############################################################################# - -############################################################################# -# Error -error() # message -{ - echo "ERROR: $1" - exit 6 -} -# Directory must exist -dirMustExist() # dir name -{ - if [ ! -d "$1" ] ; then - error "Directory for $2 does not exist: $1" - fi -} -# File must exist -fileMustExist() # dir name -{ - if [ ! -f "$1" ] ; then - error "File for $2 does not exist: $1" - fi -} -############################################################################# - -# Should be set by JPRT as the 3 basic inputs -bootdir="${ALT_BOOTDIR}" -slashjava="${ALT_SLASH_JAVA}" -jdk_import="${ALT_JDK_IMPORT_PATH}" - -# Check input -dirMustExist "${bootdir}" ALT_BOOTDIR -dirMustExist "${slashjava}" ALT_SLASH_JAVA -dirMustExist "${jdk_import}" ALT_JDK_IMPORT_PATH - -# Uses 'uname -s', but only expect SunOS or Linux, assume Windows otherwise. -osname=`uname -s` -if [ "${osname}" = SunOS ] ; then - - # SOLARIS: Sparc or X86 - osarch=`uname -p` - if [ "${osarch}" = sparc ] ; then - solaris_arch=sparc - else - solaris_arch=i386 - fi - - # Add basic solaris system paths - path4sdk=/usr/ccs/bin:/usr/ccs/lib:/usr/bin:/bin:/usr/sfw/bin - - # Get the previous JDK to be used to bootstrap the build - path4sdk=${bootdir}/bin:${path4sdk} - - # Ant - ANT_HOME=${slashjava}/devtools/share/ant/1.7.0 - export ANT_HOME - antbindir=${ANT_HOME}/bin - fileMustExist "${antbindir}/ant" ant - path4sdk=${antbindir}:${path4sdk} - - # Find GNU make - make=/usr/sfw/bin/gmake - if [ ! -f ${make} ] ; then - make=/opt/sfw/bin/gmake - if [ ! -f ${make} ] ; then - make=${slashjava}/devtools/${solaris_arch}/bin/gnumake - fi - fi - fileMustExist "${make}" make - - # File creation mask - umask 002 - -elif [ "${osname}" = Linux ] ; then - - # LINUX: X86, AMD64 - osarch=`uname -m` - if [ "${osarch}" = i686 ] ; then - linux_arch=i586 - elif [ "${osarch}" = x86_64 ] ; then - linux_arch=amd64 - fi - - # Add basic paths - path4sdk=/usr/bin:/bin:/usr/sbin:/sbin - - # Get the previous JDK to be used to bootstrap the build - path4sdk=${bootdir}/bin:${path4sdk} - - # Ant - ANT_HOME=${slashjava}/devtools/share/ant/1.7.0 - export ANT_HOME - antbindir=${ANT_HOME}/bin - fileMustExist "${antbindir}/ant" ant - path4sdk=${antbindir}:${path4sdk} - - # Find GNU make - make=/usr/bin/make - fileMustExist "${make}" make - - umask 002 - -else - - # Windows: Differs on CYGWIN vs. MKS. - # Also, blanks in pathnames gives GNU make headaches, so anything placed - # in any ALT_* variable should be the short windows dosname. - - # WINDOWS: Install and use MKS or CYGWIN (should have already been done) - # Assumption here is that you are in a shell window via MKS or cygwin. - # MKS install should have defined the environment variable ROOTDIR. - # We also need to figure out which one we have: X86, AMD64 - if [ "`echo ${PROCESSOR_IDENTIFIER} | fgrep AMD64`" != "" ] ; then - windows_arch=amd64 - else - windows_arch=i586 - fi - - # We need to determine if we are running a CYGWIN shell or an MKS shell - # (if uname isn't available, then it will be unix_toolset=unknown) - unix_toolset=unknown - if [ "`uname -a | fgrep Cygwin`" = "" -a -d "${ROOTDIR}" ] ; then - # We kind of assume ROOTDIR is where MKS is and it's ok - unix_toolset=MKS - mkshome=`dosname -s "${ROOTDIR}"` - # Utility to convert to short pathnames without spaces - dosname="${mkshome}/mksnt/dosname -s" - # Most unix utilities are in the mksnt directory of ROOTDIR - unixcommand_path="${mkshome}/mksnt" - path4sdk="${unixcommand_path}" - dirMustExist "${unixcommand_path}" ALT_UNIXCOMMAND_PATH - devtools_path="${slashjava}/devtools/win32/bin" - path4sdk="${devtools_path};${path4sdk}" - # Normally this need not be set, but on Windows it's default is C:/UTILS - ALT_DEVTOOLS_PATH="${devtools_path}" - export ALT_DEVTOOLS_PATH - dirMustExist "${devtools_path}" ALT_DEVTOOLS_PATH - # Find GNU make - make="${devtools_path}/gnumake.exe" - fileMustExist "${make}" make - elif [ "`uname -a | fgrep Cygwin`" != "" -a -f /bin/cygpath ] ; then - # For CYGWIN, uname will have "Cygwin" in it, and /bin/cygpath should exist - unix_toolset=CYGWIN - # Utility to convert to short pathnames without spaces - dosname="/usr/bin/cygpath -a -m -s" - # Most unix utilities are in the /usr/bin - unixcommand_path="/usr/bin" - path4sdk="${unixcommand_path}" - dirMustExist "${unixcommand_path}" ALT_UNIXCOMMAND_PATH - # Find GNU make - make="${unixcommand_path}/make.exe" - fileMustExist "${make}" make - else - echo "WARNING: Cannot figure out if this is MKS or CYGWIN" - fi - - # WINDOWS: Get the previous JDK to be used to bootstrap the build - path4sdk="${bootdir}/bin;${path4sdk}" - - # Ant - ANT_HOME=${slashjava}/devtools/share/ant/1.7.0 - export ANT_HOME - antbindir=${ANT_HOME}/bin - fileMustExist "${antbindir}/ant" ant - path4sdk="${antbindir};${path4sdk}" - - # Turn all \\ into /, remove duplicates and trailing / - slash_path="`echo ${path4sdk} | sed -e 's@\\\\@/@g' -e 's@//@/@g' -e 's@/$@@' -e 's@/;@;@g'`" - - # For windows, it's hard to know where the system is, so we just add this - # to PATH. - path4sdk="${slash_path};${PATH}" - - # Convert path4sdk to cygwin style - if [ "${unix_toolset}" = CYGWIN ] ; then - path4sdk="`/usr/bin/cygpath -p ${path4sdk}`" - fi - -fi - -# Export PATH setting -PATH="${path4sdk}" -export PATH - -# Things we need to unset -unset LD_LIBRARY_PATH -unset LD_LIBRARY_PATH_32 -unset LD_LIBRARY_PATH_64 -unset JAVA_HOME - From 7bb1e5eae12579b28e9b82ba45d0b66ff5c968c3 Mon Sep 17 00:00:00 2001 From: Kelly O'Hair Date: Thu, 26 Mar 2009 16:48:29 -0700 Subject: [PATCH 199/292] 6822913: Consolidate make/jprt.config files, let JPRT manage this file make it optional in repos Reviewed-by: tbell --- jaxws/make/jprt.config | 241 ----------------------------------------- 1 file changed, 241 deletions(-) delete mode 100644 jaxws/make/jprt.config diff --git a/jaxws/make/jprt.config b/jaxws/make/jprt.config deleted file mode 100644 index 90200b1bc41..00000000000 --- a/jaxws/make/jprt.config +++ /dev/null @@ -1,241 +0,0 @@ -#!echo "This is not a shell script" -############################################################################# -# -# Copyright 2006 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. -# -############################################################################# -# -# JPRT shell configuration for building. -# -# Input environment variables: -# ALT_BOOTDIR -# ALT_SLASH_JAVA -# ALT_JDK_IMPORT_PATH -# Windows Only: -# PATH -# PROCESSOR_IDENTIFIER -# ROOTDIR -# -# Output variable settings: -# make Full path to GNU make -# -# Output environment variables: -# PATH -# Windows Only: -# ALT_DEVTOOLS_PATH (To avoid the C:/UTILS default) -# -# After JDK6, most settings will be found via ALT_SLASH_JAVA or -# by way of other system environment variables. If this was JDK5 -# or an older JDK, you might need to export more ALT_* variables. -# -############################################################################# - -############################################################################# -# Error -error() # message -{ - echo "ERROR: $1" - exit 6 -} -# Directory must exist -dirMustExist() # dir name -{ - if [ ! -d "$1" ] ; then - error "Directory for $2 does not exist: $1" - fi -} -# File must exist -fileMustExist() # dir name -{ - if [ ! -f "$1" ] ; then - error "File for $2 does not exist: $1" - fi -} -############################################################################# - -# Should be set by JPRT as the 3 basic inputs -bootdir="${ALT_BOOTDIR}" -slashjava="${ALT_SLASH_JAVA}" -jdk_import="${ALT_JDK_IMPORT_PATH}" - -# Check input -dirMustExist "${bootdir}" ALT_BOOTDIR -dirMustExist "${slashjava}" ALT_SLASH_JAVA -dirMustExist "${jdk_import}" ALT_JDK_IMPORT_PATH - -# Uses 'uname -s', but only expect SunOS or Linux, assume Windows otherwise. -osname=`uname -s` -if [ "${osname}" = SunOS ] ; then - - # SOLARIS: Sparc or X86 - osarch=`uname -p` - if [ "${osarch}" = sparc ] ; then - solaris_arch=sparc - else - solaris_arch=i386 - fi - - # Add basic solaris system paths - path4sdk=/usr/ccs/bin:/usr/ccs/lib:/usr/bin:/bin:/usr/sfw/bin - - # Get the previous JDK to be used to bootstrap the build - path4sdk=${bootdir}/bin:${path4sdk} - - # Ant - ANT_HOME=${slashjava}/devtools/share/ant/1.7.0 - export ANT_HOME - antbindir=${ANT_HOME}/bin - fileMustExist "${antbindir}/ant" ant - path4sdk=${antbindir}:${path4sdk} - - # Find GNU make - make=/usr/sfw/bin/gmake - if [ ! -f ${make} ] ; then - make=/opt/sfw/bin/gmake - if [ ! -f ${make} ] ; then - make=${slashjava}/devtools/${solaris_arch}/bin/gnumake - fi - fi - fileMustExist "${make}" make - - # File creation mask - umask 002 - -elif [ "${osname}" = Linux ] ; then - - # LINUX: X86, AMD64 - osarch=`uname -m` - if [ "${osarch}" = i686 ] ; then - linux_arch=i586 - elif [ "${osarch}" = x86_64 ] ; then - linux_arch=amd64 - fi - - # Add basic paths - path4sdk=/usr/bin:/bin:/usr/sbin:/sbin - - # Get the previous JDK to be used to bootstrap the build - path4sdk=${bootdir}/bin:${path4sdk} - - # Ant - ANT_HOME=${slashjava}/devtools/share/ant/1.7.0 - export ANT_HOME - antbindir=${ANT_HOME}/bin - fileMustExist "${antbindir}/ant" ant - path4sdk=${antbindir}:${path4sdk} - - # Find GNU make - make=/usr/bin/make - fileMustExist "${make}" make - - umask 002 - -else - - # Windows: Differs on CYGWIN vs. MKS. - # Also, blanks in pathnames gives GNU make headaches, so anything placed - # in any ALT_* variable should be the short windows dosname. - - # WINDOWS: Install and use MKS or CYGWIN (should have already been done) - # Assumption here is that you are in a shell window via MKS or cygwin. - # MKS install should have defined the environment variable ROOTDIR. - # We also need to figure out which one we have: X86, AMD64 - if [ "`echo ${PROCESSOR_IDENTIFIER} | fgrep AMD64`" != "" ] ; then - windows_arch=amd64 - else - windows_arch=i586 - fi - - # We need to determine if we are running a CYGWIN shell or an MKS shell - # (if uname isn't available, then it will be unix_toolset=unknown) - unix_toolset=unknown - if [ "`uname -a | fgrep Cygwin`" = "" -a -d "${ROOTDIR}" ] ; then - # We kind of assume ROOTDIR is where MKS is and it's ok - unix_toolset=MKS - mkshome=`dosname -s "${ROOTDIR}"` - # Utility to convert to short pathnames without spaces - dosname="${mkshome}/mksnt/dosname -s" - # Most unix utilities are in the mksnt directory of ROOTDIR - unixcommand_path="${mkshome}/mksnt" - path4sdk="${unixcommand_path}" - dirMustExist "${unixcommand_path}" ALT_UNIXCOMMAND_PATH - devtools_path="${slashjava}/devtools/win32/bin" - path4sdk="${devtools_path};${path4sdk}" - # Normally this need not be set, but on Windows it's default is C:/UTILS - ALT_DEVTOOLS_PATH="${devtools_path}" - export ALT_DEVTOOLS_PATH - dirMustExist "${devtools_path}" ALT_DEVTOOLS_PATH - # Find GNU make - make="${devtools_path}/gnumake.exe" - fileMustExist "${make}" make - elif [ "`uname -a | fgrep Cygwin`" != "" -a -f /bin/cygpath ] ; then - # For CYGWIN, uname will have "Cygwin" in it, and /bin/cygpath should exist - unix_toolset=CYGWIN - # Utility to convert to short pathnames without spaces - dosname="/usr/bin/cygpath -a -m -s" - # Most unix utilities are in the /usr/bin - unixcommand_path="/usr/bin" - path4sdk="${unixcommand_path}" - dirMustExist "${unixcommand_path}" ALT_UNIXCOMMAND_PATH - # Find GNU make - make="${unixcommand_path}/make.exe" - fileMustExist "${make}" make - else - echo "WARNING: Cannot figure out if this is MKS or CYGWIN" - fi - - # WINDOWS: Get the previous JDK to be used to bootstrap the build - path4sdk="${bootdir}/bin;${path4sdk}" - - # Ant - ANT_HOME=${slashjava}/devtools/share/ant/1.7.0 - export ANT_HOME - antbindir=${ANT_HOME}/bin - fileMustExist "${antbindir}/ant" ant - path4sdk="${antbindir};${path4sdk}" - - # Turn all \\ into /, remove duplicates and trailing / - slash_path="`echo ${path4sdk} | sed -e 's@\\\\@/@g' -e 's@//@/@g' -e 's@/$@@' -e 's@/;@;@g'`" - - # For windows, it's hard to know where the system is, so we just add this - # to PATH. - path4sdk="${slash_path};${PATH}" - - # Convert path4sdk to cygwin style - if [ "${unix_toolset}" = CYGWIN ] ; then - path4sdk="`/usr/bin/cygpath -p ${path4sdk}`" - fi - -fi - -# Export PATH setting -PATH="${path4sdk}" -export PATH - -# Things we need to unset -unset LD_LIBRARY_PATH -unset LD_LIBRARY_PATH_32 -unset LD_LIBRARY_PATH_64 -unset JAVA_HOME - From 69c8b43f099f6472a1018d84b2535d3ee9fb0437 Mon Sep 17 00:00:00 2001 From: Kelly O'Hair Date: Thu, 26 Mar 2009 16:48:53 -0700 Subject: [PATCH 200/292] 6822913: Consolidate make/jprt.config files, let JPRT manage this file make it optional in repos Reviewed-by: tbell --- langtools/make/jprt.config | 241 ------------------------------------- 1 file changed, 241 deletions(-) delete mode 100644 langtools/make/jprt.config diff --git a/langtools/make/jprt.config b/langtools/make/jprt.config deleted file mode 100644 index b112bcb1eda..00000000000 --- a/langtools/make/jprt.config +++ /dev/null @@ -1,241 +0,0 @@ -#!echo "This is not a shell script" -############################################################################# -# -# Copyright 2006 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. -# -############################################################################# -# -# JPRT shell configuration for building. -# -# Input environment variables: -# ALT_BOOTDIR -# ALT_SLASH_JAVA -# ALT_JDK_IMPORT_PATH -# Windows Only: -# PATH -# PROCESSOR_IDENTIFIER -# ROOTDIR -# -# Output variable settings: -# make Full path to GNU make -# -# Output environment variables: -# PATH -# Windows Only: -# ALT_DEVTOOLS_PATH (To avoid the C:/UTILS default) -# -# After JDK6, most settings will be found via ALT_SLASH_JAVA or -# by way of other system environment variables. If this was JDK5 -# or an older JDK, you might need to export more ALT_* variables. -# -############################################################################# - -############################################################################# -# Error -error() # message -{ - echo "ERROR: $1" - exit 6 -} -# Directory must exist -dirMustExist() # dir name -{ - if [ ! -d "$1" ] ; then - error "Directory for $2 does not exist: $1" - fi -} -# File must exist -fileMustExist() # dir name -{ - if [ ! -f "$1" ] ; then - error "File for $2 does not exist: $1" - fi -} -############################################################################# - -# Should be set by JPRT as the 3 basic inputs -bootdir="${ALT_BOOTDIR}" -slashjava="${ALT_SLASH_JAVA}" -jdk_import="${ALT_JDK_IMPORT_PATH}" - -# Check input -dirMustExist "${bootdir}" ALT_BOOTDIR -dirMustExist "${slashjava}" ALT_SLASH_JAVA -dirMustExist "${jdk_import}" ALT_JDK_IMPORT_PATH - -# Uses 'uname -s', but only expect SunOS or Linux, assume Windows otherwise. -osname=`uname -s` -if [ "${osname}" = SunOS ] ; then - - # SOLARIS: Sparc or X86 - osarch=`uname -p` - if [ "${osarch}" = sparc ] ; then - solaris_arch=sparc - else - solaris_arch=i386 - fi - - # Add basic solaris system paths - path4sdk=/usr/ccs/bin:/usr/ccs/lib:/usr/bin:/bin:/usr/sfw/bin - - # Get the previous JDK to be used to bootstrap the build - path4sdk=${bootdir}/bin:${path4sdk} - - # Ant - ANT_HOME=${slashjava}/devtools/share/ant/1.7.0 - export ANT_HOME - antbindir=${ANT_HOME}/bin - fileMustExist "${antbindir}/ant" ant - path4sdk=${antbindir}:${path4sdk} - - # Find GNU make - make=/usr/sfw/bin/gmake - if [ ! -f ${make} ] ; then - make=/opt/sfw/bin/gmake - if [ ! -f ${make} ] ; then - make=${slashjava}/devtools/${solaris_arch}/bin/gnumake - fi - fi - fileMustExist "${make}" make - - # File creation mask - umask 002 - -elif [ "${osname}" = Linux ] ; then - - # LINUX: X86, AMD64 - osarch=`uname -m` - if [ "${osarch}" = i686 ] ; then - linux_arch=i586 - elif [ "${osarch}" = x86_64 ] ; then - linux_arch=amd64 - fi - - # Add basic paths - path4sdk=/usr/bin:/bin:/usr/sbin:/sbin - - # Get the previous JDK to be used to bootstrap the build - path4sdk=${bootdir}/bin:${path4sdk} - - # Ant - ANT_HOME=${slashjava}/devtools/share/ant/1.7.0 - export ANT_HOME - antbindir=${ANT_HOME}/bin - fileMustExist "${antbindir}/ant" ant - path4sdk=${antbindir}:${path4sdk} - - # Find GNU make - make=/usr/bin/make - fileMustExist "${make}" make - - umask 002 - -else - - # Windows: Differs on CYGWIN vs. MKS - # Also, blanks in pathnames gives GNU make headaches, so anything placed - # in any ALT_* variable should be the short windows dosname. - - # WINDOWS: Install and use MKS or CYGWIN (should have already been done) - # Assumption here is that you are in a shell window via MKS or cygwin. - # MKS install should have defined the environment variable ROOTDIR. - # We also need to figure out which one we have: X86, AMD64 - if [ "`echo ${PROCESSOR_IDENTIFIER} | fgrep AMD64`" != "" ] ; then - windows_arch=amd64 - else - windows_arch=i586 - fi - - # We need to determine if we are running a CYGWIN shell or an MKS shell - # (if uname isn't available, then it will be unix_toolset=unknown) - unix_toolset=unknown - if [ "`uname -a | fgrep Cygwin`" = "" -a -d "${ROOTDIR}" ] ; then - # We kind of assume ROOTDIR is where MKS is and it's ok - unix_toolset=MKS - mkshome=`dosname -s "${ROOTDIR}"` - # Utility to convert to short pathnames without spaces - dosname="${mkshome}/mksnt/dosname -s" - # Most unix utilities are in the mksnt directory of ROOTDIR - unixcommand_path="${mkshome}/mksnt" - path4sdk="${unixcommand_path}" - dirMustExist "${unixcommand_path}" ALT_UNIXCOMMAND_PATH - devtools_path="${slashjava}/devtools/win32/bin" - path4sdk="${devtools_path};${path4sdk}" - # Normally this need not be set, but on Windows it's default is C:/UTILS - ALT_DEVTOOLS_PATH="${devtools_path}" - export ALT_DEVTOOLS_PATH - dirMustExist "${devtools_path}" ALT_DEVTOOLS_PATH - # Find GNU make - make="${devtools_path}/gnumake.exe" - fileMustExist "${make}" make - elif [ "`uname -a | fgrep Cygwin`" != "" -a -f /bin/cygpath ] ; then - # For CYGWIN, uname will have "Cygwin" in it, and /bin/cygpath should exist - unix_toolset=CYGWIN - # Utility to convert to short pathnames without spaces - dosname="/usr/bin/cygpath -a -m -s" - # Most unix utilities are in the /usr/bin - unixcommand_path="/usr/bin" - path4sdk="${unixcommand_path}" - dirMustExist "${unixcommand_path}" ALT_UNIXCOMMAND_PATH - # Find GNU make - make="${unixcommand_path}/make.exe" - fileMustExist "${make}" make - else - echo "WARNING: Cannot figure out if this is MKS or CYGWIN" - fi - - # WINDOWS: Get the previous JDK to be used to bootstrap the build - path4sdk="${bootdir}/bin;${path4sdk}" - - # Ant - ANT_HOME=${slashjava}/devtools/share/ant/1.7.0 - export ANT_HOME - antbindir=${ANT_HOME}/bin - fileMustExist "${antbindir}/ant" ant - path4sdk="${antbindir};${path4sdk}" - - # Turn all \\ into /, remove duplicates and trailing / - slash_path="`echo ${path4sdk} | sed -e 's@\\\\@/@g' -e 's@//@/@g' -e 's@/$@@' -e 's@/;@;@g'`" - - # For windows, it's hard to know where the system is, so we just add this - # to PATH. - path4sdk="${slash_path};${PATH}" - - # Convert path4sdk to cygwin style - if [ "${unix_toolset}" = CYGWIN ] ; then - path4sdk="`/usr/bin/cygpath -p ${path4sdk}`" - fi - -fi - -# Export PATH setting -PATH="${path4sdk}" -export PATH - -# Things we need to unset -unset LD_LIBRARY_PATH -unset LD_LIBRARY_PATH_32 -unset LD_LIBRARY_PATH_64 -unset JAVA_HOME - From 2ce9a96c0120c46a85b281d4cf92f002cc2aad2f Mon Sep 17 00:00:00 2001 From: Kelly O'Hair Date: Thu, 26 Mar 2009 16:52:00 -0700 Subject: [PATCH 201/292] 6822374: Windows: detect X64 when PROCESSOR_IDENTIFIER contains EM64T or Intel64 6822913: Consolidate make/jprt.config files, let JPRT manage this file make it optional in repos Reviewed-by: tbell --- jdk/make/common/shared/Platform.gmk | 18 +- jdk/make/jdk_generic_profile.sh | 3 +- jdk/make/jprt.config | 363 ---------------------------- 3 files changed, 16 insertions(+), 368 deletions(-) delete mode 100644 jdk/make/jprt.config diff --git a/jdk/make/common/shared/Platform.gmk b/jdk/make/common/shared/Platform.gmk index d343cdea1c3..e07de2499fb 100644 --- a/jdk/make/common/shared/Platform.gmk +++ b/jdk/make/common/shared/Platform.gmk @@ -229,11 +229,19 @@ ifeq ($(PLATFORM), windows) TEMP_DISK=C:/temp # GNU Make or MKS overrides $(PROCESSOR_ARCHITECTURE) to always # return "x86". Use the first word of $(PROCESSOR_IDENTIFIER) instead. + PROC_ARCH:=$(word 1, $(PROCESSOR_IDENTIFIER)) + PROC_ARCH:=$(subst x86,X86,$(PROC_ARCH)) + PROC_ARCH:=$(subst Intel64,X64,$(PROC_ARCH)) + PROC_ARCH:=$(subst em64t,X64,$(PROC_ARCH)) + PROC_ARCH:=$(subst EM64T,X64,$(PROC_ARCH)) + PROC_ARCH:=$(subst amd64,X64,$(PROC_ARCH)) + PROC_ARCH:=$(subst AMD64,X64,$(PROC_ARCH)) + PROC_ARCH:=$(subst ia64,IA64,$(PROC_ARCH)) ifndef ARCH_DATA_MODEL - ifeq ($(word 1, $(PROCESSOR_IDENTIFIER)),ia64) + ifeq ($(PROC_ARCH),IA64) ARCH_DATA_MODEL=64 else - ifeq ($(word 1, $(PROCESSOR_IDENTIFIER)),AMD64) + ifeq ($(PROC_ARCH),X64) ARCH_DATA_MODEL=64 else ARCH_DATA_MODEL=32 @@ -245,10 +253,12 @@ ifeq ($(PLATFORM), windows) # If the user wants to perform a cross compile build then they must # - set ARCH_DATA_MODEL=64 and either # + set ARCH to ia64 or amd64, or - ifeq ($(word 1, $(PROCESSOR_IDENTIFIER)), AMD64) + ifeq ($(PROC_ARCH),X64) ARCH=amd64 else - ARCH=ia64 + ifeq ($(PROC_ARCH),IA64) + ARCH=ia64 + endif endif LIBARCH=$(ARCH) # Value of Java os.arch property diff --git a/jdk/make/jdk_generic_profile.sh b/jdk/make/jdk_generic_profile.sh index 32dd86197ef..125198301ca 100644 --- a/jdk/make/jdk_generic_profile.sh +++ b/jdk/make/jdk_generic_profile.sh @@ -174,7 +174,8 @@ else # Check CYGWIN (should have already been done) # Assumption here is that you are in a shell window via cygwin. - if [ "$(echo ${PROCESSOR_IDENTIFIER} | fgrep AMD64)" != "" ] ; then + proc_arch=`echo "$(PROCESSOR_IDENTIFIER)" | expand | cut -d' ' -f1 | sed -e 's@x86@X86@g' -e 's@Intel64@X64@g' -e 's@em64t@X64@g' -e 's@EM64T@X64@g' -e 's@amd64@X64@g' -e 's@AMD64@X64@g' -e 's@ia64@IA64@g'` + if [ "${proc_arch}" = "X64" ] ; then windows_arch=amd64 else windows_arch=i586 diff --git a/jdk/make/jprt.config b/jdk/make/jprt.config deleted file mode 100644 index d720475cecd..00000000000 --- a/jdk/make/jprt.config +++ /dev/null @@ -1,363 +0,0 @@ -#!echo "This is not a shell script" -############################################################################# -# -# Copyright 2006-2008 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. -# -############################################################################# -# -# JPRT shell configuration for building. -# -# Input environment variables: -# ALT_BOOTDIR -# ALT_SLASH_JAVA -# ALT_JDK_IMPORT_PATH -# OPENJDK -# Windows Only: -# PATH -# VS71COMNTOOLS -# PROCESSOR_IDENTIFIER -# ROOTDIR -# -# Output variable settings: -# make Full path to GNU make -# compiler_path Path to compiler bin directory -# compiler_name Unique name of this compiler -# -# Output environment variables: -# PATH -# ALT_COMPILER_PATH -# OPENJDK only: -# ALT_CLOSED_JDK_IMPORT_PATH -# ALT_JDK_DEVTOOLS_DIR -# Windows Only: -# ALT_MSDEVTOOLS_PATH -# ALT_DEVTOOLS_PATH (To avoid the C:/UTILS default) -# LIB -# INCLUDE -# -# After JDK6, most settings will be found via ALT_SLASH_JAVA or -# by way of other system environment variables. If this was JDK5 -# or an older JDK, you might need to export more ALT_* variables. -# -# On Windows AMD64, if MSSDK is not set, assumes Platform SDK is installed at: -# C:/Program Files/Microsoft Platform SDK -# -############################################################################# - -############################################################################# -# Error -error() # message -{ - echo "ERROR: $1" - exit 6 -} -# Directory must exist -dirMustExist() # dir name -{ - if [ ! -d "$1" ] ; then - error "Directory for $2 does not exist: $1" - fi -} -# File must exist -fileMustExist() # dir name -{ - if [ ! -f "$1" ] ; then - error "File for $2 does not exist: $1" - fi -} -############################################################################# - -# Should be set by JPRT as the 3 basic inputs -bootdir="${ALT_BOOTDIR}" -slashjava="${ALT_SLASH_JAVA}" -jdk_import="${ALT_JDK_IMPORT_PATH}" - -# The /java/devtools items -jdk_devtools="${slashjava}/devtools" -share="${jdk_devtools}/share" - -# Needed for langtools, maybe other parts of the build -ANT_HOME="${share}/ant/latest" -export ANT_HOME - -# The 3 bin directories in common to all platforms -sharebin="${share}/bin" -antbin="${ANT_HOME}/bin" - -# Check input -dirMustExist "${bootdir}" ALT_BOOTDIR -dirMustExist "${slashjava}" ALT_SLASH_JAVA -dirMustExist "${jdk_import}" ALT_JDK_IMPORT_PATH -dirMustExist "${ANT_HOME}" ANT_HOME - -# Use the JDK import for now (FIXME: use the binary plugs?) -if [ "${OPENJDK}" = true ] ; then - ALT_CLOSED_JDK_IMPORT_PATH="${jdk_import}" - export ALT_CLOSED_JDK_IMPORT_PATH -fi - -# Uses 'uname -s', but only expect SunOS or Linux, assume Windows otherwise. -osname=`uname -s` -if [ "${osname}" = SunOS ] ; then - - # SOLARIS: Sparc or X86 - osarch=`uname -p` - if [ "${osarch}" = sparc ] ; then - solaris_arch=sparc - else - solaris_arch=i386 - fi - - # Get the compilers into path (make sure it matches ALT setting) - if [ "${JPRT_SOLARIS_COMPILER_NAME}" != "" ] ; then - compiler_name=${JPRT_SOLARIS_COMPILER_NAME} - else - compiler_name=SS12 - fi - compiler_path=${jdk_devtools}/${solaris_arch}/SUNWspro/${compiler_name}/bin - ALT_COMPILER_PATH="${compiler_path}" - export ALT_COMPILER_PATH - dirMustExist "${compiler_path}" ALT_COMPILER_PATH - path4sdk=${compiler_path}:${sharebin}:${antbin} - - # Add basic solaris system paths - path4sdk=${path4sdk}:/usr/ccs/bin:/usr/ccs/lib:/usr/bin:/bin:/usr/sfw/bin - - # Get the previous JDK to be used to bootstrap the build - path4sdk=${bootdir}/bin:${path4sdk} - - # Find GNU make - make=/usr/sfw/bin/gmake - if [ ! -f ${make} ] ; then - make=/opt/sfw/bin/gmake - if [ ! -f ${make} ] ; then - make=${jdk_devtools}/${solaris_arch}/bin/gnumake - fi - fi - fileMustExist "${make}" make - - # File creation mask - umask 002 - -elif [ "${osname}" = Linux ] ; then - - # LINUX: X86, AMD64 - osarch=`uname -m` - if [ "${osarch}" = i686 ] ; then - linux_arch=i586 - elif [ "${osarch}" = x86_64 ] ; then - linux_arch=amd64 - fi - - # Get the compilers into path (make sure it matches ALT setting) - compiler_path=/usr/bin - compiler_name=usr_bin - ALT_COMPILER_PATH="${compiler_path}" - export ALT_COMPILER_PATH - dirMustExist "${compiler_path}" ALT_COMPILER_PATH - path4sdk=${compiler_path}:${sharebin}:${antbin} - - # Add basic paths - path4sdk=${path4sdk}:/usr/bin:/bin:/usr/sbin:/sbin - - # Get the previous JDK to be used to bootstrap the build - path4sdk=${bootdir}/bin:${path4sdk} - - # Find GNU make - make=/usr/bin/make - fileMustExist "${make}" make - - umask 002 - - # Linux platform may be old, use motif files from the devtools area - if [ "${OPENJDK}" = true ] ; then - ALT_JDK_DEVTOOLS_DIR="${jdk_devtools}" - export ALT_JDK_DEVTOOLS_DIR - fi - - -else - - # Windows: Differs on CYGWIN vs. MKS, and the compiler available. - # Also, blanks in pathnames gives GNU make headaches, so anything placed - # in any ALT_* variable should be the short windows dosname. - - # WINDOWS: Install and use MKS or CYGWIN (should have already been done) - # Assumption here is that you are in a shell window via MKS or cygwin. - # MKS install should have defined the environment variable ROOTDIR. - # We also need to figure out which one we have: X86, AMD64 - if [ "`echo ${PROCESSOR_IDENTIFIER} | fgrep AMD64`" != "" ] ; then - windows_arch=amd64 - else - windows_arch=i586 - fi - - # We need to determine if we are running a CYGWIN shell or an MKS shell - # (if uname isn't available, then it will be unix_toolset=unknown) - unix_toolset=unknown - if [ "`uname -a | fgrep Cygwin`" = "" -a -d "${ROOTDIR}" ] ; then - # We kind of assume ROOTDIR is where MKS is and it's ok - unix_toolset=MKS - mkshome=`dosname -s "${ROOTDIR}"` - # Utility to convert to short pathnames without spaces - dosname="${mkshome}/mksnt/dosname -s" - # Most unix utilities are in the mksnt directory of ROOTDIR - unixcommand_path="${mkshome}/mksnt" - path4sdk="${sharebin};${antbin};${unixcommand_path}" - dirMustExist "${unixcommand_path}" ALT_UNIXCOMMAND_PATH - devtools_path="${jdk_devtools}/win32/bin" - path4sdk="${devtools_path};${path4sdk}" - # Normally this need not be set, but on Windows it's default is C:/UTILS - ALT_DEVTOOLS_PATH="${devtools_path}" - export ALT_DEVTOOLS_PATH - dirMustExist "${devtools_path}" ALT_DEVTOOLS_PATH - # Find GNU make - make="${devtools_path}/gnumake.exe" - fileMustExist "${make}" make - elif [ "`uname -a | fgrep Cygwin`" != "" -a -f /bin/cygpath ] ; then - # For CYGWIN, uname will have "Cygwin" in it, and /bin/cygpath should exist - unix_toolset=CYGWIN - # Utility to convert to short pathnames without spaces - dosname="/usr/bin/cygpath -a -m -s" - # Most unix utilities are in the /usr/bin - unixcommand_path="/usr/bin" - path4sdk="${sharebin};${antbin};${unixcommand_path}" - dirMustExist "${unixcommand_path}" ALT_UNIXCOMMAND_PATH - # Find GNU make - make="${unixcommand_path}/make.exe" - fileMustExist "${make}" make - else - echo "WARNING: Cannot figure out if this is MKS or CYGWIN" - fi - - # WINDOWS: Compiler setup (nasty part) - # NOTE: You can use vcvars32.bat to set PATH, LIB, and INCLUDE. - # NOTE: CYGWIN has a link.exe too, make sure the compilers are first - if [ "${windows_arch}" = i586 ] ; then - # 32bit Windows compiler settings - # VisualStudio .NET 2003 VC++ 7.1 (VS71COMNTOOLS should be defined) - vs_root=`${dosname} "${VS71COMNTOOLS}/../.."` - # Fill in PATH, LIB, and INCLUDE (unset all others to make sure) - msdev_root="${vs_root}/Common7/Tools" - msdevtools_path="${msdev_root}/bin" - vc7_root="${vs_root}/Vc7" - compiler_path="${vc7_root}/bin" - compiler_name=VS2003 - platform_sdk="${vc7_root}/PlatformSDK" - # LIB and INCLUDE must use ; as a separator - include4sdk="${vc7_root}/atlmfc/include" - include4sdk="${include4sdk};${vc7_root}/include" - include4sdk="${include4sdk};${platform_sdk}/include/prerelease" - include4sdk="${include4sdk};${platform_sdk}/include" - include4sdk="${include4sdk};${vs_root}/SDK/v1.1/include" - lib4sdk="${vc7_root}/atlmfc/lib" - lib4sdk="${lib4sdk};${vc7_root}/lib" - lib4sdk="${lib4sdk};${platform_sdk}/lib/prerelease" - lib4sdk="${lib4sdk};${platform_sdk}/lib" - lib4sdk="${lib4sdk};${vs_root}/SDK/v1.1/lib" - # Search path and DLL locating path - # WARNING: CYGWIN has a link.exe too, make sure compilers are first - path4sdk="${vs_root}/Common7/Tools/bin;${path4sdk}" - path4sdk="${vs_root}/SDK/v1.1/bin;${path4sdk}" - path4sdk="${vs_root}/Common7/Tools;${path4sdk}" - path4sdk="${vs_root}/Common7/Tools/bin/prerelease;${path4sdk}" - path4sdk="${vs_root}/Common7/IDE;${path4sdk}" - path4sdk="${compiler_path};${path4sdk}" - elif [ "${windows_arch}" = amd64 ] ; then - # AMD64 64bit Windows compiler settings - if [ "${MSSDK}" != "" ] ; then - platform_sdk="${MSSDK}" - else - platform_sdk=`${dosname} "C:/Program Files/Microsoft Platform SDK/"` - fi - compiler_path="${platform_sdk}/Bin/win64/x86/AMD64" - compiler_name=VS2005_PSDK - msdevtools_path="${platform_sdk}/Bin" - # LIB and INCLUDE must use ; as a separator - include4sdk="${platform_sdk}/Include" - include4sdk="${include4sdk};${platform_sdk}/Include/crt/sys" - include4sdk="${include4sdk};${platform_sdk}/Include/mfc" - include4sdk="${include4sdk};${platform_sdk}/Include/atl" - include4sdk="${include4sdk};${platform_sdk}/Include/crt" - lib4sdk="${platform_sdk}/Lib/AMD64" - lib4sdk="${lib4sdk};${platform_sdk}/Lib/AMD64/atlmfc" - # Search path and DLL locating path - # WARNING: CYGWIN has a link.exe too, make sure compilers are first - path4sdk="${platform_sdk}/bin;${path4sdk}" - path4sdk="${compiler_path};${path4sdk}" - fi - # Export LIB and INCLUDE - unset lib - unset Lib - LIB="${lib4sdk}" - export LIB - unset include - unset Include - INCLUDE="${include4sdk}" - export INCLUDE - # Set the ALT variable - ALT_COMPILER_PATH=`${dosname} "${compiler_path}"` - export ALT_COMPILER_PATH - dirMustExist "${compiler_path}" ALT_COMPILER_PATH - ALT_MSDEVTOOLS_PATH=`${dosname} "${msdevtools_path}"` - export ALT_MSDEVTOOLS_PATH - dirMustExist "${msdevtools_path}" ALT_MSDEVTOOLS_PATH - - # WINDOWS: Get the previous JDK to be used to bootstrap the build - path4sdk="${bootdir}/bin;${path4sdk}" - - # Turn all \\ into /, remove duplicates and trailing / - slash_path="`echo ${path4sdk} | sed -e 's@\\\\@/@g' -e 's@//@/@g' -e 's@/$@@' -e 's@/;@;@g'`" - - # For windows, it's hard to know where the system is, so we just add this - # to PATH. - path4sdk="${slash_path};${PATH}" - - # Convert path4sdk to cygwin style - if [ "${unix_toolset}" = CYGWIN ] ; then - path4sdk="`/usr/bin/cygpath -p ${path4sdk}`" - fi - - # Set special windows ALT variables - ALT_ISHIELDDIR="C:/ishield802" - export ALT_ISHIELDDIR - - # Sponsors binaries - ALT_SPONSOR1DIR=C:/sponsor_binaries - export ALT_SPONSOR1DIR - ALT_SPONSOR2DIR=C:/sponsor_binaries - export ALT_SPONSOR2DIR - -fi - -# Export PATH setting -PATH="${path4sdk}" -export PATH - -# Things we need to unset -unset LD_LIBRARY_PATH -unset LD_LIBRARY_PATH_32 -unset LD_LIBRARY_PATH_64 -unset JAVA_HOME - From ec207ef68289d356b856690f2d52770ad055c347 Mon Sep 17 00:00:00 2001 From: Doug Lea Date: Thu, 26 Mar 2009 17:39:42 -0700 Subject: [PATCH 202/292] 6822903: Reliability and documentation improvements for ReentrantReadWriteLock Make firstReader a Thread, not a long Reviewed-by: martin --- .../locks/ReentrantReadWriteLock.java | 86 +++++++++++-------- 1 file changed, 49 insertions(+), 37 deletions(-) diff --git a/jdk/src/share/classes/java/util/concurrent/locks/ReentrantReadWriteLock.java b/jdk/src/share/classes/java/util/concurrent/locks/ReentrantReadWriteLock.java index 8888efb2477..e767dfa62b1 100644 --- a/jdk/src/share/classes/java/util/concurrent/locks/ReentrantReadWriteLock.java +++ b/jdk/src/share/classes/java/util/concurrent/locks/ReentrantReadWriteLock.java @@ -276,7 +276,7 @@ public class ReentrantReadWriteLock implements ReadWriteLock, java.io.Serializab * Maintained as a ThreadLocal; cached in cachedHoldCounter */ static final class HoldCounter { - int count; + int count = 0; // Use id, not reference, to avoid garbage retention final long tid = Thread.currentThread().getId(); } @@ -293,8 +293,9 @@ public class ReentrantReadWriteLock implements ReadWriteLock, java.io.Serializab } /** - * The number of read locks held by current thread. + * The number of reentrant read locks held by current thread. * Initialized only in constructor and readObject. + * Removed whenever a thread's read hold count drops to 0. */ private transient ThreadLocalHoldCounter readHolds; @@ -304,17 +305,35 @@ public class ReentrantReadWriteLock implements ReadWriteLock, java.io.Serializab * where the next thread to release is the last one to * acquire. This is non-volatile since it is just used * as a heuristic, and would be great for threads to cache. + * + *

Can outlive the Thread for which it is caching the read + * hold count, but avoids garbage retention by not retaining a + * reference to the Thread. + * + *

Accessed via a benign data race; relies on the memory + * model's final field and out-of-thin-air guarantees. */ private transient HoldCounter cachedHoldCounter; /** * firstReader is the first thread to have acquired the read lock. * firstReaderHoldCount is firstReader's hold count. - * This allows tracking of read holds for uncontended read + * + *

More precisely, firstReader is the unique thread that last + * changed the shared count from 0 to 1, and has not released the + * read lock since then; null if there is no such thread. + * + *

Cannot cause garbage retention unless the thread terminated + * without relinquishing its read locks, since tryReleaseShared + * sets it to null. + * + *

Accessed via a benign data race; relies on the memory + * model's out-of-thin-air guarantees for references. + * + *

This allows tracking of read holds for uncontended read * locks to be very cheap. */ - private final static long INVALID_THREAD_ID = -1; - private transient long firstReader = INVALID_THREAD_ID; + private transient Thread firstReader = null; private transient int firstReaderHoldCount; Sync() { @@ -393,16 +412,16 @@ public class ReentrantReadWriteLock implements ReadWriteLock, java.io.Serializab } protected final boolean tryReleaseShared(int unused) { - long tid = Thread.currentThread().getId(); - if (firstReader == tid) { + Thread current = Thread.currentThread(); + if (firstReader == current) { // assert firstReaderHoldCount > 0; if (firstReaderHoldCount == 1) - firstReader = INVALID_THREAD_ID; + firstReader = null; else firstReaderHoldCount--; } else { HoldCounter rh = cachedHoldCounter; - if (rh == null || rh.tid != tid) + if (rh == null || rh.tid != current.getId()) rh = readHolds.get(); int count = rh.count; if (count <= 1) { @@ -416,6 +435,9 @@ public class ReentrantReadWriteLock implements ReadWriteLock, java.io.Serializab int c = getState(); int nextc = c - SHARED_UNIT; if (compareAndSetState(c, nextc)) + // Releasing the read lock has no effect on readers, + // but it may allow waiting writers to proceed if + // both read and write locks are now free. return nextc == 0; } } @@ -450,15 +472,14 @@ public class ReentrantReadWriteLock implements ReadWriteLock, java.io.Serializab if (!readerShouldBlock() && r < MAX_COUNT && compareAndSetState(c, c + SHARED_UNIT)) { - long tid = current.getId(); if (r == 0) { - firstReader = tid; + firstReader = current; firstReaderHoldCount = 1; - } else if (firstReader == tid) { + } else if (firstReader == current) { firstReaderHoldCount++; } else { HoldCounter rh = cachedHoldCounter; - if (rh == null || rh.tid != tid) + if (rh == null || rh.tid != current.getId()) cachedHoldCounter = rh = readHolds.get(); else if (rh.count == 0) readHolds.set(rh); @@ -485,19 +506,17 @@ public class ReentrantReadWriteLock implements ReadWriteLock, java.io.Serializab int c = getState(); if (exclusiveCount(c) != 0) { if (getExclusiveOwnerThread() != current) - //if (removeNeeded) readHolds.remove(); return -1; // else we hold the exclusive lock; blocking here // would cause deadlock. } else if (readerShouldBlock()) { // Make sure we're not acquiring read lock reentrantly - long tid = current.getId(); - if (firstReader == tid) { + if (firstReader == current) { // assert firstReaderHoldCount > 0; } else { if (rh == null) { rh = cachedHoldCounter; - if (rh == null || rh.tid != tid) { + if (rh == null || rh.tid != current.getId()) { rh = readHolds.get(); if (rh.count == 0) readHolds.remove(); @@ -510,25 +529,20 @@ public class ReentrantReadWriteLock implements ReadWriteLock, java.io.Serializab if (sharedCount(c) == MAX_COUNT) throw new Error("Maximum lock count exceeded"); if (compareAndSetState(c, c + SHARED_UNIT)) { - long tid = current.getId(); if (sharedCount(c) == 0) { - firstReader = tid; + firstReader = current; firstReaderHoldCount = 1; - } else if (firstReader == tid) { + } else if (firstReader == current) { firstReaderHoldCount++; } else { - if (rh == null) { + if (rh == null) rh = cachedHoldCounter; - if (rh != null && rh.tid == tid) { - if (rh.count == 0) - readHolds.set(rh); - } else { - rh = readHolds.get(); - } - } else if (rh.count == 0) + if (rh == null || rh.tid != current.getId()) + rh = readHolds.get(); + else if (rh.count == 0) readHolds.set(rh); - cachedHoldCounter = rh; // cache for release rh.count++; + cachedHoldCounter = rh; // cache for release } return 1; } @@ -572,15 +586,14 @@ public class ReentrantReadWriteLock implements ReadWriteLock, java.io.Serializab if (r == MAX_COUNT) throw new Error("Maximum lock count exceeded"); if (compareAndSetState(c, c + SHARED_UNIT)) { - long tid = current.getId(); if (r == 0) { - firstReader = tid; + firstReader = current; firstReaderHoldCount = 1; - } else if (firstReader == tid) { + } else if (firstReader == current) { firstReaderHoldCount++; } else { HoldCounter rh = cachedHoldCounter; - if (rh == null || rh.tid != tid) + if (rh == null || rh.tid != current.getId()) cachedHoldCounter = rh = readHolds.get(); else if (rh.count == 0) readHolds.set(rh); @@ -626,12 +639,12 @@ public class ReentrantReadWriteLock implements ReadWriteLock, java.io.Serializab if (getReadLockCount() == 0) return 0; - long tid = Thread.currentThread().getId(); - if (firstReader == tid) + Thread current = Thread.currentThread(); + if (firstReader == current) return firstReaderHoldCount; HoldCounter rh = cachedHoldCounter; - if (rh != null && rh.tid == tid) + if (rh != null && rh.tid == current.getId()) return rh.count; int count = readHolds.get().count; @@ -647,7 +660,6 @@ public class ReentrantReadWriteLock implements ReadWriteLock, java.io.Serializab throws java.io.IOException, ClassNotFoundException { s.defaultReadObject(); readHolds = new ThreadLocalHoldCounter(); - firstReader = INVALID_THREAD_ID; setState(0); // reset to unlocked state } From 739414c17703f8370e3b40ff2b9e53c85de5efca Mon Sep 17 00:00:00 2001 From: Weijun Wang Date: Fri, 27 Mar 2009 11:05:45 +0800 Subject: [PATCH 203/292] 6802846: jarsigner needs enhanced cert validation(options) Reviewed-by: xuelei --- .../classes/sun/security/tools/JarSigner.java | 706 ++++++++++++------ .../security/tools/JarSignerResources.java | 53 +- .../classes/sun/security/tools/KeyTool.java | 2 +- .../tools/jarsigner/concise_jarsigner.sh | 200 +++++ 4 files changed, 706 insertions(+), 255 deletions(-) create mode 100644 jdk/test/sun/security/tools/jarsigner/concise_jarsigner.sh diff --git a/jdk/src/share/classes/sun/security/tools/JarSigner.java b/jdk/src/share/classes/sun/security/tools/JarSigner.java index d8d1ee3d517..2de2e52b08a 100644 --- a/jdk/src/share/classes/sun/security/tools/JarSigner.java +++ b/jdk/src/share/classes/sun/security/tools/JarSigner.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -32,28 +32,44 @@ import java.util.jar.*; import java.math.BigInteger; import java.net.URI; import java.net.URISyntaxException; -import java.net.URL; -import java.net.URLClassLoader; -import java.net.SocketTimeoutException; import java.text.Collator; import java.text.MessageFormat; import java.security.cert.Certificate; import java.security.cert.X509Certificate; import java.security.cert.CertificateException; -import java.security.cert.CertificateExpiredException; -import java.security.cert.CertificateNotYetValidException; import java.security.*; import java.lang.reflect.Constructor; import com.sun.jarsigner.ContentSigner; import com.sun.jarsigner.ContentSignerParameters; +import java.net.SocketTimeoutException; +import java.net.URL; +import java.net.URLClassLoader; +import java.security.cert.CertPath; +import java.security.cert.CertPathValidator; +import java.security.cert.CertificateExpiredException; +import java.security.cert.CertificateFactory; +import java.security.cert.CertificateNotYetValidException; +import java.security.cert.PKIXParameters; +import java.security.cert.TrustAnchor; +import java.util.Map.Entry; import sun.security.x509.*; import sun.security.util.*; import sun.misc.BASE64Encoder; + /** *

The jarsigner utility. * + * The exit codes for the main method are: + * + * 0: success + * 1: any error that the jar cannot be signed or verified, including: + * keystore loading error + * TSP communciation error + * jarsigner command line error... + * otherwise: error codes from -strict + * * @author Roland Schemers * @author Jan Luehe */ @@ -84,8 +100,6 @@ public class JarSigner { // Attention: // This is the entry that get launched by the security tool jarsigner. - // It's marked as exported private per AppServer Team's request. - // See http://ccc.sfbay/6428446 public static void main(String args[]) throws Exception { JarSigner js = new JarSigner(); js.run(args); @@ -93,31 +107,32 @@ public class JarSigner { static final String VERSION = "1.0"; - static final int IN_KEYSTORE = 0x01; + static final int IN_KEYSTORE = 0x01; // signer is in keystore static final int IN_SCOPE = 0x02; + static final int NOT_ALIAS = 0x04; // alias list is NOT empty and + // signer is not in alias list + static final int SIGNED_BY_ALIAS = 0x08; // signer is in alias list - // signer's certificate chain (when composing) - X509Certificate[] certChain; - - /* - * private key - */ - PrivateKey privateKey; - KeyStore store; + X509Certificate[] certChain; // signer's cert chain (when composing) + PrivateKey privateKey; // private key + KeyStore store; // the keystore specified by -keystore + // or the default keystore, never null IdentityScope scope; String keystore; // key store file boolean nullStream = false; // null keystore input stream (NONE) boolean token = false; // token-based keystore - String jarfile; // jar file to sign + String jarfile; // jar file to sign or verify String alias; // alias to sign jar with + List ckaliases = new ArrayList(); // aliases in -verify char[] storepass; // keystore password boolean protectedPath; // protected authentication path String storetype; // keystore type String providerName; // provider name Vector providers = null; // list of providers - HashMap providerArgs = new HashMap(); // arguments for provider constructors + // arguments for provider constructors + HashMap providerArgs = new HashMap(); char[] keypass; // private key password String sigfile; // name of .SF file String sigalg; // name of signature algorithm @@ -125,12 +140,14 @@ public class JarSigner { String signedjar; // output filename String tsaUrl; // location of the Timestamping Authority String tsaAlias; // alias for the Timestamping Authority's certificate + String altCertChain; // file to read alternative cert chain from boolean verify = false; // verify the jar - boolean verbose = false; // verbose output when signing/verifying + String verbose = null; // verbose output when signing/verifying boolean showcerts = false; // show certs when verifying boolean debug = false; // debug boolean signManifest = true; // "sign" the whole manifest boolean externalSF = true; // leave the .SF out of the PKCS7 block + boolean strict = false; // treat warnings as error // read zip entry raw bytes private ByteArrayOutputStream baos = new ByteArrayOutputStream(2048); @@ -139,14 +156,22 @@ public class JarSigner { private String altSignerClass = null; private String altSignerClasspath = null; private ZipFile zipFile = null; + private boolean hasExpiredCert = false; private boolean hasExpiringCert = false; private boolean notYetValidCert = false; - + private boolean chainNotValidated = false; + private boolean notSignedByAlias = false; + private boolean aliasNotInStore = false; + private boolean hasUnsignedEntry = false; private boolean badKeyUsage = false; private boolean badExtendedKeyUsage = false; private boolean badNetscapeCertType = false; + CertificateFactory certificateFactory; + CertPathValidator validator; + PKIXParameters pkixParameters; + public void run(String args[]) { try { parseArgs(args); @@ -184,14 +209,6 @@ public class JarSigner { } } - hasExpiredCert = false; - hasExpiringCert = false; - notYetValidCert = false; - - badKeyUsage = false; - badExtendedKeyUsage = false; - badNetscapeCertType = false; - if (verify) { try { loadKeyStore(keystore, false); @@ -238,6 +255,29 @@ public class JarSigner { storepass = null; } } + + if (strict) { + int exitCode = 0; + if (hasExpiringCert) { + exitCode |= 2; + } + if (chainNotValidated) { + // hasExpiredCert and notYetValidCert included in this case + exitCode |= 4; + } + if (badKeyUsage || badExtendedKeyUsage || badNetscapeCertType) { + exitCode |= 8; + } + if (hasUnsignedEntry) { + exitCode |= 16; + } + if (notSignedByAlias || aliasNotInStore) { + exitCode |= 32; + } + if (exitCode != 0) { + System.exit(exitCode); + } + } } /* @@ -247,25 +287,26 @@ public class JarSigner { /* parse flags */ int n = 0; - for (n=0; (n < args.length) && args[n].startsWith("-"); n++) { + if (args.length == 0) fullusage(); + for (n=0; n < args.length; n++) { String flags = args[n]; if (collator.compare(flags, "-keystore") == 0) { - if (++n == args.length) usage(); + if (++n == args.length) usageNoArg(); keystore = args[n]; } else if (collator.compare(flags, "-storepass") ==0) { - if (++n == args.length) usage(); + if (++n == args.length) usageNoArg(); storepass = args[n].toCharArray(); } else if (collator.compare(flags, "-storetype") ==0) { - if (++n == args.length) usage(); + if (++n == args.length) usageNoArg(); storetype = args[n]; } else if (collator.compare(flags, "-providerName") ==0) { - if (++n == args.length) usage(); + if (++n == args.length) usageNoArg(); providerName = args[n]; } else if ((collator.compare(flags, "-provider") == 0) || (collator.compare(flags, "-providerClass") == 0)) { - if (++n == args.length) usage(); + if (++n == args.length) usageNoArg(); if (providers == null) { providers = new Vector(3); } @@ -274,35 +315,38 @@ public class JarSigner { if (args.length > (n+1)) { flags = args[n+1]; if (collator.compare(flags, "-providerArg") == 0) { - if (args.length == (n+2)) usage(); + if (args.length == (n+2)) usageNoArg(); providerArgs.put(args[n], args[n+2]); n += 2; } } } else if (collator.compare(flags, "-protected") ==0) { protectedPath = true; + } else if (collator.compare(flags, "-certchain") ==0) { + if (++n == args.length) usageNoArg(); + altCertChain = args[n]; } else if (collator.compare(flags, "-debug") ==0) { debug = true; } else if (collator.compare(flags, "-keypass") ==0) { - if (++n == args.length) usage(); + if (++n == args.length) usageNoArg(); keypass = args[n].toCharArray(); } else if (collator.compare(flags, "-sigfile") ==0) { - if (++n == args.length) usage(); + if (++n == args.length) usageNoArg(); sigfile = args[n]; } else if (collator.compare(flags, "-signedjar") ==0) { - if (++n == args.length) usage(); + if (++n == args.length) usageNoArg(); signedjar = args[n]; } else if (collator.compare(flags, "-tsa") ==0) { - if (++n == args.length) usage(); + if (++n == args.length) usageNoArg(); tsaUrl = args[n]; } else if (collator.compare(flags, "-tsacert") ==0) { - if (++n == args.length) usage(); + if (++n == args.length) usageNoArg(); tsaAlias = args[n]; } else if (collator.compare(flags, "-altsigner") ==0) { - if (++n == args.length) usage(); + if (++n == args.length) usageNoArg(); altSignerClass = args[n]; } else if (collator.compare(flags, "-altsignerpath") ==0) { - if (++n == args.length) usage(); + if (++n == args.length) usageNoArg(); altSignerClasspath = args[n]; } else if (collator.compare(flags, "-sectionsonly") ==0) { signManifest = false; @@ -311,30 +355,56 @@ public class JarSigner { } else if (collator.compare(flags, "-verify") ==0) { verify = true; } else if (collator.compare(flags, "-verbose") ==0) { - verbose = true; + verbose = "all"; + } else if (collator.compare(flags, "-verbose:all") ==0) { + verbose = "all"; + } else if (collator.compare(flags, "-verbose:summary") ==0) { + verbose = "summary"; + } else if (collator.compare(flags, "-verbose:grouped") ==0) { + verbose = "grouped"; } else if (collator.compare(flags, "-sigalg") ==0) { - if (++n == args.length) usage(); + if (++n == args.length) usageNoArg(); sigalg = args[n]; } else if (collator.compare(flags, "-digestalg") ==0) { - if (++n == args.length) usage(); + if (++n == args.length) usageNoArg(); digestalg = args[n]; } else if (collator.compare(flags, "-certs") ==0) { showcerts = true; + } else if (collator.compare(flags, "-strict") ==0) { + strict = true; } else if (collator.compare(flags, "-h") == 0 || collator.compare(flags, "-help") == 0) { - usage(); + fullusage(); } else { - System.err.println(rb.getString("Illegal option: ") + flags); - usage(); + if (!flags.startsWith("-")) { + if (jarfile == null) { + jarfile = flags; + } else { + alias = flags; + ckaliases.add(alias); + } + } else { + System.err.println( + rb.getString("Illegal option: ") + flags); + usage(); + } } } - if (n == args.length) usage(); - jarfile = args[n++]; + // -certs must always be specified with -verbose + if (verbose == null) showcerts = false; - if (!verify) { - if (n == args.length) usage(); - alias = args[n++]; + if (jarfile == null) { + System.err.println(rb.getString("Please specify jarfile name")); + usage(); + } + if (!verify && alias == null) { + System.err.println(rb.getString("Please specify alias name")); + usage(); + } + if (!verify && ckaliases.size() > 1) { + System.err.println(rb.getString("Only one alias can be specified")); + usage(); } if (storetype == null) { @@ -357,7 +427,6 @@ public class JarSigner { if (token && !nullStream) { System.err.println(MessageFormat.format(rb.getString ("-keystore must be NONE if -storetype is {0}"), storetype)); - System.err.println(); usage(); } @@ -365,7 +434,6 @@ public class JarSigner { System.err.println(MessageFormat.format(rb.getString ("-keypass can not be specified " + "if -storetype is {0}"), storetype)); - System.err.println(); usage(); } @@ -374,7 +442,6 @@ public class JarSigner { System.err.println(rb.getString ("If -protected is specified, " + "then -storepass and -keypass must not be specified")); - System.err.println(); usage(); } } @@ -383,17 +450,27 @@ public class JarSigner { System.err.println(rb.getString ("If keystore is not password protected, " + "then -storepass and -keypass must not be specified")); - System.err.println(); usage(); } } } + void usageNoArg() { + System.out.println(rb.getString("Option lacks argument")); + usage(); + } + void usage() { + System.out.println(); + System.out.println(rb.getString("Please type jarsigner -help for usage")); + System.exit(1); + } + + void fullusage() { System.out.println(rb.getString ("Usage: jarsigner [options] jar-file alias")); System.out.println(rb.getString - (" jarsigner -verify [options] jar-file")); + (" jarsigner -verify [options] jar-file [alias...]")); System.out.println(); System.out.println(rb.getString ("[-keystore ] keystore location")); @@ -407,6 +484,9 @@ public class JarSigner { System.out.println(rb.getString ("[-keypass ] password for private key (if different)")); System.out.println(); + System.out.println(rb.getString + ("[-certchain ] name of alternative certchain file")); + System.out.println(); System.out.println(rb.getString ("[-sigfile ] name of .SF/.DSA file")); System.out.println(); @@ -423,7 +503,9 @@ public class JarSigner { ("[-verify] verify a signed JAR file")); System.out.println(); System.out.println(rb.getString - ("[-verbose] verbose output when signing/verifying")); + ("[-verbose[:suboptions]] verbose output when signing/verifying.")); + System.out.println(rb.getString + (" suboptions can be all, grouped or summary")); System.out.println(); System.out.println(rb.getString ("[-certs] display certificates when verbose and verifying")); @@ -457,15 +539,17 @@ public class JarSigner { System.out.println(rb.getString (" [-providerArg ]] ... master class file and constructor argument")); System.out.println(); + System.out.println(rb.getString + ("[-strict] treat warnings as errors")); + System.out.println(); - System.exit(1); + System.exit(0); } void verifyJar(String jarName) throws Exception { - boolean anySigned = false; - boolean hasUnsignedEntry = false; + boolean anySigned = false; // if there exists entry inside jar signed JarFile jf = null; try { @@ -494,11 +578,18 @@ public class JarSigner { Manifest man = jf.getManifest(); + // The map to record display info, only used when -verbose provided + // key: signer info string + // value: the list of files with common key + Map> output = + new LinkedHashMap>(); + if (man != null) { - if (verbose) System.out.println(); + if (verbose != null) System.out.println(); Enumeration e = entriesVec.elements(); long now = System.currentTimeMillis(); + String tab = rb.getString(" "); while (e.hasMoreElements()) { JarEntry je = e.nextElement(); @@ -509,77 +600,118 @@ public class JarSigner { hasUnsignedEntry |= !je.isDirectory() && !isSigned && !signatureRelated(name); - if (verbose) { - int inStoreOrScope = inKeyStore(signers); - boolean inStore = (inStoreOrScope & IN_KEYSTORE) != 0; - boolean inScope = (inStoreOrScope & IN_SCOPE) != 0; + int inStoreOrScope = inKeyStore(signers); + + boolean inStore = (inStoreOrScope & IN_KEYSTORE) != 0; + boolean inScope = (inStoreOrScope & IN_SCOPE) != 0; + + notSignedByAlias |= (inStoreOrScope & NOT_ALIAS) != 0; + aliasNotInStore |= isSigned && (!inStore && !inScope); + + // Only used when -verbose provided + StringBuffer sb = null; + if (verbose != null) { + sb = new StringBuffer(); boolean inManifest = ((man.getAttributes(name) != null) || (man.getAttributes("./"+name) != null) || (man.getAttributes("/"+name) != null)); - System.out.print( + sb.append( (isSigned ? rb.getString("s") : rb.getString(" ")) + (inManifest ? rb.getString("m") : rb.getString(" ")) + (inStore ? rb.getString("k") : rb.getString(" ")) + (inScope ? rb.getString("i") : rb.getString(" ")) + - rb.getString(" ")); - StringBuffer sb = new StringBuffer(); + ((inStoreOrScope & NOT_ALIAS) != 0 ?"X":" ") + + rb.getString(" ")); + sb.append("|"); + } + + // When -certs provided, display info has extra empty + // lines at the beginning and end. + if (isSigned) { + if (showcerts) sb.append('\n'); + for (CodeSigner signer: signers) { + // signerInfo() must be called even if -verbose + // not provided. The method updates various + // warning flags. + String si = signerInfo(signer, tab, now); + if (showcerts) { + sb.append(si); + sb.append('\n'); + } + } + } else if (showcerts && !verbose.equals("all")) { + // Print no info for unsigned entries when -verbose:all, + // to be consistent with old behavior. + if (signatureRelated(name)) { + sb.append("\n" + tab + rb.getString( + "(Signature related entries)") + "\n\n"); + } else { + sb.append("\n" + tab + rb.getString( + "(Unsigned entries)") + "\n\n"); + } + } + + if (verbose != null) { + String label = sb.toString(); + if (signatureRelated(name)) { + // Entries inside META-INF and other unsigned + // entries are grouped separately. + label = "-" + label.substring(1); + } + + // The label finally contains 2 parts separated by '|': + // The legend displayed before the entry names, and + // the cert info (if -certs specfied). + + if (!output.containsKey(label)) { + output.put(label, new ArrayList()); + } + + StringBuffer fb = new StringBuffer(); String s = Long.toString(je.getSize()); for (int i = 6 - s.length(); i > 0; --i) { - sb.append(' '); - } - sb.append(s).append(' '). - append(new Date(je.getTime()).toString()); - sb.append(' ').append(je.getName()); - System.out.println(sb.toString()); - - if (signers != null && showcerts) { - String tab = rb.getString(" "); - for (int i = 0; i < signers.length; i++) { - System.out.println(); - List certs = - signers[i].getSignerCertPath() - .getCertificates(); - // display the signature timestamp, if present - Timestamp timestamp = signers[i].getTimestamp(); - if (timestamp != null) { - System.out.println( - printTimestamp(tab, timestamp)); - } - // display the certificate(s) - for (Certificate c : certs) { - System.out.println( - printCert(tab, c, true, now)); - } - } - System.out.println(); + fb.append(' '); } + fb.append(s).append(' '). + append(new Date(je.getTime()).toString()); + fb.append(' ').append(name); + output.get(label).add(fb.toString()); } - if (isSigned) { - for (int i = 0; i < signers.length; i++) { - Certificate cert = - signers[i].getSignerCertPath() - .getCertificates().get(0); - if (cert instanceof X509Certificate) { - checkCertUsage((X509Certificate)cert, null); - if (!showcerts) { - long notAfter = ((X509Certificate)cert) - .getNotAfter().getTime(); - - if (notAfter < now) { - hasExpiredCert = true; - } else if (notAfter < now + SIX_MONTHS) { - hasExpiringCert = true; - } - } - } - } - } - } } - if (verbose) { + if (verbose != null) { + for (Entry> s: output.entrySet()) { + List files = s.getValue(); + String key = s.getKey(); + if (key.charAt(0) == '-') { // the signature-related group + key = ' ' + key.substring(1); + } + int pipe = key.indexOf('|'); + if (verbose.equals("all")) { + for (String f: files) { + System.out.println(key.substring(0, pipe) + f); + System.out.printf(key.substring(pipe+1)); + } + } else { + if (verbose.equals("grouped")) { + for (String f: files) { + System.out.println(key.substring(0, pipe) + f); + } + } else if (verbose.equals("summary")) { + System.out.print(key.substring(0, pipe)); + if (files.size() > 1) { + System.out.println(files.get(0) + " " + + String.format(rb.getString( + "(and %d more)"), files.size()-1)); + } else { + System.out.println(files.get(0)); + } + } + System.out.printf(key.substring(pipe+1)); + } + } System.out.println(); System.out.println(rb.getString( " s = signature was verified ")); @@ -589,9 +721,12 @@ public class JarSigner { " k = at least one certificate was found in keystore")); System.out.println(rb.getString( " i = at least one certificate was found in identity scope")); + if (ckaliases.size() > 0) { + System.out.println(( + " X = not signed by specified alias(es)")); + } System.out.println(); } - if (man == null) System.out.println(rb.getString("no manifest.")); @@ -602,7 +737,8 @@ public class JarSigner { System.out.println(rb.getString("jar verified.")); if (hasUnsignedEntry || hasExpiredCert || hasExpiringCert || badKeyUsage || badExtendedKeyUsage || badNetscapeCertType || - notYetValidCert) { + notYetValidCert || chainNotValidated || + aliasNotInStore || notSignedByAlias) { System.out.println(); System.out.println(rb.getString("Warning: ")); @@ -638,14 +774,27 @@ public class JarSigner { "This jar contains entries whose signer certificate is not yet valid. ")); } - if (! (verbose && showcerts)) { + if (chainNotValidated) { + System.out.println( + rb.getString("This jar contains entries whose certificate chain is not validated.")); + } + + if (notSignedByAlias) { + System.out.println( + rb.getString("This jar contains signed entries which is not signed by the specified alias(es).")); + } + + if (aliasNotInStore) { + System.out.println(rb.getString("This jar contains signed entries that's not signed by alias in this keystore.")); + } + if (! (verbose != null && showcerts)) { System.out.println(); System.out.println(rb.getString( "Re-run with the -verbose and -certs options for more details.")); } } } - System.exit(0); + return; } catch (Exception e) { System.out.println(rb.getString("jarsigner: ") + e); if (debug) { @@ -660,15 +809,6 @@ public class JarSigner { System.exit(1); } - /* - * Display some details about a certificate: - * - * [", " ] [" (" ")"] - */ - String printCert(Certificate c) { - return printCert("", c, false, 0); - } - private static MessageFormat validityTimeForm = null; private static MessageFormat notYetTimeForm = null; private static MessageFormat expiredTimeForm = null; @@ -679,6 +819,8 @@ public class JarSigner { * * [] [", " ] [" (" ")"] * [ | ] + * + * Note: no newline character at the end */ String printCert(String tab, Certificate c, boolean checkValidityPeriod, long now) { @@ -788,54 +930,75 @@ public class JarSigner { .append(signTimeForm.format(source)).append("]").toString(); } + private Map cacheForInKS = + new IdentityHashMap(); + + private int inKeyStoreForOneSigner(CodeSigner signer) { + if (cacheForInKS.containsKey(signer)) { + return cacheForInKS.get(signer); + } + + boolean found = false; + int result = 0; + List certs = signer.getSignerCertPath().getCertificates(); + for (Certificate c : certs) { + String alias = storeHash.get(c); + if (alias != null) { + if (alias.startsWith("(")) { + result |= IN_KEYSTORE; + } else if (alias.startsWith("[")) { + result |= IN_SCOPE; + } + if (ckaliases.contains(alias.substring(1, alias.length() - 1))) { + result |= SIGNED_BY_ALIAS; + } + } else { + if (store != null) { + try { + alias = store.getCertificateAlias(c); + } catch (KeyStoreException kse) { + // never happens, because keystore has been loaded + } + if (alias != null) { + storeHash.put(c, "(" + alias + ")"); + found = true; + result |= IN_KEYSTORE; + } + } + if (!found && (scope != null)) { + Identity id = scope.getIdentity(c.getPublicKey()); + if (id != null) { + result |= IN_SCOPE; + storeHash.put(c, "[" + id.getName() + "]"); + } + } + if (ckaliases.contains(alias)) { + result |= SIGNED_BY_ALIAS; + } + } + } + cacheForInKS.put(signer, result); + return result; + } + Hashtable storeHash = new Hashtable(); int inKeyStore(CodeSigner[] signers) { - int result = 0; if (signers == null) return 0; - boolean found = false; + int output = 0; - for (int i = 0; i < signers.length; i++) { - found = false; - List certs = - signers[i].getSignerCertPath().getCertificates(); - - for (Certificate c : certs) { - String alias = storeHash.get(c); - - if (alias != null) { - if (alias.startsWith("(")) - result |= IN_KEYSTORE; - else if (alias.startsWith("[")) - result |= IN_SCOPE; - } else { - if (store != null) { - try { - alias = store.getCertificateAlias(c); - } catch (KeyStoreException kse) { - // never happens, because keystore has been loaded - } - if (alias != null) { - storeHash.put(c, "("+alias+")"); - found = true; - result |= IN_KEYSTORE; - } - } - if (!found && (scope != null)) { - Identity id = scope.getIdentity(c.getPublicKey()); - if (id != null) { - result |= IN_SCOPE; - storeHash.put(c, "["+id.getName()+"]"); - } - } - } - } + for (CodeSigner signer: signers) { + int result = inKeyStoreForOneSigner(signer); + output |= result; } - return result; + if (ckaliases.size() > 0 && (output & SIGNED_BY_ALIAS) == 0) { + output |= NOT_ALIAS; + } + return output; } void signJar(String jarName, String alias, String[] args) @@ -1025,7 +1188,7 @@ public class JarSigner { // manifest file has new length mfFile = new ZipEntry(JarFile.MANIFEST_NAME); } - if (verbose) { + if (verbose != null) { if (mfCreated) { System.out.println(rb.getString(" adding: ") + mfFile.getName()); @@ -1076,7 +1239,7 @@ public class JarSigner { // signature file zos.putNextEntry(sfFile); sf.write(zos); - if (verbose) { + if (verbose != null) { if (zipFile.getEntry(sfFilename) != null) { System.out.println(rb.getString(" updating: ") + sfFilename); @@ -1086,7 +1249,7 @@ public class JarSigner { } } - if (verbose) { + if (verbose != null) { if (tsaUrl != null || tsaCert != null) { System.out.println( rb.getString("requesting a signature timestamp")); @@ -1101,8 +1264,8 @@ public class JarSigner { System.out.println(rb.getString("TSA location: ") + certUrl); } - System.out.println( - rb.getString("TSA certificate: ") + printCert(tsaCert)); + System.out.println(rb.getString("TSA certificate: ") + + printCert("", tsaCert, false, 0)); } if (signingMechanism != null) { System.out.println( @@ -1113,7 +1276,7 @@ public class JarSigner { // signature block file zos.putNextEntry(bkFile); block.write(zos); - if (verbose) { + if (verbose != null) { if (zipFile.getEntry(bkFilename) != null) { System.out.println(rb.getString(" updating: ") + bkFilename); @@ -1140,7 +1303,7 @@ public class JarSigner { ZipEntry ze = enum_.nextElement(); if (!ze.getName().startsWith(META_INF)) { - if (verbose) { + if (verbose != null) { if (manifest.getAttributes(ze.getName()) != null) System.out.println(rb.getString(" signing: ") + ze.getName()); @@ -1194,7 +1357,8 @@ public class JarSigner { } if (hasExpiredCert || hasExpiringCert || notYetValidCert - || badKeyUsage || badExtendedKeyUsage || badNetscapeCertType) { + || badKeyUsage || badExtendedKeyUsage + || badNetscapeCertType || chainNotValidated) { System.out.println(); System.out.println(rb.getString("Warning: ")); @@ -1223,6 +1387,11 @@ public class JarSigner { System.out.println( rb.getString("The signer certificate is not yet valid.")); } + + if (chainNotValidated) { + System.out.println( + rb.getString("The signer's certificate chain is not validated.")); + } } // no IOException thrown in the above try clause, so disable @@ -1274,6 +1443,40 @@ public class JarSigner { return false; } + Map cacheForSignerInfo = new IdentityHashMap(); + + /** + * Returns a string of singer info, with a newline at the end + */ + private String signerInfo(CodeSigner signer, String tab, long now) { + if (cacheForSignerInfo.containsKey(signer)) { + return cacheForSignerInfo.get(signer); + } + StringBuffer s = new StringBuffer(); + List certs = signer.getSignerCertPath().getCertificates(); + // display the signature timestamp, if present + Timestamp timestamp = signer.getTimestamp(); + if (timestamp != null) { + s.append(printTimestamp(tab, timestamp)); + } + // display the certificate(s) + for (Certificate c : certs) { + s.append(printCert(tab, c, true, now)); + s.append('\n'); + } + try { + CertPath cp = certificateFactory.generateCertPath(certs); + validator.validate(cp, pkixParameters); + } catch (Exception e) { + chainNotValidated = true; + s.append(tab + rb.getString("[CertPath not validated: ") + + e.getLocalizedMessage() + "]\n"); // TODO + } + String result = s.toString(); + cacheForSignerInfo.put(signer, result); + return result; + } + private void writeEntry(ZipFile zf, ZipOutputStream os, ZipEntry ze) throws IOException { @@ -1360,6 +1563,48 @@ public class JarSigner { } } } + Set tas = new HashSet(); + try { + KeyStore caks = KeyTool.getCacertsKeyStore(); + if (caks != null) { + Enumeration aliases = caks.aliases(); + while (aliases.hasMoreElements()) { + String a = aliases.nextElement(); + try { + tas.add(new TrustAnchor((X509Certificate)caks.getCertificate(a), null)); + } catch (Exception e2) { + // ignore, when a SecretkeyEntry does not include a cert + } + } + } + } catch (Exception e) { + // Ignore, if cacerts cannot be loaded + } + if (store != null) { + Enumeration aliases = store.aliases(); + while (aliases.hasMoreElements()) { + String a = aliases.nextElement(); + try { + X509Certificate c = (X509Certificate)store.getCertificate(a); + // Only add TrustedCertificateEntry and self-signed + // PrivateKeyEntry + if (store.isCertificateEntry(a) || + c.getSubjectDN().equals(c.getIssuerDN())) { + tas.add(new TrustAnchor(c, null)); + } + } catch (Exception e2) { + // ignore, when a SecretkeyEntry does not include a cert + } + } + } + certificateFactory = CertificateFactory.getInstance("X.509"); + validator = CertPathValidator.getInstance("PKIX"); + try { + pkixParameters = new PKIXParameters(tas); + pkixParameters.setRevocationEnabled(false); + } catch (InvalidAlgorithmParameterException ex) { + // Only if tas is empty + } } catch (IOException ioe) { throw new RuntimeException(rb.getString("keystore load: ") + ioe.getMessage()); @@ -1408,7 +1653,8 @@ public class JarSigner { void checkCertUsage(X509Certificate userCert, boolean[] bad) { // Can act as a signer? - // 1. if KeyUsage, then [0] should be true + // 1. if KeyUsage, then [0:digitalSignature] or + // [1:nonRepudiation] should be true // 2. if ExtendedKeyUsage, then should contains ANY or CODE_SIGNING // 3. if NetscapeCertType, then should contains OBJECT_SIGNING // 1,2,3 must be true @@ -1419,10 +1665,10 @@ public class JarSigner { boolean[] keyUsage = userCert.getKeyUsage(); if (keyUsage != null) { - if (keyUsage.length < 1 || !keyUsage[0]) { + keyUsage = Arrays.copyOf(keyUsage, 9); + if (!keyUsage[0] && !keyUsage[1]) { if (bad != null) { bad[0] = true; - } else { badKeyUsage = true; } } @@ -1435,7 +1681,6 @@ public class JarSigner { && !xKeyUsage.contains("1.3.6.1.5.5.7.3.3")) { // codeSigning if (bad != null) { bad[1] = true; - } else { badExtendedKeyUsage = true; } } @@ -1462,7 +1707,6 @@ public class JarSigner { if (!val) { if (bad != null) { bad[2] = true; - } else { badNetscapeCertType = true; } } @@ -1477,19 +1721,36 @@ public class JarSigner { Key key = null; try { - java.security.cert.Certificate[] cs = null; - - try { - cs = store.getCertificateChain(alias); - } catch (KeyStoreException kse) { - // this never happens, because keystore has been loaded + if (altCertChain != null) { + try { + cs = CertificateFactory.getInstance("X.509"). + generateCertificates(new FileInputStream(altCertChain)). + toArray(new Certificate[0]); + } catch (CertificateException ex) { + error(rb.getString("Cannot restore certchain from file specified")); + } catch (FileNotFoundException ex) { + error(rb.getString("File specified by -certchain does not exist")); + } + } else { + try { + cs = store.getCertificateChain(alias); + } catch (KeyStoreException kse) { + // this never happens, because keystore has been loaded + } } - if (cs == null) { - MessageFormat form = new MessageFormat(rb.getString - ("Certificate chain not found for: alias. alias must reference a valid KeyStore key entry containing a private key and corresponding public key certificate chain.")); - Object[] source = {alias, alias}; - error(form.format(source)); + if (cs == null || cs.length == 0) { + if (altCertChain != null) { + error(rb.getString + ("Certificate chain not found in the file specified.")); + } else { + MessageFormat form = new MessageFormat(rb.getString + ("Certificate chain not found for: alias. alias must" + + " reference a valid KeyStore key entry containing a" + + " private key and corresponding public key certificate chain.")); + Object[] source = {alias, alias}; + error(form.format(source)); + } } certChain = new X509Certificate[cs.length]; @@ -1501,56 +1762,15 @@ public class JarSigner { certChain[i] = (X509Certificate)cs[i]; } - // order the cert chain if necessary (put user cert first, - // root-cert last in the chain) - X509Certificate userCert - = (X509Certificate)store.getCertificate(alias); + // We don't meant to print anything, the next call + // checks validity and keyUsage etc + printCert("", certChain[0], true, 0); - // check validity of signer certificate try { - userCert.checkValidity(); - - if (userCert.getNotAfter().getTime() < - System.currentTimeMillis() + SIX_MONTHS) { - - hasExpiringCert = true; - } - } catch (CertificateExpiredException cee) { - hasExpiredCert = true; - - } catch (CertificateNotYetValidException cnyve) { - notYetValidCert = true; - } - - checkCertUsage(userCert, null); - - if (!userCert.equals(certChain[0])) { - // need to order ... - X509Certificate[] certChainTmp - = new X509Certificate[certChain.length]; - certChainTmp[0] = userCert; - Principal issuer = userCert.getIssuerDN(); - for (int i=1; i] keystore location", "[-keystore ] keystore location"}, {"[-storepass ] password for keystore integrity", @@ -64,6 +64,8 @@ public class JarSignerResources extends java.util.ListResourceBundle { "[-storetype ] keystore type"}, {"[-keypass ] password for private key (if different)", "[-keypass ] password for private key (if different)"}, + {"[-certchain ] name of alternative certchain file", + "[-certchain ] name of alternative certchain file"}, {"[-sigfile ] name of .SF/.DSA file", "[-sigfile ] name of .SF/.DSA file"}, {"[-signedjar ] name of signed JAR file", @@ -74,8 +76,10 @@ public class JarSignerResources extends java.util.ListResourceBundle { "[-sigalg ] name of signature algorithm"}, {"[-verify] verify a signed JAR file", "[-verify] verify a signed JAR file"}, - {"[-verbose] verbose output when signing/verifying", - "[-verbose] verbose output when signing/verifying"}, + {"[-verbose[:suboptions]] verbose output when signing/verifying.", + "[-verbose[:suboptions]] verbose output when signing/verifying."}, + {" suboptions can be all, grouped or summary", + " suboptions can be all, grouped or summary"}, {"[-certs] display certificates when verbose and verifying", "[-certs] display certificates when verbose and verifying"}, {"[-tsa ] location of the Timestamping Authority", @@ -98,10 +102,22 @@ public class JarSignerResources extends java.util.ListResourceBundle { "[-providerClass name of cryptographic service provider's"}, {" [-providerArg ]] ... master class file and constructor argument", " [-providerArg ]] ... master class file and constructor argument"}, + {"[-strict] treat warnings as errors", + "[-strict] treat warnings as errors"}, + {"Option lacks argument", "Option lacks argument"}, + {"Please type jarsigner -help for usage", "Please type jarsigner -help for usage"}, + {"Please specify jarfile name", "Please specify jarfile name"}, + {"Please specify alias name", "Please specify alias name"}, + {"Only one alias can be specified", "Only one alias can be specified"}, + {"This jar contains signed entries which is not signed by the specified alias(es).", + "This jar contains signed entries which is not signed by the specified alias(es)."}, + {"This jar contains signed entries that's not signed by alias in this keystore.", + "This jar contains signed entries that's not signed by alias in this keystore."}, {"s", "s"}, {"m", "m"}, {"k", "k"}, {"i", "i"}, + {"(and %d more)", "(and %d more)"}, {" s = signature was verified ", " s = signature was verified "}, {" m = entry is listed in manifest", @@ -110,7 +126,11 @@ public class JarSignerResources extends java.util.ListResourceBundle { " k = at least one certificate was found in keystore"}, {" i = at least one certificate was found in identity scope", " i = at least one certificate was found in identity scope"}, + {" X = not signed by specified alias(es)", + " X = not signed by specified alias(es)"}, {"no manifest.", "no manifest."}, + {"(Signature related entries)","(Signature related entries)"}, + {"(Unsigned entries)", "(Unsigned entries)"}, {"jar is unsigned. (signatures missing or not parsable)", "jar is unsigned. (signatures missing or not parsable)"}, {"jar verified.", "jar verified."}, @@ -134,6 +154,12 @@ public class JarSignerResources extends java.util.ListResourceBundle { "unable to instantiate keystore class: "}, {"Certificate chain not found for: alias. alias must reference a valid KeyStore key entry containing a private key and corresponding public key certificate chain.", "Certificate chain not found for: {0}. {1} must reference a valid KeyStore key entry containing a private key and corresponding public key certificate chain."}, + {"File specified by -certchain does not exist", + "File specified by -certchain does not exist"}, + {"Cannot restore certchain from file specified", + "Cannot restore certchain from file specified"}, + {"Certificate chain not found in the file specified.", + "Certificate chain not found in the file specified."}, {"found non-X.509 certificate in signer's chain", "found non-X.509 certificate in signer's chain"}, {"incomplete certificate chain", "incomplete certificate chain"}, @@ -149,6 +175,7 @@ public class JarSignerResources extends java.util.ListResourceBundle { {"certificate is not valid until", "certificate is not valid until {0}"}, {"certificate will expire on", "certificate will expire on {0}"}, + {"[CertPath not validated: ", "[CertPath not validated: "}, {"requesting a signature timestamp", "requesting a signature timestamp"}, {"TSA location: ", "TSA location: "}, @@ -189,14 +216,18 @@ public class JarSignerResources extends java.util.ListResourceBundle { "The signer certificate's ExtendedKeyUsage extension doesn't allow code signing."}, {"The signer certificate's NetscapeCertType extension doesn't allow code signing.", "The signer certificate's NetscapeCertType extension doesn't allow code signing."}, - {"This jar contains entries whose signer certificate's KeyUsage extension doesn't allow code signing.", - "This jar contains entries whose signer certificate's KeyUsage extension doesn't allow code signing."}, - {"This jar contains entries whose signer certificate's ExtendedKeyUsage extension doesn't allow code signing.", - "This jar contains entries whose signer certificate's ExtendedKeyUsage extension doesn't allow code signing."}, - {"This jar contains entries whose signer certificate's NetscapeCertType extension doesn't allow code signing.", - "This jar contains entries whose signer certificate's NetscapeCertType extension doesn't allow code signing."}, + {"This jar contains entries whose signer certificate's KeyUsage extension doesn't allow code signing.", + "This jar contains entries whose signer certificate's KeyUsage extension doesn't allow code signing."}, + {"This jar contains entries whose signer certificate's ExtendedKeyUsage extension doesn't allow code signing.", + "This jar contains entries whose signer certificate's ExtendedKeyUsage extension doesn't allow code signing."}, + {"This jar contains entries whose signer certificate's NetscapeCertType extension doesn't allow code signing.", + "This jar contains entries whose signer certificate's NetscapeCertType extension doesn't allow code signing."}, {"[{0} extension does not support code signing]", "[{0} extension does not support code signing]"}, + {"The signer's certificate chain is not validated.", + "The signer's certificate chain is not validated."}, + {"This jar contains entries whose certificate chain is not validated.", + "This jar contains entries whose certificate chain is not validated."}, }; /** diff --git a/jdk/src/share/classes/sun/security/tools/KeyTool.java b/jdk/src/share/classes/sun/security/tools/KeyTool.java index 163e78fc5cf..1ce3ab21a02 100644 --- a/jdk/src/share/classes/sun/security/tools/KeyTool.java +++ b/jdk/src/share/classes/sun/security/tools/KeyTool.java @@ -3108,7 +3108,7 @@ public final class KeyTool { /** * Returns the keystore with the configured CA certificates. */ - private KeyStore getCacertsKeyStore() + public static KeyStore getCacertsKeyStore() throws Exception { String sep = File.separator; diff --git a/jdk/test/sun/security/tools/jarsigner/concise_jarsigner.sh b/jdk/test/sun/security/tools/jarsigner/concise_jarsigner.sh new file mode 100644 index 00000000000..1c9eaabe396 --- /dev/null +++ b/jdk/test/sun/security/tools/jarsigner/concise_jarsigner.sh @@ -0,0 +1,200 @@ +# +# Copyright 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 6802846 +# @summary jarsigner needs enhanced cert validation(options) +# +# @run shell concise_jarsigner.sh +# + +if [ "${TESTJAVA}" = "" ] ; then + JAVAC_CMD=`which javac` + TESTJAVA=`dirname $JAVAC_CMD`/.. +fi + +# set platform-dependent variables +OS=`uname -s` +case "$OS" in + Windows_* ) + FS="\\" + ;; + * ) + FS="/" + ;; +esac + +KT="$TESTJAVA${FS}bin${FS}keytool -storepass changeit -keypass changeit -keystore js.jks" +JAR=$TESTJAVA${FS}bin${FS}jar +JARSIGNER=$TESTJAVA${FS}bin${FS}jarsigner +JAVAC=$TESTJAVA${FS}bin${FS}javac + +rm js.jks + +echo class A1 {} > A1.java +echo class A2 {} > A2.java +echo class A3 {} > A3.java +echo class A4 {} > A4.java +echo class A5 {} > A5.java +echo class A6 {} > A6.java + +$JAVAC A1.java A2.java A3.java A4.java A5.java A6.java +YEAR=`date +%Y` + +# ========================================================== +# First part: output format +# ========================================================== + +$KT -genkeypair -alias a1 -dname CN=a1 -validity 365 +$KT -genkeypair -alias a2 -dname CN=a2 -validity 365 + +# a.jar includes 8 unsigned, 2 signed by a1 and a2, 2 signed by a3 +$JAR cvf a.jar A1.class A2.class +$JARSIGNER -keystore js.jks -storepass changeit a.jar a1 +$JAR uvf a.jar A3.class A4.class +$JARSIGNER -keystore js.jks -storepass changeit a.jar a2 +$JAR uvf a.jar A5.class A6.class + +# Verify OK +$JARSIGNER -verify a.jar +[ $? = 0 ] || exit $LINENO + +# 4(chainNotValidated)+16(hasUnsignedEntry)+32(aliasNotInStore) +$JARSIGNER -verify a.jar -strict +[ $? = 52 ] || exit $LINENO + +# 16(hasUnsignedEntry) +$JARSIGNER -verify a.jar -strict -keystore js.jks +[ $? = 16 ] || exit $LINENO + +# 16(hasUnsignedEntry)+32(notSignedByAlias) +$JARSIGNER -verify a.jar a1 -strict -keystore js.jks +[ $? = 48 ] || exit $LINENO + +# 16(hasUnsignedEntry) +$JARSIGNER -verify a.jar a1 a2 -strict -keystore js.jks +[ $? = 16 ] || exit $LINENO + +# 12 entries all together +LINES=`$JARSIGNER -verify a.jar -verbose | grep $YEAR | wc -l` +[ $LINES = 12 ] || exit $LINENO + +# 12 entries all listed +LINES=`$JARSIGNER -verify a.jar -verbose:grouped | grep $YEAR | wc -l` +[ $LINES = 12 ] || exit $LINENO + +# 3 groups: unrelated, signed, unsigned +LINES=`$JARSIGNER -verify a.jar -verbose:summary | grep $YEAR | wc -l` +[ $LINES = 3 ] || exit $LINENO + +# 4 groups: unrelated, signed by a1/a2, signed by a2, unsigned +LINES=`$JARSIGNER -verify a.jar -verbose:summary -certs | grep $YEAR | wc -l` +[ $LINES = 4 ] || exit $LINENO + +# 2*2 for A1/A2, 2 for A3/A4 +LINES=`$JARSIGNER -verify a.jar -verbose -certs | grep "\[certificate" | wc -l` +[ $LINES = 6 ] || exit $LINENO + +# a1,a2 for A1/A2, a2 for A3/A4 +LINES=`$JARSIGNER -verify a.jar -verbose:grouped -certs | grep "\[certificate" | wc -l` +[ $LINES = 3 ] || exit $LINENO + +# a1,a2 for A1/A2, a2 for A3/A4 +LINES=`$JARSIGNER -verify a.jar -verbose:summary -certs | grep "\[certificate" | wc -l` +[ $LINES = 3 ] || exit $LINENO + +# 4 groups +LINES=`$JARSIGNER -verify a.jar -verbose:summary -certs | grep "more)" | wc -l` +[ $LINES = 4 ] || exit $LINENO + +# ========================================================== +# Second part: exit code 2, 4, 8 +# 16 and 32 already covered in the first part +# ========================================================== + +$KT -genkeypair -alias expiring -dname CN=expiring -startdate -1m +$KT -genkeypair -alias expired -dname CN=expired -startdate -10m +$KT -genkeypair -alias notyetvalid -dname CN=notyetvalid -startdate +1m +$KT -genkeypair -alias badku -dname CN=badku -ext KU=cRLSign -validity 365 +$KT -genkeypair -alias badeku -dname CN=badeku -ext EKU=sa -validity 365 +$KT -genkeypair -alias goodku -dname CN=goodku -ext KU=dig -validity 365 +$KT -genkeypair -alias goodeku -dname CN=goodeku -ext EKU=codesign -validity 365 + +# badchain signed by ca, but ca is removed later +$KT -genkeypair -alias badchain -dname CN=badchain -validity 365 +$KT -genkeypair -alias ca -dname CN=ca -ext bc -validity 365 +$KT -certreq -alias badchain | $KT -gencert -alias ca -validity 365 | \ + $KT -importcert -alias badchain +$KT -delete -alias ca + +$JARSIGNER -strict -keystore js.jks -storepass changeit a.jar expiring +[ $? = 2 ] || exit $LINENO + +$JARSIGNER -strict -keystore js.jks -storepass changeit a.jar expired +[ $? = 4 ] || exit $LINENO + +$JARSIGNER -strict -keystore js.jks -storepass changeit a.jar notyetvalid +[ $? = 4 ] || exit $LINENO + +$JARSIGNER -strict -keystore js.jks -storepass changeit a.jar badku +[ $? = 8 ] || exit $LINENO + +$JARSIGNER -strict -keystore js.jks -storepass changeit a.jar badeku +[ $? = 8 ] || exit $LINENO + +$JARSIGNER -strict -keystore js.jks -storepass changeit a.jar goodku +[ $? = 0 ] || exit $LINENO + +$JARSIGNER -strict -keystore js.jks -storepass changeit a.jar goodeku +[ $? = 0 ] || exit $LINENO + +$JARSIGNER -strict -keystore js.jks -storepass changeit a.jar badchain +[ $? = 4 ] || exit $LINENO + +$JARSIGNER -verify a.jar +[ $? = 0 ] || exit $LINENO + +# ========================================================== +# Third part: -certchain test +# ========================================================== + +# altchain signed by ca2, but ca2 is removed later +$KT -genkeypair -alias altchain -dname CN=altchain -validity 365 +$KT -genkeypair -alias ca2 -dname CN=ca2 -ext bc -validity 365 +$KT -certreq -alias altchain | $KT -gencert -alias ca2 -validity 365 -rfc > certchain +$KT -exportcert -alias ca2 -rfc >> certchain +$KT -delete -alias ca2 + +# Now altchain is still self-signed +$JARSIGNER -strict -keystore js.jks -storepass changeit a.jar altchain +[ $? = 0 ] || exit $LINENO + +# If -certchain is used, then it's bad +$JARSIGNER -strict -keystore js.jks -storepass changeit -certchain certchain a.jar altchain +[ $? = 4 ] || exit $LINENO + +$JARSIGNER -verify a.jar +[ $? = 0 ] || exit $LINENO + +echo OK +exit 0 From 595ff704c093ef83f81b8fef7653a2affa6a8291 Mon Sep 17 00:00:00 2001 From: Ivan P Krylov Date: Fri, 27 Mar 2009 01:35:39 -0500 Subject: [PATCH 204/292] 6812297: update project creation for Visual Studio 2005-2008 Add 2 news classes to create VC8 and VC9 projects Reviewed-by: apetrusenko, xlu --- hotspot/make/windows/build_vm_def.sh | 13 ++++ hotspot/make/windows/create.bat | 12 ++- hotspot/make/windows/makefiles/adlc.make | 1 + hotspot/make/windows/makefiles/compile.make | 4 - hotspot/make/windows/makefiles/makedeps.make | 4 +- hotspot/make/windows/makefiles/rules.make | 15 +++- .../tools/MakeDeps/WinGammaPlatformVC7.java | 75 +++++++++++++++---- .../tools/MakeDeps/WinGammaPlatformVC8.java | 66 ++++++++++++++++ .../tools/MakeDeps/WinGammaPlatformVC9.java | 35 +++++++++ .../vm/utilities/globalDefinitions_visCPP.hpp | 19 +++-- 10 files changed, 213 insertions(+), 31 deletions(-) create mode 100644 hotspot/src/share/tools/MakeDeps/WinGammaPlatformVC8.java create mode 100644 hotspot/src/share/tools/MakeDeps/WinGammaPlatformVC9.java diff --git a/hotspot/make/windows/build_vm_def.sh b/hotspot/make/windows/build_vm_def.sh index 6cc931963b2..99e30bb1b9e 100644 --- a/hotspot/make/windows/build_vm_def.sh +++ b/hotspot/make/windows/build_vm_def.sh @@ -52,6 +52,19 @@ CAT="$MKS_HOME/cat.exe" RM="$MKS_HOME/rm.exe" DUMPBIN="link.exe /dump" +# When called from IDE the first param should contain the link version, otherwise may be nill +if [ "x$1" != "x" ]; then +LINK_VER="$1" +fi + +if [ "x$LINK_VER" != "x800" -a "x$LINK_VER" != "x900" ]; then $DUMPBIN /symbols *.obj | "$GREP" "??_7.*@@6B@" | "$AWK" '{print $7}' | "$SORT" | "$UNIQ" > vm2.def +else +# Can't use pipes when calling cl.exe or link.exe from IDE. Using transit file vm3.def +$DUMPBIN /OUT:vm3.def /symbols *.obj +"$CAT" vm3.def | "$GREP" "??_7.*@@6B@" | "$AWK" '{print $7}' | "$SORT" | "$UNIQ" > vm2.def +"$RM" -f vm3.def +fi + "$CAT" vm1.def vm2.def > vm.def "$RM" -f vm1.def vm2.def diff --git a/hotspot/make/windows/create.bat b/hotspot/make/windows/create.bat index 21f97033669..bdb1916107d 100644 --- a/hotspot/make/windows/create.bat +++ b/hotspot/make/windows/create.bat @@ -72,12 +72,20 @@ REM figure out MSC version for /F %%i in ('sh %HotSpotWorkSpace%/make/windows/get_msc_ver.sh') do set %%i echo ************************************************************** +set ProjectFile=vm.vcproj if "%MSC_VER%" == "1200" ( set ProjectFile=vm.dsp echo Will generate VC6 project {unsupported} ) else ( -set ProjectFile=vm.vcproj -echo Will generate VC7 project +if "%MSC_VER%" == "1400" ( +echo Will generate VC8 {Visual Studio 2005} +) else ( +if "%MSC_VER%" == "1500" ( +echo Will generate VC9 {Visual Studio 2008} +) else ( +echo Will generate VC7 project {Visual Studio 2003 .NET} +) +) ) echo %ProjectFile% echo ************************************************************** diff --git a/hotspot/make/windows/makefiles/adlc.make b/hotspot/make/windows/makefiles/adlc.make index b6feb0e78b9..e9af2f964bb 100644 --- a/hotspot/make/windows/makefiles/adlc.make +++ b/hotspot/make/windows/makefiles/adlc.make @@ -46,6 +46,7 @@ ADLCFLAGS=-q -T -D_LP64 ADLCFLAGS=-q -T -U_LP64 !endif +CPP_FLAGS=$(CPP_FLAGS) /D _CRT_SECURE_NO_WARNINGS /D _CRT_SECURE_NO_DEPRECATE CPP_INCLUDE_DIRS=\ /I "..\generated" \ diff --git a/hotspot/make/windows/makefiles/compile.make b/hotspot/make/windows/makefiles/compile.make index 5869d7cb800..4906ab5a989 100644 --- a/hotspot/make/windows/makefiles/compile.make +++ b/hotspot/make/windows/makefiles/compile.make @@ -170,8 +170,6 @@ LINK_FLAGS = /manifest $(LINK_FLAGS) $(BUFFEROVERFLOWLIB) # Manifest Tool - used in VS2005 and later to adjust manifests stored # as resources inside build artifacts. MT=mt.exe -# VS2005 and later restricts the use of certain libc functions without this -CPP_FLAGS=$(CPP_FLAGS) /D _CRT_SECURE_NO_DEPRECATE !endif !if "$(COMPILER_NAME)" == "VS2008" @@ -183,8 +181,6 @@ LINK_FLAGS = /manifest $(LINK_FLAGS) # Manifest Tool - used in VS2005 and later to adjust manifests stored # as resources inside build artifacts. MT=mt.exe -# VS2005 and later restricts the use of certain libc functions without this -CPP_FLAGS=$(CPP_FLAGS) /D _CRT_SECURE_NO_DEPRECATE !endif # Compile for space above time. diff --git a/hotspot/make/windows/makefiles/makedeps.make b/hotspot/make/windows/makefiles/makedeps.make index 8bfe00737ab..43f25a4666d 100644 --- a/hotspot/make/windows/makefiles/makedeps.make +++ b/hotspot/make/windows/makefiles/makedeps.make @@ -48,6 +48,8 @@ MakeDepsSources=\ $(WorkSpace)\src\share\tools\MakeDeps\WinGammaPlatform.java \ $(WorkSpace)\src\share\tools\MakeDeps\WinGammaPlatformVC6.java \ $(WorkSpace)\src\share\tools\MakeDeps\WinGammaPlatformVC7.java \ + $(WorkSpace)\src\share\tools\MakeDeps\WinGammaPlatformVC8.java \ + $(WorkSpace)\src\share\tools\MakeDeps\WinGammaPlatformVC9.java \ $(WorkSpace)\src\share\tools\MakeDeps\Util.java \ $(WorkSpace)\src\share\tools\MakeDeps\BuildConfig.java \ $(WorkSpace)\src\share\tools\MakeDeps\ArgsParser.java @@ -121,7 +123,7 @@ MakeDepsIDEOptions=\ -additionalFile includeDB_gc_shared \ -additionalFile includeDB_gc_serial \ -additionalGeneratedFile $(HOTSPOTBUILDSPACE)\%f\%b vm.def \ - -prelink "" "Generating vm.def..." "cd $(HOTSPOTBUILDSPACE)\%f\%b $(HOTSPOTMKSHOME)\sh $(HOTSPOTWORKSPACE)\make\windows\build_vm_def.sh" \ + -prelink "" "Generating vm.def..." "cd $(HOTSPOTBUILDSPACE)\%f\%b set HOTSPOTMKSHOME=$(HOTSPOTMKSHOME) $(HOTSPOTMKSHOME)\sh $(HOTSPOTWORKSPACE)\make\windows\build_vm_def.sh $(LINK_VER)" \ $(MakeDepsIncludesPRIVATE) # Add in build-specific options diff --git a/hotspot/make/windows/makefiles/rules.make b/hotspot/make/windows/makefiles/rules.make index f07f84aee1d..064fb3f231d 100644 --- a/hotspot/make/windows/makefiles/rules.make +++ b/hotspot/make/windows/makefiles/rules.make @@ -42,10 +42,23 @@ COMPILE_RMIC=rmic BOOT_JAVA_HOME= !endif +ProjectFile=vm.vcproj + !if "$(MSC_VER)" == "1200" + VcVersion=VC6 ProjectFile=vm.dsp + +!elseif "$(MSC_VER)" == "1400" + +VcVersion=VC8 + +!elseif "$(MSC_VER)" == "1500" + +VcVersion=VC9 + !else + VcVersion=VC7 -ProjectFile=vm.vcproj + !endif diff --git a/hotspot/src/share/tools/MakeDeps/WinGammaPlatformVC7.java b/hotspot/src/share/tools/MakeDeps/WinGammaPlatformVC7.java index 82159a41835..109613b45d7 100644 --- a/hotspot/src/share/tools/MakeDeps/WinGammaPlatformVC7.java +++ b/hotspot/src/share/tools/MakeDeps/WinGammaPlatformVC7.java @@ -27,6 +27,8 @@ import java.util.*; public class WinGammaPlatformVC7 extends WinGammaPlatform { + String projectVersion() {return "7.10";}; + public void writeProjectFile(String projectFileName, String projectName, Vector allConfigs) throws IOException { System.out.println(); @@ -40,7 +42,7 @@ public class WinGammaPlatformVC7 extends WinGammaPlatform { "VisualStudioProject", new String[] { "ProjectType", "Visual C++", - "Version", "7.10", + "Version", projectVersion(), "Name", projectName, "ProjectGUID", "{8822CB5C-1C41-41C2-8493-9F6E1994338B}", "SccProjectName", "", @@ -417,7 +419,9 @@ public class WinGammaPlatformVC7 extends WinGammaPlatform { new String[] { "Name", "VCPreLinkEventTool", "Description", BuildConfig.getFieldString(null, "PrelinkDescription"), - "CommandLine", cfg.expandFormat(BuildConfig.getFieldString(null, "PrelinkCommand").replace('\t', '\n')) + //Caution: String.replace(String,String) is available from JDK5 onwards only + "CommandLine", cfg.expandFormat(BuildConfig.getFieldString(null, "PrelinkCommand").replace + ("\t", " ")) } ); @@ -542,25 +546,41 @@ public class WinGammaPlatformVC7 extends WinGammaPlatform { } class CompilerInterfaceVC7 extends CompilerInterface { - Vector getBaseCompilerFlags(Vector defines, Vector includes, String outDir) { - Vector rv = new Vector(); + void getBaseCompilerFlags_common(Vector defines, Vector includes, String outDir,Vector rv) { // advanced M$ IDE (2003) can only recognize name if it's first or // second attribute in the tag - go guess addAttr(rv, "Name", "VCCLCompilerTool"); addAttr(rv, "AdditionalIncludeDirectories", Util.join(",", includes)); - addAttr(rv, "PreprocessorDefinitions", Util.join(";", defines).replace("\"",""")); - addAttr(rv, "UsePrecompiledHeader", "3"); - addAttr(rv, "PrecompiledHeaderThrough", "incls"+Util.sep+"_precompiled.incl"); + addAttr(rv, "PreprocessorDefinitions", + Util.join(";", defines).replace("\"",""")); + addAttr(rv, "PrecompiledHeaderThrough", + "incls"+Util.sep+"_precompiled.incl"); addAttr(rv, "PrecompiledHeaderFile", outDir+Util.sep+"vm.pch"); addAttr(rv, "AssemblerListingLocation", outDir); addAttr(rv, "ObjectFile", outDir+Util.sep); addAttr(rv, "ProgramDataBaseFileName", outDir+Util.sep+"vm.pdb"); + // Set /nologo optin addAttr(rv, "SuppressStartupBanner", "TRUE"); + // Surpass the default /Tc or /Tp. 0 is compileAsDefault addAttr(rv, "CompileAs", "0"); + // Set /W3 option. 3 is warningLevel_3 addAttr(rv, "WarningLevel", "3"); + // Set /WX option, addAttr(rv, "WarnAsError", "TRUE"); + // Set /GS option addAttr(rv, "BufferSecurityCheck", "FALSE"); + // Set /Zi option. 3 is debugEnabled + addAttr(rv, "DebugInformationFormat", "3"); + } + Vector getBaseCompilerFlags(Vector defines, Vector includes, String outDir) { + Vector rv = new Vector(); + + getBaseCompilerFlags_common(defines,includes, outDir, rv); + // Set /Yu option. 3 is pchUseUsingSpecific + // Note: Starting VC8 pchUseUsingSpecific is 2 !!! + addAttr(rv, "UsePrecompiledHeader", "3"); + // Set /EHsc- option addAttr(rv, "ExceptionHandling", "FALSE"); return rv; @@ -579,27 +599,39 @@ class CompilerInterfaceVC7 extends CompilerInterface { "/export:jio_vsnprintf "); addAttr(rv, "AdditionalDependencies", "Wsock32.lib winmm.lib"); addAttr(rv, "OutputFile", outDll); + // Set /INCREMENTAL option. 1 is linkIncrementalNo addAttr(rv, "LinkIncremental", "1"); addAttr(rv, "SuppressStartupBanner", "TRUE"); addAttr(rv, "ModuleDefinitionFile", outDir+Util.sep+"vm.def"); addAttr(rv, "ProgramDatabaseFile", outDir+Util.sep+"vm.pdb"); + // Set /SUBSYSTEM option. 2 is subSystemWindows addAttr(rv, "SubSystem", "2"); addAttr(rv, "BaseAddress", "0x8000000"); addAttr(rv, "ImportLibrary", outDir+Util.sep+"jvm.lib"); + // Set /MACHINE option. 1 is machineX86 addAttr(rv, "TargetMachine", "1"); return rv; } + void getDebugCompilerFlags_common(String opt,Vector rv) { + + // Set /On option + addAttr(rv, "Optimization", opt); + // Set /FR option. 1 is brAllInfo + addAttr(rv, "BrowseInformation", "1"); + addAttr(rv, "BrowseInformationFile", "$(IntDir)" + Util.sep); + // Set /MD option. 2 is rtMultiThreadedDLL + addAttr(rv, "RuntimeLibrary", "2"); + // Set /Oy- option + addAttr(rv, "OmitFramePointers", "FALSE"); + + } + Vector getDebugCompilerFlags(String opt) { Vector rv = new Vector(); - addAttr(rv, "Optimization", opt); - addAttr(rv, "OptimizeForProcessor", "1"); - addAttr(rv, "DebugInformationFormat", "3"); - addAttr(rv, "RuntimeLibrary", "2"); - addAttr(rv, "BrowseInformation", "1"); - addAttr(rv, "BrowseInformationFile", "$(IntDir)" + Util.sep); + getDebugCompilerFlags_common(opt,rv); return rv; } @@ -607,18 +639,29 @@ class CompilerInterfaceVC7 extends CompilerInterface { Vector getDebugLinkerFlags() { Vector rv = new Vector(); - addAttr(rv, "GenerateDebugInformation", "TRUE"); + addAttr(rv, "GenerateDebugInformation", "TRUE"); // == /DEBUG option return rv; } + void getProductCompilerFlags_common(Vector rv) { + // Set /O2 option. 2 is optimizeMaxSpeed + addAttr(rv, "Optimization", "2"); + // Set /Oy- option + addAttr(rv, "OmitFramePointers", "FALSE"); + } + Vector getProductCompilerFlags() { Vector rv = new Vector(); - addAttr(rv, "Optimization", "2"); + getProductCompilerFlags_common(rv); + // Set /Ob option. 1 is expandOnlyInline addAttr(rv, "InlineFunctionExpansion", "1"); + // Set /GF option. addAttr(rv, "StringPooling", "TRUE"); + // Set /MD option. 2 is rtMultiThreadedDLL addAttr(rv, "RuntimeLibrary", "2"); + // Set /Gy option addAttr(rv, "EnableFunctionLevelLinking", "TRUE"); return rv; @@ -627,7 +670,9 @@ class CompilerInterfaceVC7 extends CompilerInterface { Vector getProductLinkerFlags() { Vector rv = new Vector(); + // Set /OPT:REF option. 2 is optReferences addAttr(rv, "OptimizeReferences", "2"); + // Set /OPT:optFolding option. 2 is optFolding addAttr(rv, "EnableCOMDATFolding", "2"); return rv; diff --git a/hotspot/src/share/tools/MakeDeps/WinGammaPlatformVC8.java b/hotspot/src/share/tools/MakeDeps/WinGammaPlatformVC8.java new file mode 100644 index 00000000000..a346b611560 --- /dev/null +++ b/hotspot/src/share/tools/MakeDeps/WinGammaPlatformVC8.java @@ -0,0 +1,66 @@ +/* + * Copyright 2005-2007 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. + * + */ + +import java.io.*; +import java.util.*; + +public class WinGammaPlatformVC8 extends WinGammaPlatformVC7 { + + String projectVersion() {return "8.00";}; + +} + +class CompilerInterfaceVC8 extends CompilerInterfaceVC7 { + + Vector getBaseCompilerFlags(Vector defines, Vector includes, String outDir) { + Vector rv = new Vector(); + + getBaseCompilerFlags_common(defines,includes, outDir, rv); + // Set /Yu option. 2 is pchUseUsingSpecific + addAttr(rv, "UsePrecompiledHeader", "2"); + // Set /EHsc- option. 0 is cppExceptionHandlingNo + addAttr(rv, "ExceptionHandling", "0"); + + return rv; + } + + + Vector getDebugCompilerFlags(String opt) { + Vector rv = new Vector(); + + getDebugCompilerFlags_common(opt,rv); + + return rv; + } + + Vector getProductCompilerFlags() { + Vector rv = new Vector(); + + getProductCompilerFlags_common(rv); + + return rv; + } + + +} diff --git a/hotspot/src/share/tools/MakeDeps/WinGammaPlatformVC9.java b/hotspot/src/share/tools/MakeDeps/WinGammaPlatformVC9.java new file mode 100644 index 00000000000..4b64a555833 --- /dev/null +++ b/hotspot/src/share/tools/MakeDeps/WinGammaPlatformVC9.java @@ -0,0 +1,35 @@ +/* + * Copyright 2005-2007 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. + * + */ + +import java.io.*; +import java.util.*; + +public class WinGammaPlatformVC9 extends WinGammaPlatformVC8 { + + String projectVersion() {return "9.00";}; + +} + +class CompilerInterfaceVC9 extends CompilerInterfaceVC8 { +} diff --git a/hotspot/src/share/vm/utilities/globalDefinitions_visCPP.hpp b/hotspot/src/share/vm/utilities/globalDefinitions_visCPP.hpp index 3e3c861df8e..2b64dfc4662 100644 --- a/hotspot/src/share/vm/utilities/globalDefinitions_visCPP.hpp +++ b/hotspot/src/share/vm/utilities/globalDefinitions_visCPP.hpp @@ -153,14 +153,6 @@ const jlong max_jlong = CONST64(0x7fffffffffffffff); //---------------------------------------------------------------------------------------------------- // Miscellaneous -inline int vsnprintf(char* buf, size_t count, const char* fmt, va_list argptr) { - // If number of characters written == count, Windows doesn't write a - // terminating NULL, so we do it ourselves. - int ret = _vsnprintf(buf, count, fmt, argptr); - if (count > 0) buf[count-1] = '\0'; - return ret; -} - // Visual Studio 2005 deprecates POSIX names - use ISO C++ names instead #if _MSC_VER >= 1400 #define open _open @@ -180,6 +172,17 @@ inline int vsnprintf(char* buf, size_t count, const char* fmt, va_list argptr) { #pragma warning( disable : 4201 ) // nonstandard extension used : nameless struct/union (needed in windows.h) #pragma warning( disable : 4511 ) // copy constructor could not be generated #pragma warning( disable : 4291 ) // no matching operator delete found; memory will not be freed if initialization thows an exception +#if _MSC_VER >= 1400 +#pragma warning( disable : 4996 ) // unsafe string functions. Same as define _CRT_SECURE_NO_WARNINGS/_CRT_SECURE_NO_DEPRICATE +#endif + +inline int vsnprintf(char* buf, size_t count, const char* fmt, va_list argptr) { + // If number of characters written == count, Windows doesn't write a + // terminating NULL, so we do it ourselves. + int ret = _vsnprintf(buf, count, fmt, argptr); + if (count > 0) buf[count-1] = '\0'; + return ret; +} // Portability macros #define PRAGMA_INTERFACE From 51ef95c39640b565aa01af50458bf2110d338c8d Mon Sep 17 00:00:00 2001 From: Yuri Nesterenko Date: Fri, 27 Mar 2009 12:01:24 +0300 Subject: [PATCH 205/292] 6680988: KeyEvent is still missing VK values for many keyboards 2 new methods and some fields added to KeyEvent, plus hash of constants introduced Reviewed-by: art --- jdk/make/sun/awt/FILES_export_unix.gmk | 5 +- jdk/make/sun/awt/FILES_export_windows.gmk | 5 +- jdk/make/sun/xawt/mapfile-vers | 18 +- .../share/classes/java/awt/AWTKeyStroke.java | 5 +- jdk/src/share/classes/java/awt/MenuItem.java | 6 +- .../share/classes/java/awt/MenuShortcut.java | 18 +- .../classes/java/awt/event/KeyEvent.java | 58 +- .../classes/javax/swing/AbstractButton.java | 5 +- jdk/src/share/classes/javax/swing/Action.java | 6 +- .../share/classes/javax/swing/JComponent.java | 19 +- jdk/src/share/classes/javax/swing/JLabel.java | 10 +- .../classes/javax/swing/JTabbedPane.java | 6 +- .../share/classes/javax/swing/KeyStroke.java | 8 +- .../classes/javax/swing/KeyboardManager.java | 27 +- .../classes/javax/swing/SwingUtilities.java | 11 +- .../classes/sun/awt/ExtendedKeyCodes.java | 670 ++++++++++++++++++ .../classes/sun/awt/X11/XConstants.java | 17 +- .../solaris/classes/sun/awt/X11/XKeysym.java | 60 +- .../solaris/classes/sun/awt/X11/XToolkit.java | 149 +++- .../solaris/classes/sun/awt/X11/XWindow.java | 93 ++- .../classes/sun/awt/X11/XlibWrapper.java | 26 +- .../awt/X11/generator/WrapperGenerator.java | 1 + .../sun/awt/X11/generator/xlibtypes.txt | 230 +++++- .../solaris/classes/sun/awt/X11/keysym2ucs.h | 62 +- jdk/src/solaris/native/sun/xawt/XlibWrapper.c | 109 ++- .../native/sun/windows/awt_Component.cpp | 177 ++++- .../native/sun/windows/awt_Component.h | 12 +- .../native/sun/windows/awt_InputMethod.cpp | 4 +- .../native/sun/windows/awt_KeyEvent.cpp | 15 +- .../windows/native/sun/windows/awt_KeyEvent.h | 5 +- .../AcceleratorTest/AcceleratorTest.html | 20 + .../AcceleratorTest/AcceleratorTest.java | 305 ++++++++ 32 files changed, 2063 insertions(+), 99 deletions(-) create mode 100644 jdk/src/share/classes/sun/awt/ExtendedKeyCodes.java create mode 100644 jdk/test/java/awt/event/KeyEvent/AcceleratorTest/AcceleratorTest.html create mode 100644 jdk/test/java/awt/event/KeyEvent/AcceleratorTest/AcceleratorTest.java diff --git a/jdk/make/sun/awt/FILES_export_unix.gmk b/jdk/make/sun/awt/FILES_export_unix.gmk index 43637e7c4cb..79246c6bc41 100644 --- a/jdk/make/sun/awt/FILES_export_unix.gmk +++ b/jdk/make/sun/awt/FILES_export_unix.gmk @@ -1,5 +1,5 @@ # -# Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2000-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 @@ -107,7 +107,8 @@ FILES_export = \ sun/java2d/x11/X11Renderer.java \ sun/java2d/x11/X11SurfaceData.java \ com/sun/java/swing/plaf/gtk/GTKEngine.java \ - com/sun/java/swing/plaf/gtk/GTKStyle.java + com/sun/java/swing/plaf/gtk/GTKStyle.java \ + sun/awt/ExtendedKeyCodes.java FILES_export2 = \ diff --git a/jdk/make/sun/awt/FILES_export_windows.gmk b/jdk/make/sun/awt/FILES_export_windows.gmk index 95933ceb396..27627494458 100644 --- a/jdk/make/sun/awt/FILES_export_windows.gmk +++ b/jdk/make/sun/awt/FILES_export_windows.gmk @@ -1,5 +1,5 @@ # -# Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2000-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 @@ -154,7 +154,7 @@ FILES_export2 = \ sun/awt/datatransfer/DataTransferer.java \ sun/awt/datatransfer/SunClipboard.java \ sun/awt/dnd/SunDragSourceContextPeer.java \ - sun/awt/windows/WToolkitThreadBlockedHandler.java + sun/awt/windows/WToolkitThreadBlockedHandler.java FILES_export3 = \ java/awt/CheckboxMenuItem.java \ @@ -214,6 +214,7 @@ FILES_export3 = \ sun/awt/windows/WBufferStrategy.java \ sun/awt/windows/WTrayIconPeer.java \ sun/awt/image/ImagingLib.java \ + sun/awt/ExtendedKeyCodes.java \ sun/java2d/pipe/hw/AccelSurface.java \ sun/java2d/pipe/hw/AccelDeviceEventNotifier.java \ sun/java2d/pipe/hw/ContextCapabilities.java \ diff --git a/jdk/make/sun/xawt/mapfile-vers b/jdk/make/sun/xawt/mapfile-vers index 2eef2391e8e..8aaaef7f260 100644 --- a/jdk/make/sun/xawt/mapfile-vers +++ b/jdk/make/sun/xawt/mapfile-vers @@ -1,5 +1,5 @@ # -# Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2002-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 @@ -293,16 +293,26 @@ SUNWprivate_1.1 { Java_sun_awt_X11_XlibWrapper_XGetIconSizes; Java_sun_awt_X11_XlibWrapper_XKeycodeToKeysym; Java_sun_awt_X11_XlibWrapper_XKeysymToKeycode; - Java_sun_awt_X11_XlibWrapper_XQueryKeymap; + Java_sun_awt_X11_XlibWrapper_XQueryKeymap; + Java_sun_awt_X11_XlibWrapper_XkbGetEffectiveGroup; + Java_sun_awt_X11_XlibWrapper_XkbSelectEvents; + Java_sun_awt_X11_XlibWrapper_XkbSelectEventDetails; + Java_sun_awt_X11_XlibWrapper_XkbKeycodeToKeysym; + Java_sun_awt_X11_XlibWrapper_XkbLibraryVersion; + Java_sun_awt_X11_XlibWrapper_XkbQueryExtension; + Java_sun_awt_X11_XlibWrapper_XkbGetMap; + Java_sun_awt_X11_XlibWrapper_XkbGetUpdatedMap; + Java_sun_awt_X11_XlibWrapper_XkbFreeKeyboard; + Java_sun_awt_X11_XlibWrapper_XkbTranslateKeyCode; Java_sun_awt_X11_XlibWrapper_XGetModifierMapping; - Java_sun_awt_X11_XlibWrapper_XFreeModifiermap; + Java_sun_awt_X11_XlibWrapper_XFreeModifiermap; Java_sun_awt_X11_XlibWrapper_XChangeActivePointerGrab; Java_sun_awt_X11_XlibWrapper_XNextSecondaryLoopEvent; Java_sun_awt_X11_XlibWrapper_ExitSecondaryLoop; Java_sun_awt_X11_XlibWrapper_XTextPropertyToStringList; Java_sun_awt_X11_XlibWrapper_XGrabServer; Java_sun_awt_X11_XlibWrapper_XUngrabServer; - Java_sun_awt_X11_XlibWrapper_XPutBackEvent; + Java_sun_awt_X11_XlibWrapper_XPutBackEvent; Java_sun_awt_X11_XlibWrapper_XConvertCase; Java_sun_awt_X11_XlibWrapper_XSynchronize; Java_java_awt_FileDialog_initIDs; diff --git a/jdk/src/share/classes/java/awt/AWTKeyStroke.java b/jdk/src/share/classes/java/awt/AWTKeyStroke.java index 12e43dc0a14..35f57bae358 100644 --- a/jdk/src/share/classes/java/awt/AWTKeyStroke.java +++ b/jdk/src/share/classes/java/awt/AWTKeyStroke.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-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 @@ -329,6 +329,9 @@ public class AWTKeyStroke implements Serializable { *

  • java.awt.event.KeyEvent.VK_TAB *
  • java.awt.event.KeyEvent.VK_SPACE * + * Alternatively, the key code may be obtained by calling + * java.awt.event.KeyEvent.getExtendedKeyCodeForChar. + * * The modifiers consist of any combination of:
      *
    • java.awt.event.InputEvent.SHIFT_DOWN_MASK *
    • java.awt.event.InputEvent.CTRL_DOWN_MASK diff --git a/jdk/src/share/classes/java/awt/MenuItem.java b/jdk/src/share/classes/java/awt/MenuItem.java index 71dd760a9bd..c8596d74f74 100644 --- a/jdk/src/share/classes/java/awt/MenuItem.java +++ b/jdk/src/share/classes/java/awt/MenuItem.java @@ -1,5 +1,5 @@ /* - * Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1995-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 @@ -398,9 +398,11 @@ public class MenuItem extends MenuComponent implements Accessible { boolean handleShortcut(KeyEvent e) { MenuShortcut s = new MenuShortcut(e.getKeyCode(), (e.getModifiers() & InputEvent.SHIFT_MASK) > 0); + MenuShortcut sE = new MenuShortcut(e.getExtendedKeyCode(), + (e.getModifiers() & InputEvent.SHIFT_MASK) > 0); // Fix For 6185151: Menu shortcuts of all menuitems within a menu // should be disabled when the menu itself is disabled - if (s.equals(shortcut) && isItemEnabled()) { + if ((s.equals(shortcut) || sE.equals(shortcut)) && isItemEnabled()) { // MenuShortcut match -- issue an event on keydown. if (e.getID() == KeyEvent.KEY_PRESSED) { doMenuEvent(e.getWhen(), e.getModifiers()); diff --git a/jdk/src/share/classes/java/awt/MenuShortcut.java b/jdk/src/share/classes/java/awt/MenuShortcut.java index 50eef973f13..004cf7c44fe 100644 --- a/jdk/src/share/classes/java/awt/MenuShortcut.java +++ b/jdk/src/share/classes/java/awt/MenuShortcut.java @@ -1,5 +1,5 @@ /* - * Copyright 1996-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -34,7 +34,21 @@ import java.awt.event.KeyEvent; * For example, a menu shortcut for Ctrl-a (assuming that Control is * the accelerator key) would be created with code like the following: *

      - * MenuShortcut ms = new MenuShortcut(KeyEvent.VK_A, false); + * MenuShortcut ms = new MenuShortcut(KeyEvent.VK_A, false); + *

      or alternatively + *

      + * MenuShortcut ms = new MenuShortcut(KeyEvent.getExtendedKeyCodeForChar('A'), false); + *

      + * Menu shortcuts may also be constructed for a wider set of keycodes + * using the java.awt.event.KeyEvent.getExtendedKeyCodeForChar call. + * For example, a menu shortcut for "Ctrl+cyrillic ef" is created by + *

      + * MenuShortcut ms = new MenuShortcut(KeyEvent.getExtendedKeyCodeForChar('\u0444'), false); + *

      + * Note that shortcuts created with a keycode or an extended keycode defined as a constant in KeyEvent + * work regardless of the current keyboard layout. However, a shortcut made of + * an extended keycode not listed in KeyEvent + * only work if the current keyboard layout produces a corresponding letter. *

      * The accelerator key is platform-dependent and may be obtained * via {@link Toolkit#getMenuShortcutKeyMask}. diff --git a/jdk/src/share/classes/java/awt/event/KeyEvent.java b/jdk/src/share/classes/java/awt/event/KeyEvent.java index 03967570297..1c0d3723d8a 100644 --- a/jdk/src/share/classes/java/awt/event/KeyEvent.java +++ b/jdk/src/share/classes/java/awt/event/KeyEvent.java @@ -1,5 +1,5 @@ /* - * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -65,15 +65,16 @@ import java.io.ObjectInputStream; *

      * For key pressed and key released events, the getKeyCode method returns * the event's keyCode. For key typed events, the getKeyCode method - * always returns VK_UNDEFINED. + * always returns {@code VK_UNDEFINED}. The {@code getExtendedKeyCode} method + * may also be used with many international keyboard layouts. * *

      * "Key pressed" and "key released" events are lower-level and depend * on the platform and keyboard layout. They are generated whenever a key is * pressed or released, and are the only way to find out about keys that don't * generate character input (e.g., action keys, modifier keys, etc.). The key - * being pressed or released is indicated by the getKeyCode method, which returns - * a virtual key code. + * being pressed or released is indicated by the {@code getKeyCode} and {@code getExtendedKeyCode} + * methods, which return a virtual key code. * *

      * Virtual key codes are used to report which keyboard key has @@ -111,6 +112,11 @@ import java.io.ObjectInputStream; * platform and keyboard layout. For example, the key that generates VK_Q * when using a U.S. keyboard layout will generate VK_A when using a French * keyboard layout. + *

    • The key that generates {@code VK_Q} when using a U.S. keyboard layout also + * generates a unique code for Russian or Hebrew layout. There is no a + * {@code VK_} constant for these and many other codes in various layouts. These codes + * may be obtained by using {@code getExtendedKeyCode} and are used whenever + * a {@code VK_} constant is used. *
    • Not all characters have a keycode associated with them. For example, * there is no keycode for the question mark because there is no keyboard * for which it appears on the primary layer. @@ -891,6 +897,12 @@ public class KeyEvent extends InputEvent { */ int keyLocation; + //set from native code. + private transient long rawCode = 0; + private transient long primaryLevelUnicode = 0; + private transient long scancode = 0; // for MS Windows only + private transient long extendedKeyCode = 0; + /* * JDK 1.1 serialVersionUID */ @@ -1315,6 +1327,9 @@ public class KeyEvent extends InputEvent { return numpad + "-" + c; } + if ((keyCode & 0x01000000) != 0) { + return String.valueOf((char)(keyCode ^ 0x01000000 )); + } String unknown = Toolkit.getProperty("AWT.unknown", "Unknown"); return unknown + " keyCode: 0x" + Integer.toString(keyCode, 16); } @@ -1551,9 +1566,44 @@ public class KeyEvent extends InputEvent { str.append("KEY_LOCATION_UNKNOWN"); break; } + str.append(",rawCode=").append(rawCode); + str.append(",primaryLevelUnicode=").append(primaryLevelUnicode); + str.append(",scancode=").append(scancode); + str.append(",extendedKeyCode=0x").append(Long.toHexString(extendedKeyCode)); return str.toString(); } + /** + * Returns an extended key code for the event. + * The extended key code is a unique id assigned to a key on the keyboard + * just like {@code keyCode}. However, unlike {@code keyCode}, this value depends on the + * current keyboard layout. For instance, pressing the left topmost letter key + * in a common English layout produces the same value as {@code keyCode}, {@code VK_Q}. + * Pressing the same key in a regular Russian layout gives another code, unique for the + * letter "Cyrillic I short". + * + * @since 1.7 + * + */ + public int getExtendedKeyCode() { + return (int)extendedKeyCode; + } + /** + * Returns an extended key code for a unicode character. + * + * @return for a unicode character with a corresponding {@code VK_} constant -- this + * {@code VK_} constant; for a character appearing on the primary + * level of a known keyboard layout -- a unique integer. + * If a character does not appear on the primary level of a known keyboard, + * {@code VK_UNDEFINED} is returned. + * + * @since 1.7 + * + */ + public static int getExtendedKeyCodeForChar(int c) { + // Return a keycode (if any) associated with a character. + return sun.awt.ExtendedKeyCodes.getExtendedKeyCodeForChar(c); + } /** * Sets new modifiers by the old ones. The key modifiers diff --git a/jdk/src/share/classes/javax/swing/AbstractButton.java b/jdk/src/share/classes/javax/swing/AbstractButton.java index d4810810128..06a48991d73 100644 --- a/jdk/src/share/classes/javax/swing/AbstractButton.java +++ b/jdk/src/share/classes/javax/swing/AbstractButton.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -1545,6 +1545,9 @@ public abstract class AbstractButton extends JComponent implements ItemSelectabl * A mnemonic must correspond to a single key on the keyboard * and should be specified using one of the VK_XXX * keycodes defined in java.awt.event.KeyEvent. + * These codes and the wider array of codes for international + * keyboards may be obtained through + * java.awt.event.KeyEvent.getExtendedKeyCodeForChar. * Mnemonics are case-insensitive, therefore a key event * with the corresponding keycode would cause the button to be * activated whether or not the Shift modifier was pressed. diff --git a/jdk/src/share/classes/javax/swing/Action.java b/jdk/src/share/classes/javax/swing/Action.java index c996244fd5d..4a13a42da89 100644 --- a/jdk/src/share/classes/javax/swing/Action.java +++ b/jdk/src/share/classes/javax/swing/Action.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -272,7 +272,9 @@ public interface Action extends ActionListener { * one of the KeyEvent key codes. The value is * commonly used to specify a mnemonic. For example: * myAction.putValue(Action.MNEMONIC_KEY, KeyEvent.VK_A) - * sets the mnemonic of myAction to 'a'. + * sets the mnemonic of myAction to 'a', while + * myAction.putValue(Action.MNEMONIC_KEY, KeyEvent.getExtendedKeyCodeForChar('\u0444')) + * sets the mnemonic of myAction to Cyrillic letter "Ef". * * @since 1.3 */ diff --git a/jdk/src/share/classes/javax/swing/JComponent.java b/jdk/src/share/classes/javax/swing/JComponent.java index 831dc717a07..ebed1925608 100644 --- a/jdk/src/share/classes/javax/swing/JComponent.java +++ b/jdk/src/share/classes/javax/swing/JComponent.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -2888,7 +2888,10 @@ public abstract class JComponent extends Container implements Serializable, return false; } // Get the KeyStroke + // There may be two keystrokes associated with a low-level key event; + // in this case a keystroke made of an extended key code has a priority. KeyStroke ks; + KeyStroke ksE = null; if (e.getID() == KeyEvent.KEY_TYPED) { ks = KeyStroke.getKeyStroke(e.getKeyChar()); @@ -2896,9 +2899,18 @@ public abstract class JComponent extends Container implements Serializable, else { ks = KeyStroke.getKeyStroke(e.getKeyCode(),e.getModifiers(), (pressed ? false:true)); + if (e.getKeyCode() != e.getExtendedKeyCode()) { + ksE = KeyStroke.getKeyStroke(e.getExtendedKeyCode(),e.getModifiers(), + (pressed ? false:true)); + } } - /* Do we have a key binding for e? */ + // Do we have a key binding for e? + // If we have a binding by an extended code, use it. + // If not, check for regular code binding. + if(ksE != null && processKeyBinding(ksE, e, WHEN_FOCUSED, pressed)) { + return true; + } if(processKeyBinding(ks, e, WHEN_FOCUSED, pressed)) return true; @@ -2910,6 +2922,9 @@ public abstract class JComponent extends Container implements Serializable, while (parent != null && !(parent instanceof Window) && !(parent instanceof Applet)) { if(parent instanceof JComponent) { + if(ksE != null && ((JComponent)parent).processKeyBinding(ksE, e, + WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, pressed)) + return true; if(((JComponent)parent).processKeyBinding(ks, e, WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, pressed)) return true; diff --git a/jdk/src/share/classes/javax/swing/JLabel.java b/jdk/src/share/classes/javax/swing/JLabel.java index 417892a8323..a9641b9bef1 100644 --- a/jdk/src/share/classes/javax/swing/JLabel.java +++ b/jdk/src/share/classes/javax/swing/JLabel.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -503,10 +503,10 @@ public class JLabel extends JComponent implements SwingConstants, Accessible * @see #setDisplayedMnemonic(int) */ public void setDisplayedMnemonic(char aChar) { - int vk = (int) aChar; - if(vk >= 'a' && vk <='z') - vk -= ('a' - 'A'); - setDisplayedMnemonic(vk); + int vk = java.awt.event.KeyEvent.getExtendedKeyCodeForChar(aChar); + if (vk != java.awt.event.KeyEvent.VK_UNDEFINED) { + setDisplayedMnemonic(vk); + } } diff --git a/jdk/src/share/classes/javax/swing/JTabbedPane.java b/jdk/src/share/classes/javax/swing/JTabbedPane.java index 2c74189fd33..e53cde113cd 100644 --- a/jdk/src/share/classes/javax/swing/JTabbedPane.java +++ b/jdk/src/share/classes/javax/swing/JTabbedPane.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -1628,7 +1628,9 @@ public class JTabbedPane extends JComponent *

      * A mnemonic must correspond to a single key on the keyboard * and should be specified using one of the VK_XXX - * keycodes defined in java.awt.event.KeyEvent. + * keycodes defined in java.awt.event.KeyEvent + * or one of the extended keycodes obtained through + * java.awt.event.KeyEvent.getExtendedKeyCodeForChar. * Mnemonics are case-insensitive, therefore a key event * with the corresponding keycode would cause the button to be * activated whether or not the Shift modifier was pressed. diff --git a/jdk/src/share/classes/javax/swing/KeyStroke.java b/jdk/src/share/classes/javax/swing/KeyStroke.java index 8a1e860ce29..2eb3c41d5db 100644 --- a/jdk/src/share/classes/javax/swing/KeyStroke.java +++ b/jdk/src/share/classes/javax/swing/KeyStroke.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -162,6 +162,9 @@ public class KeyStroke extends AWTKeyStroke { *

    • java.awt.event.KeyEvent.VK_TAB *
    • java.awt.event.KeyEvent.VK_SPACE *
    + * Alternatively, the key code may be obtained by calling + * java.awt.event.KeyEvent.getExtendedKeyCodeForChar. + * * The modifiers consist of any combination of:
      *
    • java.awt.event.InputEvent.SHIFT_DOWN_MASK *
    • java.awt.event.InputEvent.CTRL_DOWN_MASK @@ -210,6 +213,9 @@ public class KeyStroke extends AWTKeyStroke { *
    • java.awt.event.KeyEvent.VK_TAB *
    • java.awt.event.KeyEvent.VK_SPACE *
    + * Alternatively, the key code may be obtained by calling + * java.awt.event.KeyEvent.getExtendedKeyCodeForChar. + * * The modifiers consist of any combination of:
      *
    • java.awt.event.InputEvent.SHIFT_DOWN_MASK *
    • java.awt.event.InputEvent.CTRL_DOWN_MASK diff --git a/jdk/src/share/classes/javax/swing/KeyboardManager.java b/jdk/src/share/classes/javax/swing/KeyboardManager.java index 1e4f032aec6..e88139e9f6d 100644 --- a/jdk/src/share/classes/javax/swing/KeyboardManager.java +++ b/jdk/src/share/classes/javax/swing/KeyboardManager.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-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 @@ -212,19 +212,35 @@ class KeyboardManager { Thread.dumpStack(); } + // There may be two keystrokes associated with a low-level key event; + // in this case a keystroke made of an extended key code has a priority. KeyStroke ks; + KeyStroke ksE = null; if(e.getID() == KeyEvent.KEY_TYPED) { ks=KeyStroke.getKeyStroke(e.getKeyChar()); } else { + if(e.getKeyCode() != e.getExtendedKeyCode()) { + ksE=KeyStroke.getKeyStroke(e.getExtendedKeyCode(), e.getModifiers(), !pressed); + } ks=KeyStroke.getKeyStroke(e.getKeyCode(), e.getModifiers(), !pressed); } Hashtable keyMap = containerMap.get(topAncestor); if (keyMap != null) { // this container isn't registered, so bail - Object tmp = keyMap.get(ks); + Object tmp = null; + // extended code has priority + if( ksE != null ) { + tmp = keyMap.get(ksE); + if( tmp != null ) { + ks = ksE; + } + } + if( tmp == null ) { + tmp = keyMap.get(ks); + } if (tmp == null) { // don't do anything @@ -269,7 +285,12 @@ class KeyboardManager { while (iter.hasMoreElements()) { JMenuBar mb = (JMenuBar)iter.nextElement(); if ( mb.isShowing() && mb.isEnabled() ) { // don't want to give these out - fireBinding(mb, ks, e, pressed); + if( !(ks.equals(ksE)) ) { + fireBinding(mb, ksE, e, pressed); + } + if(ks.equals(ksE) || !e.isConsumed()) { + fireBinding(mb, ks, e, pressed); + } if (e.isConsumed()) { return true; } diff --git a/jdk/src/share/classes/javax/swing/SwingUtilities.java b/jdk/src/share/classes/javax/swing/SwingUtilities.java index 0493510a7bb..21a75ce1d97 100644 --- a/jdk/src/share/classes/javax/swing/SwingUtilities.java +++ b/jdk/src/share/classes/javax/swing/SwingUtilities.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -1589,15 +1589,6 @@ public class SwingUtilities implements SwingConstants * processing the key bindings associated with JComponents. */ static boolean isValidKeyEventForKeyBindings(KeyEvent e) { - if (e.getID() == KeyEvent.KEY_TYPED) { - int mod = e.getModifiers(); - if (((mod & ActionEvent.ALT_MASK) != 0) && - ((mod & ActionEvent.CTRL_MASK) == 0)) { - // filter out typed "alt-?" keys, but not those created - // with AltGr, and not control characters - return false; - } - } return true; } diff --git a/jdk/src/share/classes/sun/awt/ExtendedKeyCodes.java b/jdk/src/share/classes/sun/awt/ExtendedKeyCodes.java new file mode 100644 index 00000000000..37dfafb72ed --- /dev/null +++ b/jdk/src/share/classes/sun/awt/ExtendedKeyCodes.java @@ -0,0 +1,670 @@ +package sun.awt; + +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.awt.event.KeyEvent; + +public class ExtendedKeyCodes { + /** + * ATTN: These are the readonly hashes with load factor == 1; + * adding a value, please set the inital capacity to exact number of items + * or higher. + */ + // Keycodes declared in KeyEvent.java with corresponding Unicode values. + private final static HashMap regularKeyCodesMap = + new HashMap(122, 1.0f); + + // Keycodes derived from Unicode values. Here should be collected codes + // for characters appearing on the primary layer of at least one + // known keyboard layout. For instance, sterling sign is on the primary layer + // of the Mac Italian layout. + private final static HashSet extendedKeyCodesSet = + new HashSet(501, 1.0f); + final public static int getExtendedKeyCodeForChar( int c ) { + int rc = KeyEvent.VK_UNDEFINED; + int uc = Character.toUpperCase( c ); + int lc = Character.toLowerCase( c ); + if (regularKeyCodesMap.containsKey( c )) { + if(regularKeyCodesMap.containsKey(uc)) { + return regularKeyCodesMap.get( uc ); + } + return regularKeyCodesMap.get( c ); + } + uc += 0x01000000; + lc += 0x01000000; + if (extendedKeyCodesSet.contains( uc )) { + return uc; + }else if (extendedKeyCodesSet.contains( lc )) { + return lc; + } + return rc; + } + static { + regularKeyCodesMap.put(0x0a, KeyEvent.VK_ENTER); + regularKeyCodesMap.put(0x08, KeyEvent.VK_BACK_SPACE); + regularKeyCodesMap.put(0x09, KeyEvent.VK_TAB); + regularKeyCodesMap.put(0x1B, KeyEvent.VK_ESCAPE); + regularKeyCodesMap.put(0x20, KeyEvent.VK_SPACE); + regularKeyCodesMap.put(0x21, KeyEvent.VK_PAGE_UP); + regularKeyCodesMap.put(0x22, KeyEvent.VK_PAGE_DOWN); + regularKeyCodesMap.put(0x23, KeyEvent.VK_END); + regularKeyCodesMap.put(0x24, KeyEvent.VK_HOME); + regularKeyCodesMap.put(0x25, KeyEvent.VK_LEFT); + regularKeyCodesMap.put(0x26, KeyEvent.VK_UP); + regularKeyCodesMap.put(0x27, KeyEvent.VK_RIGHT); + regularKeyCodesMap.put(0x28, KeyEvent.VK_DOWN); + regularKeyCodesMap.put(0x2C, KeyEvent.VK_COMMA); + regularKeyCodesMap.put(0x2D, KeyEvent.VK_MINUS); + regularKeyCodesMap.put(0x2E, KeyEvent.VK_PERIOD); + regularKeyCodesMap.put(0x2F, KeyEvent.VK_SLASH); + regularKeyCodesMap.put(0x30, KeyEvent.VK_0); + regularKeyCodesMap.put(0x31, KeyEvent.VK_1); + regularKeyCodesMap.put(0x32, KeyEvent.VK_2); + regularKeyCodesMap.put(0x33, KeyEvent.VK_3); + regularKeyCodesMap.put(0x34, KeyEvent.VK_4); + regularKeyCodesMap.put(0x35, KeyEvent.VK_5); + regularKeyCodesMap.put(0x36, KeyEvent.VK_6); + regularKeyCodesMap.put(0x37, KeyEvent.VK_7); + regularKeyCodesMap.put(0x38, KeyEvent.VK_8); + regularKeyCodesMap.put(0x39, KeyEvent.VK_9); + regularKeyCodesMap.put(0x3B, KeyEvent.VK_SEMICOLON); + regularKeyCodesMap.put(0x3D, KeyEvent.VK_EQUALS); + regularKeyCodesMap.put(0x41, KeyEvent.VK_A); + regularKeyCodesMap.put(0x61, KeyEvent.VK_A); + regularKeyCodesMap.put(0x42, KeyEvent.VK_B); + regularKeyCodesMap.put(0x62, KeyEvent.VK_B); + regularKeyCodesMap.put(0x43, KeyEvent.VK_C); + regularKeyCodesMap.put(0x63, KeyEvent.VK_C); + regularKeyCodesMap.put(0x44, KeyEvent.VK_D); + regularKeyCodesMap.put(0x64, KeyEvent.VK_D); + regularKeyCodesMap.put(0x45, KeyEvent.VK_E); + regularKeyCodesMap.put(0x65, KeyEvent.VK_E); + regularKeyCodesMap.put(0x46, KeyEvent.VK_F); + regularKeyCodesMap.put(0x66, KeyEvent.VK_F); + regularKeyCodesMap.put(0x47, KeyEvent.VK_G); + regularKeyCodesMap.put(0x67, KeyEvent.VK_G); + regularKeyCodesMap.put(0x48, KeyEvent.VK_H); + regularKeyCodesMap.put(0x68, KeyEvent.VK_H); + regularKeyCodesMap.put(0x49, KeyEvent.VK_I); + regularKeyCodesMap.put(0x69, KeyEvent.VK_I); + regularKeyCodesMap.put(0x4A, KeyEvent.VK_J); + regularKeyCodesMap.put(0x6A, KeyEvent.VK_J); + regularKeyCodesMap.put(0x4B, KeyEvent.VK_K); + regularKeyCodesMap.put(0x6B, KeyEvent.VK_K); + regularKeyCodesMap.put(0x4C, KeyEvent.VK_L); + regularKeyCodesMap.put(0x6C, KeyEvent.VK_L); + regularKeyCodesMap.put(0x4D, KeyEvent.VK_M); + regularKeyCodesMap.put(0x6D, KeyEvent.VK_M); + regularKeyCodesMap.put(0x4E, KeyEvent.VK_N); + regularKeyCodesMap.put(0x6E, KeyEvent.VK_N); + regularKeyCodesMap.put(0x4F, KeyEvent.VK_O); + regularKeyCodesMap.put(0x6F, KeyEvent.VK_O); + regularKeyCodesMap.put(0x50, KeyEvent.VK_P); + regularKeyCodesMap.put(0x70, KeyEvent.VK_P); + regularKeyCodesMap.put(0x51, KeyEvent.VK_Q); + regularKeyCodesMap.put(0x71, KeyEvent.VK_Q); + regularKeyCodesMap.put(0x52, KeyEvent.VK_R); + regularKeyCodesMap.put(0x72, KeyEvent.VK_R); + regularKeyCodesMap.put(0x53, KeyEvent.VK_S); + regularKeyCodesMap.put(0x73, KeyEvent.VK_S); + regularKeyCodesMap.put(0x54, KeyEvent.VK_T); + regularKeyCodesMap.put(0x74, KeyEvent.VK_T); + regularKeyCodesMap.put(0x55, KeyEvent.VK_U); + regularKeyCodesMap.put(0x75, KeyEvent.VK_U); + regularKeyCodesMap.put(0x56, KeyEvent.VK_V); + regularKeyCodesMap.put(0x76, KeyEvent.VK_V); + regularKeyCodesMap.put(0x57, KeyEvent.VK_W); + regularKeyCodesMap.put(0x77, KeyEvent.VK_W); + regularKeyCodesMap.put(0x58, KeyEvent.VK_X); + regularKeyCodesMap.put(0x78, KeyEvent.VK_X); + regularKeyCodesMap.put(0x59, KeyEvent.VK_Y); + regularKeyCodesMap.put(0x79, KeyEvent.VK_Y); + regularKeyCodesMap.put(0x5A, KeyEvent.VK_Z); + regularKeyCodesMap.put(0x7A, KeyEvent.VK_Z); + regularKeyCodesMap.put(0x5B, KeyEvent.VK_OPEN_BRACKET); + regularKeyCodesMap.put(0x5C, KeyEvent.VK_BACK_SLASH); + regularKeyCodesMap.put(0x5D, KeyEvent.VK_CLOSE_BRACKET); +// regularKeyCodesMap.put(0x60, KeyEvent.VK_NUMPAD0); +// regularKeyCodesMap.put(0x61, KeyEvent.VK_NUMPAD1); +// regularKeyCodesMap.put(0x62, KeyEvent.VK_NUMPAD2); +// regularKeyCodesMap.put(0x63, KeyEvent.VK_NUMPAD3); +// regularKeyCodesMap.put(0x64, KeyEvent.VK_NUMPAD4); +// regularKeyCodesMap.put(0x65, KeyEvent.VK_NUMPAD5); +// regularKeyCodesMap.put(0x66, KeyEvent.VK_NUMPAD6); +// regularKeyCodesMap.put(0x67, KeyEvent.VK_NUMPAD7); +// regularKeyCodesMap.put(0x68, KeyEvent.VK_NUMPAD8); +// regularKeyCodesMap.put(0x69, KeyEvent.VK_NUMPAD9); + regularKeyCodesMap.put(0x6A, KeyEvent.VK_MULTIPLY); + regularKeyCodesMap.put(0x6B, KeyEvent.VK_ADD); + regularKeyCodesMap.put(0x6C, KeyEvent.VK_SEPARATER); + regularKeyCodesMap.put(0x6D, KeyEvent.VK_SUBTRACT); + regularKeyCodesMap.put(0x6E, KeyEvent.VK_DECIMAL); + regularKeyCodesMap.put(0x6F, KeyEvent.VK_DIVIDE); + regularKeyCodesMap.put(0x7F, KeyEvent.VK_DELETE); + regularKeyCodesMap.put(0xC0, KeyEvent.VK_BACK_QUOTE); + regularKeyCodesMap.put(0xDE, KeyEvent.VK_QUOTE); + regularKeyCodesMap.put(0x26, KeyEvent.VK_AMPERSAND); + regularKeyCodesMap.put(0x2A, KeyEvent.VK_ASTERISK); + regularKeyCodesMap.put(0x22, KeyEvent.VK_QUOTEDBL); + regularKeyCodesMap.put(0x3C, KeyEvent.VK_LESS); + regularKeyCodesMap.put(0x3E, KeyEvent.VK_GREATER); + regularKeyCodesMap.put(0x7B, KeyEvent.VK_BRACELEFT); + regularKeyCodesMap.put(0x7D, KeyEvent.VK_BRACERIGHT); + regularKeyCodesMap.put(0x40, KeyEvent.VK_AT); + regularKeyCodesMap.put(0x3A, KeyEvent.VK_COLON); + regularKeyCodesMap.put(0x5E, KeyEvent.VK_CIRCUMFLEX); + regularKeyCodesMap.put(0x24, KeyEvent.VK_DOLLAR); + regularKeyCodesMap.put(0x20AC, KeyEvent.VK_EURO_SIGN); + regularKeyCodesMap.put(0x21, KeyEvent.VK_EXCLAMATION_MARK); + regularKeyCodesMap.put(0xA1, KeyEvent.VK_INVERTED_EXCLAMATION_MARK); + regularKeyCodesMap.put(0x28, KeyEvent.VK_LEFT_PARENTHESIS); + regularKeyCodesMap.put(0x23, KeyEvent.VK_NUMBER_SIGN); + regularKeyCodesMap.put(0x2B, KeyEvent.VK_PLUS); + regularKeyCodesMap.put(0x29, KeyEvent.VK_RIGHT_PARENTHESIS); + regularKeyCodesMap.put(0x5F, KeyEvent.VK_UNDERSCORE); + + + extendedKeyCodesSet.add(0x01000000+0x0060); + extendedKeyCodesSet.add(0x01000000+0x007C); + extendedKeyCodesSet.add(0x01000000+0x007E); + extendedKeyCodesSet.add(0x01000000+0x00A2); + extendedKeyCodesSet.add(0x01000000+0x00A3); + extendedKeyCodesSet.add(0x01000000+0x00A5); + extendedKeyCodesSet.add(0x01000000+0x00A7); + extendedKeyCodesSet.add(0x01000000+0x00A8); + extendedKeyCodesSet.add(0x01000000+0x00AB); + extendedKeyCodesSet.add(0x01000000+0x00B0); + extendedKeyCodesSet.add(0x01000000+0x00B1); + extendedKeyCodesSet.add(0x01000000+0x00B2); + extendedKeyCodesSet.add(0x01000000+0x00B3); + extendedKeyCodesSet.add(0x01000000+0x00B4); + extendedKeyCodesSet.add(0x01000000+0x00B5); + extendedKeyCodesSet.add(0x01000000+0x00B6); + extendedKeyCodesSet.add(0x01000000+0x00B7); + extendedKeyCodesSet.add(0x01000000+0x00B9); + extendedKeyCodesSet.add(0x01000000+0x00BA); + extendedKeyCodesSet.add(0x01000000+0x00BB); + extendedKeyCodesSet.add(0x01000000+0x00BC); + extendedKeyCodesSet.add(0x01000000+0x00BD); + extendedKeyCodesSet.add(0x01000000+0x00BE); + extendedKeyCodesSet.add(0x01000000+0x00BF); + extendedKeyCodesSet.add(0x01000000+0x00C4); + extendedKeyCodesSet.add(0x01000000+0x00C5); + extendedKeyCodesSet.add(0x01000000+0x00C6); + extendedKeyCodesSet.add(0x01000000+0x00C7); + extendedKeyCodesSet.add(0x01000000+0x00D1); + extendedKeyCodesSet.add(0x01000000+0x00D6); + extendedKeyCodesSet.add(0x01000000+0x00D7); + extendedKeyCodesSet.add(0x01000000+0x00D8); + extendedKeyCodesSet.add(0x01000000+0x00DF); + extendedKeyCodesSet.add(0x01000000+0x00E0); + extendedKeyCodesSet.add(0x01000000+0x00E1); + extendedKeyCodesSet.add(0x01000000+0x00E2); + extendedKeyCodesSet.add(0x01000000+0x00E4); + extendedKeyCodesSet.add(0x01000000+0x00E5); + extendedKeyCodesSet.add(0x01000000+0x00E6); + extendedKeyCodesSet.add(0x01000000+0x00E7); + extendedKeyCodesSet.add(0x01000000+0x00E8); + extendedKeyCodesSet.add(0x01000000+0x00E9); + extendedKeyCodesSet.add(0x01000000+0x00EA); + extendedKeyCodesSet.add(0x01000000+0x00EB); + extendedKeyCodesSet.add(0x01000000+0x00EC); + extendedKeyCodesSet.add(0x01000000+0x00ED); + extendedKeyCodesSet.add(0x01000000+0x00EE); + extendedKeyCodesSet.add(0x01000000+0x00F0); + extendedKeyCodesSet.add(0x01000000+0x00F1); + extendedKeyCodesSet.add(0x01000000+0x00F2); + extendedKeyCodesSet.add(0x01000000+0x00F3); + extendedKeyCodesSet.add(0x01000000+0x00F4); + extendedKeyCodesSet.add(0x01000000+0x00F5); + extendedKeyCodesSet.add(0x01000000+0x00F6); + extendedKeyCodesSet.add(0x01000000+0x00F7); + extendedKeyCodesSet.add(0x01000000+0x00F8); + extendedKeyCodesSet.add(0x01000000+0x00F9); + extendedKeyCodesSet.add(0x01000000+0x00FA); + extendedKeyCodesSet.add(0x01000000+0x00FB); + extendedKeyCodesSet.add(0x01000000+0x00FC); + extendedKeyCodesSet.add(0x01000000+0x00FD); + extendedKeyCodesSet.add(0x01000000+0x00FE); + extendedKeyCodesSet.add(0x01000000+0x0105); + extendedKeyCodesSet.add(0x01000000+0x02DB); + extendedKeyCodesSet.add(0x01000000+0x0142); + extendedKeyCodesSet.add(0x01000000+0x013E); + extendedKeyCodesSet.add(0x01000000+0x015B); + extendedKeyCodesSet.add(0x01000000+0x0161); + extendedKeyCodesSet.add(0x01000000+0x015F); + extendedKeyCodesSet.add(0x01000000+0x0165); + extendedKeyCodesSet.add(0x01000000+0x017E); + extendedKeyCodesSet.add(0x01000000+0x017C); + extendedKeyCodesSet.add(0x01000000+0x0103); + extendedKeyCodesSet.add(0x01000000+0x0107); + extendedKeyCodesSet.add(0x01000000+0x010D); + extendedKeyCodesSet.add(0x01000000+0x0119); + extendedKeyCodesSet.add(0x01000000+0x011B); + extendedKeyCodesSet.add(0x01000000+0x0111); + extendedKeyCodesSet.add(0x01000000+0x0148); + extendedKeyCodesSet.add(0x01000000+0x0151); + extendedKeyCodesSet.add(0x01000000+0x0171); + extendedKeyCodesSet.add(0x01000000+0x0159); + extendedKeyCodesSet.add(0x01000000+0x016F); + extendedKeyCodesSet.add(0x01000000+0x0163); + extendedKeyCodesSet.add(0x01000000+0x02D9); + extendedKeyCodesSet.add(0x01000000+0x0130); + extendedKeyCodesSet.add(0x01000000+0x0127); + extendedKeyCodesSet.add(0x01000000+0x0125); + extendedKeyCodesSet.add(0x01000000+0x0131); + extendedKeyCodesSet.add(0x01000000+0x011F); + extendedKeyCodesSet.add(0x01000000+0x0135); + extendedKeyCodesSet.add(0x01000000+0x010B); + extendedKeyCodesSet.add(0x01000000+0x0109); + extendedKeyCodesSet.add(0x01000000+0x0121); + extendedKeyCodesSet.add(0x01000000+0x011D); + extendedKeyCodesSet.add(0x01000000+0x016D); + extendedKeyCodesSet.add(0x01000000+0x015D); + extendedKeyCodesSet.add(0x01000000+0x0138); + extendedKeyCodesSet.add(0x01000000+0x0157); + extendedKeyCodesSet.add(0x01000000+0x013C); + extendedKeyCodesSet.add(0x01000000+0x0113); + extendedKeyCodesSet.add(0x01000000+0x0123); + extendedKeyCodesSet.add(0x01000000+0x0167); + extendedKeyCodesSet.add(0x01000000+0x014B); + extendedKeyCodesSet.add(0x01000000+0x0101); + extendedKeyCodesSet.add(0x01000000+0x012F); + extendedKeyCodesSet.add(0x01000000+0x0117); + extendedKeyCodesSet.add(0x01000000+0x012B); + extendedKeyCodesSet.add(0x01000000+0x0146); + extendedKeyCodesSet.add(0x01000000+0x014D); + extendedKeyCodesSet.add(0x01000000+0x0137); + extendedKeyCodesSet.add(0x01000000+0x0173); + extendedKeyCodesSet.add(0x01000000+0x016B); + extendedKeyCodesSet.add(0x01000000+0x0153); + extendedKeyCodesSet.add(0x01000000+0x30FC); + extendedKeyCodesSet.add(0x01000000+0x30A2); + extendedKeyCodesSet.add(0x01000000+0x30A4); + extendedKeyCodesSet.add(0x01000000+0x30A6); + extendedKeyCodesSet.add(0x01000000+0x30A8); + extendedKeyCodesSet.add(0x01000000+0x30AA); + extendedKeyCodesSet.add(0x01000000+0x30AB); + extendedKeyCodesSet.add(0x01000000+0x30AD); + extendedKeyCodesSet.add(0x01000000+0x30AF); + extendedKeyCodesSet.add(0x01000000+0x30B1); + extendedKeyCodesSet.add(0x01000000+0x30B3); + extendedKeyCodesSet.add(0x01000000+0x30B5); + extendedKeyCodesSet.add(0x01000000+0x30B7); + extendedKeyCodesSet.add(0x01000000+0x30B9); + extendedKeyCodesSet.add(0x01000000+0x30BB); + extendedKeyCodesSet.add(0x01000000+0x30BD); + extendedKeyCodesSet.add(0x01000000+0x30BF); + extendedKeyCodesSet.add(0x01000000+0x30C1); + extendedKeyCodesSet.add(0x01000000+0x30C4); + extendedKeyCodesSet.add(0x01000000+0x30C6); + extendedKeyCodesSet.add(0x01000000+0x30C8); + extendedKeyCodesSet.add(0x01000000+0x30CA); + extendedKeyCodesSet.add(0x01000000+0x30CB); + extendedKeyCodesSet.add(0x01000000+0x30CC); + extendedKeyCodesSet.add(0x01000000+0x30CD); + extendedKeyCodesSet.add(0x01000000+0x30CE); + extendedKeyCodesSet.add(0x01000000+0x30CF); + extendedKeyCodesSet.add(0x01000000+0x30D2); + extendedKeyCodesSet.add(0x01000000+0x30D5); + extendedKeyCodesSet.add(0x01000000+0x30D8); + extendedKeyCodesSet.add(0x01000000+0x30DB); + extendedKeyCodesSet.add(0x01000000+0x30DE); + extendedKeyCodesSet.add(0x01000000+0x30DF); + extendedKeyCodesSet.add(0x01000000+0x30E0); + extendedKeyCodesSet.add(0x01000000+0x30E1); + extendedKeyCodesSet.add(0x01000000+0x30E2); + extendedKeyCodesSet.add(0x01000000+0x30E4); + extendedKeyCodesSet.add(0x01000000+0x30E6); + extendedKeyCodesSet.add(0x01000000+0x30E8); + extendedKeyCodesSet.add(0x01000000+0x30E9); + extendedKeyCodesSet.add(0x01000000+0x30EA); + extendedKeyCodesSet.add(0x01000000+0x30EB); + extendedKeyCodesSet.add(0x01000000+0x30EC); + extendedKeyCodesSet.add(0x01000000+0x30ED); + extendedKeyCodesSet.add(0x01000000+0x30EF); + extendedKeyCodesSet.add(0x01000000+0x30F3); + extendedKeyCodesSet.add(0x01000000+0x309B); + extendedKeyCodesSet.add(0x01000000+0x309C); + extendedKeyCodesSet.add(0x01000000+0x06F0); + extendedKeyCodesSet.add(0x01000000+0x06F1); + extendedKeyCodesSet.add(0x01000000+0x06F2); + extendedKeyCodesSet.add(0x01000000+0x06F3); + extendedKeyCodesSet.add(0x01000000+0x06F4); + extendedKeyCodesSet.add(0x01000000+0x06F5); + extendedKeyCodesSet.add(0x01000000+0x06F6); + extendedKeyCodesSet.add(0x01000000+0x06F7); + extendedKeyCodesSet.add(0x01000000+0x06F8); + extendedKeyCodesSet.add(0x01000000+0x06F9); + extendedKeyCodesSet.add(0x01000000+0x0670); + extendedKeyCodesSet.add(0x01000000+0x067E); + extendedKeyCodesSet.add(0x01000000+0x0686); + extendedKeyCodesSet.add(0x01000000+0x060C); + extendedKeyCodesSet.add(0x01000000+0x06D4); + extendedKeyCodesSet.add(0x01000000+0x0660); + extendedKeyCodesSet.add(0x01000000+0x0661); + extendedKeyCodesSet.add(0x01000000+0x0662); + extendedKeyCodesSet.add(0x01000000+0x0663); + extendedKeyCodesSet.add(0x01000000+0x0664); + extendedKeyCodesSet.add(0x01000000+0x0665); + extendedKeyCodesSet.add(0x01000000+0x0666); + extendedKeyCodesSet.add(0x01000000+0x0667); + extendedKeyCodesSet.add(0x01000000+0x0668); + extendedKeyCodesSet.add(0x01000000+0x0669); + extendedKeyCodesSet.add(0x01000000+0x061B); + extendedKeyCodesSet.add(0x01000000+0x0621); + extendedKeyCodesSet.add(0x01000000+0x0624); + extendedKeyCodesSet.add(0x01000000+0x0626); + extendedKeyCodesSet.add(0x01000000+0x0627); + extendedKeyCodesSet.add(0x01000000+0x0628); + extendedKeyCodesSet.add(0x01000000+0x0629); + extendedKeyCodesSet.add(0x01000000+0x062A); + extendedKeyCodesSet.add(0x01000000+0x062B); + extendedKeyCodesSet.add(0x01000000+0x062C); + extendedKeyCodesSet.add(0x01000000+0x062D); + extendedKeyCodesSet.add(0x01000000+0x062E); + extendedKeyCodesSet.add(0x01000000+0x062F); + extendedKeyCodesSet.add(0x01000000+0x0630); + extendedKeyCodesSet.add(0x01000000+0x0631); + extendedKeyCodesSet.add(0x01000000+0x0632); + extendedKeyCodesSet.add(0x01000000+0x0633); + extendedKeyCodesSet.add(0x01000000+0x0634); + extendedKeyCodesSet.add(0x01000000+0x0635); + extendedKeyCodesSet.add(0x01000000+0x0636); + extendedKeyCodesSet.add(0x01000000+0x0637); + extendedKeyCodesSet.add(0x01000000+0x0638); + extendedKeyCodesSet.add(0x01000000+0x0639); + extendedKeyCodesSet.add(0x01000000+0x063A); + extendedKeyCodesSet.add(0x01000000+0x0641); + extendedKeyCodesSet.add(0x01000000+0x0642); + extendedKeyCodesSet.add(0x01000000+0x0643); + extendedKeyCodesSet.add(0x01000000+0x0644); + extendedKeyCodesSet.add(0x01000000+0x0645); + extendedKeyCodesSet.add(0x01000000+0x0646); + extendedKeyCodesSet.add(0x01000000+0x0647); + extendedKeyCodesSet.add(0x01000000+0x0648); + extendedKeyCodesSet.add(0x01000000+0x0649); + extendedKeyCodesSet.add(0x01000000+0x064A); + extendedKeyCodesSet.add(0x01000000+0x064E); + extendedKeyCodesSet.add(0x01000000+0x064F); + extendedKeyCodesSet.add(0x01000000+0x0650); + extendedKeyCodesSet.add(0x01000000+0x0652); + extendedKeyCodesSet.add(0x01000000+0x0698); + extendedKeyCodesSet.add(0x01000000+0x06A4); + extendedKeyCodesSet.add(0x01000000+0x06A9); + extendedKeyCodesSet.add(0x01000000+0x06AF); + extendedKeyCodesSet.add(0x01000000+0x06BE); + extendedKeyCodesSet.add(0x01000000+0x06CC); + extendedKeyCodesSet.add(0x01000000+0x06CC); + extendedKeyCodesSet.add(0x01000000+0x06D2); + extendedKeyCodesSet.add(0x01000000+0x0493); + extendedKeyCodesSet.add(0x01000000+0x0497); + extendedKeyCodesSet.add(0x01000000+0x049B); + extendedKeyCodesSet.add(0x01000000+0x049D); + extendedKeyCodesSet.add(0x01000000+0x04A3); + extendedKeyCodesSet.add(0x01000000+0x04AF); + extendedKeyCodesSet.add(0x01000000+0x04B1); + extendedKeyCodesSet.add(0x01000000+0x04B3); + extendedKeyCodesSet.add(0x01000000+0x04B9); + extendedKeyCodesSet.add(0x01000000+0x04BB); + extendedKeyCodesSet.add(0x01000000+0x04D9); + extendedKeyCodesSet.add(0x01000000+0x04E9); + extendedKeyCodesSet.add(0x01000000+0x0452); + extendedKeyCodesSet.add(0x01000000+0x0453); + extendedKeyCodesSet.add(0x01000000+0x0451); + extendedKeyCodesSet.add(0x01000000+0x0454); + extendedKeyCodesSet.add(0x01000000+0x0455); + extendedKeyCodesSet.add(0x01000000+0x0456); + extendedKeyCodesSet.add(0x01000000+0x0457); + extendedKeyCodesSet.add(0x01000000+0x0458); + extendedKeyCodesSet.add(0x01000000+0x0459); + extendedKeyCodesSet.add(0x01000000+0x045A); + extendedKeyCodesSet.add(0x01000000+0x045B); + extendedKeyCodesSet.add(0x01000000+0x045C); + extendedKeyCodesSet.add(0x01000000+0x0491); + extendedKeyCodesSet.add(0x01000000+0x045E); + extendedKeyCodesSet.add(0x01000000+0x045F); + extendedKeyCodesSet.add(0x01000000+0x2116); + extendedKeyCodesSet.add(0x01000000+0x044E); + extendedKeyCodesSet.add(0x01000000+0x0430); + extendedKeyCodesSet.add(0x01000000+0x0431); + extendedKeyCodesSet.add(0x01000000+0x0446); + extendedKeyCodesSet.add(0x01000000+0x0434); + extendedKeyCodesSet.add(0x01000000+0x0435); + extendedKeyCodesSet.add(0x01000000+0x0444); + extendedKeyCodesSet.add(0x01000000+0x0433); + extendedKeyCodesSet.add(0x01000000+0x0445); + extendedKeyCodesSet.add(0x01000000+0x0438); + extendedKeyCodesSet.add(0x01000000+0x0439); + extendedKeyCodesSet.add(0x01000000+0x043A); + extendedKeyCodesSet.add(0x01000000+0x043B); + extendedKeyCodesSet.add(0x01000000+0x043C); + extendedKeyCodesSet.add(0x01000000+0x043D); + extendedKeyCodesSet.add(0x01000000+0x043E); + extendedKeyCodesSet.add(0x01000000+0x043F); + extendedKeyCodesSet.add(0x01000000+0x044F); + extendedKeyCodesSet.add(0x01000000+0x0440); + extendedKeyCodesSet.add(0x01000000+0x0441); + extendedKeyCodesSet.add(0x01000000+0x0442); + extendedKeyCodesSet.add(0x01000000+0x0443); + extendedKeyCodesSet.add(0x01000000+0x0436); + extendedKeyCodesSet.add(0x01000000+0x0432); + extendedKeyCodesSet.add(0x01000000+0x044C); + extendedKeyCodesSet.add(0x01000000+0x044B); + extendedKeyCodesSet.add(0x01000000+0x0437); + extendedKeyCodesSet.add(0x01000000+0x0448); + extendedKeyCodesSet.add(0x01000000+0x044D); + extendedKeyCodesSet.add(0x01000000+0x0449); + extendedKeyCodesSet.add(0x01000000+0x0447); + extendedKeyCodesSet.add(0x01000000+0x044A); + extendedKeyCodesSet.add(0x01000000+0x2015); + extendedKeyCodesSet.add(0x01000000+0x03B1); + extendedKeyCodesSet.add(0x01000000+0x03B2); + extendedKeyCodesSet.add(0x01000000+0x03B3); + extendedKeyCodesSet.add(0x01000000+0x03B4); + extendedKeyCodesSet.add(0x01000000+0x03B5); + extendedKeyCodesSet.add(0x01000000+0x03B6); + extendedKeyCodesSet.add(0x01000000+0x03B7); + extendedKeyCodesSet.add(0x01000000+0x03B8); + extendedKeyCodesSet.add(0x01000000+0x03B9); + extendedKeyCodesSet.add(0x01000000+0x03BA); + extendedKeyCodesSet.add(0x01000000+0x03BB); + extendedKeyCodesSet.add(0x01000000+0x03BC); + extendedKeyCodesSet.add(0x01000000+0x03BD); + extendedKeyCodesSet.add(0x01000000+0x03BE); + extendedKeyCodesSet.add(0x01000000+0x03BF); + extendedKeyCodesSet.add(0x01000000+0x03C0); + extendedKeyCodesSet.add(0x01000000+0x03C1); + extendedKeyCodesSet.add(0x01000000+0x03C3); + extendedKeyCodesSet.add(0x01000000+0x03C2); + extendedKeyCodesSet.add(0x01000000+0x03C4); + extendedKeyCodesSet.add(0x01000000+0x03C5); + extendedKeyCodesSet.add(0x01000000+0x03C6); + extendedKeyCodesSet.add(0x01000000+0x03C7); + extendedKeyCodesSet.add(0x01000000+0x03C8); + extendedKeyCodesSet.add(0x01000000+0x03C9); + extendedKeyCodesSet.add(0x01000000+0x2190); + extendedKeyCodesSet.add(0x01000000+0x2192); + extendedKeyCodesSet.add(0x01000000+0x2193); + extendedKeyCodesSet.add(0x01000000+0x2013); + extendedKeyCodesSet.add(0x01000000+0x201C); + extendedKeyCodesSet.add(0x01000000+0x201D); + extendedKeyCodesSet.add(0x01000000+0x201E); + extendedKeyCodesSet.add(0x01000000+0x05D0); + extendedKeyCodesSet.add(0x01000000+0x05D1); + extendedKeyCodesSet.add(0x01000000+0x05D2); + extendedKeyCodesSet.add(0x01000000+0x05D3); + extendedKeyCodesSet.add(0x01000000+0x05D4); + extendedKeyCodesSet.add(0x01000000+0x05D5); + extendedKeyCodesSet.add(0x01000000+0x05D6); + extendedKeyCodesSet.add(0x01000000+0x05D7); + extendedKeyCodesSet.add(0x01000000+0x05D8); + extendedKeyCodesSet.add(0x01000000+0x05D9); + extendedKeyCodesSet.add(0x01000000+0x05DA); + extendedKeyCodesSet.add(0x01000000+0x05DB); + extendedKeyCodesSet.add(0x01000000+0x05DC); + extendedKeyCodesSet.add(0x01000000+0x05DD); + extendedKeyCodesSet.add(0x01000000+0x05DE); + extendedKeyCodesSet.add(0x01000000+0x05DF); + extendedKeyCodesSet.add(0x01000000+0x05E0); + extendedKeyCodesSet.add(0x01000000+0x05E1); + extendedKeyCodesSet.add(0x01000000+0x05E2); + extendedKeyCodesSet.add(0x01000000+0x05E3); + extendedKeyCodesSet.add(0x01000000+0x05E4); + extendedKeyCodesSet.add(0x01000000+0x05E5); + extendedKeyCodesSet.add(0x01000000+0x05E6); + extendedKeyCodesSet.add(0x01000000+0x05E7); + extendedKeyCodesSet.add(0x01000000+0x05E8); + extendedKeyCodesSet.add(0x01000000+0x05E9); + extendedKeyCodesSet.add(0x01000000+0x05EA); + extendedKeyCodesSet.add(0x01000000+0x0E01); + extendedKeyCodesSet.add(0x01000000+0x0E02); + extendedKeyCodesSet.add(0x01000000+0x0E03); + extendedKeyCodesSet.add(0x01000000+0x0E04); + extendedKeyCodesSet.add(0x01000000+0x0E05); + extendedKeyCodesSet.add(0x01000000+0x0E07); + extendedKeyCodesSet.add(0x01000000+0x0E08); + extendedKeyCodesSet.add(0x01000000+0x0E0A); + extendedKeyCodesSet.add(0x01000000+0x0E0C); + extendedKeyCodesSet.add(0x01000000+0x0E14); + extendedKeyCodesSet.add(0x01000000+0x0E15); + extendedKeyCodesSet.add(0x01000000+0x0E16); + extendedKeyCodesSet.add(0x01000000+0x0E17); + extendedKeyCodesSet.add(0x01000000+0x0E19); + extendedKeyCodesSet.add(0x01000000+0x0E1A); + extendedKeyCodesSet.add(0x01000000+0x0E1B); + extendedKeyCodesSet.add(0x01000000+0x0E1C); + extendedKeyCodesSet.add(0x01000000+0x0E1D); + extendedKeyCodesSet.add(0x01000000+0x0E1E); + extendedKeyCodesSet.add(0x01000000+0x0E1F); + extendedKeyCodesSet.add(0x01000000+0x0E20); + extendedKeyCodesSet.add(0x01000000+0x0E21); + extendedKeyCodesSet.add(0x01000000+0x0E22); + extendedKeyCodesSet.add(0x01000000+0x0E23); + extendedKeyCodesSet.add(0x01000000+0x0E25); + extendedKeyCodesSet.add(0x01000000+0x0E27); + extendedKeyCodesSet.add(0x01000000+0x0E2A); + extendedKeyCodesSet.add(0x01000000+0x0E2B); + extendedKeyCodesSet.add(0x01000000+0x0E2D); + extendedKeyCodesSet.add(0x01000000+0x0E30); + extendedKeyCodesSet.add(0x01000000+0x0E31); + extendedKeyCodesSet.add(0x01000000+0x0E32); + extendedKeyCodesSet.add(0x01000000+0x0E33); + extendedKeyCodesSet.add(0x01000000+0x0E34); + extendedKeyCodesSet.add(0x01000000+0x0E35); + extendedKeyCodesSet.add(0x01000000+0x0E36); + extendedKeyCodesSet.add(0x01000000+0x0E37); + extendedKeyCodesSet.add(0x01000000+0x0E38); + extendedKeyCodesSet.add(0x01000000+0x0E39); + extendedKeyCodesSet.add(0x01000000+0x0E3F); + extendedKeyCodesSet.add(0x01000000+0x0E40); + extendedKeyCodesSet.add(0x01000000+0x0E41); + extendedKeyCodesSet.add(0x01000000+0x0E43); + extendedKeyCodesSet.add(0x01000000+0x0E44); + extendedKeyCodesSet.add(0x01000000+0x0E45); + extendedKeyCodesSet.add(0x01000000+0x0E46); + extendedKeyCodesSet.add(0x01000000+0x0E47); + extendedKeyCodesSet.add(0x01000000+0x0E48); + extendedKeyCodesSet.add(0x01000000+0x0E49); + extendedKeyCodesSet.add(0x01000000+0x0E50); + extendedKeyCodesSet.add(0x01000000+0x0E51); + extendedKeyCodesSet.add(0x01000000+0x0E52); + extendedKeyCodesSet.add(0x01000000+0x0E53); + extendedKeyCodesSet.add(0x01000000+0x0E54); + extendedKeyCodesSet.add(0x01000000+0x0E55); + extendedKeyCodesSet.add(0x01000000+0x0E56); + extendedKeyCodesSet.add(0x01000000+0x0E57); + extendedKeyCodesSet.add(0x01000000+0x0E58); + extendedKeyCodesSet.add(0x01000000+0x0E59); + extendedKeyCodesSet.add(0x01000000+0x0587); + extendedKeyCodesSet.add(0x01000000+0x0589); + extendedKeyCodesSet.add(0x01000000+0x0589); + extendedKeyCodesSet.add(0x01000000+0x055D); + extendedKeyCodesSet.add(0x01000000+0x055D); + extendedKeyCodesSet.add(0x01000000+0x055B); + extendedKeyCodesSet.add(0x01000000+0x055B); + extendedKeyCodesSet.add(0x01000000+0x055E); + extendedKeyCodesSet.add(0x01000000+0x055E); + extendedKeyCodesSet.add(0x01000000+0x0561); + extendedKeyCodesSet.add(0x01000000+0x0562); + extendedKeyCodesSet.add(0x01000000+0x0563); + extendedKeyCodesSet.add(0x01000000+0x0564); + extendedKeyCodesSet.add(0x01000000+0x0565); + extendedKeyCodesSet.add(0x01000000+0x0566); + extendedKeyCodesSet.add(0x01000000+0x0567); + extendedKeyCodesSet.add(0x01000000+0x0568); + extendedKeyCodesSet.add(0x01000000+0x0569); + extendedKeyCodesSet.add(0x01000000+0x056A); + extendedKeyCodesSet.add(0x01000000+0x056B); + extendedKeyCodesSet.add(0x01000000+0x056C); + extendedKeyCodesSet.add(0x01000000+0x056D); + extendedKeyCodesSet.add(0x01000000+0x056E); + extendedKeyCodesSet.add(0x01000000+0x056F); + extendedKeyCodesSet.add(0x01000000+0x0570); + extendedKeyCodesSet.add(0x01000000+0x0571); + extendedKeyCodesSet.add(0x01000000+0x0572); + extendedKeyCodesSet.add(0x01000000+0x0573); + extendedKeyCodesSet.add(0x01000000+0x0574); + extendedKeyCodesSet.add(0x01000000+0x0575); + extendedKeyCodesSet.add(0x01000000+0x0576); + extendedKeyCodesSet.add(0x01000000+0x0577); + extendedKeyCodesSet.add(0x01000000+0x0578); + extendedKeyCodesSet.add(0x01000000+0x0579); + extendedKeyCodesSet.add(0x01000000+0x057A); + extendedKeyCodesSet.add(0x01000000+0x057B); + extendedKeyCodesSet.add(0x01000000+0x057C); + extendedKeyCodesSet.add(0x01000000+0x057D); + extendedKeyCodesSet.add(0x01000000+0x057E); + extendedKeyCodesSet.add(0x01000000+0x057F); + extendedKeyCodesSet.add(0x01000000+0x0580); + extendedKeyCodesSet.add(0x01000000+0x0581); + extendedKeyCodesSet.add(0x01000000+0x0582); + extendedKeyCodesSet.add(0x01000000+0x0583); + extendedKeyCodesSet.add(0x01000000+0x0584); + extendedKeyCodesSet.add(0x01000000+0x0585); + extendedKeyCodesSet.add(0x01000000+0x0586); + extendedKeyCodesSet.add(0x01000000+0x10D0); + extendedKeyCodesSet.add(0x01000000+0x10D1); + extendedKeyCodesSet.add(0x01000000+0x10D2); + extendedKeyCodesSet.add(0x01000000+0x10D3); + extendedKeyCodesSet.add(0x01000000+0x10D4); + extendedKeyCodesSet.add(0x01000000+0x10D5); + extendedKeyCodesSet.add(0x01000000+0x10D6); + extendedKeyCodesSet.add(0x01000000+0x10D7); + extendedKeyCodesSet.add(0x01000000+0x10D8); + extendedKeyCodesSet.add(0x01000000+0x10D9); + extendedKeyCodesSet.add(0x01000000+0x10DA); + extendedKeyCodesSet.add(0x01000000+0x10DB); + extendedKeyCodesSet.add(0x01000000+0x10DC); + extendedKeyCodesSet.add(0x01000000+0x10DD); + extendedKeyCodesSet.add(0x01000000+0x10DE); + extendedKeyCodesSet.add(0x01000000+0x10DF); + extendedKeyCodesSet.add(0x01000000+0x10E0); + extendedKeyCodesSet.add(0x01000000+0x10E1); + extendedKeyCodesSet.add(0x01000000+0x10E2); + extendedKeyCodesSet.add(0x01000000+0x10E3); + extendedKeyCodesSet.add(0x01000000+0x10E4); + extendedKeyCodesSet.add(0x01000000+0x10E5); + extendedKeyCodesSet.add(0x01000000+0x10E6); + extendedKeyCodesSet.add(0x01000000+0x10E7); + extendedKeyCodesSet.add(0x01000000+0x10E8); + extendedKeyCodesSet.add(0x01000000+0x10E9); + extendedKeyCodesSet.add(0x01000000+0x10EA); + extendedKeyCodesSet.add(0x01000000+0x10EB); + extendedKeyCodesSet.add(0x01000000+0x10EC); + extendedKeyCodesSet.add(0x01000000+0x10ED); + extendedKeyCodesSet.add(0x01000000+0x10EE); + extendedKeyCodesSet.add(0x01000000+0x10EF); + extendedKeyCodesSet.add(0x01000000+0x10F0); + extendedKeyCodesSet.add(0x01000000+0x01E7); + extendedKeyCodesSet.add(0x01000000+0x0259); + extendedKeyCodesSet.add(0x01000000+0x1EB9); + extendedKeyCodesSet.add(0x01000000+0x1ECB); + extendedKeyCodesSet.add(0x01000000+0x1ECD); + extendedKeyCodesSet.add(0x01000000+0x1EE5); + extendedKeyCodesSet.add(0x01000000+0x01A1); + extendedKeyCodesSet.add(0x01000000+0x01B0); + extendedKeyCodesSet.add(0x01000000+0x20AB); + } +} diff --git a/jdk/src/solaris/classes/sun/awt/X11/XConstants.java b/jdk/src/solaris/classes/sun/awt/X11/XConstants.java index 7d9077ee6a9..23275398a07 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XConstants.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XConstants.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-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 @@ -684,4 +684,19 @@ final public class XConstants { public static final int LSBFirst = 0 ; public static final int MSBFirst = 1 ; + + /* XKB support */ + public static final int XkbUseCoreKbd = 0x0100 ; + public static final int XkbNewKeyboardNotify = 0; + public static final int XkbMapNotify = 1; + public static final int XkbStateNotify = 2; + public static final long XkbNewKeyboardNotifyMask = (1L << 0); + public static final long XkbMapNotifyMask = (1L << 1); + public static final long XkbStateNotifyMask = (1L << 2); + public static final long XkbGroupStateMask = (1L << 4); + public static final long XkbKeyTypesMask = (1L<<0); + public static final long XkbKeySymsMask = (1L<<1); + public static final long XkbModifierMapMask = (1L<<2); + public static final long XkbVirtualModsMask = (1L<<6); //server map + } diff --git a/jdk/src/solaris/classes/sun/awt/X11/XKeysym.java b/jdk/src/solaris/classes/sun/awt/X11/XKeysym.java index 9ec3d1c7109..bac5aba2ab3 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XKeysym.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XKeysym.java @@ -1,7 +1,7 @@ // This is a generated file: do not edit! Edit keysym2ucs.h if necessary. /* - * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-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 @@ -89,14 +89,47 @@ public class XKeysym { Character ch = keysym2UCSHash.get(ks); return ch == null ? (char)0 : ch.charValue(); } - static long xkeycode2keysym(XKeyEvent ev, int ndx) { + static long xkeycode2keysym_noxkb(XKeyEvent ev, int ndx) { XToolkit.awtLock(); try { - return XlibWrapper.XKeycodeToKeysym(ev.get_display(), ev.get_keycode(), ndx ); + return XlibWrapper.XKeycodeToKeysym(ev.get_display(), ev.get_keycode(), ndx); } finally { XToolkit.awtUnlock(); } } + static long xkeycode2keysym_xkb(XKeyEvent ev, int ndx) { + XToolkit.awtLock(); + try { + int mods = ev.get_state(); + if ((ndx == 0) && ((mods & XConstants.ShiftMask) != 0)) { + // I don't know all possible meanings of 'ndx' in case of XKB + // and don't want to speculate. But this particular case + // clearly means that caller needs a so called primary keysym. + mods ^= XConstants.ShiftMask; + } + XlibWrapper.XkbTranslateKeyCode(XToolkit.getXKBKbdDesc(), ev.get_keycode(), + mods, XlibWrapper.iarg1, XlibWrapper.larg3); + //XXX unconsumed modifiers? + return Native.getLong(XlibWrapper.larg3); + } finally { + XToolkit.awtUnlock(); + } + } + static long xkeycode2keysym(XKeyEvent ev, int ndx) { + XToolkit.awtLock(); + try { + if (XToolkit.canUseXKBCalls()) { + return xkeycode2keysym_xkb(ev, ndx); + }else{ + return xkeycode2keysym_noxkb(ev, ndx); + } + } finally { + XToolkit.awtUnlock(); + } + } + static long xkeycode2primary_keysym(XKeyEvent ev) { + return xkeycode2keysym(ev, 0); + } public static boolean isKPEvent( XKeyEvent ev ) { // Xsun without XKB uses keysymarray[2] keysym to determine if it is KP event. @@ -198,6 +231,27 @@ public class XKeysym { Keysym2JavaKeycode jkc = getJavaKeycode( ev ); return jkc == null ? java.awt.event.KeyEvent.VK_UNDEFINED : jkc.getJavaKeycode(); } + /** + * Return an integer java keycode apprx as it was before extending keycodes range. + * This call would ignore for instance XKB and process whatever is on the bottom + * of keysym stack. Result will not depend on actual locale, will differ between + * dual/multiple keyboard setup systems (e.g. English+Russian vs French+Russian) + * but will be someway compatible with old releases. + */ + static int getLegacyJavaKeycodeOnly( XKeyEvent ev ) { + long keysym = XConstants.NoSymbol; + int ndx = 0; + if( (ev.get_state() & XToolkit.numLockMask) != 0 && + isKPEvent(ev)) { + keysym = getKeypadKeysym( ev ); + } else { + // we only need primary-layer keysym to derive a java keycode. + ndx = 0; + keysym = xkeycode2keysym_noxkb(ev, ndx); + } + Keysym2JavaKeycode jkc = keysym2JavaKeycodeHash.get( keysym ); + return jkc == null ? java.awt.event.KeyEvent.VK_UNDEFINED : jkc.getJavaKeycode(); + } static long javaKeycode2Keysym( int jkey ) { Long ks = javaKeycode2KeysymHash.get( jkey ); return (ks == null ? 0 : ks.longValue()); diff --git a/jdk/src/solaris/classes/sun/awt/X11/XToolkit.java b/jdk/src/solaris/classes/sun/awt/X11/XToolkit.java index 8667008d576..8a5030c83a1 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XToolkit.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XToolkit.java @@ -292,6 +292,7 @@ public final class XToolkit extends UNIXToolkit implements Runnable { if (XlibWrapper.XSetLocaleModifiers("") == null) { log.finer("X locale modifiers are not supported, using default"); } + tryXKB(); AwtScreenData defaultScreen = new AwtScreenData(XToolkit.getDefaultScreenData()); awt_defaultFg = defaultScreen.get_blackpixel(); @@ -314,6 +315,7 @@ public final class XToolkit extends UNIXToolkit implements Runnable { if (xs != null) { ((XAWTXSettings)xs).dispose(); } + freeXKB(); if (log.isLoggable(Level.FINE)) { dumpPeers(); } @@ -592,6 +594,9 @@ public final class XToolkit extends UNIXToolkit implements Runnable { if (ev.get_type() != XConstants.NoExpose) { eventNumber++; } + if (awt_UseXKB_Calls && ev.get_type() == awt_XKBBaseEventCode) { + processXkbChanges(ev); + } if (XDropTargetEventProcessor.processEvent(ev) || XDragSourceContextPeer.processEvent(ev)) { @@ -2094,8 +2099,12 @@ public final class XToolkit extends UNIXToolkit implements Runnable { static boolean awt_ServerInquired = false; static boolean awt_IsXsunServer = false; - static boolean awt_XKBInquired = false; static boolean awt_UseXKB = false; + static boolean awt_UseXKB_Calls = false; + static int awt_XKBBaseEventCode = 0; + static int awt_XKBEffectiveGroup = 0; // so far, I don't use it leaving all calculations + // to XkbTranslateKeyCode + static long awt_XKBDescPtr = 0; /** Try to understand if it is Xsun server. By now (2005) Sun is vendor of Xsun and Xorg servers; we only return true if Xsun is running. @@ -2125,24 +2134,144 @@ public final class XToolkit extends UNIXToolkit implements Runnable { awtUnlock(); } } - /** - Query XKEYBOARD extension. - */ static boolean isXKBenabled() { awtLock(); try { - if( awt_XKBInquired ) { - return awt_UseXKB; - } - awt_XKBInquired = true; - String name = "XKEYBOARD"; - awt_UseXKB = XlibWrapper.XQueryExtension( getDisplay(), name, XlibWrapper.larg1, XlibWrapper.larg2, XlibWrapper.larg3); return awt_UseXKB; } finally { awtUnlock(); } } + /** + Query XKEYBOARD extension. + If possible, initialize xkb library. + */ + static boolean tryXKB() { + awtLock(); + try { + String name = "XKEYBOARD"; + // First, if there is extension at all. + awt_UseXKB = XlibWrapper.XQueryExtension( getDisplay(), name, XlibWrapper.larg1, XlibWrapper.larg2, XlibWrapper.larg3); + if( awt_UseXKB ) { + // There is a keyboard extension. Check if a client library is compatible. + // If not, don't use xkb calls. + // In this case we still may be Xkb-capable application. + awt_UseXKB_Calls = XlibWrapper.XkbLibraryVersion( XlibWrapper.larg1, XlibWrapper.larg2); + if( awt_UseXKB_Calls ) { + awt_UseXKB_Calls = XlibWrapper.XkbQueryExtension( getDisplay(), XlibWrapper.larg1, XlibWrapper.larg2, + XlibWrapper.larg3, XlibWrapper.larg4, XlibWrapper.larg5); + if( awt_UseXKB_Calls ) { + awt_XKBBaseEventCode = Native.getInt(XlibWrapper.larg2); + XlibWrapper.XkbSelectEvents (getDisplay(), + XConstants.XkbUseCoreKbd, + XConstants.XkbNewKeyboardNotifyMask | + XConstants.XkbMapNotifyMask ,//| + //XConstants.XkbStateNotifyMask, + XConstants.XkbNewKeyboardNotifyMask | + XConstants.XkbMapNotifyMask );//| + //XConstants.XkbStateNotifyMask); + + XlibWrapper.XkbSelectEventDetails(getDisplay(), XConstants.XkbUseCoreKbd, + XConstants.XkbStateNotify, + XConstants.XkbGroupStateMask, + XConstants.XkbGroupStateMask); + //XXX ? XkbGroupLockMask last, XkbAllStateComponentsMask before last? + awt_XKBDescPtr = XlibWrapper.XkbGetMap(getDisplay(), + XConstants.XkbKeyTypesMask | + XConstants.XkbKeySymsMask | + XConstants.XkbModifierMapMask | + XConstants.XkbVirtualModsMask, + XConstants.XkbUseCoreKbd); + } + } + } + return awt_UseXKB; + } finally { + awtUnlock(); + } + } + static boolean canUseXKBCalls() { + awtLock(); + try { + return awt_UseXKB_Calls; + } finally { + awtUnlock(); + } + } + static int getXKBEffectiveGroup() { + awtLock(); + try { + return awt_XKBEffectiveGroup; + } finally { + awtUnlock(); + } + } + static int getXKBBaseEventCode() { + awtLock(); + try { + return awt_XKBBaseEventCode; + } finally { + awtUnlock(); + } + } + static long getXKBKbdDesc() { + awtLock(); + try { + return awt_XKBDescPtr; + } finally { + awtUnlock(); + } + } + void freeXKB() { + awtLock(); + try { + if (awt_UseXKB_Calls && awt_XKBDescPtr != 0) { + XlibWrapper.XkbFreeKeyboard(awt_XKBDescPtr, 0xFF, true); + } + } finally { + awtUnlock(); + } + } + private void processXkbChanges(XEvent ev) { + // mapping change --> refresh kbd map + // state change --> get a new effective group; do I really need it + // or that should be left for XkbTranslateKeyCode? + XkbEvent xke = new XkbEvent( ev.getPData() ); + int xkb_type = xke.get_any().get_xkb_type(); + switch( xkb_type ) { + case XConstants.XkbNewKeyboardNotify : + if( awt_XKBDescPtr != 0 ) { + freeXKB(); + } + awt_XKBDescPtr = XlibWrapper.XkbGetMap(getDisplay(), + XConstants.XkbKeyTypesMask | + XConstants.XkbKeySymsMask | + XConstants.XkbModifierMapMask | + XConstants.XkbVirtualModsMask, + XConstants.XkbUseCoreKbd); + //System.out.println("XkbNewKeyboard:"+(xke.get_new_kbd())); + break; + case XConstants.XkbMapNotify : + //TODO: provide a simple unit test. + XlibWrapper.XkbGetUpdatedMap(getDisplay(), + XConstants.XkbKeyTypesMask | + XConstants.XkbKeySymsMask | + XConstants.XkbModifierMapMask | + XConstants.XkbVirtualModsMask, + awt_XKBDescPtr); + //System.out.println("XkbMap:"+(xke.get_map())); + break; + case XConstants.XkbStateNotify : + // May use it later e.g. to obtain an effective group etc. + //System.out.println("XkbState:"+(xke.get_state())); + break; + default: + //System.out.println("XkbEvent of xkb_type "+xkb_type); + break; + } + } + private static long eventNumber; public static long getEventNumber() { awtLock(); diff --git a/jdk/src/solaris/classes/sun/awt/X11/XWindow.java b/jdk/src/solaris/classes/sun/awt/X11/XWindow.java index 63c71c5a7c4..6c517b19697 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XWindow.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XWindow.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-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 @@ -128,6 +128,9 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { private native static void initIDs(); private static Field isPostedField; + private static Field rawCodeField; + private static Field primaryLevelUnicodeField; + private static Field extendedKeyCodeField; static { initIDs(); } @@ -1037,7 +1040,7 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { Parameter is a keysym basically from keysymdef.h XXX: how about vendor keys? Is there some with Unicode value and not in the list? */ - char keysymToUnicode( long keysym, int state ) { + int keysymToUnicode( long keysym, int state ) { return XKeysym.convertKeysym( keysym, state ); } int keyEventType2Id( int xEventType ) { @@ -1047,6 +1050,13 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { static private long xkeycodeToKeysym(XKeyEvent ev) { return XKeysym.getKeysym( ev ); } + private long xkeycodeToPrimaryKeysym(XKeyEvent ev) { + return XKeysym.xkeycode2primary_keysym( ev ); + } + static private int primaryUnicode2JavaKeycode(int uni) { + return (uni > 0? sun.awt.ExtendedKeyCodes.getExtendedKeyCodeForChar(uni) : 0); + //return (uni > 0? uni + 0x01000000 : 0); + } void logIncomingKeyEvent(XKeyEvent ev) { keyEventLog.fine("--XWindow.java:handleKeyEvent:"+ev); dumpKeysymArray(ev); @@ -1065,7 +1075,7 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { // un-final it if you need to override it in a subclass. final void handleKeyPress(XKeyEvent ev) { long keysym[] = new long[2]; - char unicodeKey = 0; + int unicodeKey = 0; keysym[0] = XConstants.NoSymbol; if (keyEventLog.isLoggable(Level.FINE)) { @@ -1110,19 +1120,36 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { if( jkc == null ) { jkc = new XKeysym.Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_UNDEFINED, java.awt.event.KeyEvent.KEY_LOCATION_UNKNOWN); } + + // Take the first keysym from a keysym array associated with the XKeyevent + // and convert it to Unicode. Then, even if a Java keycode for the keystroke + // is undefined, we still have a guess of what has been engraved on a keytop. + int unicodeFromPrimaryKeysym = keysymToUnicode( xkeycodeToPrimaryKeysym(ev) ,0); + if (keyEventLog.isLoggable(Level.FINE)) { keyEventLog.fine(">>>Fire Event:"+ (ev.get_type() == XConstants.KeyPress ? "KEY_PRESSED; " : "KEY_RELEASED; ")+ "jkeycode:decimal="+jkc.getJavaKeycode()+ - ", hex=0x"+Integer.toHexString(jkc.getJavaKeycode())+"; " + ", hex=0x"+Integer.toHexString(jkc.getJavaKeycode())+"; "+ + " legacy jkeycode: decimal="+XKeysym.getLegacyJavaKeycodeOnly(ev)+ + ", hex=0x"+Integer.toHexString(XKeysym.getLegacyJavaKeycodeOnly(ev))+"; " ); } + + int jkeyToReturn = XKeysym.getLegacyJavaKeycodeOnly(ev); // someway backward compatible + int jkeyExtended = jkc.getJavaKeycode() == java.awt.event.KeyEvent.VK_UNDEFINED ? + primaryUnicode2JavaKeycode( unicodeFromPrimaryKeysym ) : + jkc.getJavaKeycode(); postKeyEvent( java.awt.event.KeyEvent.KEY_PRESSED, ev.get_time(), - jkc.getJavaKeycode(), + jkeyToReturn, (unicodeKey == 0 ? java.awt.event.KeyEvent.CHAR_UNDEFINED : unicodeKey), jkc.getKeyLocation(), - ev.get_state(),ev.getPData(), XKeyEvent.getSize()); + ev.get_state(),ev.getPData(), XKeyEvent.getSize(), (long)(ev.get_keycode()), + unicodeFromPrimaryKeysym, + jkeyExtended); + + if( unicodeKey > 0 ) { keyEventLog.fine("fire _TYPED on "+unicodeKey); postKeyEvent( java.awt.event.KeyEvent.KEY_TYPED, @@ -1130,7 +1157,10 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { java.awt.event.KeyEvent.VK_UNDEFINED, unicodeKey, java.awt.event.KeyEvent.KEY_LOCATION_UNKNOWN, - ev.get_state(),ev.getPData(), XKeyEvent.getSize()); + ev.get_state(),ev.getPData(), XKeyEvent.getSize(), (long)0, + unicodeFromPrimaryKeysym, + java.awt.event.KeyEvent.VK_UNDEFINED); + } @@ -1148,7 +1178,7 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { // un-private it if you need to call it from elsewhere private void handleKeyRelease(XKeyEvent ev) { long keysym[] = new long[2]; - char unicodeKey = 0; + int unicodeKey = 0; keysym[0] = XConstants.NoSymbol; if (keyEventLog.isLoggable(Level.FINE)) { @@ -1166,7 +1196,9 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { keyEventLog.fine(">>>Fire Event:"+ (ev.get_type() == XConstants.KeyPress ? "KEY_PRESSED; " : "KEY_RELEASED; ")+ "jkeycode:decimal="+jkc.getJavaKeycode()+ - ", hex=0x"+Integer.toHexString(jkc.getJavaKeycode())+"; " + ", hex=0x"+Integer.toHexString(jkc.getJavaKeycode())+"; "+ + " legacy jkeycode: decimal="+XKeysym.getLegacyJavaKeycodeOnly(ev)+ + ", hex=0x"+Integer.toHexString(XKeysym.getLegacyJavaKeycodeOnly(ev))+"; " ); } // We obtain keysym from IM and derive unicodeKey from it for KeyPress only. @@ -1177,12 +1209,24 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { // That's why we use the same procedure as if there was no IM instance: do-it-yourself unicode. unicodeKey = keysymToUnicode( xkeycodeToKeysym(ev), ev.get_state() ); + // Take a first keysym from a keysym array associated with the XKeyevent + // and convert it to Unicode. Then, even if Java keycode for the keystroke + // is undefined, we still will have a guess of what was engraved on a keytop. + int unicodeFromPrimaryKeysym = keysymToUnicode( xkeycodeToPrimaryKeysym(ev) ,0); + + int jkeyToReturn = XKeysym.getLegacyJavaKeycodeOnly(ev); // someway backward compatible + int jkeyExtended = jkc.getJavaKeycode() == java.awt.event.KeyEvent.VK_UNDEFINED ? + primaryUnicode2JavaKeycode( unicodeFromPrimaryKeysym ) : + jkc.getJavaKeycode(); postKeyEvent( java.awt.event.KeyEvent.KEY_RELEASED, ev.get_time(), - jkc.getJavaKeycode(), + jkeyToReturn, (unicodeKey == 0 ? java.awt.event.KeyEvent.CHAR_UNDEFINED : unicodeKey), jkc.getKeyLocation(), - ev.get_state(),ev.getPData(), XKeyEvent.getSize()); + ev.get_state(),ev.getPData(), XKeyEvent.getSize(), (long)(ev.get_keycode()), + unicodeFromPrimaryKeysym, + jkeyExtended); + } @@ -1379,17 +1423,38 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { } } - public void postKeyEvent(int id, long when, int keyCode, char keyChar, - int keyLocation, int state, long event, int eventSize) + public void postKeyEvent(int id, long when, int keyCode, int keyChar, + int keyLocation, int state, long event, int eventSize, long rawCode, + int unicodeFromPrimaryKeysym, int extendedKeyCode) + { long jWhen = XToolkit.nowMillisUTC_offset(when); int modifiers = getModifiers(state, 0, keyCode); + if (rawCodeField == null) { + rawCodeField = XToolkit.getField(KeyEvent.class, "rawCode"); + } + if (primaryLevelUnicodeField == null) { + primaryLevelUnicodeField = XToolkit.getField(KeyEvent.class, "primaryLevelUnicode"); + } + if (extendedKeyCodeField == null) { + extendedKeyCodeField = XToolkit.getField(KeyEvent.class, "extendedKeyCode"); + } + KeyEvent ke = new KeyEvent((Component)getEventSource(), id, jWhen, - modifiers, keyCode, keyChar, keyLocation); + modifiers, keyCode, (char)keyChar, keyLocation); if (event != 0) { byte[] data = Native.toBytes(event, eventSize); setBData(ke, data); } + try { + rawCodeField.set(ke, rawCode); + primaryLevelUnicodeField.set(ke, (long)unicodeFromPrimaryKeysym); + extendedKeyCodeField.set(ke, (long)extendedKeyCode); + } catch (IllegalArgumentException e) { + assert(false); + } catch (IllegalAccessException e) { + assert(false); + } postEventToEventQueue(ke); } diff --git a/jdk/src/solaris/classes/sun/awt/X11/XlibWrapper.java b/jdk/src/solaris/classes/sun/awt/X11/XlibWrapper.java index e6a00a2f001..0de0dc86163 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XlibWrapper.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XlibWrapper.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-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 @@ -492,6 +492,21 @@ static native String XSetLocaleModifiers(String modifier_list); static native int XKeysymToKeycode(long display, long keysym); + // xkb-related + static native int XkbGetEffectiveGroup(long display); + static native long XkbKeycodeToKeysym(long display, int keycode, int group, int level); + static native void XkbSelectEvents(long display, long device, long bits_to_change, long values_for_bits); + static native void XkbSelectEventDetails(long display, long device, long event_type, + long bits_to_change, long values_for_bits); + static native boolean XkbQueryExtension(long display, long opcode_rtrn, long event_rtrn, + long error_rtrn, long major_in_out, long minor_in_out); + static native boolean XkbLibraryVersion(long lib_major_in_out, long lib_minor_in_out); + static native long XkbGetMap(long display, long which, long device_spec); + static native long XkbGetUpdatedMap(long display, long which, long xkb); + static native void XkbFreeKeyboard(long xkb, long which, boolean free_all); + static native boolean XkbTranslateKeyCode(long xkb, int keycode, long mods, long mods_rtrn, long keysym_rtrn); + + static native void XConvertCase(long keysym, long keysym_lowercase, long keysym_uppercase); @@ -617,6 +632,15 @@ static native String XSetLocaleModifiers(String modifier_list); } return buf.toString(); } + static String getEventToString( int type ) { + if( (type >= 0) && (type < eventToString.length)) { + return eventToString[type]; + }else if( type == XToolkit.getXKBBaseEventCode() ) { + //XXX TODO various xkb types + return "XkbEvent"; + } + return eventToString[0]; + } private static boolean getBuildInternal() { String javaVersion = XToolkit.getSystemProperty("java.version"); diff --git a/jdk/src/solaris/classes/sun/awt/X11/generator/WrapperGenerator.java b/jdk/src/solaris/classes/sun/awt/X11/generator/WrapperGenerator.java index 7aa039546fa..3ad8662bf70 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/generator/WrapperGenerator.java +++ b/jdk/src/solaris/classes/sun/awt/X11/generator/WrapperGenerator.java @@ -1138,6 +1138,7 @@ public class WrapperGenerator { pw.println("/* This file is an automatically generated file, please do not edit this file, modify the XlibParser.java file instead !*/\n" ); pw.println("#include \n#include \n#include \n#include \n#include \n"); pw.println("#include "); + pw.println("#include "); pw.println("#include \"awt_p.h\""); pw.println("#include \"color.h\""); pw.println("#include \"colordata.h\""); diff --git a/jdk/src/solaris/classes/sun/awt/X11/generator/xlibtypes.txt b/jdk/src/solaris/classes/sun/awt/X11/generator/xlibtypes.txt index 7ef8fd44790..8f691353fa5 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/generator/xlibtypes.txt +++ b/jdk/src/solaris/classes/sun/awt/X11/generator/xlibtypes.txt @@ -119,7 +119,7 @@ XIMStringConversionText length short feedback pointer encoding_is_wchar Bool - string pointer + string pointer XKeymapEvent type int serial long @@ -574,7 +574,7 @@ XImage f.get_pixel pointer f.put_pixel pointer f.sub_image pointer - f.add_pixel pointer + f.add_pixel pointer XIMValuesList count_values short supported_values pointer @@ -728,7 +728,7 @@ ColorData awt_icmLUT pointer int awt_icmLUT2Colors pointer byte img_grays pointer byte - img_clr_tbl pointer byte + img_clr_tbl pointer byte img_oda_red pointer byte img_oda_green pointer byte img_oda_blue pointer byte @@ -798,3 +798,227 @@ XEvent xerror struct XErrorEvent xkeymap struct XKeymapEvent pad array long 24 + +XkbAnyEvent + type int + serial ulong + send_event Bool + display long + time ulong + xkb_type int + device int + +XkbNewKeyboardNotifyEvent + type int + serial ulong + send_event Bool + display long + time ulong + xkb_type int + device int + old_device int + min_key_code int + max_key_code int + old_min_key_code int + old_max_key_code int + changed int + req_major byte + req_minor byte + +XkbMapNotifyEvent + type int + serial ulong + send_event Bool + display long + time ulong + xkb_type int + device int + changed int + flags int + first_type int + num_types int + min_key_code int + max_key_code int + first_key_sym int + first_key_act int + first_key_behavior int + first_key_explicit int + first_modmap_key int + first_vmodmap_key int + num_key_syms int + num_key_acts int + num_key_behaviors int + num_key_explicit int + num_modmap_keys int + num_vmodmap_keys int + vmods int + +XkbStateNotifyEvent + type int + serial ulong + send_event Bool + display long + time ulong + xkb_type int + device int + changed int + group int + base_group int + latched_group int + locked_group int + mods int + base_mods int + latched_mods int + locked_mods int + compat_state int + grab_mods byte + compat_grab_mods byte + lookup_mods byte + compat_lookup_mods byte + ptr_buttons int + keycode int + event_type byte + req_major byte + req_minor byte + +XkbControlsNotifyEvent + type int + serial ulong + send_event Bool + display long + time ulong + xkb_type int + device int + changed_ctrls int + enabled_ctrls int + enabled_ctrl_changes int + num_groups int + keycode int + event_type byte + req_major byte + req_minor byte + +XkbIndicatorNotifyEvent + type int + serial ulong + send_event Bool + display long + time ulong + xkb_type int + device int + changed int + state int + +XkbNamesNotifyEvent + type int + serial ulong + send_event Bool + display long + time ulong + xkb_type int + device int + changed int + first_type int + num_types int + first_lvl int + num_lvls int + num_aliases int + num_radio_groups int + changed_vmods int + changed_groups int + changed_indicators int + first_key int + num_keys int + + +XkbCompatMapNotifyEvent + type int + serial ulong + send_event Bool + display long + time ulong + xkb_type int + device int + changed_groups int + first_si int + num_si int + num_total_si int + +XkbBellNotifyEvent + type int + serial ulong + send_event Bool + display long + time ulong + xkb_type int + device int + percent int + pitch int + duration int + bell_class int + bell_id int + name Atom + window long + event_only Bool + +XkbActionMessageEvent + type int + serial ulong + send_event Bool + display long + time ulong + xkb_type int + device int + keycode int + press Bool + key_event_follows Bool + group int + mods int + message array byte 7 //XkbActionMessageLength+1 + +XkbAccessXNotifyEvent + type int + serial ulong + send_event Bool + display long + time ulong + xkb_type int + device int + detail int + keycode int + sk_delay int + debounce_delay int + +XkbExtensionDeviceNotifyEvent + type int + serial ulong + send_event Bool + display long + time ulong + xkb_type int + device int + reason int + supported int + unsupported int + first_btn int + num_btns int + leds_defined int + led_state int + led_class int + led_id int + +XkbEvent + type int + any struct XkbAnyEvent + new_kbd struct XkbNewKeyboardNotifyEvent + map struct XkbMapNotifyEvent + state struct XkbStateNotifyEvent + ctrls struct XkbControlsNotifyEvent + indicators struct XkbIndicatorNotifyEvent + names struct XkbNamesNotifyEvent + compat struct XkbCompatMapNotifyEvent + bell struct XkbBellNotifyEvent + message struct XkbActionMessageEvent + accessx struct XkbAccessXNotifyEvent + device struct XkbExtensionDeviceNotifyEvent + core struct XEvent diff --git a/jdk/src/solaris/classes/sun/awt/X11/keysym2ucs.h b/jdk/src/solaris/classes/sun/awt/X11/keysym2ucs.h index c59ffde042a..c47ac18f9ca 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/keysym2ucs.h +++ b/jdk/src/solaris/classes/sun/awt/X11/keysym2ucs.h @@ -1,5 +1,5 @@ /* - * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-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 @@ -39,7 +39,7 @@ */ tojava /* -tojava * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. +tojava * Copyright 2005-2009 Sun Microsystems, Inc. All Rights Reserved. tojava * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. tojava * tojava * This code is free software; you can redistribute it and/or modify it @@ -127,14 +127,47 @@ tojava tojava Character ch = keysym2UCSHash.get(ks); tojava return ch == null ? (char)0 : ch.charValue(); tojava } -tojava static long xkeycode2keysym(XKeyEvent ev, int ndx) { +tojava static long xkeycode2keysym_noxkb(XKeyEvent ev, int ndx) { tojava XToolkit.awtLock(); tojava try { -tojava return XlibWrapper.XKeycodeToKeysym(ev.get_display(), ev.get_keycode(), ndx ); +tojava return XlibWrapper.XKeycodeToKeysym(ev.get_display(), ev.get_keycode(), ndx); tojava } finally { tojava XToolkit.awtUnlock(); tojava } tojava } +tojava static long xkeycode2keysym_xkb(XKeyEvent ev, int ndx) { +tojava XToolkit.awtLock(); +tojava try { +tojava int mods = ev.get_state(); +tojava if ((ndx == 0) && ((mods & XConstants.ShiftMask) != 0)) { +tojava // I don't know all possible meanings of 'ndx' in case of XKB +tojava // and don't want to speculate. But this particular case +tojava // clearly means that caller needs a so called primary keysym. +tojava mods ^= XConstants.ShiftMask; +tojava } +tojava XlibWrapper.XkbTranslateKeyCode(XToolkit.getXKBKbdDesc(), ev.get_keycode(), +tojava mods, XlibWrapper.iarg1, XlibWrapper.larg3); +tojava //XXX unconsumed modifiers? +tojava return Native.getLong(XlibWrapper.larg3); +tojava } finally { +tojava XToolkit.awtUnlock(); +tojava } +tojava } +tojava static long xkeycode2keysym(XKeyEvent ev, int ndx) { +tojava XToolkit.awtLock(); +tojava try { +tojava if (XToolkit.canUseXKBCalls()) { +tojava return xkeycode2keysym_xkb(ev, ndx); +tojava }else{ +tojava return xkeycode2keysym_noxkb(ev, ndx); +tojava } +tojava } finally { +tojava XToolkit.awtUnlock(); +tojava } +tojava } +tojava static long xkeycode2primary_keysym(XKeyEvent ev) { +tojava return xkeycode2keysym(ev, 0); +tojava } tojava public static boolean isKPEvent( XKeyEvent ev ) tojava { tojava // Xsun without XKB uses keysymarray[2] keysym to determine if it is KP event. @@ -236,6 +269,27 @@ tojava static int getJavaKeycodeOnly( XKeyEvent ev ) { tojava Keysym2JavaKeycode jkc = getJavaKeycode( ev ); tojava return jkc == null ? java.awt.event.KeyEvent.VK_UNDEFINED : jkc.getJavaKeycode(); tojava } +tojava /** +tojava * Return an integer java keycode apprx as it was before extending keycodes range. +tojava * This call would ignore for instance XKB and process whatever is on the bottom +tojava * of keysym stack. Result will not depend on actual locale, will differ between +tojava * dual/multiple keyboard setup systems (e.g. English+Russian vs French+Russian) +tojava * but will be someway compatible with old releases. +tojava */ +tojava static int getLegacyJavaKeycodeOnly( XKeyEvent ev ) { +tojava long keysym = XConstants.NoSymbol; +tojava int ndx = 0; +tojava if( (ev.get_state() & XToolkit.numLockMask) != 0 && +tojava isKPEvent(ev)) { +tojava keysym = getKeypadKeysym( ev ); +tojava } else { +tojava // we only need primary-layer keysym to derive a java keycode. +tojava ndx = 0; +tojava keysym = xkeycode2keysym_noxkb(ev, ndx); +tojava } +tojava Keysym2JavaKeycode jkc = keysym2JavaKeycodeHash.get( keysym ); +tojava return jkc == null ? java.awt.event.KeyEvent.VK_UNDEFINED : jkc.getJavaKeycode(); +tojava } tojava static long javaKeycode2Keysym( int jkey ) { tojava Long ks = javaKeycode2KeysymHash.get( jkey ); tojava return (ks == null ? 0 : ks.longValue()); diff --git a/jdk/src/solaris/native/sun/xawt/XlibWrapper.c b/jdk/src/solaris/native/sun/xawt/XlibWrapper.c index b9b38b4939d..93953af16a7 100644 --- a/jdk/src/solaris/native/sun/xawt/XlibWrapper.c +++ b/jdk/src/solaris/native/sun/xawt/XlibWrapper.c @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-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 @@ -44,6 +44,7 @@ #include #include "utility/rect.h" +#include #if defined(DEBUG) || defined(INTERNAL_BUILD) static jmethodID lockIsHeldMID = NULL; @@ -449,6 +450,79 @@ JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSelectInput XSelectInput((Display *) jlong_to_ptr(display), (Window) window, mask); } +JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XkbSelectEvents +(JNIEnv *env, jclass clazz, jlong display, jlong device, jlong bits_to_change, jlong values_for_bits) +{ + AWT_CHECK_HAVE_LOCK(); + XkbSelectEvents((Display *) jlong_to_ptr(display), (unsigned int)device, + (unsigned long)bits_to_change, + (unsigned long)values_for_bits); +} +JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XkbSelectEventDetails +(JNIEnv *env, jclass clazz, jlong display, jlong device, jlong event_type, jlong bits_to_change, jlong values_for_bits) +{ + AWT_CHECK_HAVE_LOCK(); + XkbSelectEventDetails((Display *) jlong_to_ptr(display), (unsigned int)device, + (unsigned int) event_type, + (unsigned long)bits_to_change, + (unsigned long)values_for_bits); +} +JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XkbQueryExtension +(JNIEnv *env, jclass clazz, jlong display, jlong opcode_rtrn, jlong event_rtrn, + jlong error_rtrn, jlong major_in_out, jlong minor_in_out) +{ + AWT_CHECK_HAVE_LOCK(); + return XkbQueryExtension( (Display *) jlong_to_ptr(display), + (int *) jlong_to_ptr(opcode_rtrn), + (int *) jlong_to_ptr(event_rtrn), + (int *) jlong_to_ptr(error_rtrn), + (int *) jlong_to_ptr(major_in_out), + (int *) jlong_to_ptr(minor_in_out)); +} +JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XkbLibraryVersion +(JNIEnv *env, jclass clazz, jlong lib_major_in_out, jlong lib_minor_in_out) +{ + AWT_CHECK_HAVE_LOCK(); + *((int *)lib_major_in_out) = XkbMajorVersion; + *((int *)lib_minor_in_out) = XkbMinorVersion; + return XkbLibraryVersion((int *)jlong_to_ptr(lib_major_in_out), (int *)jlong_to_ptr(lib_minor_in_out)); +} + +JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XkbGetMap +(JNIEnv *env, jclass clazz, jlong display, jlong which, jlong device_spec) +{ + AWT_CHECK_HAVE_LOCK(); + return (jlong) XkbGetMap( (Display *) jlong_to_ptr(display), + (unsigned int) which, + (unsigned int) device_spec); +} +JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XkbGetUpdatedMap +(JNIEnv *env, jclass clazz, jlong display, jlong which, jlong xkb) +{ + AWT_CHECK_HAVE_LOCK(); + return (jlong) XkbGetUpdatedMap( (Display *) jlong_to_ptr(display), + (unsigned int) which, + (XkbDescPtr) jlong_to_ptr(xkb)); +} +JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XkbFreeKeyboard +(JNIEnv *env, jclass clazz, jlong xkb, jlong which, jboolean free_all) +{ + AWT_CHECK_HAVE_LOCK(); + XkbFreeKeyboard(jlong_to_ptr(xkb), (unsigned int)which, free_all); +} +JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XkbTranslateKeyCode +(JNIEnv *env, jclass clazz, jlong xkb, jint keycode, jlong mods, jlong mods_rtrn, jlong keysym_rtrn) +{ + Bool b; + b = XkbTranslateKeyCode((XkbDescPtr)xkb, (unsigned int)keycode, (unsigned int)mods, + (unsigned int *)jlong_to_ptr(mods_rtrn), + (KeySym *)jlong_to_ptr(keysym_rtrn)); + //printf("native, input: keycode:0x%0X; mods:0x%0X\n", keycode, mods); + //printf("native, output: keysym:0x%0X; mods:0x%0X\n", *(unsigned int *)jlong_to_ptr(keysym_rtrn), *(unsigned int *)jlong_to_ptr(mods_rtrn)); + return b; +} + + /* * Class: sun_awt_X11_XlibWrapper * Method: XNextEvent @@ -1672,6 +1746,39 @@ Java_sun_awt_X11_XlibWrapper_XKeycodeToKeysym(JNIEnv *env, jclass clazz, return XKeycodeToKeysym((Display*) jlong_to_ptr(display), (unsigned int)keycode, (int)index); } +JNIEXPORT jint JNICALL +Java_sun_awt_X11_XlibWrapper_XkbGetEffectiveGroup(JNIEnv *env, jclass clazz, + jlong display) { + XkbStateRec sr; + AWT_CHECK_HAVE_LOCK(); + memset(&sr, 0, sizeof(XkbStateRec)); + XkbGetState((Display*) jlong_to_ptr(display), XkbUseCoreKbd, &sr); +// printf("-------------------------------------VVVV\n"); +// printf(" group:0x%0X\n",sr.group); +// printf(" base_group:0x%0X\n",sr.base_group); +// printf(" latched_group:0x%0X\n",sr.latched_group); +// printf(" locked_group:0x%0X\n",sr.locked_group); +// printf(" mods:0x%0X\n",sr.mods); +// printf(" base_mods:0x%0X\n",sr.base_mods); +// printf(" latched_mods:0x%0X\n",sr.latched_mods); +// printf(" locked_mods:0x%0X\n",sr.locked_mods); +// printf(" compat_state:0x%0X\n",sr.compat_state); +// printf(" grab_mods:0x%0X\n",sr.grab_mods); +// printf(" compat_grab_mods:0x%0X\n",sr.compat_grab_mods); +// printf(" lookup_mods:0x%0X\n",sr.lookup_mods); +// printf(" compat_lookup_mods:0x%0X\n",sr.compat_lookup_mods); +// printf(" ptr_buttons:0x%0X\n",sr.ptr_buttons); +// printf("-------------------------------------^^^^\n"); + return (jint)(sr.group); +} +JNIEXPORT jlong JNICALL +Java_sun_awt_X11_XlibWrapper_XkbKeycodeToKeysym(JNIEnv *env, jclass clazz, + jlong display, jint keycode, + jint group, jint level) { + AWT_CHECK_HAVE_LOCK(); + return XkbKeycodeToKeysym((Display*) jlong_to_ptr(display), (unsigned int)keycode, (unsigned int)group, (unsigned int)level); +} + JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XKeysymToKeycode(JNIEnv *env, jclass clazz, jlong display, jlong keysym) { diff --git a/jdk/src/windows/native/sun/windows/awt_Component.cpp b/jdk/src/windows/native/sun/windows/awt_Component.cpp index 101095c585c..9db8ec4b873 100644 --- a/jdk/src/windows/native/sun/windows/awt_Component.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Component.cpp @@ -199,6 +199,8 @@ BOOL AwtComponent::sm_rtl = PRIMARYLANGID(GetInputLanguage()) == LANG_ARABIC || BOOL AwtComponent::sm_rtlReadingOrder = PRIMARYLANGID(GetInputLanguage()) == LANG_ARABIC; +BOOL AwtComponent::sm_PrimaryDynamicTableBuilt = FALSE; + HWND AwtComponent::sm_cursorOn; BOOL AwtComponent::m_QueryNewPaletteCalled = FALSE; @@ -245,6 +247,11 @@ AwtComponent::AwtComponent() m_MessagesProcessing = 0; m_wheelRotationAmount = 0; + if (!sm_PrimaryDynamicTableBuilt) { + // do it once. + AwtComponent::BuildPrimaryDynamicTable(); + sm_PrimaryDynamicTableBuilt = TRUE; + } } AwtComponent::~AwtComponent() @@ -2892,6 +2899,19 @@ static const CharToVKEntry charToDeadVKTable[] = { {0,0} }; +// The full map of the current keyboard state including +// windows virtual key, scancode, java virtual key, and unicode +// for this key sans modifiers. +// All but first element may be 0. +// XXX in the update releases this is an addition to the unchanged existing code +struct DynPrimaryKeymapEntry { + UINT wkey; + UINT scancode; + UINT jkey; + WCHAR unicode; +}; + +static DynPrimaryKeymapEntry dynPrimaryKeymap[256]; void AwtComponent::InitDynamicKeyMapTable() @@ -2900,6 +2920,8 @@ AwtComponent::InitDynamicKeyMapTable() if (!kbdinited) { AwtComponent::BuildDynamicKeyMapTable(); + // We cannot build it here since JNI is not available yet: + //AwtComponent::BuildPrimaryDynamicTable(); kbdinited = TRUE; } } @@ -3125,7 +3147,11 @@ UINT AwtComponent::WindowsKeyToJavaKey(UINT windowsKey, UINT modifiers) for (int j = 0; dynamicKeyMapTable[j].windowsKey != 0; j++) { if (dynamicKeyMapTable[j].windowsKey == windowsKey) { - return dynamicKeyMapTable[j].javaKey; + if (dynamicKeyMapTable[j].javaKey != java_awt_event_KeyEvent_VK_UNDEFINED) { + return dynamicKeyMapTable[j].javaKey; + }else{ + break; + } } } @@ -3202,6 +3228,122 @@ BOOL AwtComponent::IsNumPadKey(UINT vkey, BOOL extended) return FALSE; } +static void +resetKbdState( BYTE kstate[256]) { + BYTE tmpState[256]; + WCHAR wc[2]; + memmove(tmpState, kstate, sizeof(kstate)); + tmpState[VK_SHIFT] = 0; + tmpState[VK_CONTROL] = 0; + tmpState[VK_MENU] = 0; + + ::ToUnicodeEx(VK_SPACE,::MapVirtualKey(VK_SPACE, 0), tmpState, wc, 2, 0, GetKeyboardLayout(0)); +} + +// XXX in the update releases this is an addition to the unchanged existing code +// After the call, a table will have a unicode associated with a windows virtual keycode +// sans modifiers. With some further simplification, one can +// derive java keycode from it, and anyway we will pass this unicode value +// all the way up in a comment to a KeyEvent. +void +AwtComponent::BuildPrimaryDynamicTable() { + JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); + // XXX: how about that? + //CriticalSection::Lock l(GetLock()); + //if (GetPeer(env) == NULL) { + // /* event received during termination. */ + // return; + //} + + HKL hkl = GetKeyboardLayout(); + UINT sc = 0; + BYTE kbdState[AwtToolkit::KB_STATE_SIZE]; + memset(kbdState, 0, sizeof (kbdState)); + + // Use JNI call to obtain java key code. We should keep a list + // of currently available keycodes in a single place. + static jclass extKeyCodesCls; + if( extKeyCodesCls == NULL) { + jclass extKeyCodesClsLocal = env->FindClass("sun/awt/ExtendedKeyCodes"); + DASSERT(extKeyCodesClsLocal); + if (extKeyCodesClsLocal == NULL) { + /* exception already thrown */ + return; + } + extKeyCodesCls = (jclass)env->NewGlobalRef(extKeyCodesClsLocal); + env->DeleteLocalRef(extKeyCodesClsLocal); + } + static jmethodID getExtendedKeyCodeForChar; + if (getExtendedKeyCodeForChar == NULL) { + getExtendedKeyCodeForChar = + env->GetStaticMethodID(extKeyCodesCls, "getExtendedKeyCodeForChar", "(I)I"); + DASSERT(getExtendedKeyCodeForChar); + } + jint extJKC; //extended Java key code + + for (UINT i = 0; i < 256; i++) { + dynPrimaryKeymap[i].wkey = i; + dynPrimaryKeymap[i].jkey = java_awt_event_KeyEvent_VK_UNDEFINED; + dynPrimaryKeymap[i].unicode = 0; + + if ((sc = MapVirtualKey (i, 0)) == 0) { + dynPrimaryKeymap[i].scancode = 0; + continue; + } + dynPrimaryKeymap[i].scancode = sc; + + // XXX process cases like VK_SHIFT etc. + kbdState[i] = 0x80; // "key pressed". + WCHAR wc[16]; + int k = ::ToUnicodeEx(i, sc, kbdState, wc, 16, 0, hkl); + if (k == 1) { + // unicode + dynPrimaryKeymap[i].unicode = wc[0]; + if (dynPrimaryKeymap[i].jkey == java_awt_event_KeyEvent_VK_UNDEFINED) { + // Convert unicode to java keycode. + //dynPrimaryKeymap[i].jkey = ((UINT)(wc[0]) + 0x01000000); + // + //XXX If this key in on the keypad, we should force a special value equal to + //XXX an old java keycode: but how to say if it is a keypad key? + //XXX We'll do it in WmKeyUp/Down. + extJKC = env->CallStaticIntMethod(extKeyCodesCls, + getExtendedKeyCodeForChar, (jint)(wc[0])); + dynPrimaryKeymap[i].jkey = extJKC; + } + }else if (k == -1) { + // dead key: use charToDeadVKTable + dynPrimaryKeymap[i].unicode = wc[0]; + resetKbdState( kbdState ); + for (const CharToVKEntry *map = charToDeadVKTable; map->c != 0; ++map) { + if (wc[0] == map->c) { + dynPrimaryKeymap[i].jkey = map->javaKey; + break; + } + } + } else if (k == 0) { + // reset + resetKbdState( kbdState ); + }else { + printf ("++++Whats that? wkey 0x%x (%d)\n", i,i); + } + kbdState[i] = 0; // "key unpressed" + } +} +void +AwtComponent::UpdateDynPrimaryKeymap(UINT wkey, UINT jkeyLegacy, jint keyLocation, UINT modifiers) +{ + if( wkey && wkey < 256 ) { + if(keyLocation == java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD) { + // At the creation time, + // dynPrimaryKeymap cannot distinguish between e.g. "/" and "NumPad /" + dynPrimaryKeymap[wkey].jkey = jkeyLegacy; + } + if(dynPrimaryKeymap[wkey].jkey == java_awt_event_KeyEvent_VK_UNDEFINED) { + // E.g. it is non-unicode key + dynPrimaryKeymap[wkey].jkey = jkeyLegacy; + } + } +} UINT AwtComponent::WindowsKeyToJavaChar(UINT wkey, UINT modifiers, TransOps ops) { @@ -3358,10 +3500,12 @@ MsgRouting AwtComponent::WmKeyDown(UINT wkey, UINT repCnt, jint keyLocation = GetKeyLocation(wkey, flags); UINT jkey = WindowsKeyToJavaKey(wkey, modifiers); UINT character = WindowsKeyToJavaChar(wkey, modifiers, SAVE); + UpdateDynPrimaryKeymap(wkey, jkey, keyLocation, modifiers); + SendKeyEventToFocusOwner(java_awt_event_KeyEvent_KEY_PRESSED, TimeHelper::windowsToUTC(msg.time), jkey, character, - modifiers, keyLocation, &msg); + modifiers, keyLocation, (jlong)wkey, &msg); // bugid 4724007: Windows does not create a WM_CHAR for the Del key // for some reason, so we need to create the KEY_TYPED event on the @@ -3373,7 +3517,7 @@ MsgRouting AwtComponent::WmKeyDown(UINT wkey, UINT repCnt, TimeHelper::windowsToUTC(msg.time), java_awt_event_KeyEvent_VK_UNDEFINED, character, modifiers, - java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN); + java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN, (jlong)0); } return mrConsume; @@ -3398,10 +3542,11 @@ MsgRouting AwtComponent::WmKeyUp(UINT wkey, UINT repCnt, jint keyLocation = GetKeyLocation(wkey, flags); UINT jkey = WindowsKeyToJavaKey(wkey, modifiers); UINT character = WindowsKeyToJavaChar(wkey, modifiers, LOAD); + UpdateDynPrimaryKeymap(wkey, jkey, keyLocation, modifiers); SendKeyEventToFocusOwner(java_awt_event_KeyEvent_KEY_RELEASED, TimeHelper::windowsToUTC(msg.time), jkey, character, - modifiers, keyLocation, &msg); + modifiers, keyLocation, (jlong)wkey, &msg); return mrConsume; } @@ -3417,6 +3562,7 @@ MsgRouting AwtComponent::WmInputLangChange(UINT charset, HKL hKeyboardLayout) m_idLang = LOWORD(hKeyboardLayout); // lower word of HKL is LANGID m_CodePage = LangToCodePage(m_idLang); BuildDynamicKeyMapTable(); // compute new mappings for VK_OEM + BuildPrimaryDynamicTable(); return mrConsume; // do not propagate to children } @@ -3447,7 +3593,7 @@ MsgRouting AwtComponent::WmIMEChar(UINT character, UINT repCnt, UINT flags, BOOL TimeHelper::windowsToUTC(msg.time), java_awt_event_KeyEvent_VK_UNDEFINED, unicodeChar, modifiers, - java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN, + java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN, (jlong)0, &msg); return mrConsume; } @@ -3516,7 +3662,7 @@ MsgRouting AwtComponent::WmChar(UINT character, UINT repCnt, UINT flags, TimeHelper::windowsToUTC(msg.time), java_awt_event_KeyEvent_VK_UNDEFINED, unicodeChar, modifiers, - java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN, + java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN, (jlong)0, &msg); return mrConsume; } @@ -4525,7 +4671,7 @@ void AwtComponent::RemoveChild(UINT id) { } void AwtComponent::SendKeyEvent(jint id, jlong when, jint raw, jint cooked, - jint modifiers, jint keyLocation, MSG *pMsg) + jint modifiers, jint keyLocation, jlong nativeCode, MSG *pMsg) { JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); CriticalSection::Lock l(GetLock()); @@ -4562,6 +4708,18 @@ void AwtComponent::SendKeyEvent(jint id, jlong when, jint raw, jint cooked, if (safe_ExceptionOccurred(env)) env->ExceptionDescribe(); DASSERT(!safe_ExceptionOccurred(env)); DASSERT(keyEvent != NULL); + env->SetLongField(keyEvent, AwtKeyEvent::rawCodeID, nativeCode); + if( nativeCode && nativeCode < 256 ) { + env->SetLongField(keyEvent, AwtKeyEvent::primaryLevelUnicodeID, (jlong)(dynPrimaryKeymap[nativeCode].unicode)); + env->SetLongField(keyEvent, AwtKeyEvent::extendedKeyCodeID, (jlong)(dynPrimaryKeymap[nativeCode].jkey)); + if( nativeCode < 255 ) { + env->SetLongField(keyEvent, AwtKeyEvent::scancodeID, (jlong)(dynPrimaryKeymap[nativeCode].scancode)); + }else if( pMsg != NULL ) { + // unknown key with virtual keycode 0xFF. + // Its scancode is not in the table, pickup it from the message. + env->SetLongField(keyEvent, AwtKeyEvent::scancodeID, (jlong)(HIWORD(pMsg->lParam) & 0xFF)); + } + } if (pMsg != NULL) { AwtAWTEvent::saveMSG(env, pMsg, keyEvent); } @@ -4575,6 +4733,7 @@ void AwtComponent::SendKeyEventToFocusOwner(jint id, jlong when, jint raw, jint cooked, jint modifiers, jint keyLocation, + jlong nativeCode, MSG *msg) { /* @@ -4584,7 +4743,7 @@ AwtComponent::SendKeyEventToFocusOwner(jint id, jlong when, HWND hwndTarget = ((sm_focusOwner != NULL) ? sm_focusOwner : AwtComponent::GetFocusedWindow()); if (hwndTarget == GetHWnd()) { - SendKeyEvent(id, when, raw, cooked, modifiers, keyLocation, msg); + SendKeyEvent(id, when, raw, cooked, modifiers, keyLocation, nativeCode, msg); } else { AwtComponent *target = NULL; if (hwndTarget != NULL) { @@ -4595,7 +4754,7 @@ AwtComponent::SendKeyEventToFocusOwner(jint id, jlong when, } if (target != NULL) { target->SendKeyEvent(id, when, raw, cooked, modifiers, - keyLocation, msg); + keyLocation, nativeCode, msg); } } } diff --git a/jdk/src/windows/native/sun/windows/awt_Component.h b/jdk/src/windows/native/sun/windows/awt_Component.h index 9ebd0d412f6..8eec52be821 100644 --- a/jdk/src/windows/native/sun/windows/awt_Component.h +++ b/jdk/src/windows/native/sun/windows/awt_Component.h @@ -365,7 +365,7 @@ public: } void SendKeyEventToFocusOwner(jint id, jlong when, jint raw, jint cooked, - jint modifiers, jint keyLocation, + jint modifiers, jint keyLocation, jlong nativeCode, MSG *msg = NULL); /* * Allocate and initialize a new java.awt.event.KeyEvent, and @@ -373,7 +373,7 @@ public: * from the target. */ void SendKeyEvent(jint id, jlong when, jint raw, jint cooked, - jint modifiers, jint keyLocation, + jint modifiers, jint keyLocation, jlong nativeCode, MSG *msg = NULL); /* @@ -423,10 +423,6 @@ public: */ virtual BOOL InheritsNativeMouseWheelBehavior(); - /* Functions for MouseWheel support on Windows95 - * These should only be called if running on 95 - */ - /* Determines whether the component is obscured by another window */ // Called on Toolkit thread static jboolean _IsObscured(void *param); @@ -446,6 +442,7 @@ public: static UINT GetButtonMK(int mouseButton); static UINT WindowsKeyToJavaKey(UINT windowsKey, UINT modifiers); static void JavaKeyToWindowsKey(UINT javaKey, UINT *windowsKey, UINT *modifiers, UINT originalWindowsKey); + static void UpdateDynPrimaryKeymap(UINT wkey, UINT jkeyLegacy, jint keyLocation, UINT modifiers); INLINE static void AwtComponent::JavaKeyToWindowsKey(UINT javaKey, UINT *windowsKey, UINT *modifiers) @@ -787,6 +784,8 @@ private: static BOOL sm_rtl; static BOOL sm_rtlReadingOrder; + static BOOL sm_PrimaryDynamicTableBuilt; + jobject m_InputMethod; BOOL m_useNativeCompWindow; LPARAM m_bitsCandType; @@ -850,6 +849,7 @@ private: AwtComponent* SearchChild(UINT id); void RemoveChild(UINT id) ; static BOOL IsNavigationKey(UINT wkey); + static void BuildPrimaryDynamicTable(); ChildListItem* m_childList; diff --git a/jdk/src/windows/native/sun/windows/awt_InputMethod.cpp b/jdk/src/windows/native/sun/windows/awt_InputMethod.cpp index bd78cdaf3ef..f23e1e1f6f6 100644 --- a/jdk/src/windows/native/sun/windows/awt_InputMethod.cpp +++ b/jdk/src/windows/native/sun/windows/awt_InputMethod.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -176,7 +176,7 @@ Java_sun_awt_windows_WInputMethod_handleNativeIMEEvent(JNIEnv *env, jobject self java_awt_event_KeyEvent_CHAR_UNDEFINED, unicodeChar, modifiers, - java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN, + java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN, (jlong)0, &msg); } else { MSG* pCopiedMsg = new MSG; diff --git a/jdk/src/windows/native/sun/windows/awt_KeyEvent.cpp b/jdk/src/windows/native/sun/windows/awt_KeyEvent.cpp index cc795cfc805..0559741d45b 100644 --- a/jdk/src/windows/native/sun/windows/awt_KeyEvent.cpp +++ b/jdk/src/windows/native/sun/windows/awt_KeyEvent.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-1999 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-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 @@ -32,6 +32,10 @@ jfieldID AwtKeyEvent::keyCodeID; jfieldID AwtKeyEvent::keyCharID; +jfieldID AwtKeyEvent::rawCodeID; +jfieldID AwtKeyEvent::primaryLevelUnicodeID; +jfieldID AwtKeyEvent::scancodeID; +jfieldID AwtKeyEvent::extendedKeyCodeID; /************************************************************************ * AwtKeyEvent native methods @@ -45,9 +49,18 @@ Java_java_awt_event_KeyEvent_initIDs(JNIEnv *env, jclass cls) { AwtKeyEvent::keyCodeID = env->GetFieldID(cls, "keyCode", "I"); AwtKeyEvent::keyCharID = env->GetFieldID(cls, "keyChar", "C"); + AwtKeyEvent::rawCodeID = env->GetFieldID(cls, "rawCode", "J"); + AwtKeyEvent::primaryLevelUnicodeID = env->GetFieldID(cls, "primaryLevelUnicode", "J"); + AwtKeyEvent::scancodeID = env->GetFieldID(cls, "scancode", "J"); + AwtKeyEvent::extendedKeyCodeID = env->GetFieldID(cls, "extendedKeyCode", "J"); + DASSERT(AwtKeyEvent::keyCodeID != NULL); DASSERT(AwtKeyEvent::keyCharID != NULL); + DASSERT(AwtKeyEvent::rawCodeID != NULL); + DASSERT(AwtKeyEvent::primaryLevelUnicodeID != NULL); + DASSERT(AwtKeyEvent::scancodeID != NULL); + DASSERT(AwtKeyEvent::extendedKeyCodeID != NULL); CATCH_BAD_ALLOC; } diff --git a/jdk/src/windows/native/sun/windows/awt_KeyEvent.h b/jdk/src/windows/native/sun/windows/awt_KeyEvent.h index 2489051ea25..0e47eacec47 100644 --- a/jdk/src/windows/native/sun/windows/awt_KeyEvent.h +++ b/jdk/src/windows/native/sun/windows/awt_KeyEvent.h @@ -39,7 +39,10 @@ public: /* java.awt.KeyEvent field ids */ static jfieldID keyCodeID; static jfieldID keyCharID; - + static jfieldID rawCodeID; + static jfieldID primaryLevelUnicodeID; + static jfieldID scancodeID; + static jfieldID extendedKeyCodeID; }; #endif // AWT_KEYEVENT_H diff --git a/jdk/test/java/awt/event/KeyEvent/AcceleratorTest/AcceleratorTest.html b/jdk/test/java/awt/event/KeyEvent/AcceleratorTest/AcceleratorTest.html new file mode 100644 index 00000000000..64ef5d13d94 --- /dev/null +++ b/jdk/test/java/awt/event/KeyEvent/AcceleratorTest/AcceleratorTest.html @@ -0,0 +1,20 @@ + + + + AcceleratorTest + + + +

      AcceleratorTest
      Bug ID:

      + +

      See the dialog box (usually in upper left corner) for instructions

      + + + + diff --git a/jdk/test/java/awt/event/KeyEvent/AcceleratorTest/AcceleratorTest.java b/jdk/test/java/awt/event/KeyEvent/AcceleratorTest/AcceleratorTest.java new file mode 100644 index 00000000000..d0c71407ca5 --- /dev/null +++ b/jdk/test/java/awt/event/KeyEvent/AcceleratorTest/AcceleratorTest.java @@ -0,0 +1,305 @@ +/* + test + @bug 6680988 + @summary verify that various shortcuts and accelerators work + @author yuri.nesterenko : area=awt.keyboard + @run applet/manual=yesno AcceleratorTest.html +*/ + +/** + * AcceleratorTest.java + * + * summary: + */ + +//import java.applet.Applet; +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; +import java.util.Hashtable; + + +public class AcceleratorTest extends JApplet +{ + //Declare things used in the test, like buttons and labels here + static int pressed = 0; + Hashtable cmdHash = new Hashtable(); + String[] CMD = { + "\u042E, keep me in focus", + "Item Cyrl Be", + "Item English Period", + "Item English N", + "\u0436" + }; + + JFrame jfr; + + public void init() + { + //Create instructions for the user here, as well as set up + // the environment -- set the layout manager, add buttons, + // etc. + this.setLayout (new BorderLayout ()); + + String[] instructions = + { + " Ensure you have Russian keyboard layout as a currently active.", + "(1) Press Ctrl+\u0411 (a key with \",<\" on it) ", + "(2) Find a . (period) in this layout (perhaps \"/?\" or \"7&\" key).", + "Press Ctrl+.", + "(3) Press Crtl+ regular English . (period) key (on \".>\" )", + "(4) Press Ctrl+ key with English N.", + "(5) Press Alt+\u042E (key with \".>\")", + "(6) Press Alt+\u0436 (key with \";:\")", + "If all expected commands will be fired, look for message", + "\"All tests passed\"" + }; + Sysout.createDialogWithInstructions( instructions ); + for(int i = 0; i < CMD.length; i++) { + cmdHash.put(CMD[i], 0); + } + + jfr = new JFrame(); + JButton jbu; + jfr.add((jbu = new JButton(CMD[0]))); + jbu.setMnemonic(java.awt.event.KeyEvent.getExtendedKeyCodeForChar('\u042E')); + jbu.addActionListener( new ALi(CMD[0])); + + + JMenuBar menuBar = new JMenuBar(); + jfr.setJMenuBar(menuBar); + JMenu menu = new JMenu("Menu"); + menuBar.add(menu); + + JMenuItem menuItem = new JMenuItem(CMD[1]); + menuItem.setAccelerator(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.getExtendedKeyCodeForChar('\u0431'), + InputEvent.CTRL_DOWN_MASK)); + + JMenuItem menuItemEnglish = new JMenuItem(CMD[2]); + menuItemEnglish.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_PERIOD, + InputEvent.CTRL_DOWN_MASK)); + JMenuItem menuItemE1 = new JMenuItem(CMD[3]); + menuItemE1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, + InputEvent.CTRL_DOWN_MASK)); + menuItem.addActionListener( new ALi(CMD[1])); + menuItemEnglish.addActionListener( new ALi(CMD[2])); + menuItemE1.addActionListener( new ALi(CMD[3])); + menu.add(menuItem); + menu.add(menuItemEnglish); + menu.add(menuItemE1); + + KeyStroke ks; + InputMap im = new InputMap(); + ks = KeyStroke.getKeyStroke(KeyEvent.getExtendedKeyCodeForChar('\u0436'), java.awt.event.InputEvent.ALT_DOWN_MASK); + im.put(ks, "pushAction"); + im.setParent(jbu.getInputMap(JComponent.WHEN_FOCUSED)); + jbu.setInputMap(JComponent.WHEN_FOCUSED, im); + + jbu.getActionMap().put("pushAction", + new AbstractAction("pushAction") { + public void actionPerformed(ActionEvent evt) { + if( evt.getActionCommand().equals(CMD[4])) { + cmdHash.put(CMD[4], 1); + } + boolean notYet = false; + for(int i = 0; i < CMD.length; i++) { + if(cmdHash.get(CMD[i]) == 0 ) notYet = true; + } + Sysout.println("Fired"); + if( !notYet ) { + Sysout.println("All tests passed."); + } + } + } + ); + + + jfr.setBounds(650,0,200,200); + jfr.setVisible(true); + + }//End init() + + public void start () + { + //Get things going. Request focus, set size, et cetera + setSize (200,200); + setVisible(true); + validate(); + + }// start() + public class ALi implements ActionListener { + String expectedCmd; + public ALi( String eCmd ) { + expectedCmd = eCmd; + } + public void actionPerformed(ActionEvent ae) { + if( cmdHash.containsKey(ae.getActionCommand()) ) { + cmdHash.put(expectedCmd, 1); + } + boolean notYet = false; + for(int i = 0; i < CMD.length; i++) { + if(cmdHash.get(CMD[i]) == 0 ) notYet = true; + //Sysout.println(CMD[i]+":"+cmdHash.get(CMD[i])); + } + Sysout.println("FIRED"); + if( !notYet ) { + Sysout.println("All tests passed."); + } + } + } + + +}// class AcceleratorTest + +/* Place other classes related to the test after this line */ + + + + + +/**************************************************** + Standard Test Machinery + DO NOT modify anything below -- it's a standard + chunk of code whose purpose is to make user + interaction uniform, and thereby make it simpler + to read and understand someone else's test. + ****************************************************/ + +/** + This is part of the standard test machinery. + It creates a dialog (with the instructions), and is the interface + for sending text messages to the user. + To print the instructions, send an array of strings to Sysout.createDialog + WithInstructions method. Put one line of instructions per array entry. + To display a message for the tester to see, simply call Sysout.println + with the string to be displayed. + This mimics System.out.println but works within the test harness as well + as standalone. + */ + +class Sysout +{ + private static TestDialog dialog; + private static boolean numbering = false; + private static int messageNumber = 0; + + public static void createDialogWithInstructions( String[] instructions ) + { + dialog = new TestDialog( new Frame(), "Instructions" ); + dialog.printInstructions( instructions ); + dialog.setVisible(true); + 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.setVisible(true); + println( "Any messages for the tester will display here." ); + } + + /* Enables message counting for the tester. */ + public static void enableNumbering(boolean enable){ + numbering = enable; + } + + public static void printInstructions( String[] instructions ) + { + dialog.printInstructions( instructions ); + } + + + public static void println( String messageIn ) + { + if (numbering) { + messageIn = "" + messageNumber + " " + messageIn; + messageNumber++; + } + 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(); + + setVisible(true); + }// 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" ); + System.out.println(messageIn); + } + +}// TestDialog class From f59df4d48967de362500257eec95251589832698 Mon Sep 17 00:00:00 2001 From: Alan Bateman Date: Fri, 27 Mar 2009 15:24:37 +0000 Subject: [PATCH 206/292] 6693490: (se) select throws "File exists" IOException under load (lnx) Reviewed-by: sherman --- .../share/classes/sun/nio/ch/SelChImpl.java | 3 +- .../classes/sun/nio/ch/EPollArrayWrapper.java | 88 +++++++----- .../classes/sun/nio/ch/EPollSelectorImpl.java | 15 +-- .../channels/Selector/RegAfterPreClose.java | 127 ++++++++++++++++++ 4 files changed, 188 insertions(+), 45 deletions(-) create mode 100644 jdk/test/java/nio/channels/Selector/RegAfterPreClose.java diff --git a/jdk/src/share/classes/sun/nio/ch/SelChImpl.java b/jdk/src/share/classes/sun/nio/ch/SelChImpl.java index 0ef4d357f8d..fb1571d84d2 100644 --- a/jdk/src/share/classes/sun/nio/ch/SelChImpl.java +++ b/jdk/src/share/classes/sun/nio/ch/SelChImpl.java @@ -25,6 +25,7 @@ package sun.nio.ch; +import java.nio.channels.Channel; import java.io.FileDescriptor; import java.io.IOException; @@ -35,7 +36,7 @@ import java.io.IOException; * @since 1.4 */ -interface SelChImpl { +interface SelChImpl extends Channel { FileDescriptor getFD(); diff --git a/jdk/src/solaris/classes/sun/nio/ch/EPollArrayWrapper.java b/jdk/src/solaris/classes/sun/nio/ch/EPollArrayWrapper.java index 362bd97089c..622ff8d4764 100644 --- a/jdk/src/solaris/classes/sun/nio/ch/EPollArrayWrapper.java +++ b/jdk/src/solaris/classes/sun/nio/ch/EPollArrayWrapper.java @@ -78,8 +78,8 @@ class EPollArrayWrapper { // Base address of the native pollArray private final long pollArrayAddress; - // Set of "idle" file descriptors - private final HashSet idleSet; + // Set of "idle" channels + private final HashSet idleSet; EPollArrayWrapper() { // creates the epoll file descriptor @@ -96,19 +96,22 @@ class EPollArrayWrapper { } // create idle set - idleSet = new HashSet(); + idleSet = new HashSet(); } // Used to update file description registrations private static class Updator { + SelChImpl channel; int opcode; - int fd; int events; - Updator(int opcode, int fd, int events) { + Updator(SelChImpl channel, int opcode, int events) { + this.channel = channel; this.opcode = opcode; - this.fd = fd; this.events = events; } + Updator(SelChImpl channel, int opcode) { + this(channel, opcode, 0); + } } private LinkedList updateList = new LinkedList(); @@ -163,60 +166,54 @@ class EPollArrayWrapper { } /** - * Update the events for a given file descriptor. + * Update the events for a given channel. */ - void setInterest(int fd, int mask) { + void setInterest(SelChImpl channel, int mask) { synchronized (updateList) { - - // if the interest events are 0 then add to idle set, and delete - // from epoll if registered (or pending) - if (mask == 0) { - if (idleSet.add(fd)) { - updateList.add(new Updator(EPOLL_CTL_DEL, fd, 0)); - } - return; - } - - // if file descriptor is idle then add to epoll - if (!idleSet.isEmpty() && idleSet.remove(fd)) { - updateList.add(new Updator(EPOLL_CTL_ADD, fd, mask)); - return; - } - // if the previous pending operation is to add this file descriptor // to epoll then update its event set if (updateList.size() > 0) { Updator last = updateList.getLast(); - if (last.fd == fd && last.opcode == EPOLL_CTL_ADD) { + if (last.channel == channel && last.opcode == EPOLL_CTL_ADD) { last.events = mask; return; } } // update existing registration - updateList.add(new Updator(EPOLL_CTL_MOD, fd, mask)); + updateList.add(new Updator(channel, EPOLL_CTL_MOD, mask)); } } /** - * Add a new file descriptor to epoll + * Add a channel's file descriptor to epoll */ - void add(int fd) { + void add(SelChImpl channel) { synchronized (updateList) { - updateList.add(new Updator(EPOLL_CTL_ADD, fd, 0)); + updateList.add(new Updator(channel, EPOLL_CTL_ADD)); } } /** - * Remove a file descriptor from epoll + * Remove a channel's file descriptor from epoll */ - void release(int fd) { + void release(SelChImpl channel) { synchronized (updateList) { - // if file descriptor is idle then remove from idle set, otherwise - // delete from epoll - if (!idleSet.remove(fd)) { - updateList.add(new Updator(EPOLL_CTL_DEL, fd, 0)); + // flush any pending updates + int i = 0; + while (i < updateList.size()) { + if (updateList.get(i).channel == channel) { + updateList.remove(i); + } else { + i++; + } } + + // remove from the idle set (if present) + idleSet.remove(channel); + + // remove from epoll (if registered) + epollCtl(epfd, EPOLL_CTL_DEL, channel.getFDVal(), 0); } } @@ -248,7 +245,26 @@ class EPollArrayWrapper { synchronized (updateList) { Updator u = null; while ((u = updateList.poll()) != null) { - epollCtl(epfd, u.opcode, u.fd, u.events); + SelChImpl ch = u.channel; + if (!ch.isOpen()) + continue; + + // if the events are 0 then file descriptor is put into "idle + // set" to prevent it being polled + if (u.events == 0) { + boolean added = idleSet.add(u.channel); + // if added to idle set then remove from epoll if registered + if (added && (u.opcode == EPOLL_CTL_MOD)) + epollCtl(epfd, EPOLL_CTL_DEL, ch.getFDVal(), 0); + } else { + // events are specified. If file descriptor was in idle set + // it must be re-registered (by converting opcode to ADD) + boolean idle = false; + if (!idleSet.isEmpty()) + idle = idleSet.remove(u.channel); + int opcode = (idle) ? EPOLL_CTL_ADD : u.opcode; + epollCtl(epfd, opcode, ch.getFDVal(), u.events); + } } } } diff --git a/jdk/src/solaris/classes/sun/nio/ch/EPollSelectorImpl.java b/jdk/src/solaris/classes/sun/nio/ch/EPollSelectorImpl.java index a9bf82353f6..505d8b7bb4e 100644 --- a/jdk/src/solaris/classes/sun/nio/ch/EPollSelectorImpl.java +++ b/jdk/src/solaris/classes/sun/nio/ch/EPollSelectorImpl.java @@ -139,7 +139,6 @@ class EPollSelectorImpl FileDispatcherImpl.closeIntFD(fd0); FileDispatcherImpl.closeIntFD(fd1); - pollWrapper.release(fd0); pollWrapper.closeEPollFD(); // it is possible selectedKeys = null; @@ -162,17 +161,18 @@ class EPollSelectorImpl protected void implRegister(SelectionKeyImpl ski) { if (closed) throw new ClosedSelectorException(); - int fd = IOUtil.fdVal(ski.channel.getFD()); - fdToKey.put(Integer.valueOf(fd), ski); - pollWrapper.add(fd); + SelChImpl ch = ski.channel; + fdToKey.put(Integer.valueOf(ch.getFDVal()), ski); + pollWrapper.add(ch); keys.add(ski); } protected void implDereg(SelectionKeyImpl ski) throws IOException { assert (ski.getIndex() >= 0); - int fd = ski.channel.getFDVal(); + SelChImpl ch = ski.channel; + int fd = ch.getFDVal(); fdToKey.remove(Integer.valueOf(fd)); - pollWrapper.release(fd); + pollWrapper.release(ch); ski.setIndex(-1); keys.remove(ski); selectedKeys.remove(ski); @@ -185,8 +185,7 @@ class EPollSelectorImpl void putEventOps(SelectionKeyImpl sk, int ops) { if (closed) throw new ClosedSelectorException(); - int fd = IOUtil.fdVal(sk.channel.getFD()); - pollWrapper.setInterest(fd, ops); + pollWrapper.setInterest(sk.channel, ops); } public Selector wakeup() { diff --git a/jdk/test/java/nio/channels/Selector/RegAfterPreClose.java b/jdk/test/java/nio/channels/Selector/RegAfterPreClose.java new file mode 100644 index 00000000000..c5f6be1d60c --- /dev/null +++ b/jdk/test/java/nio/channels/Selector/RegAfterPreClose.java @@ -0,0 +1,127 @@ +/* + * Copyright 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 6693490 + * @summary Pre-close file descriptor may inadvertently get registered with + * epoll during close + */ + +import java.net.*; +import java.nio.channels.*; +import java.util.concurrent.*; +import java.util.*; +import java.io.IOException; + +public class RegAfterPreClose { + + static volatile boolean done; + + /** + * A task that continuously connects to a given address and immediately + * closes the connection. + */ + static class Connector implements Runnable { + private final SocketAddress sa; + Connector(int port) throws IOException { + InetAddress lh = InetAddress.getLocalHost(); + this.sa = new InetSocketAddress(lh, port); + } + public void run() { + while (!done) { + try { + SocketChannel.open(sa).close(); + } catch (IOException x) { + // back-off as probably resource related + try { + Thread.sleep(10); + } catch (InterruptedException ignore) { } + } + } + } + } + + /** + * A task that closes a channel. + */ + static class Closer implements Runnable { + private final Channel channel; + Closer(Channel sc) { + this.channel = sc; + } + public void run() { + try { + channel.close(); + } catch (IOException ignore) { } + } + } + + public static void main(String[] args) throws Exception { + // create listener + InetSocketAddress isa = new InetSocketAddress(0); + ServerSocketChannel ssc = ServerSocketChannel.open(); + ssc.socket().bind(isa); + + // register with Selector + final Selector sel = Selector.open(); + ssc.configureBlocking(false); + SelectionKey key = ssc.register(sel, SelectionKey.OP_ACCEPT); + + ThreadFactory factory = new ThreadFactory() { + @Override + public Thread newThread(Runnable r) { + Thread t = new Thread(r); + t.setDaemon(true); + return t; + } + }; + + // schedule test to run for 1 minute + Executors.newScheduledThreadPool(1, factory).schedule(new Runnable() { + public void run() { + done = true; + sel.wakeup(); + }}, 1, TimeUnit.MINUTES); + + // create Executor that handles tasks that closes channels + // "asynchronously" - this creates the conditions to provoke the bug. + Executor executor = Executors.newFixedThreadPool(2, factory); + + // submit task that connects to listener + executor.execute(new Connector(ssc.socket().getLocalPort())); + + // loop accepting connections until done (or an IOException is thrown) + while (!done) { + sel.select(); + if (key.isAcceptable()) { + SocketChannel sc = ssc.accept(); + if (sc != null) { + sc.configureBlocking(false); + sc.register(sel, SelectionKey.OP_READ); + executor.execute(new Closer(sc)); + } + } + sel.selectedKeys().clear(); + } + } +} From de8096cf4822983d870d6ee7c008d9cc282c45d7 Mon Sep 17 00:00:00 2001 From: Alan Bateman Date: Fri, 27 Mar 2009 16:04:05 +0000 Subject: [PATCH 207/292] 6772303: (se) IOException: Invalid argument" thrown on a call to Selector.select(value) with -d64 Reviewed-by: sherman --- jdk/src/solaris/native/sun/nio/ch/DevPollArrayWrapper.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/jdk/src/solaris/native/sun/nio/ch/DevPollArrayWrapper.c b/jdk/src/solaris/native/sun/nio/ch/DevPollArrayWrapper.c index 090c77e6774..fa36f612bff 100644 --- a/jdk/src/solaris/native/sun/nio/ch/DevPollArrayWrapper.c +++ b/jdk/src/solaris/native/sun/nio/ch/DevPollArrayWrapper.c @@ -28,6 +28,7 @@ #include "jvm.h" #include "jlong.h" #include "sun_nio_ch_DevPollArrayWrapper.h" +#include "java_lang_Integer.h" #include #include #include @@ -192,7 +193,11 @@ Java_sun_nio_ch_DevPollArrayWrapper_fdLimit(JNIEnv *env, jclass this) JNU_ThrowIOExceptionWithLastError(env, "getrlimit failed"); } - return (jint)rlp.rlim_max; + if (rlp.rlim_max < 0 || rlp.rlim_max > java_lang_Integer_MAX_VALUE) { + return java_lang_Integer_MAX_VALUE; + } else { + return (jint)rlp.rlim_max; + } } JNIEXPORT void JNICALL From 6d21b1e4cd88ee7072b6d064d93f7cd759c9e248 Mon Sep 17 00:00:00 2001 From: Poonam Bajaj Date: Fri, 27 Mar 2009 10:29:54 -0700 Subject: [PATCH 208/292] 6822407: heapOopSize lookup is incorrect in Serviceability Agent HeapOopSize symbol should be declared as constant in vmStructs and should not be looked up in readVMIntConstants(). Reviewed-by: never, swamyv, coleenp --- .../share/classes/sun/jvm/hotspot/HotSpotTypeDataBase.java | 2 -- .../agent/src/share/classes/sun/jvm/hotspot/runtime/VM.java | 6 ++++-- hotspot/src/share/vm/runtime/vmStructs.cpp | 1 + 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/HotSpotTypeDataBase.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/HotSpotTypeDataBase.java index 5e56a0e3f36..82f5ac44d0b 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/HotSpotTypeDataBase.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/HotSpotTypeDataBase.java @@ -306,8 +306,6 @@ public class HotSpotTypeDataBase extends BasicTypeDataBase { entryAddr = entryAddr.addOffsetTo(intConstantEntryArrayStride); } while (nameAddr != null); - String symbol = "heapOopSize"; // global int constant and value is initialized at runtime. - addIntConstant(symbol, (int)lookupInProcess(symbol).getCIntegerAt(0, 4, false)); } private void readVMLongConstants() { diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/VM.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/VM.java index 67a0d47eafd..b215abcd5a5 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/VM.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/VM.java @@ -342,12 +342,14 @@ public class VM { throw new RuntimeException("Attempt to initialize VM twice"); } soleInstance = new VM(db, debugger, debugger.getMachineDescription().isBigEndian()); - debugger.putHeapConst(soleInstance.getHeapOopSize(), Universe.getNarrowOopBase(), - Universe.getNarrowOopShift()); + for (Iterator iter = vmInitializedObservers.iterator(); iter.hasNext(); ) { ((Observer) iter.next()).update(null, null); } + debugger.putHeapConst(soleInstance.getHeapOopSize(), Universe.getNarrowOopBase(), + Universe.getNarrowOopShift()); + } /** This is used by the debugging system */ diff --git a/hotspot/src/share/vm/runtime/vmStructs.cpp b/hotspot/src/share/vm/runtime/vmStructs.cpp index 2de7bbdf56f..7a688dbb33f 100644 --- a/hotspot/src/share/vm/runtime/vmStructs.cpp +++ b/hotspot/src/share/vm/runtime/vmStructs.cpp @@ -1320,6 +1320,7 @@ static inline uint64_t cast_uint64_t(size_t x) /****************/ \ \ declare_constant(oopSize) \ + declare_constant(heapOopSize) \ declare_constant(LogBytesPerWord) \ declare_constant(BytesPerLong) \ \ From 9bac626c1a054c6921093bd2b275a6f6b8d2b3a0 Mon Sep 17 00:00:00 2001 From: Xiomara Jayasena Date: Fri, 27 Mar 2009 14:11:31 -0700 Subject: [PATCH 209/292] Added tag jdk7-b52 for changeset 90eb5f83241a --- .hgtags-top-repo | 1 + 1 file changed, 1 insertion(+) diff --git a/.hgtags-top-repo b/.hgtags-top-repo index 52f1f706812..5ac8ad95712 100644 --- a/.hgtags-top-repo +++ b/.hgtags-top-repo @@ -26,3 +26,4 @@ d7744e86dedc21a8ecf6bdb73eb191b8eaf5b0da jdk7-b47 aee93a8992d2389121eb610c00a86196f3e2b9b0 jdk7-b49 5111e13e44e542fe945b47ab154546daec36737d jdk7-b50 0f0189d55ce4a1f7840da7582ac7d970b3b7ab15 jdk7-b51 +4264c2fe66493e57c411045a1b61377796641e45 jdk7-b52 From a83e0c09252de5635a1a60eea3e44414758597c8 Mon Sep 17 00:00:00 2001 From: Xiomara Jayasena Date: Fri, 27 Mar 2009 14:11:32 -0700 Subject: [PATCH 210/292] Added tag jdk7-b52 for changeset 8608524e334e --- corba/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/corba/.hgtags b/corba/.hgtags index 28a93dc8343..91ac5a1ccae 100644 --- a/corba/.hgtags +++ b/corba/.hgtags @@ -26,3 +26,4 @@ ccd6a16502e0650d91d85c4b86be05cbcd461a87 jdk7-b42 d70978bc64bc7a04be7797ab0dcd9b7b1b3a6bff jdk7-b49 0edbd0074b02b42b2b83cc47cb391d4869b7a8ec jdk7-b50 3eb8f1047a7402a9a79937d1c39560e931e91da2 jdk7-b51 +bec82237d694f9802b820fa11bbb4f7fa9bf8e77 jdk7-b52 From 422ea850e0a4475c8fdf86a44a125e7ade494527 Mon Sep 17 00:00:00 2001 From: Xiomara Jayasena Date: Fri, 27 Mar 2009 14:11:35 -0700 Subject: [PATCH 211/292] Added tag jdk7-b52 for changeset 0d989c04422c --- hotspot/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/hotspot/.hgtags b/hotspot/.hgtags index 21dac82c44e..475bfa37988 100644 --- a/hotspot/.hgtags +++ b/hotspot/.hgtags @@ -26,3 +26,4 @@ bcb33806d186561c781992e5f4d8a90bb033f9f0 jdk7-b48 8b22ccb5aba2c6c11bddf6488a7bb7ef5b4bf2be jdk7-b49 dae503d9f04c1a11e182dbf7f770509c28dc0609 jdk7-b50 2581d90c6c9b2012da930eb4742add94a03069a0 jdk7-b51 +1b1e8f1a4fe8cebc01c022484f78148e17b62a0d jdk7-b52 From 93a90129b2ad174a8d6adb641eb786fc98814c8f Mon Sep 17 00:00:00 2001 From: Xiomara Jayasena Date: Fri, 27 Mar 2009 14:11:39 -0700 Subject: [PATCH 212/292] Added tag jdk7-b52 for changeset 37c56ec4ec7d --- jaxp/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/jaxp/.hgtags b/jaxp/.hgtags index b479a50ab7b..8951b3d1ac5 100644 --- a/jaxp/.hgtags +++ b/jaxp/.hgtags @@ -26,3 +26,4 @@ d711ad1954b294957737ea386cfd4d3c05028a36 jdk7-b47 5c1f24531903573c1830775432276da567243f9c jdk7-b49 e8514e2be76d90889ebdb90d627aca2db5c150c6 jdk7-b50 ae890d80d5dffcd4dc77a1f17d768e192d1852c7 jdk7-b51 +69ad87dc25cbcaaaded4727199395ad0c78bc427 jdk7-b52 From d8cd1fc4329a3561f63b4b971e649b769111d6d5 Mon Sep 17 00:00:00 2001 From: Xiomara Jayasena Date: Fri, 27 Mar 2009 14:11:40 -0700 Subject: [PATCH 213/292] Added tag jdk7-b52 for changeset 56b454d324bb --- jaxws/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/jaxws/.hgtags b/jaxws/.hgtags index 2869a6be543..62bf7fdbd4d 100644 --- a/jaxws/.hgtags +++ b/jaxws/.hgtags @@ -26,3 +26,4 @@ af4a3eeb7812a5d09a241c50b51b3c648a9d45c1 jdk7-b46 18ca864890f3d4ed942ecbffb78c936a57759921 jdk7-b49 5be52db581f1ea91ab6e0eb34ba7f439125bfb16 jdk7-b50 41a66a42791ba90bff489af72cbfea71be9b40a5 jdk7-b51 +e646890d18b770f625f14ed4ad5c50554d8d3d8b jdk7-b52 From ace77b0dc3f00908ba37a8bd89c43d1f28f42ec1 Mon Sep 17 00:00:00 2001 From: Xiomara Jayasena Date: Fri, 27 Mar 2009 14:11:45 -0700 Subject: [PATCH 214/292] Added tag jdk7-b52 for changeset ea5331b4a192 --- jdk/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/jdk/.hgtags b/jdk/.hgtags index 4790ae52876..39ec72bb7a9 100644 --- a/jdk/.hgtags +++ b/jdk/.hgtags @@ -26,3 +26,4 @@ b4ac413b1f129eeef0acab3f31081c1b7dfe3b27 jdk7-b47 8311105ea7a3db7bcbcb2b696459127c7f2297a4 jdk7-b49 58ba2cd5a25053684ec53205d95edeeaa0006f13 jdk7-b50 fea0898259ae41c73620b1815aa48f036216155c jdk7-b51 +bcbeadb4a5d759b29e876ee2c83401e91ff22f60 jdk7-b52 From 0f23916d8bb90249cf5e7313abb731e47c67b2b6 Mon Sep 17 00:00:00 2001 From: Xiomara Jayasena Date: Fri, 27 Mar 2009 14:11:53 -0700 Subject: [PATCH 215/292] Added tag jdk7-b52 for changeset a9071341dbea --- langtools/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/langtools/.hgtags b/langtools/.hgtags index a260d94e956..0ea2c411d86 100644 --- a/langtools/.hgtags +++ b/langtools/.hgtags @@ -26,3 +26,4 @@ c53007f34195f69223bdd4125ec6c0740f7d6736 jdk7-b48 d17d927ad9bdfafae32451645d182acb7bed7be6 jdk7-b49 46f2f6ed96f13fc49fec3d1b6aa616686128cb57 jdk7-b50 8c55d5b0ed71ed3a749eb97e4eab79b4831649b8 jdk7-b51 +29329051d483d39f66073752ba4afbf29d893cfe jdk7-b52 From 99aa7292a36916c12dc4d1560f7f659d975d2b24 Mon Sep 17 00:00:00 2001 From: Tom Rodriguez Date: Fri, 27 Mar 2009 14:37:42 -0700 Subject: [PATCH 216/292] 6822333: _call_stub_compiled_return address handling in SA is broken causing jstack to hang occasionally Reviewed-by: kvn, twisti --- .../classes/sun/jvm/hotspot/runtime/StubRoutines.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/StubRoutines.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/StubRoutines.java index be55ca524c7..fad351b495d 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/StubRoutines.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/StubRoutines.java @@ -46,12 +46,18 @@ public class StubRoutines { Type type = db.lookupType("StubRoutines"); callStubReturnAddressField = type.getAddressField("_call_stub_return_address"); - // Only some platforms have specif return from compiled to call_stub + // Only some platforms have specific return from compiled to call_stub try { - callStubCompiledReturnAddressField = type.getAddressField("_call_stub_compiled_return"); + type = db.lookupType("StubRoutines::x86"); + if (type != null) { + callStubCompiledReturnAddressField = type.getAddressField("_call_stub_compiled_return"); + } } catch (RuntimeException re) { callStubCompiledReturnAddressField = null; } + if (callStubCompiledReturnAddressField == null && VM.getVM().getCPU().equals("x86")) { + throw new InternalError("Missing definition for _call_stub_compiled_return"); + } } public StubRoutines() { From 350ce4d28bee19bb97b883cca4b96575a4f8324b Mon Sep 17 00:00:00 2001 From: Erik Trimble Date: Fri, 27 Mar 2009 16:58:30 -0700 Subject: [PATCH 217/292] 6823377: Bump HS15 build number to 04 Update the HS15 Build number to 04 Reviewed-by: jcoomes --- hotspot/make/hotspot_version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hotspot/make/hotspot_version b/hotspot/make/hotspot_version index d0da3b6ce8d..f3f6bc5d15b 100644 --- a/hotspot/make/hotspot_version +++ b/hotspot/make/hotspot_version @@ -35,7 +35,7 @@ HOTSPOT_VM_COPYRIGHT=Copyright 2008 HS_MAJOR_VER=15 HS_MINOR_VER=0 -HS_BUILD_NUMBER=03 +HS_BUILD_NUMBER=04 JDK_MAJOR_VER=1 JDK_MINOR_VER=7 From 137a679446093b7afd169f9a2ee3d785e4f97af0 Mon Sep 17 00:00:00 2001 From: "Y. Srinivas Ramakrishna" Date: Sat, 28 Mar 2009 15:47:29 -0700 Subject: [PATCH 218/292] 6819891: ParNew: Fix work queue overflow code to deal correctly with +UseCompressedOops When using compressed oops, rather than chaining the overflowed grey objects' pre-images through their klass words, we use GC-worker thread-local overflow stacks. Reviewed-by: jcoomes, jmasa --- .../concurrentMarkSweepGeneration.cpp | 14 +- .../parNew/parNewGeneration.cpp | 176 +++++++++++++----- .../parNew/parNewGeneration.hpp | 17 +- hotspot/src/share/vm/runtime/globals.hpp | 3 + 4 files changed, 154 insertions(+), 56 deletions(-) diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp index de9ee7869d9..40714825b7d 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp @@ -3847,7 +3847,7 @@ bool CMSConcMarkingTask::get_work_from_overflow_stack(CMSMarkStack* ovflw_stk, MutexLockerEx ml(ovflw_stk->par_lock(), Mutex::_no_safepoint_check_flag); // Grab up to 1/4 the size of the work queue - size_t num = MIN2((size_t)work_q->max_elems()/4, + size_t num = MIN2((size_t)(work_q->max_elems() - work_q->size())/4, (size_t)ParGCDesiredObjsFromOverflowList); num = MIN2(num, ovflw_stk->length()); for (int i = (int) num; i > 0; i--) { @@ -5204,13 +5204,12 @@ CMSParRemarkTask::do_work_steal(int i, Par_MarkRefsIntoAndScanClosure* cl, NOT_PRODUCT(int num_steals = 0;) oop obj_to_scan; CMSBitMap* bm = &(_collector->_markBitMap); - size_t num_from_overflow_list = - MIN2((size_t)work_q->max_elems()/4, - (size_t)ParGCDesiredObjsFromOverflowList); while (true) { // Completely finish any left over work from (an) earlier round(s) cl->trim_queue(0); + size_t num_from_overflow_list = MIN2((size_t)(work_q->max_elems() - work_q->size())/4, + (size_t)ParGCDesiredObjsFromOverflowList); // Now check if there's any work in the overflow list if (_collector->par_take_from_overflow_list(num_from_overflow_list, work_q)) { @@ -5622,13 +5621,12 @@ void CMSRefProcTaskProxy::do_work_steal(int i, OopTaskQueue* work_q = work_queue(i); NOT_PRODUCT(int num_steals = 0;) oop obj_to_scan; - size_t num_from_overflow_list = - MIN2((size_t)work_q->max_elems()/4, - (size_t)ParGCDesiredObjsFromOverflowList); while (true) { // Completely finish any left over work from (an) earlier round(s) drain->trim_queue(0); + size_t num_from_overflow_list = MIN2((size_t)(work_q->max_elems() - work_q->size())/4, + (size_t)ParGCDesiredObjsFromOverflowList); // Now check if there's any work in the overflow list if (_collector->par_take_from_overflow_list(num_from_overflow_list, work_q)) { @@ -9021,7 +9019,7 @@ void ASConcurrentMarkSweepGeneration::shrink_by(size_t desired_bytes) { // Transfer some number of overflown objects to usual marking // stack. Return true if some objects were transferred. bool MarkRefsIntoAndScanClosure::take_from_overflow_list() { - size_t num = MIN2((size_t)_mark_stack->capacity()/4, + size_t num = MIN2((size_t)(_mark_stack->capacity() - _mark_stack->length())/4, (size_t)ParGCDesiredObjsFromOverflowList); bool res = _collector->take_from_overflow_list(num, _mark_stack); diff --git a/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp b/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp index 7bafe50aa36..bec5507ef76 100644 --- a/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp +++ b/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp @@ -36,7 +36,7 @@ ParScanThreadState::ParScanThreadState(Space* to_space_, ObjToScanQueueSet* work_queue_set_, size_t desired_plab_sz_, ParallelTaskTerminator& term_) : - _to_space(to_space_), _old_gen(old_gen_), _thread_num(thread_num_), + _to_space(to_space_), _old_gen(old_gen_), _young_gen(gen_), _thread_num(thread_num_), _work_queue(work_queue_set_->queue(thread_num_)), _to_space_full(false), _ageTable(false), // false ==> not the global age table, no perf data. _to_space_alloc_buffer(desired_plab_sz_), @@ -57,6 +57,11 @@ ParScanThreadState::ParScanThreadState(Space* to_space_, _start = os::elapsedTime(); _old_gen_closure.set_generation(old_gen_); _old_gen_root_closure.set_generation(old_gen_); + if (UseCompressedOops) { + _overflow_stack = new (ResourceObj::C_HEAP) GrowableArray(512, true); + } else { + _overflow_stack = NULL; + } } #ifdef _MSC_VER #pragma warning( pop ) @@ -81,7 +86,7 @@ void ParScanThreadState::scan_partial_array_and_push_remainder(oop old) { assert(old->is_objArray(), "must be obj array"); assert(old->is_forwarded(), "must be forwarded"); assert(Universe::heap()->is_in_reserved(old), "must be in heap."); - assert(!_old_gen->is_in(old), "must be in young generation."); + assert(!old_gen()->is_in(old), "must be in young generation."); objArrayOop obj = objArrayOop(old->forwardee()); // Process ParGCArrayScanChunk elements now @@ -119,26 +124,68 @@ void ParScanThreadState::scan_partial_array_and_push_remainder(oop old) { void ParScanThreadState::trim_queues(int max_size) { ObjToScanQueue* queue = work_queue(); - while (queue->size() > (juint)max_size) { - oop obj_to_scan; - if (queue->pop_local(obj_to_scan)) { - note_pop(); - - if ((HeapWord *)obj_to_scan < young_old_boundary()) { - if (obj_to_scan->is_objArray() && - obj_to_scan->is_forwarded() && - obj_to_scan->forwardee() != obj_to_scan) { - scan_partial_array_and_push_remainder(obj_to_scan); + do { + while (queue->size() > (juint)max_size) { + oop obj_to_scan; + if (queue->pop_local(obj_to_scan)) { + note_pop(); + if ((HeapWord *)obj_to_scan < young_old_boundary()) { + if (obj_to_scan->is_objArray() && + obj_to_scan->is_forwarded() && + obj_to_scan->forwardee() != obj_to_scan) { + scan_partial_array_and_push_remainder(obj_to_scan); + } else { + // object is in to_space + obj_to_scan->oop_iterate(&_to_space_closure); + } } else { - // object is in to_space - obj_to_scan->oop_iterate(&_to_space_closure); + // object is in old generation + obj_to_scan->oop_iterate(&_old_gen_closure); } - } else { - // object is in old generation - obj_to_scan->oop_iterate(&_old_gen_closure); } } + // For the case of compressed oops, we have a private, non-shared + // overflow stack, so we eagerly drain it so as to more evenly + // distribute load early. Note: this may be good to do in + // general rather than delay for the final stealing phase. + // If applicable, we'll transfer a set of objects over to our + // work queue, allowing them to be stolen and draining our + // private overflow stack. + } while (ParGCTrimOverflow && young_gen()->take_from_overflow_list(this)); +} + +bool ParScanThreadState::take_from_overflow_stack() { + assert(UseCompressedOops, "Else should not call"); + assert(young_gen()->overflow_list() == NULL, "Error"); + ObjToScanQueue* queue = work_queue(); + GrowableArray* of_stack = overflow_stack(); + uint num_overflow_elems = of_stack->length(); + uint num_take_elems = MIN2(MIN2((queue->max_elems() - queue->size())/4, + (juint)ParGCDesiredObjsFromOverflowList), + num_overflow_elems); + // Transfer the most recent num_take_elems from the overflow + // stack to our work queue. + for (size_t i = 0; i != num_take_elems; i++) { + oop cur = of_stack->pop(); + oop obj_to_push = cur->forwardee(); + assert(Universe::heap()->is_in_reserved(cur), "Should be in heap"); + assert(!old_gen()->is_in_reserved(cur), "Should be in young gen"); + assert(Universe::heap()->is_in_reserved(obj_to_push), "Should be in heap"); + if (should_be_partially_scanned(obj_to_push, cur)) { + assert(arrayOop(cur)->length() == 0, "entire array remaining to be scanned"); + obj_to_push = cur; + } + bool ok = queue->push(obj_to_push); + assert(ok, "Should have succeeded"); } + assert(young_gen()->overflow_list() == NULL, "Error"); + return num_take_elems > 0; // was something transferred? +} + +void ParScanThreadState::push_on_overflow_stack(oop p) { + assert(UseCompressedOops, "Else should not call"); + overflow_stack()->push(p); + assert(young_gen()->overflow_list() == NULL, "Error"); } HeapWord* ParScanThreadState::alloc_in_to_space_slow(size_t word_sz) { @@ -425,8 +472,7 @@ void ParNewGenTask::work(int i) { ResourceMark rm; HandleMark hm; // We would need multiple old-gen queues otherwise. - guarantee(gch->n_gens() == 2, - "Par young collection currently only works with one older gen."); + assert(gch->n_gens() == 2, "Par young collection currently only works with one older gen."); Generation* old_gen = gch->next_gen(_gen); @@ -1169,36 +1215,75 @@ bool ParNewGeneration::should_simulate_overflow() { } #endif +// In case we are using compressed oops, we need to be careful. +// If the object being pushed is an object array, then its length +// field keeps track of the "grey boundary" at which the next +// incremental scan will be done (see ParGCArrayScanChunk). +// When using compressed oops, this length field is kept in the +// lower 32 bits of the erstwhile klass word and cannot be used +// for the overflow chaining pointer (OCP below). As such the OCP +// would itself need to be compressed into the top 32-bits in this +// case. Unfortunately, see below, in the event that we have a +// promotion failure, the node to be pushed on the list can be +// outside of the Java heap, so the heap-based pointer compression +// would not work (we would have potential aliasing between C-heap +// and Java-heap pointers). For this reason, when using compressed +// oops, we simply use a worker-thread-local, non-shared overflow +// list in the form of a growable array, with a slightly different +// overflow stack draining strategy. If/when we start using fat +// stacks here, we can go back to using (fat) pointer chains +// (although some performance comparisons would be useful since +// single global lists have their own performance disadvantages +// as we were made painfully aware not long ago, see 6786503). #define BUSY (oop(0x1aff1aff)) void ParNewGeneration::push_on_overflow_list(oop from_space_obj, ParScanThreadState* par_scan_state) { - // if the object has been forwarded to itself, then we cannot - // use the klass pointer for the linked list. Instead we have - // to allocate an oopDesc in the C-Heap and use that for the linked list. - // XXX This is horribly inefficient when a promotion failure occurs - // and should be fixed. XXX FIX ME !!! + assert(is_in_reserved(from_space_obj), "Should be from this generation"); + if (UseCompressedOops) { + // In the case of compressed oops, we use a private, not-shared + // overflow stack. + par_scan_state->push_on_overflow_stack(from_space_obj); + } else { + // if the object has been forwarded to itself, then we cannot + // use the klass pointer for the linked list. Instead we have + // to allocate an oopDesc in the C-Heap and use that for the linked list. + // XXX This is horribly inefficient when a promotion failure occurs + // and should be fixed. XXX FIX ME !!! #ifndef PRODUCT - Atomic::inc_ptr(&_num_par_pushes); - assert(_num_par_pushes > 0, "Tautology"); + Atomic::inc_ptr(&_num_par_pushes); + assert(_num_par_pushes > 0, "Tautology"); #endif - if (from_space_obj->forwardee() == from_space_obj) { - oopDesc* listhead = NEW_C_HEAP_ARRAY(oopDesc, 1); - listhead->forward_to(from_space_obj); - from_space_obj = listhead; - } - oop observed_overflow_list = _overflow_list; - oop cur_overflow_list; - do { - cur_overflow_list = observed_overflow_list; - if (cur_overflow_list != BUSY) { - from_space_obj->set_klass_to_list_ptr(cur_overflow_list); - } else { - from_space_obj->set_klass_to_list_ptr(NULL); + if (from_space_obj->forwardee() == from_space_obj) { + oopDesc* listhead = NEW_C_HEAP_ARRAY(oopDesc, 1); + listhead->forward_to(from_space_obj); + from_space_obj = listhead; } - observed_overflow_list = - (oop)Atomic::cmpxchg_ptr(from_space_obj, &_overflow_list, cur_overflow_list); - } while (cur_overflow_list != observed_overflow_list); + oop observed_overflow_list = _overflow_list; + oop cur_overflow_list; + do { + cur_overflow_list = observed_overflow_list; + if (cur_overflow_list != BUSY) { + from_space_obj->set_klass_to_list_ptr(cur_overflow_list); + } else { + from_space_obj->set_klass_to_list_ptr(NULL); + } + observed_overflow_list = + (oop)Atomic::cmpxchg_ptr(from_space_obj, &_overflow_list, cur_overflow_list); + } while (cur_overflow_list != observed_overflow_list); + } } +bool ParNewGeneration::take_from_overflow_list(ParScanThreadState* par_scan_state) { + bool res; + + if (UseCompressedOops) { + res = par_scan_state->take_from_overflow_stack(); + } else { + res = take_from_overflow_list_work(par_scan_state); + } + return res; +} + + // *NOTE*: The overflow list manipulation code here and // in CMSCollector:: are very similar in shape, // except that in the CMS case we thread the objects @@ -1213,14 +1298,13 @@ void ParNewGeneration::push_on_overflow_list(oop from_space_obj, ParScanThreadSt // similar changes might be needed. // See CMSCollector::par_take_from_overflow_list() for // more extensive documentation comments. -bool -ParNewGeneration::take_from_overflow_list(ParScanThreadState* par_scan_state) { +bool ParNewGeneration::take_from_overflow_list_work(ParScanThreadState* par_scan_state) { ObjToScanQueue* work_q = par_scan_state->work_queue(); - assert(work_q->size() == 0, "Should first empty local work queue"); // How many to take? - size_t objsFromOverflow = MIN2((size_t)work_q->max_elems()/4, + size_t objsFromOverflow = MIN2((size_t)(work_q->max_elems() - work_q->size())/4, (size_t)ParGCDesiredObjsFromOverflowList); + assert(par_scan_state->overflow_stack() == NULL, "Error"); if (_overflow_list == NULL) return false; // Otherwise, there was something there; try claiming the list. diff --git a/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.hpp b/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.hpp index 51e4c5f39f1..7f0015bd676 100644 --- a/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.hpp +++ b/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.hpp @@ -55,6 +55,7 @@ class ParScanThreadState { friend class ParScanThreadStateSet; private: ObjToScanQueue *_work_queue; + GrowableArray* _overflow_stack; ParGCAllocBuffer _to_space_alloc_buffer; @@ -79,6 +80,9 @@ class ParScanThreadState { Space* _to_space; Space* to_space() { return _to_space; } + ParNewGeneration* _young_gen; + ParNewGeneration* young_gen() const { return _young_gen; } + Generation* _old_gen; Generation* old_gen() { return _old_gen; } @@ -134,6 +138,11 @@ class ParScanThreadState { // Decrease queue size below "max_size". void trim_queues(int max_size); + // Private overflow stack usage + GrowableArray* overflow_stack() { return _overflow_stack; } + bool take_from_overflow_stack(); + void push_on_overflow_stack(oop p); + // Is new_obj a candidate for scan_partial_array_and_push_remainder method. inline bool should_be_partially_scanned(oop new_obj, oop old_obj) const; @@ -378,13 +387,17 @@ class ParNewGeneration: public DefNewGeneration { NOT_PRODUCT(int _overflow_counter;) NOT_PRODUCT(bool should_simulate_overflow();) + // Accessor for overflow list + oop overflow_list() { return _overflow_list; } + // Push the given (from-space) object on the global overflow list. void push_on_overflow_list(oop from_space_obj, ParScanThreadState* par_scan_state); // If the global overflow list is non-empty, move some tasks from it - // onto "work_q" (which must be empty). No more than 1/4 of the - // max_elems of "work_q" are moved. + // onto "work_q" (which need not be empty). No more than 1/4 of the + // available space on "work_q" is used. bool take_from_overflow_list(ParScanThreadState* par_scan_state); + bool take_from_overflow_list_work(ParScanThreadState* par_scan_state); // The task queues to be used by parallel GC threads. ObjToScanQueueSet* task_queues() { diff --git a/hotspot/src/share/vm/runtime/globals.hpp b/hotspot/src/share/vm/runtime/globals.hpp index 2d33287fcd4..b80ec6fbda2 100644 --- a/hotspot/src/share/vm/runtime/globals.hpp +++ b/hotspot/src/share/vm/runtime/globals.hpp @@ -1316,6 +1316,9 @@ class CommandLineFlags { product(intx, ParGCArrayScanChunk, 50, \ "Scan a subset and push remainder, if array is bigger than this") \ \ + product(bool, ParGCTrimOverflow, true, \ + "Eagerly trim the overflow lists (useful for UseCompressedOops") \ + \ notproduct(bool, ParGCWorkQueueOverflowALot, false, \ "Whether we should simulate work queue overflow in ParNew") \ \ From 0c7428a720156bd087c58dae90e34755e952d9bc Mon Sep 17 00:00:00 2001 From: Yuri Nesterenko Date: Mon, 30 Mar 2009 16:33:39 +0400 Subject: [PATCH 219/292] 6823589: Remake sizes.64-solaris-i386 with newly added fields 6782746: Keyboard hotkeys don't work in locales where non latin characters are used 6299348: Zero keycode returned in keyPressed and keyReleased for some keys in non-english layout - Win32 6316369: Provide a method to convert a character to VK_* Java keycode, if possible 6446568: KeyEvent lacks 3 virtual keys of Danish keyboards 6559449: Support for converting from char to KeyEvent VK_ keycode 6182651: Need to identify any key pressed/released with a unique code Various by-products of 6680988 fix. Reviewed-by: art --- .../awt/X11/generator/sizes.64-solaris-i386 | 210 ++++++++++++++++++ 1 file changed, 210 insertions(+) diff --git a/jdk/src/solaris/classes/sun/awt/X11/generator/sizes.64-solaris-i386 b/jdk/src/solaris/classes/sun/awt/X11/generator/sizes.64-solaris-i386 index 29d6603890e..bdeeee25e2f 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/generator/sizes.64-solaris-i386 +++ b/jdk/src/solaris/classes/sun/awt/X11/generator/sizes.64-solaris-i386 @@ -16,10 +16,38 @@ XIMStringConversionCallbackStruct.operation 8 XIMStringConversionCallbackStruct.factor 10 XIMStringConversionCallbackStruct.text 16 XIMStringConversionCallbackStruct 24 +XkbNewKeyboardNotifyEvent.type 0 +XkbNewKeyboardNotifyEvent.serial 8 +XkbNewKeyboardNotifyEvent.send_event 16 +XkbNewKeyboardNotifyEvent.display 24 +XkbNewKeyboardNotifyEvent.time 32 +XkbNewKeyboardNotifyEvent.xkb_type 40 +XkbNewKeyboardNotifyEvent.device 44 +XkbNewKeyboardNotifyEvent.old_device 48 +XkbNewKeyboardNotifyEvent.min_key_code 52 +XkbNewKeyboardNotifyEvent.max_key_code 56 +XkbNewKeyboardNotifyEvent.old_min_key_code 60 +XkbNewKeyboardNotifyEvent.old_max_key_code 64 +XkbNewKeyboardNotifyEvent.changed 68 +XkbNewKeyboardNotifyEvent.req_major 72 +XkbNewKeyboardNotifyEvent.req_minor 73 +XkbNewKeyboardNotifyEvent 80 XTimeCoord.time 0 XTimeCoord.x 8 XTimeCoord.y 10 XTimeCoord 16 +XkbCompatMapNotifyEvent.type 0 +XkbCompatMapNotifyEvent.serial 8 +XkbCompatMapNotifyEvent.send_event 16 +XkbCompatMapNotifyEvent.display 24 +XkbCompatMapNotifyEvent.time 32 +XkbCompatMapNotifyEvent.xkb_type 40 +XkbCompatMapNotifyEvent.device 44 +XkbCompatMapNotifyEvent.changed_groups 48 +XkbCompatMapNotifyEvent.first_si 52 +XkbCompatMapNotifyEvent.num_si 56 +XkbCompatMapNotifyEvent.num_total_si 60 +XkbCompatMapNotifyEvent 64 XIMStatusDrawCallbackStruct.type 0 XIMStatusDrawCallbackStruct.data 8 XIMStatusDrawCallbackStruct 16 @@ -289,6 +317,22 @@ XVisualInfo.blue_mask 48 XVisualInfo.colormap_size 56 XVisualInfo.bits_per_rgb 60 XVisualInfo 64 +XkbControlsNotifyEvent.type 0 +XkbControlsNotifyEvent.serial 8 +XkbControlsNotifyEvent.send_event 16 +XkbControlsNotifyEvent.display 24 +XkbControlsNotifyEvent.time 32 +XkbControlsNotifyEvent.xkb_type 40 +XkbControlsNotifyEvent.device 44 +XkbControlsNotifyEvent.changed_ctrls 48 +XkbControlsNotifyEvent.enabled_ctrls 52 +XkbControlsNotifyEvent.enabled_ctrl_changes 56 +XkbControlsNotifyEvent.num_groups 60 +XkbControlsNotifyEvent.keycode 64 +XkbControlsNotifyEvent.event_type 65 +XkbControlsNotifyEvent.req_major 66 +XkbControlsNotifyEvent.req_minor 67 +XkbControlsNotifyEvent 72 PropMwmHints.flags 0 PropMwmHints.functions 8 PropMwmHints.decorations 16 @@ -310,8 +354,26 @@ XAnyEvent.send_event 16 XAnyEvent.display 24 XAnyEvent.window 32 XAnyEvent 40 +XkbIndicatorNotifyEvent.type 0 +XkbIndicatorNotifyEvent.serial 8 +XkbIndicatorNotifyEvent.send_event 16 +XkbIndicatorNotifyEvent.display 24 +XkbIndicatorNotifyEvent.time 32 +XkbIndicatorNotifyEvent.xkb_type 40 +XkbIndicatorNotifyEvent.device 44 +XkbIndicatorNotifyEvent.changed 48 +XkbIndicatorNotifyEvent.state 52 +XkbIndicatorNotifyEvent 56 XIMPreeditStateNotifyCallbackStruct.state 0 XIMPreeditStateNotifyCallbackStruct 8 +XkbAnyEvent.type 0 +XkbAnyEvent.serial 8 +XkbAnyEvent.send_event 16 +XkbAnyEvent.display 24 +XkbAnyEvent.time 32 +XkbAnyEvent.xkb_type 40 +XkbAnyEvent.device 44 +XkbAnyEvent 48 XMotionEvent.type 0 XMotionEvent.serial 8 XMotionEvent.send_event 16 @@ -334,6 +396,23 @@ XIMHotKeyTriggers 16 XIMStyles.count_styles 0 XIMStyles.supported_styles 8 XIMStyles 16 +XkbExtensionDeviceNotifyEvent.type 0 +XkbExtensionDeviceNotifyEvent.serial 8 +XkbExtensionDeviceNotifyEvent.send_event 16 +XkbExtensionDeviceNotifyEvent.display 24 +XkbExtensionDeviceNotifyEvent.time 32 +XkbExtensionDeviceNotifyEvent.xkb_type 40 +XkbExtensionDeviceNotifyEvent.device 44 +XkbExtensionDeviceNotifyEvent.reason 48 +XkbExtensionDeviceNotifyEvent.supported 52 +XkbExtensionDeviceNotifyEvent.unsupported 56 +XkbExtensionDeviceNotifyEvent.first_btn 60 +XkbExtensionDeviceNotifyEvent.num_btns 64 +XkbExtensionDeviceNotifyEvent.leds_defined 68 +XkbExtensionDeviceNotifyEvent.led_state 72 +XkbExtensionDeviceNotifyEvent.led_class 76 +XkbExtensionDeviceNotifyEvent.led_id 80 +XkbExtensionDeviceNotifyEvent 88 XwcTextItem.chars 0 XwcTextItem.nchars 8 XwcTextItem.delta 12 @@ -419,6 +498,20 @@ XKeyEvent.state 80 XKeyEvent.keycode 84 XKeyEvent.same_screen 88 XKeyEvent 96 +XkbActionMessageEvent.type 0 +XkbActionMessageEvent.serial 8 +XkbActionMessageEvent.send_event 16 +XkbActionMessageEvent.display 24 +XkbActionMessageEvent.time 32 +XkbActionMessageEvent.xkb_type 40 +XkbActionMessageEvent.device 44 +XkbActionMessageEvent.keycode 48 +XkbActionMessageEvent.press 52 +XkbActionMessageEvent.key_event_follows 56 +XkbActionMessageEvent.group 60 +XkbActionMessageEvent.mods 64 +XkbActionMessageEvent.message 68 +XkbActionMessageEvent 80 XdbeSwapInfo.swap_window 0 XdbeSwapInfo.swap_action 8 XdbeSwapInfo 16 @@ -458,6 +551,18 @@ Visual 56 XOMOrientation.num_orientation 0 XOMOrientation.orientation 8 XOMOrientation 16 +XkbAccessXNotifyEvent.type 0 +XkbAccessXNotifyEvent.serial 8 +XkbAccessXNotifyEvent.send_event 16 +XkbAccessXNotifyEvent.display 24 +XkbAccessXNotifyEvent.time 32 +XkbAccessXNotifyEvent.xkb_type 40 +XkbAccessXNotifyEvent.device 44 +XkbAccessXNotifyEvent.detail 48 +XkbAccessXNotifyEvent.keycode 52 +XkbAccessXNotifyEvent.sk_delay 56 +XkbAccessXNotifyEvent.debounce_delay 60 +XkbAccessXNotifyEvent 64 XWindowAttributes.x 0 XWindowAttributes.y 4 XWindowAttributes.width 8 @@ -528,6 +633,33 @@ awtImageData.wsImageFormat 4 awtImageData.clrdata 16 awtImageData.convert 48 awtImageData 560 +XkbStateNotifyEvent.type 0 +XkbStateNotifyEvent.serial 8 +XkbStateNotifyEvent.send_event 16 +XkbStateNotifyEvent.display 24 +XkbStateNotifyEvent.time 32 +XkbStateNotifyEvent.xkb_type 40 +XkbStateNotifyEvent.device 44 +XkbStateNotifyEvent.changed 48 +XkbStateNotifyEvent.group 52 +XkbStateNotifyEvent.base_group 56 +XkbStateNotifyEvent.latched_group 60 +XkbStateNotifyEvent.locked_group 64 +XkbStateNotifyEvent.mods 68 +XkbStateNotifyEvent.base_mods 72 +XkbStateNotifyEvent.latched_mods 76 +XkbStateNotifyEvent.locked_mods 80 +XkbStateNotifyEvent.compat_state 84 +XkbStateNotifyEvent.grab_mods 88 +XkbStateNotifyEvent.compat_grab_mods 89 +XkbStateNotifyEvent.lookup_mods 90 +XkbStateNotifyEvent.compat_lookup_mods 91 +XkbStateNotifyEvent.ptr_buttons 92 +XkbStateNotifyEvent.keycode 96 +XkbStateNotifyEvent.event_type 97 +XkbStateNotifyEvent.req_major 98 +XkbStateNotifyEvent.req_minor 99 +XkbStateNotifyEvent 104 XExposeEvent.type 0 XExposeEvent.serial 8 XExposeEvent.send_event 16 @@ -539,6 +671,33 @@ XExposeEvent.width 48 XExposeEvent.height 52 XExposeEvent.count 56 XExposeEvent 64 +XkbMapNotifyEvent.type 0 +XkbMapNotifyEvent.serial 8 +XkbMapNotifyEvent.send_event 16 +XkbMapNotifyEvent.display 24 +XkbMapNotifyEvent.time 32 +XkbMapNotifyEvent.xkb_type 40 +XkbMapNotifyEvent.device 44 +XkbMapNotifyEvent.changed 48 +XkbMapNotifyEvent.flags 52 +XkbMapNotifyEvent.first_type 56 +XkbMapNotifyEvent.num_types 60 +XkbMapNotifyEvent.min_key_code 64 +XkbMapNotifyEvent.max_key_code 65 +XkbMapNotifyEvent.first_key_sym 66 +XkbMapNotifyEvent.first_key_act 67 +XkbMapNotifyEvent.first_key_behavior 68 +XkbMapNotifyEvent.first_key_explicit 69 +XkbMapNotifyEvent.first_modmap_key 70 +XkbMapNotifyEvent.first_vmodmap_key 71 +XkbMapNotifyEvent.num_key_syms 72 +XkbMapNotifyEvent.num_key_acts 76 +XkbMapNotifyEvent.num_key_behaviors 80 +XkbMapNotifyEvent.num_key_explicit 84 +XkbMapNotifyEvent.num_modmap_keys 88 +XkbMapNotifyEvent.num_vmodmap_keys 92 +XkbMapNotifyEvent.vmods 96 +XkbMapNotifyEvent 104 XGCValues.function 0 XGCValues.plane_mask 8 XGCValues.foreground 16 @@ -583,6 +742,22 @@ XMapEvent.event 32 XMapEvent.window 40 XMapEvent.override_redirect 48 XMapEvent 56 +XkbBellNotifyEvent.type 0 +XkbBellNotifyEvent.serial 8 +XkbBellNotifyEvent.send_event 16 +XkbBellNotifyEvent.display 24 +XkbBellNotifyEvent.time 32 +XkbBellNotifyEvent.xkb_type 40 +XkbBellNotifyEvent.device 44 +XkbBellNotifyEvent.percent 48 +XkbBellNotifyEvent.pitch 52 +XkbBellNotifyEvent.duration 56 +XkbBellNotifyEvent.bell_class 60 +XkbBellNotifyEvent.bell_id 64 +XkbBellNotifyEvent.name 72 +XkbBellNotifyEvent.window 80 +XkbBellNotifyEvent.event_only 88 +XkbBellNotifyEvent 96 XIMStringConversionText.length 0 XIMStringConversionText.feedback 8 XIMStringConversionText.encoding_is_wchar 16 @@ -596,6 +771,21 @@ XKeyboardState.led_mask 16 XKeyboardState.global_auto_repeat 24 XKeyboardState.auto_repeats 28 XKeyboardState 64 +XkbEvent.type 0 +XkbEvent.any 0 +XkbEvent.new_kbd 0 +XkbEvent.map 0 +XkbEvent.state 0 +XkbEvent.ctrls 0 +XkbEvent.indicators 0 +XkbEvent.names 0 +XkbEvent.compat 0 +XkbEvent.bell 0 +XkbEvent.message 0 +XkbEvent.accessx 0 +XkbEvent.device 0 +XkbEvent.core 0 +XkbEvent 192 XPoint.x 0 XPoint.y 2 XPoint 4 @@ -633,6 +823,26 @@ XRectangle.y 2 XRectangle.width 4 XRectangle.height 6 XRectangle 8 +XkbNamesNotifyEvent.type 0 +XkbNamesNotifyEvent.serial 8 +XkbNamesNotifyEvent.send_event 16 +XkbNamesNotifyEvent.display 24 +XkbNamesNotifyEvent.time 32 +XkbNamesNotifyEvent.xkb_type 40 +XkbNamesNotifyEvent.device 44 +XkbNamesNotifyEvent.changed 48 +XkbNamesNotifyEvent.first_type 52 +XkbNamesNotifyEvent.num_types 56 +XkbNamesNotifyEvent.first_lvl 60 +XkbNamesNotifyEvent.num_lvls 64 +XkbNamesNotifyEvent.num_aliases 68 +XkbNamesNotifyEvent.num_radio_groups 72 +XkbNamesNotifyEvent.changed_vmods 76 +XkbNamesNotifyEvent.changed_groups 80 +XkbNamesNotifyEvent.changed_indicators 84 +XkbNamesNotifyEvent.first_key 88 +XkbNamesNotifyEvent.num_keys 92 +XkbNamesNotifyEvent 96 XCreateWindowEvent.type 0 XCreateWindowEvent.serial 8 XCreateWindowEvent.send_event 16 From dcd22838961cc512696c48248cccf03137f0f2b8 Mon Sep 17 00:00:00 2001 From: Jonathan Gibbons Date: Mon, 30 Mar 2009 15:08:09 -0700 Subject: [PATCH 220/292] 6819246: improve support for decoding instructions in classfile library Reviewed-by: ksrini --- .../sun/tools/classfile/Code_attribute.java | 35 + .../com/sun/tools/classfile/Instruction.java | 339 +++++++ .../com/sun/tools/classfile/OpCodes.java | 868 ------------------ .../com/sun/tools/classfile/Opcode.java | 472 ++++++++++ .../com/sun/tools/javap/CodeWriter.java | 293 ++---- 5 files changed, 931 insertions(+), 1076 deletions(-) create mode 100644 langtools/src/share/classes/com/sun/tools/classfile/Instruction.java delete mode 100644 langtools/src/share/classes/com/sun/tools/classfile/OpCodes.java create mode 100644 langtools/src/share/classes/com/sun/tools/classfile/Opcode.java diff --git a/langtools/src/share/classes/com/sun/tools/classfile/Code_attribute.java b/langtools/src/share/classes/com/sun/tools/classfile/Code_attribute.java index b614767b3b4..af1b9fceb69 100644 --- a/langtools/src/share/classes/com/sun/tools/classfile/Code_attribute.java +++ b/langtools/src/share/classes/com/sun/tools/classfile/Code_attribute.java @@ -26,6 +26,8 @@ package com.sun.tools.classfile; import java.io.IOException; +import java.util.Iterator; +import java.util.NoSuchElementException; /** * See JVMS3, section 4.8.3. @@ -100,6 +102,39 @@ public class Code_attribute extends Attribute { return visitor.visitCode(this, data); } + public Iterable getInstructions() { + return new Iterable() { + public Iterator iterator() { + return new Iterator() { + + public boolean hasNext() { + return (next != null); + } + + public Instruction next() { + if (next == null) + throw new NoSuchElementException(); + + current = next; + pc += current.length(); + next = (pc < code.length ? new Instruction(code, pc) : null); + return current; + } + + public void remove() { + throw new UnsupportedOperationException("Not supported."); + } + + Instruction current = null; + int pc = 0; + Instruction next = new Instruction(code, pc); + + }; + } + + }; + } + public final int max_stack; public final int max_locals; public final int code_length; diff --git a/langtools/src/share/classes/com/sun/tools/classfile/Instruction.java b/langtools/src/share/classes/com/sun/tools/classfile/Instruction.java new file mode 100644 index 00000000000..c0a30ba2755 --- /dev/null +++ b/langtools/src/share/classes/com/sun/tools/classfile/Instruction.java @@ -0,0 +1,339 @@ +/* + * Copyright 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. 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. + */ + +package com.sun.tools.classfile; + +/** + * See JVMS3, chapter 6. + * + *

      This is NOT part of any API supported by Sun Microsystems. If + * you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * + * @see Code_attribute#getInstructions + */ +public class Instruction { + /** The kind of an instruction, as determined by the position, size and + * types of its operands. */ + public static enum Kind { + /** Opcode is not followed by any operands. */ + NO_OPERANDS(1), + /** Opcode is followed by a byte indicating a type. */ + ATYPE(2), + /** Opcode is followed by a 2-byte branch offset. */ + BRANCH(3), + /** Opcode is followed by a 4-byte branch offset. */ + BRANCH_W(5), + /** Opcode is followed by a signed byte value. */ + BYTE(2), + /** Opcode is followed by a 1-byte index into the constant pool. */ + CPREF(2), + /** Opcode is followed by a 2-byte index into the constant pool. */ + CPREF_W(3), + /** Opcode is followed by a 2-byte index into the constant pool, + * an unsigned byte value. */ + CPREF_W_UBYTE(4), + /** Opcode is followed by a 2-byte index into the constant pool., + * an unsigned byte value, and a zero byte. */ + CPREF_W_UBYTE_ZERO(5), + /** Opcode is followed by variable number of operands, depending + * on the instruction.*/ + DYNAMIC(-1), + /** Opcode is followed by a 1-byte reference to a local variable. */ + LOCAL(2), + /** Opcode is followed by a 1-byte reference to a local variable, + * and a signed byte value. */ + LOCAL_BYTE(3), + /** Opcode is followed by a signed short value. */ + SHORT(3), + /** Wide opcode is not followed by any operands. */ + WIDE_NO_OPERANDS(2), + /** Wide opcode is followed by a 2-byte index into the constant pool. */ + WIDE_CPREF_W(4), + /** Wide opcode is followed by a 2-byte index into the constant pool, + * and a signed short value. */ + WIDE_CPREF_W_SHORT(6), + /** Opcode was not recognized. */ + UNKNOWN(1); + + Kind(int length) { + this.length = length; + } + + /** The length, in bytes, of this kind of instruction, or -1 is the + * length depends on the specific instruction. */ + public final int length; + }; + + /** A utility visitor to help decode the operands of an instruction. + * @see Instruction#accept */ + public interface KindVisitor { + /** See {@link Kind#NO_OPERANDS}, {@link Kind#WIDE_NO_OPERANDS}. */ + R visitNoOperands(Instruction instr, P p); + /** See {@link Kind#ATYPE}. */ + R visitArrayType(Instruction instr, TypeKind kind, P p); + /** See {@link Kind#BRANCH}, {@link Kind#BRANCH_W}. */ + R visitBranch(Instruction instr, int offset, P p); + /** See {@link Kind#CPREF}, {@link Kind#CPREF_W}, {@link Kind#WIDE_CPREF_W}. */ + R visitConstantPoolRef(Instruction instr, int index, P p); + /** See {@link Kind#CPREF_W_UBYTE}, {@link Kind#CPREF_W_UBYTE_ZERO}, {@link Kind#WIDE_CPREF_W_SHORT}. */ + R visitConstantPoolRefAndValue(Instruction instr, int index, int value, P p); + /** See {@link Kind#LOCAL}. */ + R visitLocal(Instruction instr, int index, P p); + /** See {@link Kind#LOCAL_UBYTE}. */ + R visitLocalAndValue(Instruction instr, int index, int value, P p); + /** See {@link Kind#DYNAMIC}. */ + R visitLookupSwitch(Instruction instr, int default_, int npairs, int[] matches, int[] offsets); + /** See {@link Kind#DYNAMIC}. */ + R visitTableSwitch(Instruction instr, int default_, int low, int high, int[] offsets); + /** See {@link Kind#BYTE}, {@link Kind#SHORT}. */ + R visitValue(Instruction instr, int value, P p); + /** Instruction is unrecognized. */ + R visitUnknown(Instruction instr, P p); + + } + + /** The kind of primitive array type to create. + * See JVMS chapter 6, newarray. */ + public static enum TypeKind { + T_BOOLEAN(4, "boolean"), + T_CHAR(5, "char"), + T_FLOAT(6, "float"), + T_DOUBLE(7, "double"), + T_BYTE(8, "byte"), + T_SHORT(9, "short"), + T_INT (10, "int"), + T_LONG (11, "long"); + TypeKind(int value, String name) { + this.value = value; + this.name = name; + } + + public static TypeKind get(int value) { + switch (value) { + case 4: return T_BOOLEAN; + case 5: return T_CHAR; + case 6: return T_FLOAT; + case 7: return T_DOUBLE; + case 8: return T_BYTE; + case 9: return T_SHORT; + case 10: return T_INT; + case 11: return T_LONG; + default: return null; + } + } + + public final int value; + public final String name; + } + + /** An instruction is defined by its position in a bytecode array. */ + public Instruction(byte[] bytes, int pc) { + this.bytes = bytes; + this.pc = pc; + } + + /** Get the position of the instruction within the bytecode array. */ + public int getPC() { + return pc; + } + + /** Get a byte value, relative to the start of this instruction. */ + public int getByte(int offset) { + return bytes[pc + offset]; + } + + /** Get an unsigned byte value, relative to the start of this instruction. */ + public int getUnsignedByte(int offset) { + return getByte(offset) & 0xff; + } + + /** Get a 2-byte value, relative to the start of this instruction. */ + public int getShort(int offset) { + return (getByte(offset) << 8) | getUnsignedByte(offset + 1); + } + + /** Get a unsigned 2-byte value, relative to the start of this instruction. */ + public int getUnsignedShort(int offset) { + return getShort(offset) & 0xFFFF; + } + + /** Get a 4-byte value, relative to the start of this instruction. */ + public int getInt(int offset) { + return (getShort(offset) << 16) | (getUnsignedShort(offset + 2)); + } + + /** Get the Opcode for this instruction, or null if the instruction is + * unrecognized. */ + public Opcode getOpcode() { + int b = getUnsignedByte(0); + switch (b) { + case Opcode.NONPRIV: + case Opcode.PRIV: + case Opcode.WIDE: + return Opcode.get(b, getUnsignedByte(1)); + } + return Opcode.get(b); + } + + /** Get the mnemonic for this instruction, or a default string if the + * instruction is unrecognized. */ + public String getMnemonic() { + Opcode opcode = getOpcode(); + if (opcode == null) + return "bytecode " + getUnsignedByte(0); + else + return opcode.toString().toLowerCase(); + } + + /** Get the length, in bytes, of this instruction, including the opcode + * and all its operands. */ + public int length() { + Opcode opcode = getOpcode(); + if (opcode == null) + return 1; + + switch (opcode) { + case TABLESWITCH: { + int pad = align(pc + 1) - pc; + int low = getInt(pad + 4); + int high = getInt(pad + 8); + return pad + 12 + 4 * (high - low + 1); + } + case LOOKUPSWITCH: { + int pad = align(pc + 1) - pc; + int npairs = getInt(pad + 4); + return pad + 8 + 8 * npairs; + + } + default: + return opcode.kind.length; + } + } + + /** Get the {@link Kind} of this instruction. */ + public Kind getKind() { + Opcode opcode = getOpcode(); + return (opcode != null ? opcode.kind : Kind.UNKNOWN); + } + + /** Invoke a method on the visitor according to the kind of this + * instruction, passing in the decoded operands for the instruction. */ + public R accept(KindVisitor visitor, P p) { + switch (getKind()) { + case NO_OPERANDS: + return visitor.visitNoOperands(this, p); + + case ATYPE: + return visitor.visitArrayType( + this, TypeKind.get(getUnsignedByte(1)), p); + + case BRANCH: + return visitor.visitBranch(this, getShort(1), p); + + case BRANCH_W: + return visitor.visitBranch(this, getInt(1), p); + + case BYTE: + return visitor.visitValue(this, getByte(1), p); + + case CPREF: + return visitor.visitConstantPoolRef(this, getUnsignedByte(1), p); + + case CPREF_W: + return visitor.visitConstantPoolRef(this, getUnsignedShort(1), p); + + case CPREF_W_UBYTE: + case CPREF_W_UBYTE_ZERO: + return visitor.visitConstantPoolRefAndValue( + this, getUnsignedShort(1), getUnsignedByte(3), p); + + case DYNAMIC: { + switch (getOpcode()) { + case TABLESWITCH: { + int pad = align(pc + 1) - pc; + int default_ = getInt(pad); + int low = getInt(pad + 4); + int high = getInt(pad + 8); + int[] values = new int[high - low + 1]; + for (int i = 0; i < values.length; i++) + values[i] = getInt(pad + 12 + 4 * i); + return visitor.visitTableSwitch( + this, default_, low, high, values); + } + case LOOKUPSWITCH: { + int pad = align(pc + 1) - pc; + int default_ = getInt(pad); + int npairs = getInt(pad + 4); + int[] matches = new int[npairs]; + int[] offsets = new int[npairs]; + for (int i = 0; i < npairs; i++) { + matches[i] = getInt(pad + 8 + i * 8); + offsets[i] = getInt(pad + 12 + i * 8); + } + return visitor.visitLookupSwitch( + this, default_, npairs, matches, offsets); + } + default: + throw new IllegalStateException(); + } + } + + case LOCAL: + return visitor.visitLocal(this, getUnsignedByte(1), p); + + case LOCAL_BYTE: + return visitor.visitLocalAndValue( + this, getUnsignedByte(1), getByte(2), p); + + case SHORT: + return visitor.visitValue(this, getShort(1), p); + + case WIDE_NO_OPERANDS: + return visitor.visitNoOperands(this, p); + + case WIDE_CPREF_W: + return visitor.visitConstantPoolRef(this, getUnsignedShort(2), p); + + case WIDE_CPREF_W_SHORT: + return visitor.visitConstantPoolRefAndValue( + this, getUnsignedShort(2), getUnsignedByte(4), p); + + case UNKNOWN: + return visitor.visitUnknown(this, p); + + default: + throw new IllegalStateException(); + } + } + + private static int align(int n) { + return (n + 3) & ~3; + } + + private byte[] bytes; + private int pc; +} diff --git a/langtools/src/share/classes/com/sun/tools/classfile/OpCodes.java b/langtools/src/share/classes/com/sun/tools/classfile/OpCodes.java deleted file mode 100644 index 12fa7fbedf8..00000000000 --- a/langtools/src/share/classes/com/sun/tools/classfile/OpCodes.java +++ /dev/null @@ -1,868 +0,0 @@ -/* - * Copyright 2007-2008 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. - */ - -package com.sun.tools.classfile; - -import java.util.HashMap; - -/** - * See JVMS3, section 6. - * - *

      This is NOT part of any API supported by Sun Microsystems. If - * you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice. - */ -public class OpCodes { - - public static int opcLength(int opc) throws IllegalArgumentException { - switch (opc >> 8) { - case 0: - return opcLengthsTab[opc]; - case opc_wide: - switch (opc & 0xFF) { - case opc_aload: - case opc_astore: - case opc_fload: - case opc_fstore: - case opc_iload: - case opc_istore: - case opc_lload: - case opc_lstore: - case opc_dload: - case opc_dstore: - case opc_ret: - return 4; - case opc_iinc: - return 6; - default: - throw new IllegalArgumentException(); - } - case opc_nonpriv: - case opc_priv: - return 2; - default: - throw new IllegalArgumentException(); - } - } - - public static String opcName(int opc) { - try { - switch (opc >> 8) { - case 0: - return opcNamesTab[opc]; - case opc_wide: - { - String mnem = opcNamesTab[opc & 0xFF] + "_w"; - if (mnemocodes.get(mnem) == null) { - return null; // non-existent opcode - } - return mnem; - } - case opc_nonpriv: - return opcExtNamesTab[opc & 0xFF]; - case opc_priv: - return opcPrivExtNamesTab[opc & 0xFF]; - default: - return null; - } - } catch (ArrayIndexOutOfBoundsException e) { - switch (opc) { - case opc_nonpriv: - return "nonpriv"; - case opc_priv: - return "priv"; - default: - return null; - } - } - } - - /* Opcodes */ - public static final int opc_dead = -2; - public static final int opc_label = -1; - public static final int opc_nop = 0; - public static final int opc_aconst_null = 1; - public static final int opc_iconst_m1 = 2; - public static final int opc_iconst_0 = 3; - public static final int opc_iconst_1 = 4; - public static final int opc_iconst_2 = 5; - public static final int opc_iconst_3 = 6; - public static final int opc_iconst_4 = 7; - public static final int opc_iconst_5 = 8; - public static final int opc_lconst_0 = 9; - public static final int opc_lconst_1 = 10; - public static final int opc_fconst_0 = 11; - public static final int opc_fconst_1 = 12; - public static final int opc_fconst_2 = 13; - public static final int opc_dconst_0 = 14; - public static final int opc_dconst_1 = 15; - public static final int opc_bipush = 16; - public static final int opc_sipush = 17; - public static final int opc_ldc = 18; - public static final int opc_ldc_w = 19; - public static final int opc_ldc2_w = 20; - public static final int opc_iload = 21; - public static final int opc_lload = 22; - public static final int opc_fload = 23; - public static final int opc_dload = 24; - public static final int opc_aload = 25; - public static final int opc_iload_0 = 26; - public static final int opc_iload_1 = 27; - public static final int opc_iload_2 = 28; - public static final int opc_iload_3 = 29; - public static final int opc_lload_0 = 30; - public static final int opc_lload_1 = 31; - public static final int opc_lload_2 = 32; - public static final int opc_lload_3 = 33; - public static final int opc_fload_0 = 34; - public static final int opc_fload_1 = 35; - public static final int opc_fload_2 = 36; - public static final int opc_fload_3 = 37; - public static final int opc_dload_0 = 38; - public static final int opc_dload_1 = 39; - public static final int opc_dload_2 = 40; - public static final int opc_dload_3 = 41; - public static final int opc_aload_0 = 42; - public static final int opc_aload_1 = 43; - public static final int opc_aload_2 = 44; - public static final int opc_aload_3 = 45; - public static final int opc_iaload = 46; - public static final int opc_laload = 47; - public static final int opc_faload = 48; - public static final int opc_daload = 49; - public static final int opc_aaload = 50; - public static final int opc_baload = 51; - public static final int opc_caload = 52; - public static final int opc_saload = 53; - public static final int opc_istore = 54; - public static final int opc_lstore = 55; - public static final int opc_fstore = 56; - public static final int opc_dstore = 57; - public static final int opc_astore = 58; - public static final int opc_istore_0 = 59; - public static final int opc_istore_1 = 60; - public static final int opc_istore_2 = 61; - public static final int opc_istore_3 = 62; - public static final int opc_lstore_0 = 63; - public static final int opc_lstore_1 = 64; - public static final int opc_lstore_2 = 65; - public static final int opc_lstore_3 = 66; - public static final int opc_fstore_0 = 67; - public static final int opc_fstore_1 = 68; - public static final int opc_fstore_2 = 69; - public static final int opc_fstore_3 = 70; - public static final int opc_dstore_0 = 71; - public static final int opc_dstore_1 = 72; - public static final int opc_dstore_2 = 73; - public static final int opc_dstore_3 = 74; - public static final int opc_astore_0 = 75; - public static final int opc_astore_1 = 76; - public static final int opc_astore_2 = 77; - public static final int opc_astore_3 = 78; - public static final int opc_iastore = 79; - public static final int opc_lastore = 80; - public static final int opc_fastore = 81; - public static final int opc_dastore = 82; - public static final int opc_aastore = 83; - public static final int opc_bastore = 84; - public static final int opc_castore = 85; - public static final int opc_sastore = 86; - public static final int opc_pop = 87; - public static final int opc_pop2 = 88; - public static final int opc_dup = 89; - public static final int opc_dup_x1 = 90; - public static final int opc_dup_x2 = 91; - public static final int opc_dup2 = 92; - public static final int opc_dup2_x1 = 93; - public static final int opc_dup2_x2 = 94; - public static final int opc_swap = 95; - public static final int opc_iadd = 96; - public static final int opc_ladd = 97; - public static final int opc_fadd = 98; - public static final int opc_dadd = 99; - public static final int opc_isub = 100; - public static final int opc_lsub = 101; - public static final int opc_fsub = 102; - public static final int opc_dsub = 103; - public static final int opc_imul = 104; - public static final int opc_lmul = 105; - public static final int opc_fmul = 106; - public static final int opc_dmul = 107; - public static final int opc_idiv = 108; - public static final int opc_ldiv = 109; - public static final int opc_fdiv = 110; - public static final int opc_ddiv = 111; - public static final int opc_irem = 112; - public static final int opc_lrem = 113; - public static final int opc_frem = 114; - public static final int opc_drem = 115; - public static final int opc_ineg = 116; - public static final int opc_lneg = 117; - public static final int opc_fneg = 118; - public static final int opc_dneg = 119; - public static final int opc_ishl = 120; - public static final int opc_lshl = 121; - public static final int opc_ishr = 122; - public static final int opc_lshr = 123; - public static final int opc_iushr = 124; - public static final int opc_lushr = 125; - public static final int opc_iand = 126; - public static final int opc_land = 127; - public static final int opc_ior = 128; - public static final int opc_lor = 129; - public static final int opc_ixor = 130; - public static final int opc_lxor = 131; - public static final int opc_iinc = 132; - public static final int opc_i2l = 133; - public static final int opc_i2f = 134; - public static final int opc_i2d = 135; - public static final int opc_l2i = 136; - public static final int opc_l2f = 137; - public static final int opc_l2d = 138; - public static final int opc_f2i = 139; - public static final int opc_f2l = 140; - public static final int opc_f2d = 141; - public static final int opc_d2i = 142; - public static final int opc_d2l = 143; - public static final int opc_d2f = 144; - public static final int opc_i2b = 145; - public static final int opc_int2byte = 145; - public static final int opc_i2c = 146; - public static final int opc_int2char = 146; - public static final int opc_i2s = 147; - public static final int opc_int2short = 147; - public static final int opc_lcmp = 148; - public static final int opc_fcmpl = 149; - public static final int opc_fcmpg = 150; - public static final int opc_dcmpl = 151; - public static final int opc_dcmpg = 152; - public static final int opc_ifeq = 153; - public static final int opc_ifne = 154; - public static final int opc_iflt = 155; - public static final int opc_ifge = 156; - public static final int opc_ifgt = 157; - public static final int opc_ifle = 158; - public static final int opc_if_icmpeq = 159; - public static final int opc_if_icmpne = 160; - public static final int opc_if_icmplt = 161; - public static final int opc_if_icmpge = 162; - public static final int opc_if_icmpgt = 163; - public static final int opc_if_icmple = 164; - public static final int opc_if_acmpeq = 165; - public static final int opc_if_acmpne = 166; - public static final int opc_goto = 167; - public static final int opc_jsr = 168; - public static final int opc_ret = 169; - public static final int opc_tableswitch = 170; - public static final int opc_lookupswitch = 171; - public static final int opc_ireturn = 172; - public static final int opc_lreturn = 173; - public static final int opc_freturn = 174; - public static final int opc_dreturn = 175; - public static final int opc_areturn = 176; - public static final int opc_return = 177; - public static final int opc_getstatic = 178; - public static final int opc_putstatic = 179; - public static final int opc_getfield = 180; - public static final int opc_putfield = 181; - public static final int opc_invokevirtual = 182; - public static final int opc_invokenonvirtual = 183; - public static final int opc_invokespecial = 183; - public static final int opc_invokestatic = 184; - public static final int opc_invokeinterface = 185; -// public static final int opc_xxxunusedxxx = 186; - public static final int opc_new = 187; - public static final int opc_newarray = 188; - public static final int opc_anewarray = 189; - public static final int opc_arraylength = 190; - public static final int opc_athrow = 191; - public static final int opc_checkcast = 192; - public static final int opc_instanceof = 193; - public static final int opc_monitorenter = 194; - public static final int opc_monitorexit = 195; - public static final int opc_wide = 196; - public static final int opc_multianewarray = 197; - public static final int opc_ifnull = 198; - public static final int opc_ifnonnull = 199; - public static final int opc_goto_w = 200; - public static final int opc_jsr_w = 201; - - /* Pseudo-instructions */ - public static final int opc_bytecode = 203; - public static final int opc_try = 204; - public static final int opc_endtry = 205; - public static final int opc_catch = 206; - public static final int opc_var = 207; - public static final int opc_endvar = 208; - public static final int opc_localsmap = 209; - public static final int opc_stackmap = 210; - - /* PicoJava prefixes */ - public static final int opc_nonpriv = 254; - public static final int opc_priv = 255; - - /* Wide instructions */ - public static final int opc_iload_w = (opc_wide << 8 ) | opc_iload; - public static final int opc_lload_w = (opc_wide << 8 ) | opc_lload; - public static final int opc_fload_w = (opc_wide << 8 ) | opc_fload; - public static final int opc_dload_w = (opc_wide << 8 ) | opc_dload; - public static final int opc_aload_w = (opc_wide << 8 ) | opc_aload; - public static final int opc_istore_w = (opc_wide << 8 ) | opc_istore; - public static final int opc_lstore_w = (opc_wide << 8 ) | opc_lstore; - public static final int opc_fstore_w = (opc_wide << 8 ) | opc_fstore; - public static final int opc_dstore_w = (opc_wide << 8 ) | opc_dstore; - public static final int opc_astore_w = (opc_wide << 8 ) | opc_astore; - public static final int opc_ret_w = (opc_wide << 8 ) | opc_ret; - public static final int opc_iinc_w = (opc_wide << 8 ) | opc_iinc; - - /* Opcode Names */ - private static final String opcNamesTab[] = { - "nop", - "aconst_null", - "iconst_m1", - "iconst_0", - "iconst_1", - "iconst_2", - "iconst_3", - "iconst_4", - "iconst_5", - "lconst_0", - "lconst_1", - "fconst_0", - "fconst_1", - "fconst_2", - "dconst_0", - "dconst_1", - "bipush", - "sipush", - "ldc", - "ldc_w", - "ldc2_w", - "iload", - "lload", - "fload", - "dload", - "aload", - "iload_0", - "iload_1", - "iload_2", - "iload_3", - "lload_0", - "lload_1", - "lload_2", - "lload_3", - "fload_0", - "fload_1", - "fload_2", - "fload_3", - "dload_0", - "dload_1", - "dload_2", - "dload_3", - "aload_0", - "aload_1", - "aload_2", - "aload_3", - "iaload", - "laload", - "faload", - "daload", - "aaload", - "baload", - "caload", - "saload", - "istore", - "lstore", - "fstore", - "dstore", - "astore", - "istore_0", - "istore_1", - "istore_2", - "istore_3", - "lstore_0", - "lstore_1", - "lstore_2", - "lstore_3", - "fstore_0", - "fstore_1", - "fstore_2", - "fstore_3", - "dstore_0", - "dstore_1", - "dstore_2", - "dstore_3", - "astore_0", - "astore_1", - "astore_2", - "astore_3", - "iastore", - "lastore", - "fastore", - "dastore", - "aastore", - "bastore", - "castore", - "sastore", - "pop", - "pop2", - "dup", - "dup_x1", - "dup_x2", - "dup2", - "dup2_x1", - "dup2_x2", - "swap", - "iadd", - "ladd", - "fadd", - "dadd", - "isub", - "lsub", - "fsub", - "dsub", - "imul", - "lmul", - "fmul", - "dmul", - "idiv", - "ldiv", - "fdiv", - "ddiv", - "irem", - "lrem", - "frem", - "drem", - "ineg", - "lneg", - "fneg", - "dneg", - "ishl", - "lshl", - "ishr", - "lshr", - "iushr", - "lushr", - "iand", - "land", - "ior", - "lor", - "ixor", - "lxor", - "iinc", - "i2l", - "i2f", - "i2d", - "l2i", - "l2f", - "l2d", - "f2i", - "f2l", - "f2d", - "d2i", - "d2l", - "d2f", - "i2b", - "i2c", - "i2s", - "lcmp", - "fcmpl", - "fcmpg", - "dcmpl", - "dcmpg", - "ifeq", - "ifne", - "iflt", - "ifge", - "ifgt", - "ifle", - "if_icmpeq", - "if_icmpne", - "if_icmplt", - "if_icmpge", - "if_icmpgt", - "if_icmple", - "if_acmpeq", - "if_acmpne", - "goto", - "jsr", - "ret", - "tableswitch", - "lookupswitch", - "ireturn", - "lreturn", - "freturn", - "dreturn", - "areturn", - "return", - "getstatic", - "putstatic", - "getfield", - "putfield", - "invokevirtual", - "invokespecial", // was "invokenonvirtual", - "invokestatic", - "invokeinterface", - "bytecode 186", //"xxxunusedxxx", - "new", - "newarray", - "anewarray", - "arraylength", - "athrow", - "checkcast", - "instanceof", - "monitorenter", - "monitorexit", - null, // "wide", - "multianewarray", - "ifnull", - "ifnonnull", - "goto_w", - "jsr_w", - "bytecode 202", // "breakpoint", - "bytecode", - "try", - "endtry", - "catch", - "var", - "endvar", - "locals_map", - "stack_map" - }; - - /* Opcode Lengths */ - private static final int opcLengthsTab[] = { - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 2, - 3, - 2, - 3, - 3, - 2, - 2, - 2, - 2, - 2, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 2, - 2, - 2, - 2, - 2, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 3, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 2, - 99, - 99, - 1, - 1, - 1, - 1, - 1, - 1, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 5, - 0, - 3, - 2, - 3, - 1, - 1, - 3, - 3, - 1, - 1, - 0, // wide - 4, - 3, - 3, - 5, - 5, - 1, - 1, 0, 0, 0, 0, 0 // pseudo - }; - - /* Type codes, used in newarray opcode */ - public static final int T_CLASS = 0x00000002; - public static final int T_BOOLEAN = 0x00000004; - public static final int T_CHAR = 0x00000005; - public static final int T_FLOAT = 0x00000006; - public static final int T_DOUBLE = 0x00000007; - public static final int T_BYTE = 0x00000008; - public static final int T_SHORT = 0x00000009; - public static final int T_INT = 0x0000000a; - public static final int T_LONG = 0x0000000b; - - private static HashMap mnemocodes = new HashMap(301, 0.5f); - private static String opcExtNamesTab[]=new String[128]; - private static String opcPrivExtNamesTab[]=new String[128]; - - private static void defineNonPriv(int opc, String mnem) { - mnemocodes.put(opcExtNamesTab[opc] = mnem, opc_nonpriv * 256 + opc); - } - - private static void definePriv(int opc, String mnem) { - mnemocodes.put(opcPrivExtNamesTab[opc] = "priv_" + mnem, opc_priv * 256 + opc); - } - - private static void defineExt(int opc, String mnem) { - defineNonPriv(opc, mnem); - definePriv(opc, mnem); - } - - static { - for (int i = 0; i < opc_wide; i++) { - mnemocodes.put(opcNamesTab[i], i); - } - for (int i = opc_wide + 1; i < opcNamesTab.length; i++) { - mnemocodes.put(opcNamesTab[i], i); - } - mnemocodes.put("invokenonvirtual", opc_invokespecial); - - mnemocodes.put("iload_w", opc_iload_w); - mnemocodes.put("lload_w", opc_lload_w); - mnemocodes.put("fload_w", opc_fload_w); - mnemocodes.put("dload_w", opc_dload_w); - mnemocodes.put("aload_w", opc_aload_w); - mnemocodes.put("istore_w", opc_istore_w); - mnemocodes.put("lstore_w", opc_lstore_w); - mnemocodes.put("fstore_w", opc_fstore_w); - mnemocodes.put("dstore_w", opc_dstore_w); - mnemocodes.put("astore_w", opc_astore_w); - mnemocodes.put("ret_w", opc_ret_w); - mnemocodes.put("iinc_w", opc_iinc_w); - - mnemocodes.put("nonpriv", opc_nonpriv); - mnemocodes.put("priv", opc_priv); - - defineExt(0, "load_ubyte"); - defineExt(1, "load_byte"); - defineExt(2, "load_char"); - defineExt(3, "load_short"); - defineExt(4, "load_word"); - defineExt(10, "load_char_oe"); - defineExt(11, "load_short_oe"); - defineExt(12, "load_word_oe"); - defineExt(16, "ncload_ubyte"); - defineExt(17, "ncload_byte"); - defineExt(18, "ncload_char"); - defineExt(19, "ncload_short"); - defineExt(20, "ncload_word"); - defineExt(26, "ncload_char_oe"); - defineExt(27, "ncload_short_oe"); - defineExt(28, "ncload_word_oe"); - defineExt(30, "cache_flush"); - defineExt(32, "store_byte"); - defineExt(34, "store_short"); - defineExt(36, "store_word"); - defineExt(42, "store_short_oe"); - defineExt(44, "store_word_oe"); - defineExt(48, "ncstore_byte"); - defineExt(50, "ncstore_short"); - defineExt(52, "ncstore_word"); - defineExt(58, "ncstore_short_oe"); - defineExt(60, "ncstore_word_oe"); - defineExt(62, "zero_line"); - defineNonPriv(5, "ret_from_sub"); - defineNonPriv(63, "enter_sync_method"); - definePriv(5, "ret_from_trap"); - definePriv(6, "read_dcache_tag"); - definePriv(7, "read_dcache_data"); - definePriv(14, "read_icache_tag"); - definePriv(15, "read_icache_data"); - definePriv(22, "powerdown"); - definePriv(23, "read_scache_data"); - definePriv(31, "cache_index_flush"); - definePriv(38, "write_dcache_tag"); - definePriv(39, "write_dcache_data"); - definePriv(46, "write_icache_tag"); - definePriv(47, "write_icache_data"); - definePriv(54, "reset"); - definePriv(55, "write_scache_data"); - for (int i = 0; i < 32; i++) { - definePriv(i + 64, "read_reg_" + i); - } - for (int i = 0; i < 32; i++) { - definePriv(i + 96, "write_reg_" + i); - } - } -} diff --git a/langtools/src/share/classes/com/sun/tools/classfile/Opcode.java b/langtools/src/share/classes/com/sun/tools/classfile/Opcode.java new file mode 100644 index 00000000000..562c3876934 --- /dev/null +++ b/langtools/src/share/classes/com/sun/tools/classfile/Opcode.java @@ -0,0 +1,472 @@ +/* + * Copyright 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. 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. + */ + +package com.sun.tools.classfile; + +import static com.sun.tools.classfile.Instruction.Kind.*; +import static com.sun.tools.classfile.Opcode.Set.*; + +/** + * See JVMS3, chapter 6. + * + *

      In addition to providing all the standard opcodes defined in JVMS, + * this class also provides legacy support for the PicoJava extensions. + * + *

      This is NOT part of any API supported by Sun Microsystems. If + * you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + */ +public enum Opcode { + NOP(0x0), + ACONST_NULL(0x1), + ICONST_M1(0x2), + ICONST_0(0x3), + ICONST_1(0x4), + ICONST_2(0x5), + ICONST_3(0x6), + ICONST_4(0x7), + ICONST_5(0x8), + LCONST_0(0x9), + LCONST_1(0xa), + FCONST_0(0xb), + FCONST_1(0xc), + FCONST_2(0xd), + DCONST_0(0xe), + DCONST_1(0xf), + BIPUSH(0x10, BYTE), + SIPUSH(0x11, SHORT), + LDC(0x12, CPREF), + LDC_W(0x13, CPREF_W), + LDC2_W(0x14, CPREF_W), + ILOAD(0x15, LOCAL), + LLOAD(0x16, LOCAL), + FLOAD(0x17, LOCAL), + DLOAD(0x18, LOCAL), + ALOAD(0x19, LOCAL), + ILOAD_0(0x1a), + ILOAD_1(0x1b), + ILOAD_2(0x1c), + ILOAD_3(0x1d), + LLOAD_0(0x1e), + LLOAD_1(0x1f), + LLOAD_2(0x20), + LLOAD_3(0x21), + FLOAD_0(0x22), + FLOAD_1(0x23), + FLOAD_2(0x24), + FLOAD_3(0x25), + DLOAD_0(0x26), + DLOAD_1(0x27), + DLOAD_2(0x28), + DLOAD_3(0x29), + ALOAD_0(0x2a), + ALOAD_1(0x2b), + ALOAD_2(0x2c), + ALOAD_3(0x2d), + IALOAD(0x2e), + LALOAD(0x2f), + FALOAD(0x30), + DALOAD(0x31), + AALOAD(0x32), + BALOAD(0x33), + CALOAD(0x34), + SALOAD(0x35), + ISTORE(0x36, LOCAL), + LSTORE(0x37, LOCAL), + FSTORE(0x38, LOCAL), + DSTORE(0x39, LOCAL), + ASTORE(0x3a, LOCAL), + ISTORE_0(0x3b), + ISTORE_1(0x3c), + ISTORE_2(0x3d), + ISTORE_3(0x3e), + LSTORE_0(0x3f), + LSTORE_1(0x40), + LSTORE_2(0x41), + LSTORE_3(0x42), + FSTORE_0(0x43), + FSTORE_1(0x44), + FSTORE_2(0x45), + FSTORE_3(0x46), + DSTORE_0(0x47), + DSTORE_1(0x48), + DSTORE_2(0x49), + DSTORE_3(0x4a), + ASTORE_0(0x4b), + ASTORE_1(0x4c), + ASTORE_2(0x4d), + ASTORE_3(0x4e), + IASTORE(0x4f), + LASTORE(0x50), + FASTORE(0x51), + DASTORE(0x52), + AASTORE(0x53), + BASTORE(0x54), + CASTORE(0x55), + SASTORE(0x56), + POP(0x57), + POP2(0x58), + DUP(0x59), + DUP_X1(0x5a), + DUP_X2(0x5b), + DUP2(0x5c), + DUP2_X1(0x5d), + DUP2_X2(0x5e), + SWAP(0x5f), + IADD(0x60), + LADD(0x61), + FADD(0x62), + DADD(0x63), + ISUB(0x64), + LSUB(0x65), + FSUB(0x66), + DSUB(0x67), + IMUL(0x68), + LMUL(0x69), + FMUL(0x6a), + DMUL(0x6b), + IDIV(0x6c), + LDIV(0x6d), + FDIV(0x6e), + DDIV(0x6f), + IREM(0x70), + LREM(0x71), + FREM(0x72), + DREM(0x73), + INEG(0x74), + LNEG(0x75), + FNEG(0x76), + DNEG(0x77), + ISHL(0x78), + LSHL(0x79), + ISHR(0x7a), + LSHR(0x7b), + IUSHR(0x7c), + LUSHR(0x7d), + IAND(0x7e), + LAND(0x7f), + IOR(0x80), + LOR(0x81), + IXOR(0x82), + LXOR(0x83), + IINC(0x84, LOCAL_BYTE), + I2L(0x85), + I2F(0x86), + I2D(0x87), + L2I(0x88), + L2F(0x89), + L2D(0x8a), + F2I(0x8b), + F2L(0x8c), + F2D(0x8d), + D2I(0x8e), + D2L(0x8f), + D2F(0x90), + I2B(0x91), + I2C(0x92), + I2S(0x93), + LCMP(0x94), + FCMPL(0x95), + FCMPG(0x96), + DCMPL(0x97), + DCMPG(0x98), + IFEQ(0x99, BRANCH), + IFNE(0x9a, BRANCH), + IFLT(0x9b, BRANCH), + IFGE(0x9c, BRANCH), + IFGT(0x9d, BRANCH), + IFLE(0x9e, BRANCH), + IF_ICMPEQ(0x9f, BRANCH), + IF_ICMPNE(0xa0, BRANCH), + IF_ICMPLT(0xa1, BRANCH), + IF_ICMPGE(0xa2, BRANCH), + IF_ICMPGT(0xa3, BRANCH), + IF_ICMPLE(0xa4, BRANCH), + IF_ACMPEQ(0xa5, BRANCH), + IF_ACMPNE(0xa6, BRANCH), + GOTO(0xa7, BRANCH), + JSR(0xa8, BRANCH), + RET(0xa9, LOCAL), + TABLESWITCH(0xaa, DYNAMIC), + LOOKUPSWITCH(0xab, DYNAMIC), + IRETURN(0xac), + LRETURN(0xad), + FRETURN(0xae), + DRETURN(0xaf), + ARETURN(0xb0), + RETURN(0xb1), + GETSTATIC(0xb2, CPREF_W), + PUTSTATIC(0xb3, CPREF_W), + GETFIELD(0xb4, CPREF_W), + PUTFIELD(0xb5, CPREF_W), + INVOKEVIRTUAL(0xb6, CPREF_W), + INVOKESPECIAL(0xb7, CPREF_W), + INVOKESTATIC(0xb8, CPREF_W), + INVOKEINTERFACE(0xb9, CPREF_W_UBYTE_ZERO), + // unused 0xba + NEW(0xbb, CPREF_W), + NEWARRAY(0xbc, ATYPE), + ANEWARRAY(0xbd, CPREF_W), + ARRAYLENGTH(0xbe), + ATHROW(0xbf), + CHECKCAST(0xc0, CPREF_W), + INSTANCEOF(0xc1, CPREF_W), + MONITORENTER(0xc2), + MONITOREXIT(0xc3), + // wide 0xc4 + MULTIANEWARRAY(0xc5, CPREF_W_UBYTE), + IFNULL(0xc6, BRANCH), + IFNONNULL(0xc7, BRANCH), + GOTO_W(0xc8, BRANCH_W), + JSR_W(0xc9, BRANCH_W), + // impdep 0xfe: PicoJava nonpriv + // impdep 0xff: Picojava priv + + // wide opcodes + ILOAD_W(0xc415, WIDE_CPREF_W), + LLOAD_W(0xc416, WIDE_CPREF_W), + FLOAD_W(0xc417, WIDE_CPREF_W), + DLOAD_W(0xc418, WIDE_CPREF_W), + ALOAD_W(0xc419, WIDE_CPREF_W), + ISTORE_W(0xc436, WIDE_CPREF_W), + LSTORE_W(0xc437, WIDE_CPREF_W), + FSTORE_W(0xc438, WIDE_CPREF_W), + DSTORE_W(0xc439, WIDE_CPREF_W), + ASTORE_W(0xc43a, WIDE_CPREF_W), + IINC_W(0xc484, WIDE_CPREF_W_SHORT), + RET_W(0xc4a9, WIDE_CPREF_W), + + // PicoJava nonpriv instructions + LOAD_UBYTE(PICOJAVA, 0xfe00), + LOAD_BYTE(PICOJAVA, 0xfe01), + LOAD_CHAR(PICOJAVA, 0xfe02), + LOAD_SHORT(PICOJAVA, 0xfe03), + LOAD_WORD(PICOJAVA, 0xfe04), + RET_FROM_SUB(PICOJAVA, 0xfe05), + LOAD_CHAR_OE(PICOJAVA, 0xfe0a), + LOAD_SHORT_OE(PICOJAVA, 0xfe0b), + LOAD_WORD_OE(PICOJAVA, 0xfe0c), + NCLOAD_UBYTE(PICOJAVA, 0xfe10), + NCLOAD_BYTE(PICOJAVA, 0xfe11), + NCLOAD_CHAR(PICOJAVA, 0xfe12), + NCLOAD_SHORT(PICOJAVA, 0xfe13), + NCLOAD_WORD(PICOJAVA, 0xfe14), + NCLOAD_CHAR_OE(PICOJAVA, 0xfe1a), + NCLOAD_SHORT_OE(PICOJAVA, 0xfe1b), + NCLOAD_WORD_OE(PICOJAVA, 0xfe1c), + CACHE_FLUSH(PICOJAVA, 0xfe1e), + STORE_BYTE(PICOJAVA, 0xfe20), + STORE_SHORT(PICOJAVA, 0xfe22), + STORE_WORD(PICOJAVA, 0xfe24), + STORE_SHORT_OE(PICOJAVA, 0xfe2a), + STORE_WORD_OE(PICOJAVA, 0xfe2c), + NCSTORE_BYTE(PICOJAVA, 0xfe30), + NCSTORE_SHORT(PICOJAVA, 0xfe32), + NCSTORE_WORD(PICOJAVA, 0xfe34), + NCSTORE_SHORT_OE(PICOJAVA, 0xfe3a), + NCSTORE_WORD_OE(PICOJAVA, 0xfe3c), + ZERO_LINE(PICOJAVA, 0xfe3e), + ENTER_SYNC_METHOD(PICOJAVA, 0xfe3f), + + // PicoJava priv instructions + PRIV_LOAD_UBYTE(PICOJAVA, 0xff00), + PRIV_LOAD_BYTE(PICOJAVA, 0xff01), + PRIV_LOAD_CHAR(PICOJAVA, 0xff02), + PRIV_LOAD_SHORT(PICOJAVA, 0xff03), + PRIV_LOAD_WORD(PICOJAVA, 0xff04), + PRIV_RET_FROM_TRAP(PICOJAVA, 0xff05), + PRIV_READ_DCACHE_TAG(PICOJAVA, 0xff06), + PRIV_READ_DCACHE_DATA(PICOJAVA, 0xff07), + PRIV_LOAD_CHAR_OE(PICOJAVA, 0xff0a), + PRIV_LOAD_SHORT_OE(PICOJAVA, 0xff0b), + PRIV_LOAD_WORD_OE(PICOJAVA, 0xff0c), + PRIV_READ_ICACHE_TAG(PICOJAVA, 0xff0e), + PRIV_READ_ICACHE_DATA(PICOJAVA, 0xff0f), + PRIV_NCLOAD_UBYTE(PICOJAVA, 0xff10), + PRIV_NCLOAD_BYTE(PICOJAVA, 0xff11), + PRIV_NCLOAD_CHAR(PICOJAVA, 0xff12), + PRIV_NCLOAD_SHORT(PICOJAVA, 0xff13), + PRIV_NCLOAD_WORD(PICOJAVA, 0xff14), + PRIV_POWERDOWN(PICOJAVA, 0xff16), + PRIV_READ_SCACHE_DATA(PICOJAVA, 0xff17), + PRIV_NCLOAD_CHAR_OE(PICOJAVA, 0xff1a), + PRIV_NCLOAD_SHORT_OE(PICOJAVA, 0xff1b), + PRIV_NCLOAD_WORD_OE(PICOJAVA, 0xff1c), + PRIV_CACHE_FLUSH(PICOJAVA, 0xff1e), + PRIV_CACHE_INDEX_FLUSH(PICOJAVA, 0xff1f), + PRIV_STORE_BYTE(PICOJAVA, 0xff20), + PRIV_STORE_SHORT(PICOJAVA, 0xff22), + PRIV_STORE_WORD(PICOJAVA, 0xff24), + PRIV_WRITE_DCACHE_TAG(PICOJAVA, 0xff26), + PRIV_WRITE_DCACHE_DATA(PICOJAVA, 0xff27), + PRIV_STORE_SHORT_OE(PICOJAVA, 0xff2a), + PRIV_STORE_WORD_OE(PICOJAVA, 0xff2c), + PRIV_WRITE_ICACHE_TAG(PICOJAVA, 0xff2e), + PRIV_WRITE_ICACHE_DATA(PICOJAVA, 0xff2f), + PRIV_NCSTORE_BYTE(PICOJAVA, 0xff30), + PRIV_NCSTORE_SHORT(PICOJAVA, 0xff32), + PRIV_NCSTORE_WORD(PICOJAVA, 0xff34), + PRIV_RESET(PICOJAVA, 0xff36), + PRIV_WRITE_SCACHE_DATA(PICOJAVA, 0xff37), + PRIV_NCSTORE_SHORT_OE(PICOJAVA, 0xff3a), + PRIV_NCSTORE_WORD_OE(PICOJAVA, 0xff3c), + PRIV_ZERO_LINE(PICOJAVA, 0xff3e), + PRIV_READ_REG_0(PICOJAVA, 0xff40), + PRIV_READ_REG_1(PICOJAVA, 0xff41), + PRIV_READ_REG_2(PICOJAVA, 0xff42), + PRIV_READ_REG_3(PICOJAVA, 0xff43), + PRIV_READ_REG_4(PICOJAVA, 0xff44), + PRIV_READ_REG_5(PICOJAVA, 0xff45), + PRIV_READ_REG_6(PICOJAVA, 0xff46), + PRIV_READ_REG_7(PICOJAVA, 0xff47), + PRIV_READ_REG_8(PICOJAVA, 0xff48), + PRIV_READ_REG_9(PICOJAVA, 0xff49), + PRIV_READ_REG_10(PICOJAVA, 0xff4a), + PRIV_READ_REG_11(PICOJAVA, 0xff4b), + PRIV_READ_REG_12(PICOJAVA, 0xff4c), + PRIV_READ_REG_13(PICOJAVA, 0xff4d), + PRIV_READ_REG_14(PICOJAVA, 0xff4e), + PRIV_READ_REG_15(PICOJAVA, 0xff4f), + PRIV_READ_REG_16(PICOJAVA, 0xff50), + PRIV_READ_REG_17(PICOJAVA, 0xff51), + PRIV_READ_REG_18(PICOJAVA, 0xff52), + PRIV_READ_REG_19(PICOJAVA, 0xff53), + PRIV_READ_REG_20(PICOJAVA, 0xff54), + PRIV_READ_REG_21(PICOJAVA, 0xff55), + PRIV_READ_REG_22(PICOJAVA, 0xff56), + PRIV_READ_REG_23(PICOJAVA, 0xff57), + PRIV_READ_REG_24(PICOJAVA, 0xff58), + PRIV_READ_REG_25(PICOJAVA, 0xff59), + PRIV_READ_REG_26(PICOJAVA, 0xff5a), + PRIV_READ_REG_27(PICOJAVA, 0xff5b), + PRIV_READ_REG_28(PICOJAVA, 0xff5c), + PRIV_READ_REG_29(PICOJAVA, 0xff5d), + PRIV_READ_REG_30(PICOJAVA, 0xff5e), + PRIV_READ_REG_31(PICOJAVA, 0xff5f), + PRIV_WRITE_REG_0(PICOJAVA, 0xff60), + PRIV_WRITE_REG_1(PICOJAVA, 0xff61), + PRIV_WRITE_REG_2(PICOJAVA, 0xff62), + PRIV_WRITE_REG_3(PICOJAVA, 0xff63), + PRIV_WRITE_REG_4(PICOJAVA, 0xff64), + PRIV_WRITE_REG_5(PICOJAVA, 0xff65), + PRIV_WRITE_REG_6(PICOJAVA, 0xff66), + PRIV_WRITE_REG_7(PICOJAVA, 0xff67), + PRIV_WRITE_REG_8(PICOJAVA, 0xff68), + PRIV_WRITE_REG_9(PICOJAVA, 0xff69), + PRIV_WRITE_REG_10(PICOJAVA, 0xff6a), + PRIV_WRITE_REG_11(PICOJAVA, 0xff6b), + PRIV_WRITE_REG_12(PICOJAVA, 0xff6c), + PRIV_WRITE_REG_13(PICOJAVA, 0xff6d), + PRIV_WRITE_REG_14(PICOJAVA, 0xff6e), + PRIV_WRITE_REG_15(PICOJAVA, 0xff6f), + PRIV_WRITE_REG_16(PICOJAVA, 0xff70), + PRIV_WRITE_REG_17(PICOJAVA, 0xff71), + PRIV_WRITE_REG_18(PICOJAVA, 0xff72), + PRIV_WRITE_REG_19(PICOJAVA, 0xff73), + PRIV_WRITE_REG_20(PICOJAVA, 0xff74), + PRIV_WRITE_REG_21(PICOJAVA, 0xff75), + PRIV_WRITE_REG_22(PICOJAVA, 0xff76), + PRIV_WRITE_REG_23(PICOJAVA, 0xff77), + PRIV_WRITE_REG_24(PICOJAVA, 0xff78), + PRIV_WRITE_REG_25(PICOJAVA, 0xff79), + PRIV_WRITE_REG_26(PICOJAVA, 0xff7a), + PRIV_WRITE_REG_27(PICOJAVA, 0xff7b), + PRIV_WRITE_REG_28(PICOJAVA, 0xff7c), + PRIV_WRITE_REG_29(PICOJAVA, 0xff7d), + PRIV_WRITE_REG_30(PICOJAVA, 0xff7e), + PRIV_WRITE_REG_31(PICOJAVA, 0xff7f); + + Opcode(int opcode) { + this(STANDARD, opcode, NO_OPERANDS); + } + + Opcode(int opcode, Instruction.Kind kind) { + this(STANDARD, opcode, kind); + } + + Opcode(Set set, int opcode) { + this(set, opcode, (set == STANDARD ? NO_OPERANDS : WIDE_NO_OPERANDS)); + } + + Opcode(Set set, int opcode, Instruction.Kind kind) { + this.set = set; + this.opcode = opcode; + this.kind = kind; + } + + public final Set set; + public final int opcode; + public final Instruction.Kind kind; + + /** Get the Opcode for a simple standard 1-byte opcode. */ + public static Opcode get(int opcode) { + return stdOpcodes[opcode]; + } + + /** Get the Opcode for 1- or 2-byte opcode. */ + public static Opcode get(int opcodePrefix, int opcode) { + Opcode[] block = getOpcodeBlock(opcodePrefix); + return (block == null ? null : block[opcode]); + } + + private static Opcode[] getOpcodeBlock(int opcodePrefix) { + switch (opcodePrefix) { + case 0: + return stdOpcodes; + case WIDE: + return wideOpcodes; + case NONPRIV: + return nonPrivOpcodes; + case PRIV: + return privOpcodes; + default: + return null; + } + + } + + private static Opcode[] stdOpcodes = new Opcode[256]; + private static Opcode[] wideOpcodes = new Opcode[256]; + private static Opcode[] nonPrivOpcodes = new Opcode[256]; + private static Opcode[] privOpcodes = new Opcode[256]; + static { + for (Opcode o: values()) + getOpcodeBlock(o.opcode >> 8)[o.opcode & 0xff] = o; + } + + /** The byte prefix for the wide instructions. */ + public static final int WIDE = 0xc4; + /** The byte prefix for the PicoJava nonpriv instructions. */ + public static final int NONPRIV = 0xfe; + /** The byte prefix for the PicoJava priv instructions. */ + public static final int PRIV = 0xff; + + public enum Set { + /** Standard opcodes. */ + STANDARD, + /** Legacy support for PicoJava opcodes. */ + PICOJAVA }; +} diff --git a/langtools/src/share/classes/com/sun/tools/javap/CodeWriter.java b/langtools/src/share/classes/com/sun/tools/javap/CodeWriter.java index 25b7330a0e1..e1dc8bd97a1 100644 --- a/langtools/src/share/classes/com/sun/tools/javap/CodeWriter.java +++ b/langtools/src/share/classes/com/sun/tools/javap/CodeWriter.java @@ -30,9 +30,12 @@ import com.sun.tools.classfile.Code_attribute; import com.sun.tools.classfile.ConstantPool; import com.sun.tools.classfile.ConstantPoolException; import com.sun.tools.classfile.DescriptorException; +import com.sun.tools.classfile.Instruction; +import com.sun.tools.classfile.Instruction.TypeKind; import com.sun.tools.classfile.Method; +import com.sun.tools.classfile.Opcode; -import static com.sun.tools.classfile.OpCodes.*; +//import static com.sun.tools.classfile.OpCodes.*; /* * Write the contents of a Code attribute. @@ -87,218 +90,92 @@ class CodeWriter extends BasicWriter { } public void writeInstrs(Code_attribute attr) { - try { - for (int pc = 0; pc < attr.code_length;) { - print(" " + pc + ":\t"); - pc += writeInstr(attr, pc); - println(); + for (Instruction instr: attr.getInstructions()) { + try { + writeInstr(instr); + } catch (ArrayIndexOutOfBoundsException e) { + println(report("error at or after byte " + instr.getPC())); + break; } - } catch (Code_attribute.InvalidIndex e) { - println(report(e)); } } - public int writeInstr(Code_attribute attr, int pc) - throws Code_attribute.InvalidIndex { - String lP = ""; - int opcode = attr.getUnsignedByte(pc); - int opcode2; - String mnem; - switch (opcode) { - case opc_nonpriv: - case opc_priv: { - opcode2 = attr.getUnsignedByte(pc + 1); - mnem = opcName((opcode << 8) + opcode2); - if (mnem == null) { - mnem = opcName(opcode) + " " + opcode2; - } - print(mnem); - return 2; - } - case opc_wide: { - opcode2 = attr.getUnsignedByte(pc + 1); - mnem = opcName((opcode << 8) + opcode2); - if (mnem == null) { - print("bytecode " + opcode); - return 1; - } - print(mnem + " " + attr.getUnsignedShort(pc + 2)); - if (opcode2 == opc_iinc) { - print(", " + attr.getShort(pc + 4)); - return 6; - } - return 4; - } - } - mnem = opcName(opcode); - if (mnem == null) { - print("bytecode " + opcode); - return 1; - } - if (opcode > opc_jsr_w) { - print("bytecode " + opcode); - return 1; - } - print(opcName(opcode)); - switch (opcode) { - case opc_aload: - case opc_astore: - case opc_fload: - case opc_fstore: - case opc_iload: - case opc_istore: - case opc_lload: - case opc_lstore: - case opc_dload: - case opc_dstore: - case opc_ret: - print("\t" + attr.getUnsignedByte(pc + 1)); - return 2; - case opc_iinc: - print("\t" + attr.getUnsignedByte(pc + 1) + ", " + attr.getByte(pc + 2)); - return 3; - case opc_tableswitch: - { - int tb = align(pc + 1); - int default_skip = attr.getInt(tb); - int low = attr.getInt(tb + 4); - int high = attr.getInt(tb + 8); - int count = high - low; - print("{ //" + low + " to " + high); - for (int i = 0; i <= count; i++) { - print("\n\t\t" + (i + low) + ": " + lP + (pc + attr.getInt(tb + 12 + 4 * i)) + ";"); - } - print("\n\t\tdefault: " + lP + (default_skip + pc) + " }"); - return tb - pc + 16 + count * 4; - } - case opc_lookupswitch: - { - int tb = align(pc + 1); - int default_skip = attr.getInt(tb); - int npairs = attr.getInt(tb + 4); - print("{ //" + npairs); - for (int i = 1; i <= npairs; i++) { - print("\n\t\t" + attr.getInt(tb + i * 8) + ": " + lP + (pc + attr.getInt(tb + 4 + i * 8)) + ";"); - } - print("\n\t\tdefault: " + lP + (default_skip + pc) + " }"); - return tb - pc + (npairs + 1) * 8; - } - case opc_newarray: - int type = attr.getUnsignedByte(pc + 1); - switch (type) { - case T_BOOLEAN: - print(" boolean"); - break; - case T_BYTE: - print(" byte"); - break; - case T_CHAR: - print(" char"); - break; - case T_SHORT: - print(" short"); - break; - case T_INT: - print(" int"); - break; - case T_LONG: - print(" long"); - break; - case T_FLOAT: - print(" float"); - break; - case T_DOUBLE: - print(" double"); - break; - case T_CLASS: - print(" class"); - break; - default: - print(" BOGUS TYPE:" + type); - } - return 2; - case opc_anewarray: - { - int index = attr.getUnsignedShort(pc + 1); - print("\t#" + index + "; //"); - printConstant(index); - return 3; - } - case opc_sipush: - print("\t" + attr.getShort(pc + 1)); - return 3; - case opc_bipush: - print("\t" + attr.getByte(pc + 1)); - return 2; - case opc_ldc: - { - int index = attr.getUnsignedByte(pc + 1); - print("\t#" + index + "; //"); - printConstant(index); - return 2; - } - case opc_ldc_w: - case opc_ldc2_w: - case opc_instanceof: - case opc_checkcast: - case opc_new: - case opc_putstatic: - case opc_getstatic: - case opc_putfield: - case opc_getfield: - case opc_invokevirtual: - case opc_invokespecial: - case opc_invokestatic: - { - int index = attr.getUnsignedShort(pc + 1); - print("\t#" + index + "; //"); - printConstant(index); - return 3; - } - case opc_invokeinterface: - { - int index = attr.getUnsignedShort(pc + 1); - int nargs = attr.getUnsignedByte(pc + 3); - print("\t#" + index + ", " + nargs + "; //"); - printConstant(index); - return 5; - } - case opc_multianewarray: - { - int index = attr.getUnsignedShort(pc + 1); - int dimensions = attr.getUnsignedByte(pc + 3); - print("\t#" + index + ", " + dimensions + "; //"); - printConstant(index); - return 4; - } - case opc_jsr: - case opc_goto: - case opc_ifeq: - case opc_ifge: - case opc_ifgt: - case opc_ifle: - case opc_iflt: - case opc_ifne: - case opc_if_icmpeq: - case opc_if_icmpne: - case opc_if_icmpge: - case opc_if_icmpgt: - case opc_if_icmple: - case opc_if_icmplt: - case opc_if_acmpeq: - case opc_if_acmpne: - case opc_ifnull: - case opc_ifnonnull: - print("\t" + lP + (pc + attr.getShort(pc + 1))); - return 3; - case opc_jsr_w: - case opc_goto_w: - print("\t" + lP + (pc + attr.getInt(pc + 1))); - return 5; - default: - return 1; - } + public void writeInstr(Instruction instr) { + print(" " + instr.getPC() + ":\t"); + print(instr.getMnemonic()); + instr.accept(instructionPrinter, null); + println(); } + // where + Instruction.KindVisitor instructionPrinter = + new Instruction.KindVisitor() { + + public Void visitNoOperands(Instruction instr, Void p) { + return null; + } + + public Void visitArrayType(Instruction instr, TypeKind kind, Void p) { + print(" " + kind.name); + return null; + } + + public Void visitBranch(Instruction instr, int offset, Void p) { + print("\t" + (instr.getPC() + offset)); + return null; + } + + public Void visitConstantPoolRef(Instruction instr, int index, Void p) { + print("\t#" + index + "; //"); + printConstant(index); + return null; + } + + public Void visitConstantPoolRefAndValue(Instruction instr, int index, int value, Void p) { + print("\t#" + index + ", " + value + "; //"); + printConstant(index); + return null; + } + + public Void visitLocal(Instruction instr, int index, Void p) { + print("\t" + index); + return null; + } + + public Void visitLocalAndValue(Instruction instr, int index, int value, Void p) { + print("\t" + index + ", " + value); + return null; + } + + public Void visitLookupSwitch(Instruction instr, int default_, int npairs, int[] matches, int[] offsets) { + int pc = instr.getPC(); + print("{ //" + npairs); + for (int i = 0; i < npairs; i++) { + print("\n\t\t" + matches[i] + ": " + (pc + offsets[i]) + ";"); + } + print("\n\t\tdefault: " + (pc + default_) + " }"); + return null; + } + + public Void visitTableSwitch(Instruction instr, int default_, int low, int high, int[] offsets) { + int pc = instr.getPC(); + print("{ //" + low + " to " + high); + for (int i = 0; i < offsets.length; i++) { + print("\n\t\t" + (low + i) + ": " + (pc + offsets[i]) + ";"); + } + print("\n\t\tdefault: " + (pc + default_) + " }"); + return null; + } + + public Void visitValue(Instruction instr, int value, Void p) { + print("\t" + value); + return null; + } + + public Void visitUnknown(Instruction instr, Void p) { + return null; + } + }; + public void writeExceptionTable(Code_attribute attr) { if (attr.exception_table_langth > 0) { From 705188bb7b441bde57dad82910e0d47da1e9ca7c Mon Sep 17 00:00:00 2001 From: Vladimir Kozlov Date: Mon, 30 Mar 2009 18:19:31 -0700 Subject: [PATCH 221/292] 6821700: tune VM flags for peak performance Tune C2 flags default values for performance. Reviewed-by: never, phh, iveresov, jmasa, ysr --- hotspot/src/cpu/sparc/vm/globals_sparc.hpp | 1 + hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp | 14 +++++++++----- hotspot/src/cpu/x86/vm/globals_x86.hpp | 1 + hotspot/src/share/vm/classfile/vmSymbols.hpp | 2 ++ hotspot/src/share/vm/opto/bytecodeInfo.cpp | 8 ++++++++ hotspot/src/share/vm/runtime/globals.hpp | 3 ++- 6 files changed, 23 insertions(+), 6 deletions(-) diff --git a/hotspot/src/cpu/sparc/vm/globals_sparc.hpp b/hotspot/src/cpu/sparc/vm/globals_sparc.hpp index 9d1bd7ac26f..98b3230ec7b 100644 --- a/hotspot/src/cpu/sparc/vm/globals_sparc.hpp +++ b/hotspot/src/cpu/sparc/vm/globals_sparc.hpp @@ -46,6 +46,7 @@ define_pd_global(uintx, TLABSize, 0); define_pd_global(uintx, NewSize, ScaleForWordSize((2048 * K) + (2 * (64 * K)))); define_pd_global(intx, SurvivorRatio, 8); define_pd_global(intx, InlineFrequencyCount, 50); // we can use more inlining on the SPARC +define_pd_global(intx, InlineSmallCode, 1500); #ifdef _LP64 // Stack slots are 2X larger in LP64 than in the 32 bit VM. define_pd_global(intx, ThreadStackSize, 1024); diff --git a/hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp b/hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp index dc7f6b5bdbe..17666c0a7fc 100644 --- a/hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp +++ b/hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp @@ -62,7 +62,7 @@ void VM_Version::initialize() { if (is_niagara1()) { // Indirect branch is the same cost as direct if (FLAG_IS_DEFAULT(UseInlineCaches)) { - UseInlineCaches = false; + FLAG_SET_DEFAULT(UseInlineCaches, false); } #ifdef _LP64 // Single issue niagara1 is slower for CompressedOops @@ -79,15 +79,19 @@ void VM_Version::initialize() { #ifdef COMPILER2 // Indirect branch is the same cost as direct if (FLAG_IS_DEFAULT(UseJumpTables)) { - UseJumpTables = true; + FLAG_SET_DEFAULT(UseJumpTables, true); } // Single-issue, so entry and loop tops are // aligned on a single instruction boundary if (FLAG_IS_DEFAULT(InteriorEntryAlignment)) { - InteriorEntryAlignment = 4; + FLAG_SET_DEFAULT(InteriorEntryAlignment, 4); } if (FLAG_IS_DEFAULT(OptoLoopAlignment)) { - OptoLoopAlignment = 4; + FLAG_SET_DEFAULT(OptoLoopAlignment, 4); + } + if (is_niagara1_plus() && FLAG_IS_DEFAULT(AllocatePrefetchDistance)) { + // Use smaller prefetch distance on N2 + FLAG_SET_DEFAULT(AllocatePrefetchDistance, 256); } #endif } @@ -95,7 +99,7 @@ void VM_Version::initialize() { // Use hardware population count instruction if available. if (has_hardware_popc()) { if (FLAG_IS_DEFAULT(UsePopCountInstruction)) { - UsePopCountInstruction = true; + FLAG_SET_DEFAULT(UsePopCountInstruction, true); } } diff --git a/hotspot/src/cpu/x86/vm/globals_x86.hpp b/hotspot/src/cpu/x86/vm/globals_x86.hpp index 67f27d68125..9d6d0292eab 100644 --- a/hotspot/src/cpu/x86/vm/globals_x86.hpp +++ b/hotspot/src/cpu/x86/vm/globals_x86.hpp @@ -60,6 +60,7 @@ define_pd_global(uintx, NewSize, 1024 * K); define_pd_global(intx, StackShadowPages, 3 DEBUG_ONLY(+1)); #endif // AMD64 define_pd_global(intx, InlineFrequencyCount, 100); +define_pd_global(intx, InlineSmallCode, 1000); define_pd_global(intx, PreInflateSpin, 10); define_pd_global(intx, StackYellowPages, 2); diff --git a/hotspot/src/share/vm/classfile/vmSymbols.hpp b/hotspot/src/share/vm/classfile/vmSymbols.hpp index 1d5b68f0da6..4678ba95175 100644 --- a/hotspot/src/share/vm/classfile/vmSymbols.hpp +++ b/hotspot/src/share/vm/classfile/vmSymbols.hpp @@ -50,6 +50,7 @@ template(java_lang_Class, "java/lang/Class") \ template(java_lang_String, "java/lang/String") \ template(java_lang_StringValue, "java/lang/StringValue") \ + template(java_lang_StringCache, "java/lang/StringValue$StringCache") \ template(java_lang_Thread, "java/lang/Thread") \ template(java_lang_ThreadGroup, "java/lang/ThreadGroup") \ template(java_lang_Cloneable, "java/lang/Cloneable") \ @@ -286,6 +287,7 @@ template(frontCacheEnabled_name, "frontCacheEnabled") \ template(stringCacheEnabled_name, "stringCacheEnabled") \ template(bitCount_name, "bitCount") \ + template(profile_name, "profile") \ \ /* non-intrinsic name/signature pairs: */ \ template(register_method_name, "register") \ diff --git a/hotspot/src/share/vm/opto/bytecodeInfo.cpp b/hotspot/src/share/vm/opto/bytecodeInfo.cpp index 38623fd5f76..a66c873e282 100644 --- a/hotspot/src/share/vm/opto/bytecodeInfo.cpp +++ b/hotspot/src/share/vm/opto/bytecodeInfo.cpp @@ -232,6 +232,14 @@ const char* InlineTree::shouldNotInline(ciMethod *callee_method, ciMethod* calle return "disallowed by CompilerOracle"; } + if (UseStringCache) { + // Do not inline StringCache::profile() method used only at the beginning. + if (callee_method->name() == ciSymbol::profile_name() && + callee_method->holder()->name() == ciSymbol::java_lang_StringCache()) { + return "profiling method"; + } + } + return NULL; } diff --git a/hotspot/src/share/vm/runtime/globals.hpp b/hotspot/src/share/vm/runtime/globals.hpp index 2d33287fcd4..9af4074d76f 100644 --- a/hotspot/src/share/vm/runtime/globals.hpp +++ b/hotspot/src/share/vm/runtime/globals.hpp @@ -47,6 +47,7 @@ define_pd_global(intx, Tier4BackEdgeThreshold, 0); define_pd_global(intx, OnStackReplacePercentage, 0); define_pd_global(bool, ResizeTLAB, false); define_pd_global(intx, FreqInlineSize, 0); +define_pd_global(intx, InlineSmallCode, 0); define_pd_global(intx, NewSizeThreadIncrease, 4*K); define_pd_global(intx, NewRatio, 4); define_pd_global(intx, InlineClassNatives, true); @@ -2616,7 +2617,7 @@ class CommandLineFlags { develop(intx, MaxRecursiveInlineLevel, 1, \ "maximum number of nested recursive calls that are inlined") \ \ - product(intx, InlineSmallCode, 1000, \ + product_pd(intx, InlineSmallCode, \ "Only inline already compiled methods if their code size is " \ "less than this") \ \ From f38ce53536937901e06d2f7725eaae79bd4ed482 Mon Sep 17 00:00:00 2001 From: Andrew John Hughes Date: Tue, 31 Mar 2009 18:47:31 +0400 Subject: [PATCH 222/292] 6819601: Fix AWT JTReg tests which fail to compile Fix compilation of tests. Reviewed-by: anthony, son --- .../isLightweightCrash/StubPeerCrash.java | 2 +- .../awt/EventQueue/6638195/bug6638195.java | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/jdk/test/java/awt/Component/isLightweightCrash/StubPeerCrash.java b/jdk/test/java/awt/Component/isLightweightCrash/StubPeerCrash.java index 20f6145e320..5cde4aacb90 100644 --- a/jdk/test/java/awt/Component/isLightweightCrash/StubPeerCrash.java +++ b/jdk/test/java/awt/Component/isLightweightCrash/StubPeerCrash.java @@ -118,7 +118,7 @@ class StubComponentPeer implements ComponentPeer { public boolean handlesWheelScrolling(){return true;}; public void createBuffers(int numBuffers, BufferCapabilities caps) throws AWTException{}; public Image getBackBuffer(){return null;}; - public void flip(BufferCapabilities.FlipContents flipAction){}; + public void flip(int x1, int y1, int x2, int y2, BufferCapabilities.FlipContents flipAction){}; public void destroyBuffers(){}; /** diff --git a/jdk/test/java/awt/EventQueue/6638195/bug6638195.java b/jdk/test/java/awt/EventQueue/6638195/bug6638195.java index b1109967071..9dc3b50b973 100644 --- a/jdk/test/java/awt/EventQueue/6638195/bug6638195.java +++ b/jdk/test/java/awt/EventQueue/6638195/bug6638195.java @@ -76,8 +76,13 @@ public class bug6638195 { Callable afterDispatchCallable = new Callable() { public Void call() { - delegate.afterDispatch(afterDispatchEventArgument[0], - afterDispatchHandleArgument[0]); + try { + delegate.afterDispatch(afterDispatchEventArgument[0], + afterDispatchHandleArgument[0]); + } + catch (InterruptedException e) { + throw new RuntimeException("afterDispatch interrupted", e); + } return null; } }; @@ -91,8 +96,13 @@ public class bug6638195 { Callable beforeDispatchCallable = new Callable() { public Object call() { - return delegate.beforeDispatch( - beforeDispatchEventArgument[0]); + try { + return delegate.beforeDispatch( + beforeDispatchEventArgument[0]); + } + catch (InterruptedException e) { + throw new RuntimeException("beforeDispatch interrupted", e); + } } }; methodMap = new HashMap(); From 681d2163323096049bc82f46d0c508a6ffb3ef83 Mon Sep 17 00:00:00 2001 From: Jonathan Gibbons Date: Tue, 31 Mar 2009 11:07:55 -0700 Subject: [PATCH 223/292] 6817950: refactor ClassReader to improve attribute handling Reviewed-by: mcimadamore --- .../com/sun/tools/javac/jvm/ClassFile.java | 17 +- .../com/sun/tools/javac/jvm/ClassReader.java | 416 ++++++++++++------ 2 files changed, 296 insertions(+), 137 deletions(-) diff --git a/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassFile.java b/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassFile.java index 247b0e183b0..c560ccbc86a 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassFile.java +++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassFile.java @@ -25,8 +25,9 @@ package com.sun.tools.javac.jvm; -import com.sun.tools.javac.code.*; -import com.sun.tools.javac.util.*; +import com.sun.tools.javac.code.Type; +import com.sun.tools.javac.util.Name; + /** A JVM class file. * @@ -86,6 +87,18 @@ public class ClassFile { public final static int MAX_LOCALS = 0xffff; public final static int MAX_STACK = 0xffff; + public enum Version { + V45_3(45, 3), // base level for all attributes + V49(49, 0), // JDK 1.5: enum, generics, annotations + V50(50, 0), // JDK 1.6: stackmaps + V51(51, 0); // JDK 1.7 + Version(int major, int minor) { + this.major = major; + this.minor = minor; + } + public final int major, minor; + } + /************************************************************************ * String Translation Routines diff --git a/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java b/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java index 72953f4b5fe..263ca3c0b0a 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java +++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java @@ -35,8 +35,11 @@ import java.util.Set; import javax.lang.model.SourceVersion; import javax.tools.JavaFileObject; import javax.tools.JavaFileManager; +import javax.tools.JavaFileManager.Location; import javax.tools.StandardJavaFileManager; +import static javax.tools.StandardLocation.*; + import com.sun.tools.javac.comp.Annotate; import com.sun.tools.javac.code.*; import com.sun.tools.javac.code.Type.*; @@ -49,9 +52,8 @@ import com.sun.tools.javac.util.List; import static com.sun.tools.javac.code.Flags.*; import static com.sun.tools.javac.code.Kinds.*; import static com.sun.tools.javac.code.TypeTags.*; -import com.sun.tools.javac.jvm.ClassFile.NameAndType; -import javax.tools.JavaFileManager.Location; -import static javax.tools.StandardLocation.*; +import static com.sun.tools.javac.jvm.ClassFile.*; +import static com.sun.tools.javac.jvm.ClassFile.Version.*; /** This class provides operations to read a classfile into an internal * representation. The internal representation is anchored in a @@ -64,7 +66,7 @@ import static javax.tools.StandardLocation.*; * This code and its internal interfaces are subject to change or * deletion without notice. */ -public class ClassReader extends ClassFile implements Completer { +public class ClassReader implements Completer { /** The context key for the class reader. */ protected static final Context.Key classReaderKey = new Context.Key(); @@ -180,6 +182,11 @@ public class ClassReader extends ClassFile implements Completer { */ int[] poolIdx; + /** The major version number of the class file being read. */ + int majorVersion; + /** The minor version number of the class file being read. */ + int minorVersion; + /** Get the ClassReader instance for this invocation. */ public static ClassReader instance(Context context) { ClassReader instance = context.get(classReaderKey); @@ -249,6 +256,8 @@ public class ClassReader extends ClassFile implements Completer { : null; typevars = new Scope(syms.noSymbol); + + initAttributeReaders(); } /** Add member to class unless it is synthetic. @@ -655,6 +664,7 @@ public class ClassReader extends ClassFile implements Completer { sbp - startSbp)); outer = new ClassType(outer, sigToTypes('>'), t) { boolean completed = false; + @Override public Type getEnclosingType() { if (!completed) { completed = true; @@ -679,6 +689,7 @@ public class ClassReader extends ClassFile implements Completer { } return super.getEnclosingType(); } + @Override public void setEnclosingType(Type outer) { throw new UnsupportedOperationException(); } @@ -822,6 +833,246 @@ public class ClassReader extends ClassFile implements Completer { * Reading Attributes ***********************************************************************/ + protected enum AttributeKind { CLASS, MEMBER }; + protected abstract class AttributeReader { + AttributeReader(Name name, Version version, Set kinds) { + this.name = name; + this.version = version; + this.kinds = kinds; + } + + boolean accepts(AttributeKind kind) { + return kinds.contains(kind) && majorVersion >= version.major; + } + + abstract void read(Symbol sym, int attrLen); + + final Name name; + final Version version; + final Set kinds; + } + + protected Set CLASS_ATTRIBUTE = + EnumSet.of(AttributeKind.CLASS); + protected Set MEMBER_ATTRIBUTE = + EnumSet.of(AttributeKind.MEMBER); + protected Set CLASS_OR_MEMBER_ATTRIBUTE = + EnumSet.of(AttributeKind.CLASS, AttributeKind.MEMBER); + + protected Map attributeReaders = new HashMap(); + + protected void initAttributeReaders() { + AttributeReader[] readers = { + // v45.3 attributes + + new AttributeReader(names.Code, V45_3, MEMBER_ATTRIBUTE) { + void read(Symbol sym, int attrLen) { + if (readAllOfClassFile || saveParameterNames) + ((MethodSymbol)sym).code = readCode(sym); + else + bp = bp + attrLen; + } + }, + + new AttributeReader(names.ConstantValue, V45_3, MEMBER_ATTRIBUTE) { + void read(Symbol sym, int attrLen) { + Object v = readPool(nextChar()); + // Ignore ConstantValue attribute if field not final. + if ((sym.flags() & FINAL) != 0) + ((VarSymbol) sym).setData(v); + } + }, + + new AttributeReader(names.Deprecated, V45_3, CLASS_OR_MEMBER_ATTRIBUTE) { + void read(Symbol sym, int attrLen) { + sym.flags_field |= DEPRECATED; + } + }, + + new AttributeReader(names.Exceptions, V45_3, CLASS_OR_MEMBER_ATTRIBUTE) { + void read(Symbol sym, int attrLen) { + int nexceptions = nextChar(); + List thrown = List.nil(); + for (int j = 0; j < nexceptions; j++) + thrown = thrown.prepend(readClassSymbol(nextChar()).type); + if (sym.type.getThrownTypes().isEmpty()) + sym.type.asMethodType().thrown = thrown.reverse(); + } + }, + + new AttributeReader(names.InnerClasses, V45_3, CLASS_ATTRIBUTE) { + void read(Symbol sym, int attrLen) { + ClassSymbol c = (ClassSymbol) sym; + readInnerClasses(c); + } + }, + + new AttributeReader(names.LocalVariableTable, V45_3, CLASS_OR_MEMBER_ATTRIBUTE) { + void read(Symbol sym, int attrLen) { + int newbp = bp + attrLen; + if (saveParameterNames) { + // pick up parameter names from the variable table + List parameterNames = List.nil(); + int firstParam = ((sym.flags() & STATIC) == 0) ? 1 : 0; + int endParam = firstParam + Code.width(sym.type.getParameterTypes()); + int numEntries = nextChar(); + for (int i=0; i is = new ListBuffer(); + while (sigp != siglimit) is.append(sigToType()); + ct1.interfaces_field = is.toList(); + } finally { + readingClassAttr = false; + } + } else { + List thrown = sym.type.getThrownTypes(); + sym.type = readType(nextChar()); + //- System.err.println(" # " + sym.type); + if (sym.kind == MTH && sym.type.getThrownTypes().isEmpty()) + sym.type.asMethodType().thrown = thrown; + + } + } + }, + + // v49 annotation attributes + + new AttributeReader(names.AnnotationDefault, V49, CLASS_OR_MEMBER_ATTRIBUTE) { + void read(Symbol sym, int attrLen) { + attachAnnotationDefault(sym); + } + }, + + new AttributeReader(names.RuntimeInvisibleAnnotations, V49, CLASS_OR_MEMBER_ATTRIBUTE) { + void read(Symbol sym, int attrLen) { + attachAnnotations(sym); + } + }, + + new AttributeReader(names.RuntimeInvisibleParameterAnnotations, V49, CLASS_OR_MEMBER_ATTRIBUTE) { + void read(Symbol sym, int attrLen) { + attachParameterAnnotations(sym); + } + }, + + new AttributeReader(names.RuntimeVisibleAnnotations, V49, CLASS_OR_MEMBER_ATTRIBUTE) { + void read(Symbol sym, int attrLen) { + attachAnnotations(sym); + } + }, + + new AttributeReader(names.RuntimeVisibleParameterAnnotations, V49, CLASS_OR_MEMBER_ATTRIBUTE) { + void read(Symbol sym, int attrLen) { + attachParameterAnnotations(sym); + } + }, + + // additional "legacy" v49 attributes, superceded by flags + + new AttributeReader(names.Annotation, V49, CLASS_OR_MEMBER_ATTRIBUTE) { + void read(Symbol sym, int attrLen) { + if (allowAnnotations) + sym.flags_field |= ANNOTATION; + } + }, + + new AttributeReader(names.Bridge, V49, MEMBER_ATTRIBUTE) { + void read(Symbol sym, int attrLen) { + sym.flags_field |= BRIDGE; + if (!allowGenerics) + sym.flags_field &= ~SYNTHETIC; + } + }, + + new AttributeReader(names.Enum, V49, CLASS_OR_MEMBER_ATTRIBUTE) { + void read(Symbol sym, int attrLen) { + sym.flags_field |= ENUM; + } + }, + + new AttributeReader(names.Varargs, V49, CLASS_OR_MEMBER_ATTRIBUTE) { + void read(Symbol sym, int attrLen) { + if (allowVarargs) + sym.flags_field |= VARARGS; + } + } + + // The following attributes for a Code attribute are not currently handled + // StackMapTable + // SourceDebugExtension + // LineNumberTable + // LocalVariableTypeTable + }; + + for (AttributeReader r: readers) + attributeReaders.put(r.name, r); + } + /** Report unrecognized attribute. */ void unrecognized(Name attrName) { @@ -829,99 +1080,7 @@ public class ClassReader extends ClassFile implements Completer { printCCF("ccf.unrecognized.attribute", attrName); } - /** Read member attribute. - */ - void readMemberAttr(Symbol sym, Name attrName, int attrLen) { - //- System.err.println(" z " + sym + ", " + attrName + ", " + attrLen); - if (attrName == names.ConstantValue) { - Object v = readPool(nextChar()); - // Ignore ConstantValue attribute if field not final. - if ((sym.flags() & FINAL) != 0) - ((VarSymbol)sym).setData(v); - } else if (attrName == names.Code) { - if (readAllOfClassFile || saveParameterNames) - ((MethodSymbol)sym).code = readCode(sym); - else - bp = bp + attrLen; - } else if (attrName == names.Exceptions) { - int nexceptions = nextChar(); - List thrown = List.nil(); - for (int j = 0; j < nexceptions; j++) - thrown = thrown.prepend(readClassSymbol(nextChar()).type); - if (sym.type.getThrownTypes().isEmpty()) - sym.type.asMethodType().thrown = thrown.reverse(); - } else if (attrName == names.Synthetic) { - // bridge methods are visible when generics not enabled - if (allowGenerics || (sym.flags_field & BRIDGE) == 0) - sym.flags_field |= SYNTHETIC; - } else if (attrName == names.Bridge) { - sym.flags_field |= BRIDGE; - if (!allowGenerics) - sym.flags_field &= ~SYNTHETIC; - } else if (attrName == names.Deprecated) { - sym.flags_field |= DEPRECATED; - } else if (attrName == names.Varargs) { - if (allowVarargs) sym.flags_field |= VARARGS; - } else if (attrName == names.Annotation) { - if (allowAnnotations) sym.flags_field |= ANNOTATION; - } else if (attrName == names.Enum) { - sym.flags_field |= ENUM; - } else if (allowGenerics && attrName == names.Signature) { - List thrown = sym.type.getThrownTypes(); - sym.type = readType(nextChar()); - //- System.err.println(" # " + sym.type); - if (sym.kind == MTH && sym.type.getThrownTypes().isEmpty()) - sym.type.asMethodType().thrown = thrown; - } else if (attrName == names.RuntimeVisibleAnnotations) { - attachAnnotations(sym); - } else if (attrName == names.RuntimeInvisibleAnnotations) { - attachAnnotations(sym); - } else if (attrName == names.RuntimeVisibleParameterAnnotations) { - attachParameterAnnotations(sym); - } else if (attrName == names.RuntimeInvisibleParameterAnnotations) { - attachParameterAnnotations(sym); - } else if (attrName == names.LocalVariableTable) { - int newbp = bp + attrLen; - if (saveParameterNames) { - // pick up parameter names from the variable table - List parameterNames = List.nil(); - int firstParam = ((sym.flags() & STATIC) == 0) ? 1 : 0; - int endParam = firstParam + Code.width(sym.type.getParameterTypes()); - int numEntries = nextChar(); - for (int i=0; i is = new ListBuffer(); - while (sigp != siglimit) is.append(sigToType()); - ct1.interfaces_field = is.toList(); - } finally { - readingClassAttr = false; - } - } else { - readMemberAttr(c, attrName, attrLen); - } - } private boolean readingClassAttr = false; private List missingTypeVariables = List.nil(); private List foundTypeVariables = List.nil(); @@ -1069,12 +1213,7 @@ public class ClassReader extends ClassFile implements Completer { /** Read class attributes. */ void readClassAttrs(ClassSymbol c) { - char ac = nextChar(); - for (int i = 0; i < ac; i++) { - Name attrName = readName(nextChar()); - int attrLen = nextInt(); - readClassAttr(c, attrName, attrLen); - } + readAttrs(c, AttributeKind.CLASS); } /** Read code block. @@ -1219,6 +1358,7 @@ public class ClassReader extends ClassFile implements Completer { this.enumerator = enumerator; } public void accept(Visitor v) { ((ProxyVisitor)v).visitEnumAttributeProxy(this); } + @Override public String toString() { return "/*proxy enum*/" + enumType + "." + enumerator; } @@ -1231,6 +1371,7 @@ public class ClassReader extends ClassFile implements Completer { this.values = values; } public void accept(Visitor v) { ((ProxyVisitor)v).visitArrayAttributeProxy(this); } + @Override public String toString() { return "{" + values + "}"; } @@ -1246,6 +1387,7 @@ public class ClassReader extends ClassFile implements Completer { this.values = values; } public void accept(Visitor v) { ((ProxyVisitor)v).visitCompoundAnnotationProxy(this); } + @Override public String toString() { StringBuffer buf = new StringBuffer(); buf.append("@"); @@ -1414,6 +1556,7 @@ public class ClassReader extends ClassFile implements Completer { final MethodSymbol sym; final Attribute value; final JavaFileObject classFile = currentClassFile; + @Override public String toString() { return " ClassReader store default for " + sym.owner + "." + sym + " is " + value; } @@ -1437,6 +1580,7 @@ public class ClassReader extends ClassFile implements Completer { final Symbol sym; final List l; final JavaFileObject classFile; + @Override public String toString() { return " ClassReader annotate " + sym.owner + "." + sym + " with " + l; } @@ -1544,7 +1688,8 @@ public class ClassReader extends ClassFile implements Completer { // prepare type variable table typevars = typevars.dup(currentOwner); - if (ct.getEnclosingType().tag == CLASS) enterTypevars(ct.getEnclosingType()); + if (ct.getEnclosingType().tag == CLASS) + enterTypevars(ct.getEnclosingType()); // read flags, or skip if this is an inner class long flags = adjustClassFlags(nextChar()); @@ -1632,8 +1777,8 @@ public class ClassReader extends ClassFile implements Completer { if (magic != JAVA_MAGIC) throw badClassFile("illegal.start.of.class.file"); - int minorVersion = nextChar(); - int majorVersion = nextChar(); + minorVersion = nextChar(); + majorVersion = nextChar(); int maxMajor = Target.MAX().majorVersion; int maxMinor = Target.MAX().minorVersion; if (majorVersion > maxMajor || @@ -1775,13 +1920,13 @@ public class ClassReader extends ClassFile implements Completer { if (sym.kind == TYP) { ClassSymbol c = (ClassSymbol)sym; c.members_field = new Scope.ErrorScope(c); // make sure it's always defined - boolean suppressFlush = this.suppressFlush; - this.suppressFlush = true; + boolean saveSuppressFlush = suppressFlush; + suppressFlush = true; try { completeOwners(c.owner); completeEnclosing(c); } finally { - this.suppressFlush = suppressFlush; + suppressFlush = saveSuppressFlush; } fillIn(c); } else if (sym.kind == PCK) { @@ -2270,6 +2415,7 @@ public class ClassReader extends ClassFile implements Completer { return URI.create(name.toString()); } + @Override public Reader openReader(boolean ignoreEncodingErrors) throws IOException { throw new UnsupportedOperationException(); } From 851190bb2e824adc8b401cb6190e0d7de96ecfdc Mon Sep 17 00:00:00 2001 From: Jonathan Gibbons Date: Tue, 31 Mar 2009 11:16:15 -0700 Subject: [PATCH 224/292] 6813059: replace use of JavaCompiler.errorCount with shouldContinue Reviewed-by: mcimadamore --- .../sun/tools/javac/main/JavaCompiler.java | 109 +++++++---- .../test/tools/javac/policy/test3/A.java | 10 ++ .../test/tools/javac/policy/test3/Test.java | 169 ++++++++++++++++++ 3 files changed, 253 insertions(+), 35 deletions(-) create mode 100644 langtools/test/tools/javac/policy/test3/A.java create mode 100644 langtools/test/tools/javac/policy/test3/Test.java diff --git a/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java b/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java index 9eccdfc3956..555ef2356bd 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java +++ b/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java @@ -386,6 +386,11 @@ public class JavaCompiler implements ClassReader.SourceCompleter { (options.get("failcomplete") != null) ? names.fromString(options.get("failcomplete")) : null; + + shouldStopPolicy = + (options.get("shouldStopPolicy") != null) + ? CompileState.valueOf(options.get("shouldStopPolicy")) + : null; } /* Switches: @@ -459,14 +464,26 @@ public class JavaCompiler implements ClassReader.SourceCompleter { */ public boolean verboseCompilePolicy; + /** + * Policy of how far to continue processing. null means until first + * error. + */ + public CompileState shouldStopPolicy; + /** A queue of all as yet unattributed classes. */ public Todo todo; + /** Ordered list of compiler phases for each compilation unit. */ protected enum CompileState { - TODO(0), - ATTR(1), - FLOW(2); + PARSE(1), + ENTER(2), + PROCESS(3), + ATTR(4), + FLOW(5), + TRANSTYPES(6), + LOWER(7), + GENERATE(8); CompileState(int value) { this.value = value; } @@ -475,6 +492,9 @@ public class JavaCompiler implements ClassReader.SourceCompleter { } private int value; }; + /** Partial map to record which compiler phases have been executed + * for each compilation unit. Used for ATTR and FLOW phases. + */ protected class CompileStates extends HashMap,CompileState> { private static final long serialVersionUID = 1812267524140424433L; boolean isDone(Env env, CompileState cs) { @@ -490,6 +510,13 @@ public class JavaCompiler implements ClassReader.SourceCompleter { */ protected Set inputFiles = new HashSet(); + protected boolean shouldStop(CompileState cs) { + if (shouldStopPolicy == null) + return (errorCount() > 0); + else + return cs.ordinal() > shouldStopPolicy.ordinal(); + } + /** The number of errors reported so far. */ public int errorCount() { @@ -503,18 +530,12 @@ public class JavaCompiler implements ClassReader.SourceCompleter { return log.nerrors; } - protected final Queue stopIfError(Queue queue) { - if (errorCount() == 0) - return queue; - else - return ListBuffer.lb(); + protected final Queue stopIfError(CompileState cs, Queue queue) { + return shouldStop(cs) ? ListBuffer.lb() : queue; } - protected final List stopIfError(List list) { - if (errorCount() == 0) - return list; - else - return List.nil(); + protected final List stopIfError(CompileState cs, List list) { + return shouldStop(cs) ? List.nil() : list; } /** The number of warnings reported so far. @@ -669,7 +690,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter { */ JavaFileObject genCode(Env env, JCClassDecl cdef) throws IOException { try { - if (gen.genClass(env, cdef)) + if (gen.genClass(env, cdef) && (errorCount() == 0)) return writer.writeClass(cdef.sym); } catch (ClassWriter.PoolOverflow ex) { log.error(cdef.pos(), "limit.pool"); @@ -779,8 +800,10 @@ public class JavaCompiler implements ClassReader.SourceCompleter { initProcessAnnotations(processors); // These method calls must be chained to avoid memory leaks - delegateCompiler = processAnnotations(enterTrees(stopIfError(parseFiles(sourceFileObjects))), - classnames); + delegateCompiler = + processAnnotations( + enterTrees(stopIfError(CompileState.PARSE, parseFiles(sourceFileObjects))), + classnames); delegateCompiler.compile2(); delegateCompiler.close(); @@ -812,7 +835,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter { case BY_FILE: { Queue>> q = todo.groupByFile(); - while (!q.isEmpty() && errorCount() == 0) { + while (!q.isEmpty() && !shouldStop(CompileState.ATTR)) { generate(desugar(flow(attribute(q.remove())))); } } @@ -850,7 +873,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter { * Parses a list of files. */ public List parseFiles(List fileObjects) throws IOException { - if (errorCount() > 0) + if (shouldStop(CompileState.PARSE)) return List.nil(); //parse all files @@ -961,7 +984,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter { public JavaCompiler processAnnotations(List roots, List classnames) throws IOException { // TODO: see TEMP note in JavacProcessingEnvironment - if (errorCount() != 0) { + if (shouldStop(CompileState.PROCESS)) { // Errors were encountered. If todo is empty, then the // encountered errors were parse errors. Otherwise, the // errors were found during the enter phase which should @@ -1068,7 +1091,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter { ListBuffer> results = lb(); while (!envs.isEmpty()) results.append(attribute(envs.remove())); - return results; + return stopIfError(CompileState.ATTR, results); } /** @@ -1115,7 +1138,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter { for (Env env: envs) { flow(env, results); } - return stopIfError(results); + return stopIfError(CompileState.FLOW, results); } /** @@ -1124,7 +1147,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter { public Queue> flow(Env env) { ListBuffer> results = lb(); flow(env, results); - return stopIfError(results); + return stopIfError(CompileState.FLOW, results); } /** @@ -1132,7 +1155,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter { */ protected void flow(Env env, Queue> results) { try { - if (errorCount() > 0) + if (shouldStop(CompileState.FLOW)) return; if (relax || compileStates.isDone(env, CompileState.FLOW)) { @@ -1141,7 +1164,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter { } if (verboseCompilePolicy) - log.printLines(log.noticeWriter, "[flow " + env.enclClass.sym + "]"); + printNote("[flow " + env.enclClass.sym + "]"); JavaFileObject prev = log.useSource( env.enclClass.sym.sourcefile != null ? env.enclClass.sym.sourcefile : @@ -1152,7 +1175,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter { flow.analyzeTree(env.tree, localMake); compileStates.put(env, CompileState.FLOW); - if (errorCount() > 0) + if (shouldStop(CompileState.FLOW)) return; results.add(env); @@ -1179,7 +1202,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter { ListBuffer, JCClassDecl>> results = lb(); for (Env env: envs) desugar(env, results); - return stopIfError(results); + return stopIfError(CompileState.FLOW, results); } /** @@ -1189,7 +1212,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter { * The preparation stops as soon as an error is found. */ protected void desugar(final Env env, Queue, JCClassDecl>> results) { - if (errorCount() > 0) + if (shouldStop(CompileState.TRANSTYPES)) return; if (implicitSourcePolicy == ImplicitSourcePolicy.NONE @@ -1204,6 +1227,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter { */ class ScanNested extends TreeScanner { Set> dependencies = new LinkedHashSet>(); + @Override public void visitClassDef(JCClassDecl node) { Type st = types.supertype(node.sym.type); if (st.tag == TypeTags.CLASS) { @@ -1226,11 +1250,11 @@ public class JavaCompiler implements ClassReader.SourceCompleter { //We need to check for error another time as more classes might //have been attributed and analyzed at this stage - if (errorCount() > 0) + if (shouldStop(CompileState.TRANSTYPES)) return; if (verboseCompilePolicy) - log.printLines(log.noticeWriter, "[desugar " + env.enclClass.sym + "]"); + printNote("[desugar " + env.enclClass.sym + "]"); JavaFileObject prev = log.useSource(env.enclClass.sym.sourcefile != null ? env.enclClass.sym.sourcefile : @@ -1244,6 +1268,8 @@ public class JavaCompiler implements ClassReader.SourceCompleter { if (env.tree instanceof JCCompilationUnit) { if (!(stubOutput || sourceOutput || printFlat)) { + if (shouldStop(CompileState.LOWER)) + return; List pdef = lower.translateTopLevelClass(env, env.tree, localMake); if (pdef.head != null) { assert pdef.tail.isEmpty(); @@ -1266,9 +1292,12 @@ public class JavaCompiler implements ClassReader.SourceCompleter { return; } + if (shouldStop(CompileState.TRANSTYPES)) + return; + env.tree = transTypes.translateTopLevelClass(env.tree, localMake); - if (errorCount() != 0) + if (shouldStop(CompileState.LOWER)) return; if (sourceOutput) { @@ -1285,7 +1314,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter { //translate out inner classes List cdefs = lower.translateTopLevelClass(env, env.tree, localMake); - if (errorCount() != 0) + if (shouldStop(CompileState.LOWER)) return; //generate code for each class @@ -1310,6 +1339,9 @@ public class JavaCompiler implements ClassReader.SourceCompleter { } public void generate(Queue, JCClassDecl>> queue, Queue results) { + if (shouldStop(CompileState.GENERATE)) + return; + boolean usePrintSource = (stubOutput || sourceOutput || printFlat); for (Pair, JCClassDecl> x: queue) { @@ -1317,7 +1349,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter { JCClassDecl cdef = x.snd; if (verboseCompilePolicy) { - log.printLines(log.noticeWriter, "[generate " + printNote("[generate " + (usePrintSource ? " source" : "code") + " " + cdef.sym + "]"); } @@ -1371,6 +1403,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter { JCClassDecl removeMethodBodies(JCClassDecl cdef) { final boolean isInterface = (cdef.mods.flags & Flags.INTERFACE) != 0; class MethodBodyRemover extends TreeTranslator { + @Override public void visitMethodDef(JCMethodDecl tree) { tree.mods.flags &= ~Flags.SYNCHRONIZED; for (JCVariableDecl vd : tree.params) @@ -1378,11 +1411,13 @@ public class JavaCompiler implements ClassReader.SourceCompleter { tree.body = null; super.visitMethodDef(tree); } + @Override public void visitVarDef(JCVariableDecl tree) { if (tree.init != null && tree.init.type.constValue() == null) tree.init = null; super.visitVarDef(tree); } + @Override public void visitClassDef(JCClassDecl tree) { ListBuffer newdefs = lb(); for (List it = tree.defs; it.tail != null; it = it.tail) { @@ -1469,12 +1504,16 @@ public class JavaCompiler implements ClassReader.SourceCompleter { } } + protected void printNote(String lines) { + Log.printLines(log.noticeWriter, lines); + } + /** Output for "-verbose" option. * @param key The key to look up the correct internationalized string. * @param arg An argument for substitution into the output string. */ protected void printVerbose(String key, Object arg) { - Log.printLines(log.noticeWriter, log.getLocalizedString("verbose." + key, arg)); + Log.printLines(log.noticeWriter, Log.getLocalizedString("verbose." + key, arg)); } /** Print numbers of errors and warnings. @@ -1483,9 +1522,9 @@ public class JavaCompiler implements ClassReader.SourceCompleter { if (count != 0) { String text; if (count == 1) - text = log.getLocalizedString("count." + kind, String.valueOf(count)); + text = Log.getLocalizedString("count." + kind, String.valueOf(count)); else - text = log.getLocalizedString("count." + kind + ".plural", String.valueOf(count)); + text = Log.getLocalizedString("count." + kind + ".plural", String.valueOf(count)); Log.printLines(log.errWriter, text); log.errWriter.flush(); } diff --git a/langtools/test/tools/javac/policy/test3/A.java b/langtools/test/tools/javac/policy/test3/A.java new file mode 100644 index 00000000000..b21c7713860 --- /dev/null +++ b/langtools/test/tools/javac/policy/test3/A.java @@ -0,0 +1,10 @@ +class A { + void m1() { + System.err.println("hello"); + 0 // syntax error + System.err.println("world"); + } + + void m2() { + } +} diff --git a/langtools/test/tools/javac/policy/test3/Test.java b/langtools/test/tools/javac/policy/test3/Test.java new file mode 100644 index 00000000000..09e64449bf7 --- /dev/null +++ b/langtools/test/tools/javac/policy/test3/Test.java @@ -0,0 +1,169 @@ +/* + * Copyright 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 6813059 + * @summary + */ + +import java.io.*; +import java.util.*; + +// Simple test of -XDshouldStopPolicy. +// For each of the permissable values, we compile a file with an error in it, +// then using -XDverboseCompilePolicy we check that the compilation gets as +// far as expected, but no further. + +public class Test { + enum ShouldStopPolicy { + BLANK(false, null, "attr"), + PROCESS(true, null, "attr"), + ATTR(true, "attr", "flow"), + FLOW(true, "flow", "desugar"), + TRANSTYPES(true, "desugar", "generate"), + LOWER(true, "desugar", "generate"), + GENERATE(true, "generate", null); + ShouldStopPolicy(boolean needOption, String expect, String dontExpect) { + this.needOption = needOption; + this.expect = expect; + this.dontExpect = dontExpect; + } + boolean needOption; + String expect; + String dontExpect; + } + + enum CompilePolicy { + BYFILE, + BYTODO + } + + public static void main(String... args) throws Exception { + new Test().run(); + } + + public void run() throws Exception { + for (CompilePolicy cp: CompilePolicy.values()) { + for (ShouldStopPolicy ssp: ShouldStopPolicy.values()) { + test(cp, ssp); + } + } + + if (errors > 0) + throw new Exception(errors + " errors occurred"); + } + + public void test(CompilePolicy cp, ShouldStopPolicy ssp) { + System.err.println(); + System.err.println("test " + cp + " " + ssp); + List args = new ArrayList(); + args.add("-XDverboseCompilePolicy"); + args.add("-XDcompilePolicy=" + cp.toString().toLowerCase()); + args.add("-d"); + args.add("."); + if (ssp.needOption) + args.add("-XDshouldStopPolicy=" + ssp); + args.add(new File(System.getProperty("test.src", "."), "A.java").getPath()); + + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + System.err.println("compile " + args); + int rc = com.sun.tools.javac.Main.compile(args.toArray(new String[args.size()]), pw); + if (rc == 0) + throw new Error("compilation succeeded unexpectedly"); + //System.err.println(sw); + + // The following is a workaround for the current javac implementation, + // that in bytodo mode, it will still attribute files after syntax errors. + // Changing that behavior may surprise existing users, so for now, we + // work around it. + if (cp == CompilePolicy.BYTODO && ssp == ShouldStopPolicy.PROCESS) + ssp = ShouldStopPolicy.ATTR; + + boolean foundExpected = (ssp.expect == null); + String[] lines = sw.toString().split("\n"); + for (String line: lines) { + if (ssp.expect != null && line.startsWith("[" + ssp.expect)) + foundExpected = true; + if (ssp.dontExpect != null && line.startsWith("[" + ssp.dontExpect)) { + error("Unexpected output: " + ssp.dontExpect + "\n" + sw); + return; + } + } + + if (!foundExpected) + error("Expected output not found: " + ssp.expect + "\n" + sw); + } + + void error(String message) { + System.err.println(message); + errors++; + } + + int errors; +} + + + + + + + + + + + + +// These tests test the ability of the compiler to continue in the face of +// errors, accordining to the shouldStopPolicy + +/* @ test /nodynamiccopyright/ + * @bug 6813059 + * @summary + * @compile/fail/ref=flow.out -XDrawDiagnostics -XDcompilePolicy=byfile -XDverboseCompilePolicy -XDshouldStopPolicy=FLOW Test.java + + * @compile/fail/ref=default.out -XDrawDiagnostics -XDcompilePolicy=byfile -XDverboseCompilePolicy Test.java + * @compile/fail/ref=enter.out -XDrawDiagnostics -XDcompilePolicy=byfile -XDverboseCompilePolicy -XDshouldStopPolicy=ENTER Test.java + * @compile/fail/ref=attr.out -XDrawDiagnostics -XDcompilePolicy=byfile -XDverboseCompilePolicy -XDshouldStopPolicy=ATTR Test.java + * @compile/fail/ref=transtypes.out -XDrawDiagnostics -XDcompilePolicy=byfile -XDverboseCompilePolicy -XDshouldStopPolicy=TRANSTYPES Test.java + * @compile/fail/ref=lower.out -XDrawDiagnostics -XDcompilePolicy=byfile -XDverboseCompilePolicy -XDshouldStopPolicy=LOWER Test.java + * @compile/fail/ref=generate.out -XDrawDiagnostics -XDcompilePolicy=byfile -XDverboseCompilePolicy -XDshouldStopPolicy=GENERATE Test.java + */ + +/* +class Test { + void m1() { + System.err.println("hello"); + 0 // syntax error + System.err.println("world"); + } + + void m2() { + } +} + +class Test2 { +} +*/ + From c0d62ad9e6b0783f73b795c82626254e2239d2f0 Mon Sep 17 00:00:00 2001 From: Changpeng Fang Date: Tue, 31 Mar 2009 14:07:08 -0700 Subject: [PATCH 225/292] 6761600: Use sse 4.2 in intrinsics Use SSE 4.2 in intrinsics for String.{compareTo/equals/indexOf} and Arrays.equals. Reviewed-by: kvn, never, jrose --- hotspot/src/cpu/sparc/vm/sparc.ad | 215 ++++++++++ hotspot/src/cpu/x86/vm/assembler_x86.cpp | 48 +++ hotspot/src/cpu/x86/vm/assembler_x86.hpp | 8 + hotspot/src/cpu/x86/vm/vm_version_x86.cpp | 5 + hotspot/src/cpu/x86/vm/x86_32.ad | 427 +++++++++++++++--- hotspot/src/cpu/x86/vm/x86_64.ad | 428 ++++++++++++++++--- hotspot/src/share/vm/adlc/formssel.cpp | 14 +- hotspot/src/share/vm/classfile/vmSymbols.hpp | 3 +- hotspot/src/share/vm/opto/classes.hpp | 2 + hotspot/src/share/vm/opto/gcm.cpp | 6 + hotspot/src/share/vm/opto/lcm.cpp | 2 + hotspot/src/share/vm/opto/library_call.cpp | 240 ++++++++--- hotspot/src/share/vm/opto/loopnode.cpp | 2 + hotspot/src/share/vm/opto/matcher.cpp | 4 + hotspot/src/share/vm/opto/memnode.cpp | 26 +- hotspot/src/share/vm/opto/memnode.hpp | 48 +++ hotspot/src/share/vm/runtime/arguments.cpp | 3 - hotspot/src/share/vm/runtime/globals.hpp | 8 +- 18 files changed, 1297 insertions(+), 192 deletions(-) diff --git a/hotspot/src/cpu/sparc/vm/sparc.ad b/hotspot/src/cpu/sparc/vm/sparc.ad index df6e9049ebb..c65cc5495e6 100644 --- a/hotspot/src/cpu/sparc/vm/sparc.ad +++ b/hotspot/src/cpu/sparc/vm/sparc.ad @@ -3003,6 +3003,202 @@ enc_class Fast_Unlock(iRegP oop, iRegP box, o7RegP scratch, iRegP scratch2) %{ __ bind(Ldone); %} +enc_class enc_String_Equals(o0RegP str1, o1RegP str2, g3RegP tmp1, g4RegP tmp2, notemp_iRegI result) %{ + Label Lword, Lword_loop, Lpost_word, Lchar, Lchar_loop, Ldone; + MacroAssembler _masm(&cbuf); + + Register str1_reg = reg_to_register_object($str1$$reg); + Register str2_reg = reg_to_register_object($str2$$reg); + Register tmp1_reg = reg_to_register_object($tmp1$$reg); + Register tmp2_reg = reg_to_register_object($tmp2$$reg); + Register result_reg = reg_to_register_object($result$$reg); + + // Get the first character position in both strings + // [8] char array, [12] offset, [16] count + int value_offset = java_lang_String:: value_offset_in_bytes(); + int offset_offset = java_lang_String::offset_offset_in_bytes(); + int count_offset = java_lang_String:: count_offset_in_bytes(); + + // load str1 (jchar*) base address into tmp1_reg + __ load_heap_oop(Address(str1_reg, 0, value_offset), tmp1_reg); + __ ld(Address(str1_reg, 0, offset_offset), result_reg); + __ add(tmp1_reg, arrayOopDesc::base_offset_in_bytes(T_CHAR), tmp1_reg); + __ ld(Address(str1_reg, 0, count_offset), str1_reg); // hoisted + __ sll(result_reg, exact_log2(sizeof(jchar)), result_reg); + __ load_heap_oop(Address(str2_reg, 0, value_offset), tmp2_reg); // hoisted + __ add(result_reg, tmp1_reg, tmp1_reg); + + // load str2 (jchar*) base address into tmp2_reg + // __ ld_ptr(Address(str2_reg, 0, value_offset), tmp2_reg); // hoisted + __ ld(Address(str2_reg, 0, offset_offset), result_reg); + __ add(tmp2_reg, arrayOopDesc::base_offset_in_bytes(T_CHAR), tmp2_reg); + __ ld(Address(str2_reg, 0, count_offset), str2_reg); // hoisted + __ sll(result_reg, exact_log2(sizeof(jchar)), result_reg); + __ cmp(str1_reg, str2_reg); // hoisted + __ add(result_reg, tmp2_reg, tmp2_reg); + + __ sll(str1_reg, exact_log2(sizeof(jchar)), str1_reg); + __ br(Assembler::notEqual, true, Assembler::pt, Ldone); + __ delayed()->mov(G0, result_reg); // not equal + + __ br_zero(Assembler::equal, true, Assembler::pn, str1_reg, Ldone); + __ delayed()->add(G0, 1, result_reg); //equals + + __ cmp(tmp1_reg, tmp2_reg); //same string ? + __ brx(Assembler::equal, true, Assembler::pn, Ldone); + __ delayed()->add(G0, 1, result_reg); + + //rename registers + Register limit_reg = str1_reg; + Register chr2_reg = str2_reg; + Register chr1_reg = result_reg; + // tmp{12} are the base pointers + + //check for alignment and position the pointers to the ends + __ or3(tmp1_reg, tmp2_reg, chr1_reg); + __ andcc(chr1_reg, 0x3, chr1_reg); // notZero means at least one not 4-byte aligned + __ br(Assembler::notZero, false, Assembler::pn, Lchar); + __ delayed()->nop(); + + __ bind(Lword); + __ and3(limit_reg, 0x2, O7); //remember the remainder (either 0 or 2) + __ andn(limit_reg, 0x3, limit_reg); + __ br_zero(Assembler::zero, false, Assembler::pn, limit_reg, Lpost_word); + __ delayed()->nop(); + + __ add(tmp1_reg, limit_reg, tmp1_reg); + __ add(tmp2_reg, limit_reg, tmp2_reg); + __ neg(limit_reg); + + __ lduw(tmp1_reg, limit_reg, chr1_reg); + __ bind(Lword_loop); + __ lduw(tmp2_reg, limit_reg, chr2_reg); + __ cmp(chr1_reg, chr2_reg); + __ br(Assembler::notEqual, true, Assembler::pt, Ldone); + __ delayed()->mov(G0, result_reg); + __ inccc(limit_reg, 2*sizeof(jchar)); + // annul LDUW if branch i s not taken to prevent access past end of string + __ br(Assembler::notZero, true, Assembler::pt, Lword_loop); //annul on taken + __ delayed()->lduw(tmp1_reg, limit_reg, chr1_reg); // hoisted + + __ bind(Lpost_word); + __ br_zero(Assembler::zero, true, Assembler::pt, O7, Ldone); + __ delayed()->add(G0, 1, result_reg); + + __ lduh(tmp1_reg, 0, chr1_reg); + __ lduh(tmp2_reg, 0, chr2_reg); + __ cmp (chr1_reg, chr2_reg); + __ br(Assembler::notEqual, true, Assembler::pt, Ldone); + __ delayed()->mov(G0, result_reg); + __ ba(false,Ldone); + __ delayed()->add(G0, 1, result_reg); + + __ bind(Lchar); + __ add(tmp1_reg, limit_reg, tmp1_reg); + __ add(tmp2_reg, limit_reg, tmp2_reg); + __ neg(limit_reg); //negate count + + __ lduh(tmp1_reg, limit_reg, chr1_reg); + __ bind(Lchar_loop); + __ lduh(tmp2_reg, limit_reg, chr2_reg); + __ cmp(chr1_reg, chr2_reg); + __ br(Assembler::notEqual, true, Assembler::pt, Ldone); + __ delayed()->mov(G0, result_reg); //not equal + __ inccc(limit_reg, sizeof(jchar)); + // annul LDUH if branch is not taken to prevent access past end of string + __ br(Assembler::notZero, true, Assembler::pt, Lchar_loop); //annul on taken + __ delayed()->lduh(tmp1_reg, limit_reg, chr1_reg); // hoisted + + __ add(G0, 1, result_reg); //equal + + __ bind(Ldone); + %} + +enc_class enc_Array_Equals(o0RegP ary1, o1RegP ary2, g3RegP tmp1, g4RegP tmp2, notemp_iRegI result) %{ + Label Lvector, Ldone, Lloop; + MacroAssembler _masm(&cbuf); + + Register ary1_reg = reg_to_register_object($ary1$$reg); + Register ary2_reg = reg_to_register_object($ary2$$reg); + Register tmp1_reg = reg_to_register_object($tmp1$$reg); + Register tmp2_reg = reg_to_register_object($tmp2$$reg); + Register result_reg = reg_to_register_object($result$$reg); + + int length_offset = arrayOopDesc::length_offset_in_bytes(); + int base_offset = arrayOopDesc::base_offset_in_bytes(T_CHAR); + + // return true if the same array + __ cmp(ary1_reg, ary2_reg); + __ br(Assembler::equal, true, Assembler::pn, Ldone); + __ delayed()->add(G0, 1, result_reg); // equal + + __ br_null(ary1_reg, true, Assembler::pn, Ldone); + __ delayed()->mov(G0, result_reg); // not equal + + __ br_null(ary2_reg, true, Assembler::pn, Ldone); + __ delayed()->mov(G0, result_reg); // not equal + + //load the lengths of arrays + __ ld(Address(ary1_reg, 0, length_offset), tmp1_reg); + __ ld(Address(ary2_reg, 0, length_offset), tmp2_reg); + + // return false if the two arrays are not equal length + __ cmp(tmp1_reg, tmp2_reg); + __ br(Assembler::notEqual, true, Assembler::pn, Ldone); + __ delayed()->mov(G0, result_reg); // not equal + + __ br_zero(Assembler::zero, true, Assembler::pn, tmp1_reg, Ldone); + __ delayed()->add(G0, 1, result_reg); // zero-length arrays are equal + + // load array addresses + __ add(ary1_reg, base_offset, ary1_reg); + __ add(ary2_reg, base_offset, ary2_reg); + + // renaming registers + Register chr1_reg = tmp2_reg; // for characters in ary1 + Register chr2_reg = result_reg; // for characters in ary2 + Register limit_reg = tmp1_reg; // length + + // set byte count + __ sll(limit_reg, exact_log2(sizeof(jchar)), limit_reg); + __ andcc(limit_reg, 0x2, chr1_reg); //trailing character ? + __ br(Assembler::zero, false, Assembler::pt, Lvector); + __ delayed()->nop(); + + //compare the trailing char + __ sub(limit_reg, sizeof(jchar), limit_reg); + __ lduh(ary1_reg, limit_reg, chr1_reg); + __ lduh(ary2_reg, limit_reg, chr2_reg); + __ cmp(chr1_reg, chr2_reg); + __ br(Assembler::notEqual, true, Assembler::pt, Ldone); + __ delayed()->mov(G0, result_reg); // not equal + + // only one char ? + __ br_zero(Assembler::zero, true, Assembler::pn, limit_reg, Ldone); + __ delayed()->add(G0, 1, result_reg); // zero-length arrays are equal + + __ bind(Lvector); + // Shift ary1_reg and ary2_reg to the end of the arrays, negate limit + __ add(ary1_reg, limit_reg, ary1_reg); + __ add(ary2_reg, limit_reg, ary2_reg); + __ neg(limit_reg, limit_reg); + + __ lduw(ary1_reg, limit_reg, chr1_reg); + __ bind(Lloop); + __ lduw(ary2_reg, limit_reg, chr2_reg); + __ cmp(chr1_reg, chr2_reg); + __ br(Assembler::notEqual, false, Assembler::pt, Ldone); + __ delayed()->mov(G0, result_reg); // not equal + __ inccc(limit_reg, 2*sizeof(jchar)); + // annul LDUW if branch is not taken to prevent access past end of string + __ br(Assembler::notZero, true, Assembler::pt, Lloop); //annul on taken + __ delayed()->lduw(ary1_reg, limit_reg, chr1_reg); // hoisted + + __ add(G0, 1, result_reg); // equals + + __ bind(Ldone); + %} + enc_class enc_rethrow() %{ cbuf.set_inst_mark(); Register temp_reg = G3; @@ -9015,6 +9211,25 @@ instruct string_compare(o0RegP str1, o1RegP str2, g3RegP tmp1, g4RegP tmp2, note ins_pipe(long_memory_op); %} +instruct string_equals(o0RegP str1, o1RegP str2, g3RegP tmp1, g4RegP tmp2, notemp_iRegI result, + o7RegI tmp3, flagsReg ccr) %{ + match(Set result (StrEquals str1 str2)); + effect(USE_KILL str1, USE_KILL str2, KILL tmp1, KILL tmp2, KILL ccr, KILL tmp3); + ins_cost(300); + format %{ "String Equals $str1,$str2 -> $result" %} + ins_encode( enc_String_Equals(str1, str2, tmp1, tmp2, result) ); + ins_pipe(long_memory_op); +%} + +instruct array_equals(o0RegP ary1, o1RegP ary2, g3RegP tmp1, g4RegP tmp2, notemp_iRegI result, + flagsReg ccr) %{ + match(Set result (AryEq ary1 ary2)); + effect(USE_KILL ary1, USE_KILL ary2, KILL tmp1, KILL tmp2, KILL ccr); + ins_cost(300); + format %{ "Array Equals $ary1,$ary2 -> $result" %} + ins_encode( enc_Array_Equals(ary1, ary2, tmp1, tmp2, result)); + ins_pipe(long_memory_op); +%} //---------- Population Count Instructions ------------------------------------- diff --git a/hotspot/src/cpu/x86/vm/assembler_x86.cpp b/hotspot/src/cpu/x86/vm/assembler_x86.cpp index dbf2f2b664a..35ee7e54019 100644 --- a/hotspot/src/cpu/x86/vm/assembler_x86.cpp +++ b/hotspot/src/cpu/x86/vm/assembler_x86.cpp @@ -2173,6 +2173,31 @@ void Assembler::orl(Register dst, Register src) { emit_arith(0x0B, 0xC0, dst, src); } +void Assembler::pcmpestri(XMMRegister dst, Address src, int imm8) { + assert(VM_Version::supports_sse4_2(), ""); + + InstructionMark im(this); + emit_byte(0x66); + prefix(src, dst); + emit_byte(0x0F); + emit_byte(0x3A); + emit_byte(0x61); + emit_operand(dst, src); + emit_byte(imm8); +} + +void Assembler::pcmpestri(XMMRegister dst, XMMRegister src, int imm8) { + assert(VM_Version::supports_sse4_2(), ""); + + emit_byte(0x66); + int encode = prefixq_and_encode(dst->encoding(), src->encoding()); + emit_byte(0x0F); + emit_byte(0x3A); + emit_byte(0x61); + emit_byte(0xC0 | encode); + emit_byte(imm8); +} + // generic void Assembler::pop(Register dst) { int encode = prefix_and_encode(dst->encoding()); @@ -2330,6 +2355,29 @@ void Assembler::psrlq(XMMRegister dst, int shift) { emit_byte(shift); } +void Assembler::ptest(XMMRegister dst, Address src) { + assert(VM_Version::supports_sse4_1(), ""); + + InstructionMark im(this); + emit_byte(0x66); + prefix(src, dst); + emit_byte(0x0F); + emit_byte(0x38); + emit_byte(0x17); + emit_operand(dst, src); +} + +void Assembler::ptest(XMMRegister dst, XMMRegister src) { + assert(VM_Version::supports_sse4_1(), ""); + + emit_byte(0x66); + int encode = prefixq_and_encode(dst->encoding(), src->encoding()); + emit_byte(0x0F); + emit_byte(0x38); + emit_byte(0x17); + emit_byte(0xC0 | encode); +} + void Assembler::punpcklbw(XMMRegister dst, XMMRegister src) { NOT_LP64(assert(VM_Version::supports_sse2(), "")); emit_byte(0x66); diff --git a/hotspot/src/cpu/x86/vm/assembler_x86.hpp b/hotspot/src/cpu/x86/vm/assembler_x86.hpp index a5efad8d22b..89ac6dd5326 100644 --- a/hotspot/src/cpu/x86/vm/assembler_x86.hpp +++ b/hotspot/src/cpu/x86/vm/assembler_x86.hpp @@ -1226,6 +1226,10 @@ private: void orq(Register dst, Address src); void orq(Register dst, Register src); + // SSE4.2 string instructions + void pcmpestri(XMMRegister xmm1, XMMRegister xmm2, int imm8); + void pcmpestri(XMMRegister xmm1, Address src, int imm8); + void popl(Address dst); #ifdef _LP64 @@ -1260,6 +1264,10 @@ private: // Shift Right Logical Quadword Immediate void psrlq(XMMRegister dst, int shift); + // Logical Compare Double Quadword + void ptest(XMMRegister dst, XMMRegister src); + void ptest(XMMRegister dst, Address src); + // Interleave Low Bytes void punpcklbw(XMMRegister dst, XMMRegister src); diff --git a/hotspot/src/cpu/x86/vm/vm_version_x86.cpp b/hotspot/src/cpu/x86/vm/vm_version_x86.cpp index 1307dd1e54f..ccf6b429282 100644 --- a/hotspot/src/cpu/x86/vm/vm_version_x86.cpp +++ b/hotspot/src/cpu/x86/vm/vm_version_x86.cpp @@ -408,6 +408,11 @@ void VM_Version::get_processor_features() { UseUnalignedLoadStores = true; // use movdqu on newest Intel cpus } } + if( supports_sse4_2() && UseSSE >= 4 ) { + if( FLAG_IS_DEFAULT(UseSSE42Intrinsics)) { + UseSSE42Intrinsics = true; + } + } } } diff --git a/hotspot/src/cpu/x86/vm/x86_32.ad b/hotspot/src/cpu/x86/vm/x86_32.ad index cd64cfbf9f2..509a39972fe 100644 --- a/hotspot/src/cpu/x86/vm/x86_32.ad +++ b/hotspot/src/cpu/x86/vm/x86_32.ad @@ -3694,12 +3694,16 @@ encode %{ } %} - enc_class enc_String_Compare() %{ + enc_class enc_String_Compare(eDIRegP str1, eSIRegP str2, regXD tmp1, regXD tmp2, + eAXRegI tmp3, eBXRegI tmp4, eCXRegI result) %{ Label ECX_GOOD_LABEL, LENGTH_DIFF_LABEL, POP_LABEL, DONE_LABEL, CONT_LABEL, WHILE_HEAD_LABEL; MacroAssembler masm(&cbuf); + XMMRegister tmp1Reg = as_XMMRegister($tmp1$$reg); + XMMRegister tmp2Reg = as_XMMRegister($tmp2$$reg); + // Get the first character position in both strings // [8] char array, [12] offset, [16] count int value_offset = java_lang_String::value_offset_in_bytes(); @@ -3717,7 +3721,6 @@ encode %{ // Compute the minimum of the string lengths(rsi) and the // difference of the string lengths (stack) - if (VM_Version::supports_cmov()) { masm.movl(rdi, Address(rdi, count_offset)); masm.movl(rsi, Address(rsi, count_offset)); @@ -3731,7 +3734,7 @@ encode %{ masm.movl(rsi, rdi); masm.subl(rdi, rcx); masm.push(rdi); - masm.jcc(Assembler::lessEqual, ECX_GOOD_LABEL); + masm.jccb(Assembler::lessEqual, ECX_GOOD_LABEL); masm.movl(rsi, rcx); // rsi holds min, rcx is unused } @@ -3756,7 +3759,7 @@ encode %{ Label LSkip2; // Check if the strings start at same location masm.cmpptr(rbx,rax); - masm.jcc(Assembler::notEqual, LSkip2); + masm.jccb(Assembler::notEqual, LSkip2); // Check if the length difference is zero (from stack) masm.cmpl(Address(rsp, 0), 0x0); @@ -3766,9 +3769,52 @@ encode %{ masm.bind(LSkip2); } - // Shift rax, and rbx, to the end of the arrays, negate min - masm.lea(rax, Address(rax, rsi, Address::times_2, 2)); - masm.lea(rbx, Address(rbx, rsi, Address::times_2, 2)); + // Advance to next character + masm.addptr(rax, 2); + masm.addptr(rbx, 2); + + if (UseSSE42Intrinsics) { + // With SSE4.2, use double quad vector compare + Label COMPARE_VECTORS, VECTOR_NOT_EQUAL, COMPARE_TAIL; + // Setup to compare 16-byte vectors + masm.movl(rdi, rsi); + masm.andl(rsi, 0xfffffff8); // rsi holds the vector count + masm.andl(rdi, 0x00000007); // rdi holds the tail count + masm.testl(rsi, rsi); + masm.jccb(Assembler::zero, COMPARE_TAIL); + + masm.lea(rax, Address(rax, rsi, Address::times_2)); + masm.lea(rbx, Address(rbx, rsi, Address::times_2)); + masm.negl(rsi); + + masm.bind(COMPARE_VECTORS); + masm.movdqu(tmp1Reg, Address(rax, rsi, Address::times_2)); + masm.movdqu(tmp2Reg, Address(rbx, rsi, Address::times_2)); + masm.pxor(tmp1Reg, tmp2Reg); + masm.ptest(tmp1Reg, tmp1Reg); + masm.jccb(Assembler::notZero, VECTOR_NOT_EQUAL); + masm.addl(rsi, 8); + masm.jcc(Assembler::notZero, COMPARE_VECTORS); + masm.jmpb(COMPARE_TAIL); + + // Mismatched characters in the vectors + masm.bind(VECTOR_NOT_EQUAL); + masm.lea(rax, Address(rax, rsi, Address::times_2)); + masm.lea(rbx, Address(rbx, rsi, Address::times_2)); + masm.movl(rdi, 8); + + // Compare tail (< 8 chars), or rescan last vectors to + // find 1st mismatched characters + masm.bind(COMPARE_TAIL); + masm.testl(rdi, rdi); + masm.jccb(Assembler::zero, LENGTH_DIFF_LABEL); + masm.movl(rsi, rdi); + // Fallthru to tail compare + } + + //Shift rax, and rbx, to the end of the arrays, negate min + masm.lea(rax, Address(rax, rsi, Address::times_2, 0)); + masm.lea(rbx, Address(rbx, rsi, Address::times_2, 0)); masm.negl(rsi); // Compare the rest of the characters @@ -3776,93 +3822,329 @@ encode %{ masm.load_unsigned_short(rcx, Address(rbx, rsi, Address::times_2, 0)); masm.load_unsigned_short(rdi, Address(rax, rsi, Address::times_2, 0)); masm.subl(rcx, rdi); - masm.jcc(Assembler::notZero, POP_LABEL); + masm.jccb(Assembler::notZero, POP_LABEL); masm.incrementl(rsi); masm.jcc(Assembler::notZero, WHILE_HEAD_LABEL); // Strings are equal up to min length. Return the length difference. masm.bind(LENGTH_DIFF_LABEL); masm.pop(rcx); - masm.jmp(DONE_LABEL); + masm.jmpb(DONE_LABEL); // Discard the stored length difference masm.bind(POP_LABEL); masm.addptr(rsp, 4); - + // That's it masm.bind(DONE_LABEL); %} - enc_class enc_Array_Equals(eDIRegP ary1, eSIRegP ary2, eAXRegI tmp1, eBXRegI tmp2, eCXRegI result) %{ - Label TRUE_LABEL, FALSE_LABEL, DONE_LABEL, COMPARE_LOOP_HDR, COMPARE_LOOP; + enc_class enc_String_Equals(eDIRegP str1, eSIRegP str2, regXD tmp1, regXD tmp2, + eBXRegI tmp3, eCXRegI tmp4, eAXRegI result) %{ + Label RET_TRUE, RET_FALSE, DONE, COMPARE_VECTORS, COMPARE_CHAR; MacroAssembler masm(&cbuf); - Register ary1Reg = as_Register($ary1$$reg); - Register ary2Reg = as_Register($ary2$$reg); - Register tmp1Reg = as_Register($tmp1$$reg); - Register tmp2Reg = as_Register($tmp2$$reg); - Register resultReg = as_Register($result$$reg); + XMMRegister tmp1Reg = as_XMMRegister($tmp1$$reg); + XMMRegister tmp2Reg = as_XMMRegister($tmp2$$reg); + + int value_offset = java_lang_String::value_offset_in_bytes(); + int offset_offset = java_lang_String::offset_offset_in_bytes(); + int count_offset = java_lang_String::count_offset_in_bytes(); + int base_offset = arrayOopDesc::base_offset_in_bytes(T_CHAR); + + // does source == target string? + masm.cmpptr(rdi, rsi); + masm.jcc(Assembler::equal, RET_TRUE); + + // get and compare counts + masm.movl(rcx, Address(rdi, count_offset)); + masm.movl(rax, Address(rsi, count_offset)); + masm.cmpl(rcx, rax); + masm.jcc(Assembler::notEqual, RET_FALSE); + masm.testl(rax, rax); + masm.jcc(Assembler::zero, RET_TRUE); + + // get source string offset and value + masm.movptr(rbx, Address(rsi, value_offset)); + masm.movl(rax, Address(rsi, offset_offset)); + masm.leal(rsi, Address(rbx, rax, Address::times_2, base_offset)); + + // get compare string offset and value + masm.movptr(rbx, Address(rdi, value_offset)); + masm.movl(rax, Address(rdi, offset_offset)); + masm.leal(rdi, Address(rbx, rax, Address::times_2, base_offset)); + + // Set byte count + masm.shll(rcx, 1); + masm.movl(rax, rcx); + + if (UseSSE42Intrinsics) { + // With SSE4.2, use double quad vector compare + Label COMPARE_WIDE_VECTORS, COMPARE_TAIL; + // Compare 16-byte vectors + masm.andl(rcx, 0xfffffff0); // vector count (in bytes) + masm.andl(rax, 0x0000000e); // tail count (in bytes) + masm.testl(rcx, rcx); + masm.jccb(Assembler::zero, COMPARE_TAIL); + masm.lea(rdi, Address(rdi, rcx, Address::times_1)); + masm.lea(rsi, Address(rsi, rcx, Address::times_1)); + masm.negl(rcx); + + masm.bind(COMPARE_WIDE_VECTORS); + masm.movdqu(tmp1Reg, Address(rdi, rcx, Address::times_1)); + masm.movdqu(tmp2Reg, Address(rsi, rcx, Address::times_1)); + masm.pxor(tmp1Reg, tmp2Reg); + masm.ptest(tmp1Reg, tmp1Reg); + masm.jccb(Assembler::notZero, RET_FALSE); + masm.addl(rcx, 16); + masm.jcc(Assembler::notZero, COMPARE_WIDE_VECTORS); + masm.bind(COMPARE_TAIL); + masm.movl(rcx, rax); + // Fallthru to tail compare + } + + // Compare 4-byte vectors + masm.andl(rcx, 0xfffffffc); // vector count (in bytes) + masm.andl(rax, 0x00000002); // tail char (in bytes) + masm.testl(rcx, rcx); + masm.jccb(Assembler::zero, COMPARE_CHAR); + masm.lea(rdi, Address(rdi, rcx, Address::times_1)); + masm.lea(rsi, Address(rsi, rcx, Address::times_1)); + masm.negl(rcx); + + masm.bind(COMPARE_VECTORS); + masm.movl(rbx, Address(rdi, rcx, Address::times_1)); + masm.cmpl(rbx, Address(rsi, rcx, Address::times_1)); + masm.jccb(Assembler::notEqual, RET_FALSE); + masm.addl(rcx, 4); + masm.jcc(Assembler::notZero, COMPARE_VECTORS); + + // Compare trailing char (final 2 bytes), if any + masm.bind(COMPARE_CHAR); + masm.testl(rax, rax); + masm.jccb(Assembler::zero, RET_TRUE); + masm.load_unsigned_short(rbx, Address(rdi, 0)); + masm.load_unsigned_short(rcx, Address(rsi, 0)); + masm.cmpl(rbx, rcx); + masm.jccb(Assembler::notEqual, RET_FALSE); + + masm.bind(RET_TRUE); + masm.movl(rax, 1); // return true + masm.jmpb(DONE); + + masm.bind(RET_FALSE); + masm.xorl(rax, rax); // return false + + masm.bind(DONE); + %} + + enc_class enc_String_IndexOf(eSIRegP str1, eDIRegP str2, regXD tmp1, eAXRegI tmp2, + eCXRegI tmp3, eDXRegI tmp4, eBXRegI result) %{ + // SSE4.2 version + Label LOAD_SUBSTR, PREP_FOR_SCAN, SCAN_TO_SUBSTR, + SCAN_SUBSTR, RET_NEG_ONE, RET_NOT_FOUND, CLEANUP, DONE; + MacroAssembler masm(&cbuf); + + XMMRegister tmp1Reg = as_XMMRegister($tmp1$$reg); + + // Get the first character position in both strings + // [8] char array, [12] offset, [16] count + int value_offset = java_lang_String::value_offset_in_bytes(); + int offset_offset = java_lang_String::offset_offset_in_bytes(); + int count_offset = java_lang_String::count_offset_in_bytes(); + int base_offset = arrayOopDesc::base_offset_in_bytes(T_CHAR); + + // Get counts for string and substr + masm.movl(rdx, Address(rsi, count_offset)); + masm.movl(rax, Address(rdi, count_offset)); + // Check for substr count > string count + masm.cmpl(rax, rdx); + masm.jcc(Assembler::greater, RET_NEG_ONE); + + // Start the indexOf operation + // Get start addr of string + masm.movptr(rbx, Address(rsi, value_offset)); + masm.movl(rcx, Address(rsi, offset_offset)); + masm.lea(rsi, Address(rbx, rcx, Address::times_2, base_offset)); + masm.push(rsi); + + // Get start addr of substr + masm.movptr(rbx, Address(rdi, value_offset)); + masm.movl(rcx, Address(rdi, offset_offset)); + masm.lea(rdi, Address(rbx, rcx, Address::times_2, base_offset)); + masm.push(rdi); + masm.push(rax); + masm.jmpb(PREP_FOR_SCAN); + + // Substr count saved at sp + // Substr saved at sp+4 + // String saved at sp+8 + + // Prep to load substr for scan + masm.bind(LOAD_SUBSTR); + masm.movptr(rdi, Address(rsp, 4)); + masm.movl(rax, Address(rsp, 0)); + + // Load substr + masm.bind(PREP_FOR_SCAN); + masm.movdqu(tmp1Reg, Address(rdi, 0)); + masm.addl(rdx, 8); // prime the loop + masm.subptr(rsi, 16); + + // Scan string for substr in 16-byte vectors + masm.bind(SCAN_TO_SUBSTR); + masm.subl(rdx, 8); + masm.addptr(rsi, 16); + masm.pcmpestri(tmp1Reg, Address(rsi, 0), 0x0d); + masm.jcc(Assembler::above, SCAN_TO_SUBSTR); // CF == 0 && ZF == 0 + masm.jccb(Assembler::aboveEqual, RET_NOT_FOUND); // CF == 0 + + // Fallthru: found a potential substr + + // Make sure string is still long enough + masm.subl(rdx, rcx); + masm.cmpl(rdx, rax); + masm.jccb(Assembler::negative, RET_NOT_FOUND); + // Compute start addr of substr + masm.lea(rsi, Address(rsi, rcx, Address::times_2)); + masm.movptr(rbx, rsi); + + // Compare potential substr + masm.addl(rdx, 8); // prime the loop + masm.addl(rax, 8); + masm.subptr(rsi, 16); + masm.subptr(rdi, 16); + + // Scan 16-byte vectors of string and substr + masm.bind(SCAN_SUBSTR); + masm.subl(rax, 8); + masm.subl(rdx, 8); + masm.addptr(rsi, 16); + masm.addptr(rdi, 16); + masm.movdqu(tmp1Reg, Address(rdi, 0)); + masm.pcmpestri(tmp1Reg, Address(rsi, 0), 0x0d); + masm.jcc(Assembler::noOverflow, LOAD_SUBSTR); // OF == 0 + masm.jcc(Assembler::positive, SCAN_SUBSTR); // SF == 0 + + // Compute substr offset + masm.movptr(rsi, Address(rsp, 8)); + masm.subptr(rbx, rsi); + masm.shrl(rbx, 1); + masm.jmpb(CLEANUP); + + masm.bind(RET_NEG_ONE); + masm.movl(rbx, -1); + masm.jmpb(DONE); + + masm.bind(RET_NOT_FOUND); + masm.movl(rbx, -1); + + masm.bind(CLEANUP); + masm.addptr(rsp, 12); + + masm.bind(DONE); + %} + + enc_class enc_Array_Equals(eDIRegP ary1, eSIRegP ary2, regXD tmp1, regXD tmp2, + eBXRegI tmp3, eDXRegI tmp4, eAXRegI result) %{ + Label TRUE_LABEL, FALSE_LABEL, DONE, COMPARE_VECTORS, COMPARE_CHAR; + MacroAssembler masm(&cbuf); + + XMMRegister tmp1Reg = as_XMMRegister($tmp1$$reg); + XMMRegister tmp2Reg = as_XMMRegister($tmp2$$reg); + Register ary1Reg = as_Register($ary1$$reg); + Register ary2Reg = as_Register($ary2$$reg); + Register tmp3Reg = as_Register($tmp3$$reg); + Register tmp4Reg = as_Register($tmp4$$reg); + Register resultReg = as_Register($result$$reg); int length_offset = arrayOopDesc::length_offset_in_bytes(); int base_offset = arrayOopDesc::base_offset_in_bytes(T_CHAR); // Check the input args - masm.cmpl(ary1Reg, ary2Reg); + masm.cmpptr(ary1Reg, ary2Reg); masm.jcc(Assembler::equal, TRUE_LABEL); - masm.testl(ary1Reg, ary1Reg); + masm.testptr(ary1Reg, ary1Reg); masm.jcc(Assembler::zero, FALSE_LABEL); - masm.testl(ary2Reg, ary2Reg); + masm.testptr(ary2Reg, ary2Reg); masm.jcc(Assembler::zero, FALSE_LABEL); // Check the lengths - masm.movl(tmp2Reg, Address(ary1Reg, length_offset)); + masm.movl(tmp4Reg, Address(ary1Reg, length_offset)); masm.movl(resultReg, Address(ary2Reg, length_offset)); - masm.cmpl(tmp2Reg, resultReg); + masm.cmpl(tmp4Reg, resultReg); masm.jcc(Assembler::notEqual, FALSE_LABEL); masm.testl(resultReg, resultReg); masm.jcc(Assembler::zero, TRUE_LABEL); - // Get the number of 4 byte vectors to compare - masm.shrl(resultReg, 1); + // Load array addrs + masm.lea(ary1Reg, Address(ary1Reg, base_offset)); + masm.lea(ary2Reg, Address(ary2Reg, base_offset)); - // Check for odd-length arrays - masm.andl(tmp2Reg, 1); - masm.testl(tmp2Reg, tmp2Reg); - masm.jcc(Assembler::zero, COMPARE_LOOP_HDR); + // Set byte count + masm.shll(tmp4Reg, 1); + masm.movl(resultReg, tmp4Reg); - // Compare 2-byte "tail" at end of arrays - masm.load_unsigned_short(tmp1Reg, Address(ary1Reg, resultReg, Address::times_4, base_offset)); - masm.load_unsigned_short(tmp2Reg, Address(ary2Reg, resultReg, Address::times_4, base_offset)); - masm.cmpl(tmp1Reg, tmp2Reg); - masm.jcc(Assembler::notEqual, FALSE_LABEL); + if (UseSSE42Intrinsics) { + // With SSE4.2, use double quad vector compare + Label COMPARE_WIDE_VECTORS, COMPARE_TAIL; + // Compare 16-byte vectors + masm.andl(tmp4Reg, 0xfffffff0); // vector count (in bytes) + masm.andl(resultReg, 0x0000000e); // tail count (in bytes) + masm.testl(tmp4Reg, tmp4Reg); + masm.jccb(Assembler::zero, COMPARE_TAIL); + masm.lea(ary1Reg, Address(ary1Reg, tmp4Reg, Address::times_1)); + masm.lea(ary2Reg, Address(ary2Reg, tmp4Reg, Address::times_1)); + masm.negl(tmp4Reg); + + masm.bind(COMPARE_WIDE_VECTORS); + masm.movdqu(tmp1Reg, Address(ary1Reg, tmp4Reg, Address::times_1)); + masm.movdqu(tmp2Reg, Address(ary2Reg, tmp4Reg, Address::times_1)); + masm.pxor(tmp1Reg, tmp2Reg); + masm.ptest(tmp1Reg, tmp1Reg); + + masm.jccb(Assembler::notZero, FALSE_LABEL); + masm.addl(tmp4Reg, 16); + masm.jcc(Assembler::notZero, COMPARE_WIDE_VECTORS); + masm.bind(COMPARE_TAIL); + masm.movl(tmp4Reg, resultReg); + // Fallthru to tail compare + } + + // Compare 4-byte vectors + masm.andl(tmp4Reg, 0xfffffffc); // vector count (in bytes) + masm.andl(resultReg, 0x00000002); // tail char (in bytes) + masm.testl(tmp4Reg, tmp4Reg); + masm.jccb(Assembler::zero, COMPARE_CHAR); + masm.lea(ary1Reg, Address(ary1Reg, tmp4Reg, Address::times_1)); + masm.lea(ary2Reg, Address(ary2Reg, tmp4Reg, Address::times_1)); + masm.negl(tmp4Reg); + + masm.bind(COMPARE_VECTORS); + masm.movl(tmp3Reg, Address(ary1Reg, tmp4Reg, Address::times_1)); + masm.cmpl(tmp3Reg, Address(ary2Reg, tmp4Reg, Address::times_1)); + masm.jccb(Assembler::notEqual, FALSE_LABEL); + masm.addl(tmp4Reg, 4); + masm.jcc(Assembler::notZero, COMPARE_VECTORS); + + // Compare trailing char (final 2 bytes), if any + masm.bind(COMPARE_CHAR); masm.testl(resultReg, resultReg); - masm.jcc(Assembler::zero, TRUE_LABEL); - - // Setup compare loop - masm.bind(COMPARE_LOOP_HDR); - // Shift tmp1Reg and tmp2Reg to the last 4-byte boundary of the arrays - masm.leal(tmp1Reg, Address(ary1Reg, resultReg, Address::times_4, base_offset)); - masm.leal(tmp2Reg, Address(ary2Reg, resultReg, Address::times_4, base_offset)); - masm.negl(resultReg); - - // 4-byte-wide compare loop - masm.bind(COMPARE_LOOP); - masm.movl(ary1Reg, Address(tmp1Reg, resultReg, Address::times_4, 0)); - masm.movl(ary2Reg, Address(tmp2Reg, resultReg, Address::times_4, 0)); - masm.cmpl(ary1Reg, ary2Reg); - masm.jcc(Assembler::notEqual, FALSE_LABEL); - masm.increment(resultReg); - masm.jcc(Assembler::notZero, COMPARE_LOOP); + masm.jccb(Assembler::zero, TRUE_LABEL); + masm.load_unsigned_short(tmp3Reg, Address(ary1Reg, 0)); + masm.load_unsigned_short(tmp4Reg, Address(ary2Reg, 0)); + masm.cmpl(tmp3Reg, tmp4Reg); + masm.jccb(Assembler::notEqual, FALSE_LABEL); masm.bind(TRUE_LABEL); masm.movl(resultReg, 1); // return true - masm.jmp(DONE_LABEL); + masm.jmpb(DONE); masm.bind(FALSE_LABEL); masm.xorl(resultReg, resultReg); // return false // That's it - masm.bind(DONE_LABEL); + masm.bind(DONE); %} enc_class enc_pop_rdx() %{ @@ -12074,11 +12356,8 @@ instruct Repl2F_immXF0(regXD dst, immXF0 zero) %{ ins_pipe( fpu_reg_reg ); %} - - // ======================================================================= // fast clearing of an array - instruct rep_stos(eCXRegI cnt, eDIRegP base, eAXRegI zero, Universe dummy, eFlagsReg cr) %{ match(Set dummy (ClearArray cnt base)); effect(USE_KILL cnt, USE_KILL base, KILL zero, KILL cr); @@ -12092,24 +12371,48 @@ instruct rep_stos(eCXRegI cnt, eDIRegP base, eAXRegI zero, Universe dummy, eFlag ins_pipe( pipe_slow ); %} -instruct string_compare(eDIRegP str1, eSIRegP str2, eAXRegI tmp1, eBXRegI tmp2, eCXRegI result, eFlagsReg cr) %{ +instruct string_compare(eDIRegP str1, eSIRegP str2, regXD tmp1, regXD tmp2, + eAXRegI tmp3, eBXRegI tmp4, eCXRegI result, eFlagsReg cr) %{ match(Set result (StrComp str1 str2)); - effect(USE_KILL str1, USE_KILL str2, KILL tmp1, KILL tmp2, KILL cr); + effect(TEMP tmp1, TEMP tmp2, USE_KILL str1, USE_KILL str2, KILL tmp3, KILL tmp4, KILL cr); //ins_cost(300); format %{ "String Compare $str1,$str2 -> $result // KILL EAX, EBX" %} - ins_encode( enc_String_Compare() ); + ins_encode( enc_String_Compare(str1, str2, tmp1, tmp2, tmp3, tmp4, result) ); + ins_pipe( pipe_slow ); +%} + +// fast string equals +instruct string_equals(eDIRegP str1, eSIRegP str2, regXD tmp1, regXD tmp2, + eBXRegI tmp3, eCXRegI tmp4, eAXRegI result, eFlagsReg cr) %{ + match(Set result (StrEquals str1 str2)); + effect(TEMP tmp1, TEMP tmp2, USE_KILL str1, USE_KILL str2, KILL tmp3, KILL tmp4, KILL cr); + + format %{ "String Equals $str1,$str2 -> $result // KILL EBX, ECX" %} + ins_encode( enc_String_Equals(tmp1, tmp2, str1, str2, tmp3, tmp4, result) ); + ins_pipe( pipe_slow ); +%} + +instruct string_indexof(eSIRegP str1, eDIRegP str2, regXD tmp1, eAXRegI tmp2, + eCXRegI tmp3, eDXRegI tmp4, eBXRegI result, eFlagsReg cr) %{ + predicate(UseSSE42Intrinsics); + match(Set result (StrIndexOf str1 str2)); + effect(TEMP tmp1, USE_KILL str1, USE_KILL str2, KILL tmp2, KILL tmp3, KILL tmp4, KILL cr); + + format %{ "String IndexOf $str1,$str2 -> $result // KILL EAX, ECX, EDX" %} + ins_encode( enc_String_IndexOf(str1, str2, tmp1, tmp2, tmp3, tmp4, result) ); ins_pipe( pipe_slow ); %} // fast array equals -instruct array_equals(eDIRegP ary1, eSIRegP ary2, eAXRegI tmp1, eBXRegI tmp2, eCXRegI result, eFlagsReg cr) %{ +instruct array_equals(eDIRegP ary1, eSIRegP ary2, regXD tmp1, regXD tmp2, eBXRegI tmp3, + eDXRegI tmp4, eAXRegI result, eFlagsReg cr) %{ match(Set result (AryEq ary1 ary2)); - effect(USE_KILL ary1, USE_KILL ary2, KILL tmp1, KILL tmp2, KILL cr); + effect(TEMP tmp1, TEMP tmp2, USE_KILL ary1, USE_KILL ary2, KILL tmp3, KILL tmp4, KILL cr); //ins_cost(300); - format %{ "Array Equals $ary1,$ary2 -> $result // KILL EAX, EBX" %} - ins_encode( enc_Array_Equals(ary1, ary2, tmp1, tmp2, result) ); + format %{ "Array Equals $ary1,$ary2 -> $result // KILL EBX, EDX" %} + ins_encode( enc_Array_Equals(ary1, ary2, tmp1, tmp2, tmp3, tmp4, result) ); ins_pipe( pipe_slow ); %} diff --git a/hotspot/src/cpu/x86/vm/x86_64.ad b/hotspot/src/cpu/x86/vm/x86_64.ad index ae23fef1114..892b0863128 100644 --- a/hotspot/src/cpu/x86/vm/x86_64.ad +++ b/hotspot/src/cpu/x86/vm/x86_64.ad @@ -3694,13 +3694,16 @@ encode %{ } %} - enc_class enc_String_Compare() - %{ + enc_class enc_String_Compare(rdi_RegP str1, rsi_RegP str2, regD tmp1, regD tmp2, + rax_RegI tmp3, rbx_RegI tmp4, rcx_RegI result) %{ Label RCX_GOOD_LABEL, LENGTH_DIFF_LABEL, POP_LABEL, DONE_LABEL, CONT_LABEL, WHILE_HEAD_LABEL; MacroAssembler masm(&cbuf); + XMMRegister tmp1Reg = as_XMMRegister($tmp1$$reg); + XMMRegister tmp2Reg = as_XMMRegister($tmp2$$reg); + // Get the first character position in both strings // [8] char array, [12] offset, [16] count int value_offset = java_lang_String::value_offset_in_bytes(); @@ -3718,6 +3721,7 @@ encode %{ // Compute the minimum of the string lengths(rsi) and the // difference of the string lengths (stack) + // do the conditional move stuff masm.movl(rdi, Address(rdi, count_offset)); masm.movl(rsi, Address(rsi, count_offset)); masm.movl(rcx, rdi); @@ -3745,7 +3749,7 @@ encode %{ Label LSkip2; // Check if the strings start at same location masm.cmpptr(rbx, rax); - masm.jcc(Assembler::notEqual, LSkip2); + masm.jccb(Assembler::notEqual, LSkip2); // Check if the length difference is zero (from stack) masm.cmpl(Address(rsp, 0), 0x0); @@ -3755,9 +3759,52 @@ encode %{ masm.bind(LSkip2); } + // Advance to next character + masm.addptr(rax, 2); + masm.addptr(rbx, 2); + + if (UseSSE42Intrinsics) { + // With SSE4.2, use double quad vector compare + Label COMPARE_VECTORS, VECTOR_NOT_EQUAL, COMPARE_TAIL; + // Setup to compare 16-byte vectors + masm.movl(rdi, rsi); + masm.andl(rsi, 0xfffffff8); // rsi holds the vector count + masm.andl(rdi, 0x00000007); // rdi holds the tail count + masm.testl(rsi, rsi); + masm.jccb(Assembler::zero, COMPARE_TAIL); + + masm.lea(rax, Address(rax, rsi, Address::times_2)); + masm.lea(rbx, Address(rbx, rsi, Address::times_2)); + masm.negptr(rsi); + + masm.bind(COMPARE_VECTORS); + masm.movdqu(tmp1Reg, Address(rax, rsi, Address::times_2)); + masm.movdqu(tmp2Reg, Address(rbx, rsi, Address::times_2)); + masm.pxor(tmp1Reg, tmp2Reg); + masm.ptest(tmp1Reg, tmp1Reg); + masm.jccb(Assembler::notZero, VECTOR_NOT_EQUAL); + masm.addptr(rsi, 8); + masm.jcc(Assembler::notZero, COMPARE_VECTORS); + masm.jmpb(COMPARE_TAIL); + + // Mismatched characters in the vectors + masm.bind(VECTOR_NOT_EQUAL); + masm.lea(rax, Address(rax, rsi, Address::times_2)); + masm.lea(rbx, Address(rbx, rsi, Address::times_2)); + masm.movl(rdi, 8); + + // Compare tail (< 8 chars), or rescan last vectors to + // find 1st mismatched characters + masm.bind(COMPARE_TAIL); + masm.testl(rdi, rdi); + masm.jccb(Assembler::zero, LENGTH_DIFF_LABEL); + masm.movl(rsi, rdi); + // Fallthru to tail compare + } + // Shift RAX and RBX to the end of the arrays, negate min - masm.lea(rax, Address(rax, rsi, Address::times_2, 2)); - masm.lea(rbx, Address(rbx, rsi, Address::times_2, 2)); + masm.lea(rax, Address(rax, rsi, Address::times_2, 0)); + masm.lea(rbx, Address(rbx, rsi, Address::times_2, 0)); masm.negptr(rsi); // Compare the rest of the characters @@ -3765,93 +3812,329 @@ encode %{ masm.load_unsigned_short(rcx, Address(rbx, rsi, Address::times_2, 0)); masm.load_unsigned_short(rdi, Address(rax, rsi, Address::times_2, 0)); masm.subl(rcx, rdi); - masm.jcc(Assembler::notZero, POP_LABEL); + masm.jccb(Assembler::notZero, POP_LABEL); masm.increment(rsi); masm.jcc(Assembler::notZero, WHILE_HEAD_LABEL); // Strings are equal up to min length. Return the length difference. masm.bind(LENGTH_DIFF_LABEL); masm.pop(rcx); - masm.jmp(DONE_LABEL); + masm.jmpb(DONE_LABEL); // Discard the stored length difference masm.bind(POP_LABEL); masm.addptr(rsp, 8); - + // That's it masm.bind(DONE_LABEL); %} - enc_class enc_Array_Equals(rdi_RegP ary1, rsi_RegP ary2, rax_RegI tmp1, rbx_RegI tmp2, rcx_RegI result) %{ - Label TRUE_LABEL, FALSE_LABEL, DONE_LABEL, COMPARE_LOOP_HDR, COMPARE_LOOP; + enc_class enc_String_IndexOf(rsi_RegP str1, rdi_RegP str2, regD tmp1, rax_RegI tmp2, + rcx_RegI tmp3, rdx_RegI tmp4, rbx_RegI result) %{ + // SSE4.2 version + Label LOAD_SUBSTR, PREP_FOR_SCAN, SCAN_TO_SUBSTR, + SCAN_SUBSTR, RET_NEG_ONE, RET_NOT_FOUND, CLEANUP, DONE; MacroAssembler masm(&cbuf); - Register ary1Reg = as_Register($ary1$$reg); - Register ary2Reg = as_Register($ary2$$reg); - Register tmp1Reg = as_Register($tmp1$$reg); - Register tmp2Reg = as_Register($tmp2$$reg); - Register resultReg = as_Register($result$$reg); + XMMRegister tmp1Reg = as_XMMRegister($tmp1$$reg); + + // Get the first character position in both strings + // [8] char array, [12] offset, [16] count + int value_offset = java_lang_String::value_offset_in_bytes(); + int offset_offset = java_lang_String::offset_offset_in_bytes(); + int count_offset = java_lang_String::count_offset_in_bytes(); + int base_offset = arrayOopDesc::base_offset_in_bytes(T_CHAR); + + // Get counts for string and substr + masm.movl(rdx, Address(rsi, count_offset)); + masm.movl(rax, Address(rdi, count_offset)); + // Check for substr count > string count + masm.cmpl(rax, rdx); + masm.jcc(Assembler::greater, RET_NEG_ONE); + + // Start the indexOf operation + // Get start addr of string + masm.load_heap_oop(rbx, Address(rsi, value_offset)); + masm.movl(rcx, Address(rsi, offset_offset)); + masm.lea(rsi, Address(rbx, rcx, Address::times_2, base_offset)); + masm.push(rsi); + + // Get start addr of substr + masm.load_heap_oop(rbx, Address(rdi, value_offset)); + masm.movl(rcx, Address(rdi, offset_offset)); + masm.lea(rdi, Address(rbx, rcx, Address::times_2, base_offset)); + masm.push(rdi); + masm.push(rax); + masm.jmpb(PREP_FOR_SCAN); + + // Substr count saved at sp + // Substr saved at sp+8 + // String saved at sp+16 + + // Prep to load substr for scan + masm.bind(LOAD_SUBSTR); + masm.movptr(rdi, Address(rsp, 8)); + masm.movl(rax, Address(rsp, 0)); + + // Load substr + masm.bind(PREP_FOR_SCAN); + masm.movdqu(tmp1Reg, Address(rdi, 0)); + masm.addq(rdx, 8); // prime the loop + masm.subptr(rsi, 16); + + // Scan string for substr in 16-byte vectors + masm.bind(SCAN_TO_SUBSTR); + masm.subq(rdx, 8); + masm.addptr(rsi, 16); + masm.pcmpestri(tmp1Reg, Address(rsi, 0), 0x0d); + masm.jcc(Assembler::above, SCAN_TO_SUBSTR); + masm.jccb(Assembler::aboveEqual, RET_NOT_FOUND); + + // Fallthru: found a potential substr + + //Make sure string is still long enough + masm.subl(rdx, rcx); + masm.cmpl(rdx, rax); + masm.jccb(Assembler::negative, RET_NOT_FOUND); + // Compute start addr of substr + masm.lea(rsi, Address(rsi, rcx, Address::times_2)); + masm.movptr(rbx, rsi); + + // Compare potential substr + masm.addq(rdx, 8); // prime the loop + masm.addq(rax, 8); + masm.subptr(rsi, 16); + masm.subptr(rdi, 16); + + // Scan 16-byte vectors of string and substr + masm.bind(SCAN_SUBSTR); + masm.subq(rax, 8); + masm.subq(rdx, 8); + masm.addptr(rsi, 16); + masm.addptr(rdi, 16); + masm.movdqu(tmp1Reg, Address(rdi, 0)); + masm.pcmpestri(tmp1Reg, Address(rsi, 0), 0x0d); + masm.jcc(Assembler::noOverflow, LOAD_SUBSTR); // OF == 0 + masm.jcc(Assembler::positive, SCAN_SUBSTR); // SF == 0 + + // Compute substr offset + masm.movptr(rsi, Address(rsp, 16)); + masm.subptr(rbx, rsi); + masm.shrl(rbx, 1); + masm.jmpb(CLEANUP); + + masm.bind(RET_NEG_ONE); + masm.movl(rbx, -1); + masm.jmpb(DONE); + + masm.bind(RET_NOT_FOUND); + masm.movl(rbx, -1); + + masm.bind(CLEANUP); + masm.addptr(rsp, 24); + + masm.bind(DONE); + %} + + enc_class enc_String_Equals(rdi_RegP str1, rsi_RegP str2, regD tmp1, regD tmp2, + rbx_RegI tmp3, rcx_RegI tmp2, rax_RegI result) %{ + Label RET_TRUE, RET_FALSE, DONE, COMPARE_VECTORS, COMPARE_CHAR; + MacroAssembler masm(&cbuf); + + XMMRegister tmp1Reg = as_XMMRegister($tmp1$$reg); + XMMRegister tmp2Reg = as_XMMRegister($tmp2$$reg); + + int value_offset = java_lang_String::value_offset_in_bytes(); + int offset_offset = java_lang_String::offset_offset_in_bytes(); + int count_offset = java_lang_String::count_offset_in_bytes(); + int base_offset = arrayOopDesc::base_offset_in_bytes(T_CHAR); + + // does source == target string? + masm.cmpptr(rdi, rsi); + masm.jcc(Assembler::equal, RET_TRUE); + + // get and compare counts + masm.movl(rcx, Address(rdi, count_offset)); + masm.movl(rax, Address(rsi, count_offset)); + masm.cmpl(rcx, rax); + masm.jcc(Assembler::notEqual, RET_FALSE); + masm.testl(rax, rax); + masm.jcc(Assembler::zero, RET_TRUE); + + // get source string offset and value + masm.load_heap_oop(rbx, Address(rsi, value_offset)); + masm.movl(rax, Address(rsi, offset_offset)); + masm.lea(rsi, Address(rbx, rax, Address::times_2, base_offset)); + + // get compare string offset and value + masm.load_heap_oop(rbx, Address(rdi, value_offset)); + masm.movl(rax, Address(rdi, offset_offset)); + masm.lea(rdi, Address(rbx, rax, Address::times_2, base_offset)); + + // Set byte count + masm.shll(rcx, 1); + masm.movl(rax, rcx); + + if (UseSSE42Intrinsics) { + // With SSE4.2, use double quad vector compare + Label COMPARE_WIDE_VECTORS, COMPARE_TAIL; + // Compare 16-byte vectors + masm.andl(rcx, 0xfffffff0); // vector count (in bytes) + masm.andl(rax, 0x0000000e); // tail count (in bytes) + masm.testl(rcx, rcx); + masm.jccb(Assembler::zero, COMPARE_TAIL); + masm.lea(rdi, Address(rdi, rcx, Address::times_1)); + masm.lea(rsi, Address(rsi, rcx, Address::times_1)); + masm.negptr(rcx); + + masm.bind(COMPARE_WIDE_VECTORS); + masm.movdqu(tmp1Reg, Address(rdi, rcx, Address::times_1)); + masm.movdqu(tmp2Reg, Address(rsi, rcx, Address::times_1)); + masm.pxor(tmp1Reg, tmp2Reg); + masm.ptest(tmp1Reg, tmp1Reg); + masm.jccb(Assembler::notZero, RET_FALSE); + masm.addptr(rcx, 16); + masm.jcc(Assembler::notZero, COMPARE_WIDE_VECTORS); + masm.bind(COMPARE_TAIL); + masm.movl(rcx, rax); + // Fallthru to tail compare + } + + // Compare 4-byte vectors + masm.andl(rcx, 0xfffffffc); // vector count (in bytes) + masm.andl(rax, 0x00000002); // tail char (in bytes) + masm.testl(rcx, rcx); + masm.jccb(Assembler::zero, COMPARE_CHAR); + masm.lea(rdi, Address(rdi, rcx, Address::times_1)); + masm.lea(rsi, Address(rsi, rcx, Address::times_1)); + masm.negptr(rcx); + + masm.bind(COMPARE_VECTORS); + masm.movl(rbx, Address(rdi, rcx, Address::times_1)); + masm.cmpl(rbx, Address(rsi, rcx, Address::times_1)); + masm.jccb(Assembler::notEqual, RET_FALSE); + masm.addptr(rcx, 4); + masm.jcc(Assembler::notZero, COMPARE_VECTORS); + + // Compare trailing char (final 2 bytes), if any + masm.bind(COMPARE_CHAR); + masm.testl(rax, rax); + masm.jccb(Assembler::zero, RET_TRUE); + masm.load_unsigned_short(rbx, Address(rdi, 0)); + masm.load_unsigned_short(rcx, Address(rsi, 0)); + masm.cmpl(rbx, rcx); + masm.jccb(Assembler::notEqual, RET_FALSE); + + masm.bind(RET_TRUE); + masm.movl(rax, 1); // return true + masm.jmpb(DONE); + + masm.bind(RET_FALSE); + masm.xorl(rax, rax); // return false + + masm.bind(DONE); + %} + + enc_class enc_Array_Equals(rdi_RegP ary1, rsi_RegP ary2, regD tmp1, regD tmp2, + rax_RegI tmp3, rbx_RegI tmp4, rcx_RegI result) %{ + Label TRUE_LABEL, FALSE_LABEL, DONE, COMPARE_VECTORS, COMPARE_CHAR; + MacroAssembler masm(&cbuf); + + XMMRegister tmp1Reg = as_XMMRegister($tmp1$$reg); + XMMRegister tmp2Reg = as_XMMRegister($tmp2$$reg); + Register ary1Reg = as_Register($ary1$$reg); + Register ary2Reg = as_Register($ary2$$reg); + Register tmp3Reg = as_Register($tmp3$$reg); + Register tmp4Reg = as_Register($tmp4$$reg); + Register resultReg = as_Register($result$$reg); int length_offset = arrayOopDesc::length_offset_in_bytes(); int base_offset = arrayOopDesc::base_offset_in_bytes(T_CHAR); // Check the input args - masm.cmpq(ary1Reg, ary2Reg); + masm.cmpq(ary1Reg, ary2Reg); masm.jcc(Assembler::equal, TRUE_LABEL); - masm.testq(ary1Reg, ary1Reg); + masm.testq(ary1Reg, ary1Reg); masm.jcc(Assembler::zero, FALSE_LABEL); - masm.testq(ary2Reg, ary2Reg); + masm.testq(ary2Reg, ary2Reg); masm.jcc(Assembler::zero, FALSE_LABEL); // Check the lengths - masm.movl(tmp2Reg, Address(ary1Reg, length_offset)); + masm.movl(tmp4Reg, Address(ary1Reg, length_offset)); masm.movl(resultReg, Address(ary2Reg, length_offset)); - masm.cmpl(tmp2Reg, resultReg); + masm.cmpl(tmp4Reg, resultReg); masm.jcc(Assembler::notEqual, FALSE_LABEL); masm.testl(resultReg, resultReg); masm.jcc(Assembler::zero, TRUE_LABEL); - // Get the number of 4 byte vectors to compare - masm.shrl(resultReg, 1); + //load array address + masm.lea(ary1Reg, Address(ary1Reg, base_offset)); + masm.lea(ary2Reg, Address(ary2Reg, base_offset)); - // Check for odd-length arrays - masm.andl(tmp2Reg, 1); - masm.testl(tmp2Reg, tmp2Reg); - masm.jcc(Assembler::zero, COMPARE_LOOP_HDR); + //set byte count + masm.shll(tmp4Reg, 1); + masm.movl(resultReg,tmp4Reg); - // Compare 2-byte "tail" at end of arrays - masm.load_unsigned_short(tmp1Reg, Address(ary1Reg, resultReg, Address::times_4, base_offset)); - masm.load_unsigned_short(tmp2Reg, Address(ary2Reg, resultReg, Address::times_4, base_offset)); - masm.cmpl(tmp1Reg, tmp2Reg); - masm.jcc(Assembler::notEqual, FALSE_LABEL); + if (UseSSE42Intrinsics){ + // With SSE4.2, use double quad vector compare + Label COMPARE_WIDE_VECTORS, COMPARE_TAIL; + // Compare 16-byte vectors + masm.andl(tmp4Reg, 0xfffffff0); // vector count (in bytes) + masm.andl(resultReg, 0x0000000e); // tail count (in bytes) + masm.testl(tmp4Reg, tmp4Reg); + masm.jccb(Assembler::zero, COMPARE_TAIL); + masm.lea(ary1Reg, Address(ary1Reg, tmp4Reg, Address::times_1)); + masm.lea(ary2Reg, Address(ary2Reg, tmp4Reg, Address::times_1)); + masm.negptr(tmp4Reg); + + masm.bind(COMPARE_WIDE_VECTORS); + masm.movdqu(tmp1Reg, Address(ary1Reg, tmp4Reg, Address::times_1)); + masm.movdqu(tmp2Reg, Address(ary2Reg, tmp4Reg, Address::times_1)); + masm.pxor(tmp1Reg, tmp2Reg); + masm.ptest(tmp1Reg, tmp1Reg); + + masm.jccb(Assembler::notZero, FALSE_LABEL); + masm.addptr(tmp4Reg, 16); + masm.jcc(Assembler::notZero, COMPARE_WIDE_VECTORS); + masm.bind(COMPARE_TAIL); + masm.movl(tmp4Reg, resultReg); + // Fallthru to tail compare + } + + // Compare 4-byte vectors + masm.andl(tmp4Reg, 0xfffffffc); // vector count (in bytes) + masm.andl(resultReg, 0x00000002); // tail char (in bytes) + masm.testl(tmp4Reg, tmp4Reg); //if tmp2 == 0, only compare char + masm.jccb(Assembler::zero, COMPARE_CHAR); + masm.lea(ary1Reg, Address(ary1Reg, tmp4Reg, Address::times_1)); + masm.lea(ary2Reg, Address(ary2Reg, tmp4Reg, Address::times_1)); + masm.negptr(tmp4Reg); + + masm.bind(COMPARE_VECTORS); + masm.movl(tmp3Reg, Address(ary1Reg, tmp4Reg, Address::times_1)); + masm.cmpl(tmp3Reg, Address(ary2Reg, tmp4Reg, Address::times_1)); + masm.jccb(Assembler::notEqual, FALSE_LABEL); + masm.addptr(tmp4Reg, 4); + masm.jcc(Assembler::notZero, COMPARE_VECTORS); + + // Compare trailing char (final 2 bytes), if any + masm.bind(COMPARE_CHAR); masm.testl(resultReg, resultReg); - masm.jcc(Assembler::zero, TRUE_LABEL); - - // Setup compare loop - masm.bind(COMPARE_LOOP_HDR); - // Shift tmp1Reg and tmp2Reg to the last 4-byte boundary of the arrays - masm.leaq(tmp1Reg, Address(ary1Reg, resultReg, Address::times_4, base_offset)); - masm.leaq(tmp2Reg, Address(ary2Reg, resultReg, Address::times_4, base_offset)); - masm.negq(resultReg); - - // 4-byte-wide compare loop - masm.bind(COMPARE_LOOP); - masm.movl(ary1Reg, Address(tmp1Reg, resultReg, Address::times_4, 0)); - masm.movl(ary2Reg, Address(tmp2Reg, resultReg, Address::times_4, 0)); - masm.cmpl(ary1Reg, ary2Reg); - masm.jcc(Assembler::notEqual, FALSE_LABEL); - masm.incrementq(resultReg); - masm.jcc(Assembler::notZero, COMPARE_LOOP); + masm.jccb(Assembler::zero, TRUE_LABEL); + masm.load_unsigned_short(tmp3Reg, Address(ary1Reg, 0)); + masm.load_unsigned_short(tmp4Reg, Address(ary2Reg, 0)); + masm.cmpl(tmp3Reg, tmp4Reg); + masm.jccb(Assembler::notEqual, FALSE_LABEL); masm.bind(TRUE_LABEL); masm.movl(resultReg, 1); // return true - masm.jmp(DONE_LABEL); + masm.jmpb(DONE); masm.bind(FALSE_LABEL); masm.xorl(resultReg, resultReg); // return false // That's it - masm.bind(DONE_LABEL); + masm.bind(DONE); %} enc_class enc_rethrow() @@ -5087,7 +5370,7 @@ operand regF() %} // Double register operands -operand regD() +operand regD() %{ constraint(ALLOC_IN_RC(double_reg)); match(RegD); @@ -11540,27 +11823,52 @@ instruct rep_stos(rcx_RegL cnt, rdi_RegP base, rax_RegI zero, Universe dummy, ins_pipe(pipe_slow); %} -instruct string_compare(rdi_RegP str1, rsi_RegP str2, rax_RegI tmp1, - rbx_RegI tmp2, rcx_RegI result, rFlagsReg cr) +instruct string_compare(rdi_RegP str1, rsi_RegP str2, regD tmp1, regD tmp2, + rax_RegI tmp3, rbx_RegI tmp4, rcx_RegI result, rFlagsReg cr) %{ match(Set result (StrComp str1 str2)); - effect(USE_KILL str1, USE_KILL str2, KILL tmp1, KILL tmp2, KILL cr); + effect(TEMP tmp1, TEMP tmp2, USE_KILL str1, USE_KILL str2, KILL tmp3, KILL tmp4, KILL cr); //ins_cost(300); format %{ "String Compare $str1, $str2 -> $result // XXX KILL RAX, RBX" %} - ins_encode( enc_String_Compare() ); + ins_encode( enc_String_Compare(str1, str2, tmp1, tmp2, tmp3, tmp4, result) ); + ins_pipe( pipe_slow ); +%} + +instruct string_indexof(rsi_RegP str1, rdi_RegP str2, regD tmp1, rax_RegI tmp2, + rcx_RegI tmp3, rdx_RegI tmp4, rbx_RegI result, rFlagsReg cr) +%{ + predicate(UseSSE42Intrinsics); + match(Set result (StrIndexOf str1 str2)); + effect(TEMP tmp1, USE_KILL str1, USE_KILL str2, KILL tmp2, KILL tmp3, KILL tmp4, KILL cr); + + format %{ "String IndexOf $str1,$str2 -> $result // KILL RAX, RCX, RDX" %} + ins_encode( enc_String_IndexOf(str1, str2, tmp1, tmp2, tmp3, tmp4, result) ); + ins_pipe( pipe_slow ); +%} + +// fast string equals +instruct string_equals(rdi_RegP str1, rsi_RegP str2, regD tmp1, regD tmp2, rbx_RegI tmp3, + rcx_RegI tmp4, rax_RegI result, rFlagsReg cr) +%{ + match(Set result (StrEquals str1 str2)); + effect(TEMP tmp1, TEMP tmp2, USE_KILL str1, USE_KILL str2, KILL tmp3, KILL tmp4, KILL cr); + + format %{ "String Equals $str1,$str2 -> $result // KILL RBX, RCX" %} + ins_encode( enc_String_Equals(str1, str2, tmp1, tmp2, tmp3, tmp4, result) ); ins_pipe( pipe_slow ); %} // fast array equals -instruct array_equals(rdi_RegP ary1, rsi_RegP ary2, rax_RegI tmp1, - rbx_RegI tmp2, rcx_RegI result, rFlagsReg cr) %{ +instruct array_equals(rdi_RegP ary1, rsi_RegP ary2, regD tmp1, regD tmp2, rax_RegI tmp3, + rbx_RegI tmp4, rcx_RegI result, rFlagsReg cr) +%{ match(Set result (AryEq ary1 ary2)); - effect(USE_KILL ary1, USE_KILL ary2, KILL tmp1, KILL tmp2, KILL cr); + effect(TEMP tmp1, TEMP tmp2, USE_KILL ary1, USE_KILL ary2, KILL tmp3, KILL tmp4, KILL cr); //ins_cost(300); - format %{ "Array Equals $ary1,$ary2 -> $result // KILL RAX, RBX" %} - ins_encode( enc_Array_Equals(ary1, ary2, tmp1, tmp2, result) ); + format %{ "Array Equals $ary1,$ary2 -> $result // KILL RAX, RBX" %} + ins_encode( enc_Array_Equals(ary1, ary2, tmp1, tmp2, tmp3, tmp4, result) ); ins_pipe( pipe_slow ); %} diff --git a/hotspot/src/share/vm/adlc/formssel.cpp b/hotspot/src/share/vm/adlc/formssel.cpp index c573511a66e..1f80e2d0e16 100644 --- a/hotspot/src/share/vm/adlc/formssel.cpp +++ b/hotspot/src/share/vm/adlc/formssel.cpp @@ -574,9 +574,13 @@ bool InstructForm::needs_anti_dependence_check(FormDict &globals) const { // TEMPORARY // if( is_simple_chain_rule(globals) ) return false; - // String-compare uses many memorys edges, but writes none + // String.(compareTo/equals/indexOf) and Arrays.equals use many memorys edges, + // but writes none if( _matrule && _matrule->_rChild && - strcmp(_matrule->_rChild->_opType,"StrComp")==0 ) + ( strcmp(_matrule->_rChild->_opType,"StrComp" )==0 || + strcmp(_matrule->_rChild->_opType,"StrEquals" )==0 || + strcmp(_matrule->_rChild->_opType,"StrIndexOf" )==0 || + strcmp(_matrule->_rChild->_opType,"AryEq" )==0 )) return true; // Check if instruction has a USE of a memory operand class, but no defs @@ -815,8 +819,10 @@ uint InstructForm::oper_input_base(FormDict &globals) { return AdlcVMDeps::Parms; // Skip the machine-state edges if( _matrule->_rChild && - strcmp(_matrule->_rChild->_opType,"StrComp")==0 ) { - // String compare takes 1 control and 4 memory edges. + ( strcmp(_matrule->_rChild->_opType,"StrComp" )==0 || + strcmp(_matrule->_rChild->_opType,"StrEquals" )==0 || + strcmp(_matrule->_rChild->_opType,"StrIndexOf")==0 )) { + // String.(compareTo/equals/indexOf) take 1 control and 4 memory edges. return 5; } diff --git a/hotspot/src/share/vm/classfile/vmSymbols.hpp b/hotspot/src/share/vm/classfile/vmSymbols.hpp index cbf24f4bc89..fc0601aee3a 100644 --- a/hotspot/src/share/vm/classfile/vmSymbols.hpp +++ b/hotspot/src/share/vm/classfile/vmSymbols.hpp @@ -288,6 +288,7 @@ template(stringCacheEnabled_name, "stringCacheEnabled") \ template(bitCount_name, "bitCount") \ template(profile_name, "profile") \ + template(equals_name, "equals") \ \ /* non-intrinsic name/signature pairs: */ \ template(register_method_name, "register") \ @@ -579,7 +580,6 @@ do_signature(copyOfRange_signature, "([Ljava/lang/Object;IILjava/lang/Class;)[Ljava/lang/Object;") \ \ do_intrinsic(_equalsC, java_util_Arrays, equals_name, equalsC_signature, F_S) \ - do_name( equals_name, "equals") \ do_signature(equalsC_signature, "([C[C)Z") \ \ do_intrinsic(_invoke, java_lang_reflect_Method, invoke_name, object_array_object_object_signature, F_R) \ @@ -589,6 +589,7 @@ do_name( compareTo_name, "compareTo") \ do_intrinsic(_indexOf, java_lang_String, indexOf_name, string_int_signature, F_R) \ do_name( indexOf_name, "indexOf") \ + do_intrinsic(_equals, java_lang_String, equals_name, object_boolean_signature, F_R) \ \ do_class(java_nio_Buffer, "java/nio/Buffer") \ do_intrinsic(_checkIndex, java_nio_Buffer, checkIndex_name, int_int_signature, F_R) \ diff --git a/hotspot/src/share/vm/opto/classes.hpp b/hotspot/src/share/vm/opto/classes.hpp index 87adb737cb7..b854447d75d 100644 --- a/hotspot/src/share/vm/opto/classes.hpp +++ b/hotspot/src/share/vm/opto/classes.hpp @@ -218,6 +218,8 @@ macro(StoreL) macro(StoreP) macro(StoreN) macro(StrComp) +macro(StrEquals) +macro(StrIndexOf) macro(SubD) macro(SubF) macro(SubI) diff --git a/hotspot/src/share/vm/opto/gcm.cpp b/hotspot/src/share/vm/opto/gcm.cpp index df648455117..92d5371153d 100644 --- a/hotspot/src/share/vm/opto/gcm.cpp +++ b/hotspot/src/share/vm/opto/gcm.cpp @@ -438,6 +438,12 @@ Block* PhaseCFG::insert_anti_dependences(Block* LCA, Node* load, bool verify) { #endif assert(load_alias_idx || (load->is_Mach() && load->as_Mach()->ideal_Opcode() == Op_StrComp), "String compare is only known 'load' that does not conflict with any stores"); + assert(load_alias_idx || (load->is_Mach() && load->as_Mach()->ideal_Opcode() == Op_StrEquals), + "String equals is a 'load' that does not conflict with any stores"); + assert(load_alias_idx || (load->is_Mach() && load->as_Mach()->ideal_Opcode() == Op_StrIndexOf), + "String indexOf is a 'load' that does not conflict with any stores"); + assert(load_alias_idx || (load->is_Mach() && load->as_Mach()->ideal_Opcode() == Op_AryEq), + "Arrays equals is a 'load' that do not conflict with any stores"); if (!C->alias_type(load_alias_idx)->is_rewritable()) { // It is impossible to spoil this load by putting stores before it, diff --git a/hotspot/src/share/vm/opto/lcm.cpp b/hotspot/src/share/vm/opto/lcm.cpp index 4c83f0af66d..31de55a5435 100644 --- a/hotspot/src/share/vm/opto/lcm.cpp +++ b/hotspot/src/share/vm/opto/lcm.cpp @@ -137,6 +137,8 @@ void Block::implicit_null_check(PhaseCFG *cfg, Node *proj, Node *val, int allowe if( mach->in(2) != val ) continue; break; // Found a memory op? case Op_StrComp: + case Op_StrEquals: + case Op_StrIndexOf: case Op_AryEq: // Not a legit memory op for implicit null check regardless of // embedded loads diff --git a/hotspot/src/share/vm/opto/library_call.cpp b/hotspot/src/share/vm/opto/library_call.cpp index b5b7136a375..a57333fd5a0 100644 --- a/hotspot/src/share/vm/opto/library_call.cpp +++ b/hotspot/src/share/vm/opto/library_call.cpp @@ -136,6 +136,7 @@ class LibraryCallKit : public GraphKit { bool inline_string_compareTo(); bool inline_string_indexOf(); Node* string_indexOf(Node* string_object, ciTypeArray* target_array, jint offset, jint cache_i, jint md2_i); + bool inline_string_equals(); Node* pop_math_arg(); bool runtime_math(const TypeFunc* call_type, address funcAddr, const char* funcName); bool inline_math_native(vmIntrinsics::ID id); @@ -261,6 +262,7 @@ CallGenerator* Compile::make_vm_intrinsic(ciMethod* m, bool is_virtual) { switch (id) { case vmIntrinsics::_indexOf: case vmIntrinsics::_compareTo: + case vmIntrinsics::_equals: case vmIntrinsics::_equalsC: break; // InlineNatives does not control String.compareTo default: @@ -275,6 +277,9 @@ CallGenerator* Compile::make_vm_intrinsic(ciMethod* m, bool is_virtual) { case vmIntrinsics::_indexOf: if (!SpecialStringIndexOf) return NULL; break; + case vmIntrinsics::_equals: + if (!SpecialStringEquals) return NULL; + break; case vmIntrinsics::_equalsC: if (!SpecialArraysEquals) return NULL; break; @@ -442,6 +447,8 @@ bool LibraryCallKit::try_to_inline() { return inline_string_compareTo(); case vmIntrinsics::_indexOf: return inline_string_indexOf(); + case vmIntrinsics::_equals: + return inline_string_equals(); case vmIntrinsics::_getObject: return inline_unsafe_access(!is_native_ptr, !is_store, T_OBJECT, false); @@ -793,6 +800,8 @@ Node* LibraryCallKit::generate_current_thread(Node* &tls_output) { //------------------------------inline_string_compareTo------------------------ bool LibraryCallKit::inline_string_compareTo() { + if (!Matcher::has_match_rule(Op_StrComp)) return false; + const int value_offset = java_lang_String::value_offset_in_bytes(); const int count_offset = java_lang_String::count_offset_in_bytes(); const int offset_offset = java_lang_String::offset_offset_in_bytes(); @@ -830,6 +839,82 @@ bool LibraryCallKit::inline_string_compareTo() { return true; } +//------------------------------inline_string_equals------------------------ +bool LibraryCallKit::inline_string_equals() { + + if (!Matcher::has_match_rule(Op_StrEquals)) return false; + + const int value_offset = java_lang_String::value_offset_in_bytes(); + const int count_offset = java_lang_String::count_offset_in_bytes(); + const int offset_offset = java_lang_String::offset_offset_in_bytes(); + + _sp += 2; + Node* argument = pop(); // pop non-receiver first: it was pushed second + Node* receiver = pop(); + + // Null check on self without removing any arguments. The argument + // null check technically happens in the wrong place, which can lead to + // invalid stack traces when string compare is inlined into a method + // which handles NullPointerExceptions. + _sp += 2; + receiver = do_null_check(receiver, T_OBJECT); + //should not do null check for argument for String.equals(), because spec + //allows to specify NULL as argument. + _sp -= 2; + + if (stopped()) { + return true; + } + + // get String klass for instanceOf + ciInstanceKlass* klass = env()->String_klass(); + + // two paths (plus control) merge + RegionNode* region = new (C, 3) RegionNode(3); + Node* phi = new (C, 3) PhiNode(region, TypeInt::BOOL); + + Node* inst = gen_instanceof(argument, makecon(TypeKlassPtr::make(klass))); + Node* cmp = _gvn.transform(new (C, 3) CmpINode(inst, intcon(1))); + Node* bol = _gvn.transform(new (C, 2) BoolNode(cmp, BoolTest::eq)); + + IfNode* iff = create_and_map_if(control(), bol, PROB_MAX, COUNT_UNKNOWN); + + Node* if_true = _gvn.transform(new (C, 1) IfTrueNode(iff)); + set_control(if_true); + + const TypeInstPtr* string_type = + TypeInstPtr::make(TypePtr::BotPTR, klass, false, NULL, 0); + + // instanceOf == true + Node* equals = + _gvn.transform(new (C, 7) StrEqualsNode( + control(), + memory(TypeAryPtr::CHARS), + memory(string_type->add_offset(value_offset)), + memory(string_type->add_offset(count_offset)), + memory(string_type->add_offset(offset_offset)), + receiver, + argument)); + + phi->init_req(1, _gvn.transform(equals)); + region->init_req(1, if_true); + + //instanceOf == false, fallthrough + Node* if_false = _gvn.transform(new (C, 1) IfFalseNode(iff)); + set_control(if_false); + + phi->init_req(2, _gvn.transform(intcon(0))); + region->init_req(2, if_false); + + // post merge + set_control(_gvn.transform(region)); + record_for_igvn(region); + + push(_gvn.transform(phi)); + + return true; +} + //------------------------------inline_array_equals---------------------------- bool LibraryCallKit::inline_array_equals() { @@ -994,80 +1079,115 @@ Node* LibraryCallKit::string_indexOf(Node* string_object, ciTypeArray* target_ar return result; } - //------------------------------inline_string_indexOf------------------------ bool LibraryCallKit::inline_string_indexOf() { - _sp += 2; - Node *argument = pop(); // pop non-receiver first: it was pushed second - Node *receiver = pop(); - - // don't intrinsify if argument isn't a constant string. - if (!argument->is_Con()) { - return false; - } - const TypeOopPtr* str_type = _gvn.type(argument)->isa_oopptr(); - if (str_type == NULL) { - return false; - } - ciInstanceKlass* klass = env()->String_klass(); - ciObject* str_const = str_type->const_oop(); - if (str_const == NULL || str_const->klass() != klass) { - return false; - } - ciInstance* str = str_const->as_instance(); - assert(str != NULL, "must be instance"); - const int value_offset = java_lang_String::value_offset_in_bytes(); const int count_offset = java_lang_String::count_offset_in_bytes(); const int offset_offset = java_lang_String::offset_offset_in_bytes(); - ciObject* v = str->field_value_by_offset(value_offset).as_object(); - int o = str->field_value_by_offset(offset_offset).as_int(); - int c = str->field_value_by_offset(count_offset).as_int(); - ciTypeArray* pat = v->as_type_array(); // pattern (argument) character array - - // constant strings have no offset and count == length which - // simplifies the resulting code somewhat so lets optimize for that. - if (o != 0 || c != pat->length()) { - return false; - } - - // Null check on self without removing any arguments. The argument - // null check technically happens in the wrong place, which can lead to - // invalid stack traces when string compare is inlined into a method - // which handles NullPointerExceptions. _sp += 2; - receiver = do_null_check(receiver, T_OBJECT); - // No null check on the argument is needed since it's a constant String oop. - _sp -= 2; - if (stopped()) { - return true; - } + Node *argument = pop(); // pop non-receiver first: it was pushed second + Node *receiver = pop(); - // The null string as a pattern always returns 0 (match at beginning of string) - if (c == 0) { - push(intcon(0)); - return true; - } + Node* result; + if (Matcher::has_match_rule(Op_StrIndexOf) && + UseSSE42Intrinsics) { + // Generate SSE4.2 version of indexOf + // We currently only have match rules that use SSE4.2 - jchar lastChar = pat->char_at(o + (c - 1)); - int cache = 0; - int i; - for (i = 0; i < c - 1; i++) { - assert(i < pat->length(), "out of range"); - cache |= (1 << (pat->char_at(o + i) & (sizeof(cache) * BitsPerByte - 1))); - } + // Null check on self without removing any arguments. The argument + // null check technically happens in the wrong place, which can lead to + // invalid stack traces when string compare is inlined into a method + // which handles NullPointerExceptions. + _sp += 2; + receiver = do_null_check(receiver, T_OBJECT); + argument = do_null_check(argument, T_OBJECT); + _sp -= 2; - int md2 = c; - for (i = 0; i < c - 1; i++) { - assert(i < pat->length(), "out of range"); - if (pat->char_at(o + i) == lastChar) { - md2 = (c - 1) - i; + if (stopped()) { + return true; } + + ciInstanceKlass* klass = env()->String_klass(); + const TypeInstPtr* string_type = + TypeInstPtr::make(TypePtr::BotPTR, klass, false, NULL, 0); + + result = + _gvn.transform(new (C, 7) + StrIndexOfNode(control(), + memory(TypeAryPtr::CHARS), + memory(string_type->add_offset(value_offset)), + memory(string_type->add_offset(count_offset)), + memory(string_type->add_offset(offset_offset)), + receiver, + argument)); + } else { //Use LibraryCallKit::string_indexOf + // don't intrinsify is argument isn't a constant string. + if (!argument->is_Con()) { + return false; + } + const TypeOopPtr* str_type = _gvn.type(argument)->isa_oopptr(); + if (str_type == NULL) { + return false; + } + ciInstanceKlass* klass = env()->String_klass(); + ciObject* str_const = str_type->const_oop(); + if (str_const == NULL || str_const->klass() != klass) { + return false; + } + ciInstance* str = str_const->as_instance(); + assert(str != NULL, "must be instance"); + + ciObject* v = str->field_value_by_offset(value_offset).as_object(); + int o = str->field_value_by_offset(offset_offset).as_int(); + int c = str->field_value_by_offset(count_offset).as_int(); + ciTypeArray* pat = v->as_type_array(); // pattern (argument) character array + + // constant strings have no offset and count == length which + // simplifies the resulting code somewhat so lets optimize for that. + if (o != 0 || c != pat->length()) { + return false; + } + + // Null check on self without removing any arguments. The argument + // null check technically happens in the wrong place, which can lead to + // invalid stack traces when string compare is inlined into a method + // which handles NullPointerExceptions. + _sp += 2; + receiver = do_null_check(receiver, T_OBJECT); + // No null check on the argument is needed since it's a constant String oop. + _sp -= 2; + if (stopped()) { + return true; + } + + // The null string as a pattern always returns 0 (match at beginning of string) + if (c == 0) { + push(intcon(0)); + return true; + } + + // Generate default indexOf + jchar lastChar = pat->char_at(o + (c - 1)); + int cache = 0; + int i; + for (i = 0; i < c - 1; i++) { + assert(i < pat->length(), "out of range"); + cache |= (1 << (pat->char_at(o + i) & (sizeof(cache) * BitsPerByte - 1))); + } + + int md2 = c; + for (i = 0; i < c - 1; i++) { + assert(i < pat->length(), "out of range"); + if (pat->char_at(o + i) == lastChar) { + md2 = (c - 1) - i; + } + } + + result = string_indexOf(receiver, pat, o, cache, md2); } - Node* result = string_indexOf(receiver, pat, o, cache, md2); push(result); return true; } diff --git a/hotspot/src/share/vm/opto/loopnode.cpp b/hotspot/src/share/vm/opto/loopnode.cpp index bb372e0d3f6..a36d0a534fc 100644 --- a/hotspot/src/share/vm/opto/loopnode.cpp +++ b/hotspot/src/share/vm/opto/loopnode.cpp @@ -2668,6 +2668,8 @@ void PhaseIdealLoop::build_loop_late_post( Node *n, const PhaseIdealLoop *verify case Op_LoadD_unaligned: case Op_LoadL_unaligned: case Op_StrComp: // Does a bunch of load-like effects + case Op_StrEquals: + case Op_StrIndexOf: case Op_AryEq: pinned = false; } diff --git a/hotspot/src/share/vm/opto/matcher.cpp b/hotspot/src/share/vm/opto/matcher.cpp index 100f79fd9e1..e230480b22a 100644 --- a/hotspot/src/share/vm/opto/matcher.cpp +++ b/hotspot/src/share/vm/opto/matcher.cpp @@ -746,6 +746,8 @@ static void match_alias_type(Compile* C, Node* n, Node* m) { if (nidx == Compile::AliasIdxBot && midx == Compile::AliasIdxTop) { switch (n->Opcode()) { case Op_StrComp: + case Op_StrEquals: + case Op_StrIndexOf: case Op_AryEq: case Op_MemBarVolatile: case Op_MemBarCPUOrder: // %%% these ideals should have narrower adr_type? @@ -1788,6 +1790,8 @@ void Matcher::find_shared( Node *n ) { mstack.push(n->in(0), Pre_Visit); // Visit Control input continue; // while (mstack.is_nonempty()) case Op_StrComp: + case Op_StrEquals: + case Op_StrIndexOf: case Op_AryEq: set_shared(n); // Force result into register (it will be anyways) break; diff --git a/hotspot/src/share/vm/opto/memnode.cpp b/hotspot/src/share/vm/opto/memnode.cpp index 570e813e2fa..b2af60d27dc 100644 --- a/hotspot/src/share/vm/opto/memnode.cpp +++ b/hotspot/src/share/vm/opto/memnode.cpp @@ -2481,6 +2481,31 @@ Node *StrCompNode::Ideal(PhaseGVN *phase, bool can_reshape){ return remove_dead_region(phase, can_reshape) ? this : NULL; } +// Do we match on this edge? No memory edges +uint StrEqualsNode::match_edge(uint idx) const { + return idx == 5 || idx == 6; +} + +//------------------------------Ideal------------------------------------------ +// Return a node which is more "ideal" than the current node. Strip out +// control copies +Node *StrEqualsNode::Ideal(PhaseGVN *phase, bool can_reshape){ + return remove_dead_region(phase, can_reshape) ? this : NULL; +} + +//============================================================================= +// Do we match on this edge? No memory edges +uint StrIndexOfNode::match_edge(uint idx) const { + return idx == 5 || idx == 6; +} + +//------------------------------Ideal------------------------------------------ +// Return a node which is more "ideal" than the current node. Strip out +// control copies +Node *StrIndexOfNode::Ideal(PhaseGVN *phase, bool can_reshape){ + return remove_dead_region(phase, can_reshape) ? this : NULL; +} + //------------------------------Ideal------------------------------------------ // Return a node which is more "ideal" than the current node. Strip out // control copies @@ -2488,7 +2513,6 @@ Node *AryEqNode::Ideal(PhaseGVN *phase, bool can_reshape){ return remove_dead_region(phase, can_reshape) ? this : NULL; } - //============================================================================= MemBarNode::MemBarNode(Compile* C, int alias_idx, Node* precedent) : MultiNode(TypeFunc::Parms + (precedent == NULL? 0: 1)), diff --git a/hotspot/src/share/vm/opto/memnode.hpp b/hotspot/src/share/vm/opto/memnode.hpp index e318f3079f6..1d4f499da13 100644 --- a/hotspot/src/share/vm/opto/memnode.hpp +++ b/hotspot/src/share/vm/opto/memnode.hpp @@ -765,6 +765,54 @@ public: virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); }; +//------------------------------StrEquals------------------------------------- +class StrEqualsNode: public Node { +public: + StrEqualsNode(Node *control, + Node* char_array_mem, + Node* value_mem, + Node* count_mem, + Node* offset_mem, + Node* s1, Node* s2): Node(control, + char_array_mem, + value_mem, + count_mem, + offset_mem, + s1, s2) {}; + virtual int Opcode() const; + virtual bool depends_only_on_test() const { return false; } + virtual const Type* bottom_type() const { return TypeInt::BOOL; } + // a StrEqualsNode (conservatively) aliases with everything: + virtual const TypePtr* adr_type() const { return TypePtr::BOTTOM; } + virtual uint match_edge(uint idx) const; + virtual uint ideal_reg() const { return Op_RegI; } + virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); +}; + +//------------------------------StrIndexOf------------------------------------- +class StrIndexOfNode: public Node { +public: + StrIndexOfNode(Node *control, + Node* char_array_mem, + Node* value_mem, + Node* count_mem, + Node* offset_mem, + Node* s1, Node* s2): Node(control, + char_array_mem, + value_mem, + count_mem, + offset_mem, + s1, s2) {}; + virtual int Opcode() const; + virtual bool depends_only_on_test() const { return false; } + virtual const Type* bottom_type() const { return TypeInt::INT; } + // a StrIndexOfNode (conservatively) aliases with everything: + virtual const TypePtr* adr_type() const { return TypePtr::BOTTOM; } + virtual uint match_edge(uint idx) const; + virtual uint ideal_reg() const { return Op_RegI; } + virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); +}; + //------------------------------AryEq--------------------------------------- class AryEqNode: public Node { public: diff --git a/hotspot/src/share/vm/runtime/arguments.cpp b/hotspot/src/share/vm/runtime/arguments.cpp index 05a84d581e9..567e6073e28 100644 --- a/hotspot/src/share/vm/runtime/arguments.cpp +++ b/hotspot/src/share/vm/runtime/arguments.cpp @@ -1366,9 +1366,6 @@ void Arguments::set_aggressive_opts_flags() { if (AggressiveOpts && FLAG_IS_DEFAULT(DoEscapeAnalysis)) { FLAG_SET_DEFAULT(DoEscapeAnalysis, true); } - if (AggressiveOpts && FLAG_IS_DEFAULT(SpecialArraysEquals)) { - FLAG_SET_DEFAULT(SpecialArraysEquals, true); - } if (AggressiveOpts && FLAG_IS_DEFAULT(BiasedLockingStartupDelay)) { FLAG_SET_DEFAULT(BiasedLockingStartupDelay, 500); } diff --git a/hotspot/src/share/vm/runtime/globals.hpp b/hotspot/src/share/vm/runtime/globals.hpp index 9af4074d76f..fc85089e624 100644 --- a/hotspot/src/share/vm/runtime/globals.hpp +++ b/hotspot/src/share/vm/runtime/globals.hpp @@ -491,9 +491,15 @@ class CommandLineFlags { develop(bool, SpecialStringIndexOf, true, \ "special version of string indexOf") \ \ - product(bool, SpecialArraysEquals, false, \ + develop(bool, SpecialStringEquals, true, \ + "special version of string equals") \ + \ + develop(bool, SpecialArraysEquals, true, \ "special version of Arrays.equals(char[],char[])") \ \ + product(bool, UseSSE42Intrinsics, false, \ + "SSE4.2 versions of intrinsics") \ + \ develop(bool, TraceCallFixup, false, \ "traces all call fixups") \ \ From b857081608c1f9cf158cf253143fb704acb106a5 Mon Sep 17 00:00:00 2001 From: Tom Rodriguez Date: Tue, 31 Mar 2009 15:09:45 -0700 Subject: [PATCH 226/292] 6824463: deopt blob is testing wrong register on 64-bit x86 Reviewed-by: jrose, phh, kvn --- hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp index 0de47d37fe3..57fa4a480ca 100644 --- a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp +++ b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp @@ -2691,7 +2691,7 @@ void SharedRuntime::generate_deopt_blob() { __ mov(rdi, rax); Label noException; - __ cmpl(r12, Deoptimization::Unpack_exception); // Was exception pending? + __ cmpl(r14, Deoptimization::Unpack_exception); // Was exception pending? __ jcc(Assembler::notEqual, noException); __ movptr(rax, Address(r15_thread, JavaThread::exception_oop_offset())); // QQQ this is useless it was NULL above From 0a7ba6e27e3fd51a1a63c8a6692cedd03dda45f0 Mon Sep 17 00:00:00 2001 From: Tim Bell Date: Tue, 31 Mar 2009 15:27:40 -0700 Subject: [PATCH 227/292] 6819847: build is broken for OpenJDK with plugs Reviewed-by: jjg, robilad, ohair --- jdk/make/Makefile | 5 ----- jdk/make/common/Defs.gmk | 9 +++++++++ jdk/make/common/shared/Sanity-Settings.gmk | 1 + jdk/make/java/redist/Makefile | 6 ++++-- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/jdk/make/Makefile b/jdk/make/Makefile index c78e4c27e01..27781781f62 100644 --- a/jdk/make/Makefile +++ b/jdk/make/Makefile @@ -328,11 +328,6 @@ else $(ECHO) "Rule $@ does not apply on $(PLATFORM)-$(ARCH)" endif -# -# Binary Plug rules and macros -# -include $(BUILDDIR)/common/internal/BinaryPlugs.gmk - # # Get top level sccs_get rule # diff --git a/jdk/make/common/Defs.gmk b/jdk/make/common/Defs.gmk index 33eedad16a4..d959123fdae 100644 --- a/jdk/make/common/Defs.gmk +++ b/jdk/make/common/Defs.gmk @@ -145,6 +145,11 @@ endif # 2. ALT_BINARY_PLUGS_PATH overrides all locations of classes and libraries # 3. ALT_BUILD_BINARY_PLUGS_PATH is used to find a ALT_BINARY_PLUGS_PATH # 4. ALT_CLOSED_JDK_IMPORT_PATH is used to locate classes and libraries +# Note: If any of the ALT_ variables are modified here, it is assumed +# that the build should be done with IMPORT_BINARY_PLUGS=true as +# well. Otherwise the default will be IMPORT_BINARY_PLUGS=false. +# Lastly, setting IMPORT_BINARY_PLUGS=false on the command line +# will override this logic, and plugs will not be imported. # # Always needed, defines the name of the imported/exported jarfile @@ -155,9 +160,11 @@ ifdef OPENJDK CLOSED_JDK_IMPORT_PATH = $(ALT_CLOSED_JDK_IMPORT_PATH) BINARY_PLUGS_PATH = $(CLOSED_JDK_IMPORT_PATH) BINARY_PLUGS_JARFILE = $(CLOSED_JDK_IMPORT_PATH)/jre/lib/rt.jar + IMPORT_BINARY_PLUGS=true endif ifdef ALT_BUILD_BINARY_PLUGS_PATH BUILD_BINARY_PLUGS_PATH = $(ALT_BUILD_BINARY_PLUGS_PATH) + IMPORT_BINARY_PLUGS=true else BUILD_BINARY_PLUGS_PATH = $(SLASH_JAVA)/re/jdk/$(JDK_VERSION)/promoted/latest/openjdk/binaryplugs endif @@ -166,9 +173,11 @@ ifdef OPENJDK ifdef ALT_BINARY_PLUGS_PATH BINARY_PLUGS_PATH = $(ALT_BINARY_PLUGS_PATH) BINARY_PLUGS_JARFILE = $(BINARY_PLUGS_PATH)/jre/lib/$(BINARY_PLUGS_JARNAME) + IMPORT_BINARY_PLUGS=true endif ifdef ALT_BINARY_PLUGS_JARFILE BINARY_PLUGS_JARFILE = $(ALT_BINARY_PLUGS_JARFILE) + IMPORT_BINARY_PLUGS=true endif endif # OPENJDK diff --git a/jdk/make/common/shared/Sanity-Settings.gmk b/jdk/make/common/shared/Sanity-Settings.gmk index 987ba93489a..b64e3b52a13 100644 --- a/jdk/make/common/shared/Sanity-Settings.gmk +++ b/jdk/make/common/shared/Sanity-Settings.gmk @@ -245,6 +245,7 @@ ifdef OPENJDK ALL_SETTINGS+=$(call addAltSetting,FREETYPE_HEADERS_PATH) ALL_SETTINGS+=$(call addAltSetting,FREETYPE_LIB_PATH) ALL_SETTINGS+=$(call addHeading,OPENJDK Import Binary Plug Settings) + ALL_SETTINGS+=$(call addOptionalSetting,IMPORT_BINARY_PLUGS) ALL_SETTINGS+=$(call addAltSetting,BINARY_PLUGS_JARFILE) ALL_SETTINGS+=$(call addAltSetting,BINARY_PLUGS_PATH) ALL_SETTINGS+=$(call addAltSetting,BUILD_BINARY_PLUGS_PATH) diff --git a/jdk/make/java/redist/Makefile b/jdk/make/java/redist/Makefile index 159c247b3f3..9ab884dd247 100644 --- a/jdk/make/java/redist/Makefile +++ b/jdk/make/java/redist/Makefile @@ -251,9 +251,11 @@ endif # INCLUDE_SA # ifdef OPENJDK -include $(BUILDDIR)/common/internal/BinaryPlugs.gmk + ifeq ($(IMPORT_BINARY_PLUGS),true) + include $(BUILDDIR)/common/internal/BinaryPlugs.gmk -build: import-binary-plugs + build: import-binary-plugs + endif else # !OPENJDK From 183aabe3b52aa416e2f1c02c4a3fdde6785c64e1 Mon Sep 17 00:00:00 2001 From: Kelly O'Hair Date: Tue, 31 Mar 2009 16:10:31 -0700 Subject: [PATCH 228/292] 6604458: linux_x64-fastdebug-c2 fails on hyperbolic trig tests Reviewed-by: tbell --- jdk/make/common/Defs-linux.gmk | 7 +++++-- jdk/make/common/Defs-solaris.gmk | 7 +++++-- jdk/make/common/Defs-windows.gmk | 3 +++ jdk/make/java/fdlibm/Makefile | 2 ++ 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/jdk/make/common/Defs-linux.gmk b/jdk/make/common/Defs-linux.gmk index 9ecdd4d7156..591b6ccae31 100644 --- a/jdk/make/common/Defs-linux.gmk +++ b/jdk/make/common/Defs-linux.gmk @@ -94,6 +94,9 @@ ifndef OPTIMIZATION_LEVEL OPTIMIZATION_LEVEL = LOWER endif endif +ifndef FASTDEBUG_OPTIMIZATION_LEVEL + FASTDEBUG_OPTIMIZATION_LEVEL = LOWER +endif CC_OPT/NONE = CC_OPT/LOWER = -O2 @@ -173,8 +176,8 @@ CXXFLAGS_COMMON += $(CFLAGS_REQUIRED) # FASTDEBUG: Optimize the code in the -g versions, gives us a faster debug java ifeq ($(FASTDEBUG), true) - CFLAGS_DBG += $(CC_OPT/LOWER) - CXXFLAGS_DBG += $(CC_OPT/LOWER) + CFLAGS_DBG += $(CC_OPT/$(FASTDEBUG_OPTIMIZATION_LEVEL)) + CXXFLAGS_DBG += $(CC_OPT/$(FASTDEBUG_OPTIMIZATION_LEVEL)) endif CPPFLAGS_COMMON = -D$(ARCH) -DARCH='"$(ARCH)"' -DLINUX $(VERSION_DEFINES) \ diff --git a/jdk/make/common/Defs-solaris.gmk b/jdk/make/common/Defs-solaris.gmk index 9b5cc8b721b..5b1d237caae 100644 --- a/jdk/make/common/Defs-solaris.gmk +++ b/jdk/make/common/Defs-solaris.gmk @@ -93,6 +93,9 @@ ifndef OPTIMIZATION_LEVEL OPTIMIZATION_LEVEL = LOWER endif endif +ifndef FASTDEBUG_OPTIMIZATION_LEVEL + FASTDEBUG_OPTIMIZATION_LEVEL = LOWER +endif # # If -Xa is in CFLAGS_COMMON it will end up ahead of $(CC_OPT) for the @@ -143,8 +146,8 @@ endif # Performance/size of files should be about the same, maybe smaller. # ifeq ($(FASTDEBUG), true) - CFLAGS_DEBUG_OPTION = -g $(CC_OPT/LOWER) - CXXFLAGS_DEBUG_OPTION = -g0 $(CXX_OPT/LOWER) + CFLAGS_DEBUG_OPTION = -g $(CC_OPT/$(FASTDEBUG_OPTIMIZATION_LEVEL)) + CXXFLAGS_DEBUG_OPTION = -g0 $(CXX_OPT/$(FASTDEBUG_OPTIMIZATION_LEVEL)) endif CFLAGS_COMMON = -L$(OBJDIR) diff --git a/jdk/make/common/Defs-windows.gmk b/jdk/make/common/Defs-windows.gmk index 7cb827928cd..00b8ea71e2a 100644 --- a/jdk/make/common/Defs-windows.gmk +++ b/jdk/make/common/Defs-windows.gmk @@ -111,6 +111,9 @@ ifndef OPTIMIZATION_LEVEL OPTIMIZATION_LEVEL = LOWER endif endif +ifndef FASTDEBUG_OPTIMIZATION_LEVEL + FASTDEBUG_OPTIMIZATION_LEVEL = LOWER +endif ifeq ($(CC_VERSION),msvc) # Visual Studio .NET 2003 or VS2003 compiler option definitions: diff --git a/jdk/make/java/fdlibm/Makefile b/jdk/make/java/fdlibm/Makefile index eeb5e744f41..739eaf4403f 100644 --- a/jdk/make/java/fdlibm/Makefile +++ b/jdk/make/java/fdlibm/Makefile @@ -45,6 +45,7 @@ FDLIBM_SRC = $(SHARE_SRC)/native/java/lang/fdlibm ifeq ($(PLATFORM),windows) # Turn all optimizations off OPTIMIZATION_LEVEL = NONE + FASTDEBUG_OPTIMIZATION_LEVEL = NONE OTHER_CFLAGS = CPPFLAGS_DBG += -DLOGGING endif @@ -56,6 +57,7 @@ endif ifeq ($(PLATFORM),linux) # Turn all optimizations off OPTIMIZATION_LEVEL = NONE + FASTDEBUG_OPTIMIZATION_LEVEL = NONE endif # From a4fccad415c0293f1b3219c53edd3848556fc14b Mon Sep 17 00:00:00 2001 From: Kelly O'Hair Date: Tue, 31 Mar 2009 16:11:09 -0700 Subject: [PATCH 229/292] 6745361: Add -XX options to prevent stdout/stderr pollution using fastdebug/debug bootjdk Reviewed-by: tbell --- jdk/make/common/shared/Defs-java.gmk | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/jdk/make/common/shared/Defs-java.gmk b/jdk/make/common/shared/Defs-java.gmk index 8454ab2d674..78f87294fbe 100644 --- a/jdk/make/common/shared/Defs-java.gmk +++ b/jdk/make/common/shared/Defs-java.gmk @@ -59,7 +59,15 @@ else ADD_CLIENT_VM_OPTION = true endif endif -JAVA_JVM_FLAGS = + +# Options for hotspot to turn off printing of options with fastdebug version +# and creating the hotspot.log file. +JAVA_HOTSPOT_DISABLE_PRINT_VMOPTIONS = \ + -XX:-PrintVMOptions -XX:+UnlockDiagnosticVMOptions -XX:-LogVMOutput + +# JVM options +JAVA_JVM_FLAGS = $(JAVA_HOTSPOT_DISABLE_PRINT_VMOPTIONS) + ifeq ($(ADD_CLIENT_VM_OPTION), true) JAVA_JVM_FLAGS += -client endif From 53b5f6ae6b5e0a276a706211dad4f2ec3da19358 Mon Sep 17 00:00:00 2001 From: Kelly O'Hair Date: Tue, 31 Mar 2009 16:12:56 -0700 Subject: [PATCH 230/292] 6502548: test/Makefile needs to be setup to allow for JPRT testrules (NSK and JCK testing too?) A work in progress on testing additions for JPRT system. Reviewed-by: tbell --- jdk/test/Makefile | 468 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 403 insertions(+), 65 deletions(-) diff --git a/jdk/test/Makefile b/jdk/test/Makefile index 5435bf0a614..775e7cbc913 100644 --- a/jdk/test/Makefile +++ b/jdk/test/Makefile @@ -1,12 +1,44 @@ # -# Makefile to run jtreg +# Copyright 1995-2008 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. +# + +# +# Makefile to run various jdk tests # # Get OS/ARCH specifics OSNAME = $(shell uname -s) + +# Commands to run on paths to make mixed paths for java on windows +GETMIXEDPATH=echo + +# Location of developer shared files +SLASH_JAVA = /java + +# Platform specific settings ifeq ($(OSNAME), SunOS) PLATFORM = solaris - JCT_PLATFORM = solaris ARCH = $(shell uname -p) ifeq ($(ARCH), i386) ARCH=i586 @@ -14,97 +46,403 @@ ifeq ($(OSNAME), SunOS) endif ifeq ($(OSNAME), Linux) PLATFORM = linux - JCT_PLATFORM = linux ARCH = $(shell uname -m) ifeq ($(ARCH), i386) ARCH=i586 endif endif -ifeq ($(OSNAME), Windows_NT) + +# Cannot trust uname output +ifneq ($(PROCESSOR_IDENTIFIER), ) PLATFORM = windows - JCT_PLATFORM = win32 - ifeq ($(word 1, $(PROCESSOR_IDENTIFIER)),ia64) - ARCH=ia64 + SLASH_JAVA = J: + # A variety of ways to say X64 arch :^( + PROC_ARCH:=$(word 1, $(PROCESSOR_IDENTIFIER)) + PROC_ARCH:=$(subst x86,X86,$(PROC_ARCH)) + PROC_ARCH:=$(subst x64,X64,$(PROC_ARCH)) + PROC_ARCH:=$(subst AMD64,X64,$(PROC_ARCH)) + PROC_ARCH:=$(subst amd64,X64,$(PROC_ARCH)) + PROC_ARCH:=$(subst EM64T,X64,$(PROC_ARCH)) + PROC_ARCH:=$(subst em64t,X64,$(PROC_ARCH)) + PROC_ARCH:=$(subst intel64,X64,$(PROC_ARCH)) + PROC_ARCH:=$(subst Intel64,X64,$(PROC_ARCH)) + PROC_ARCH:=$(subst INTEL64,X64,$(PROC_ARCH)) + PROC_ARCH:=$(subst ia64,IA64,$(PROC_ARCH)) + ifeq ($(PROC_ARCH),IA64) + ARCH = ia64 else - ifeq ($(word 1, $(PROCESSOR_IDENTIFIER)),AMD64) - ARCH=x64 + ifeq ($(PROC_ARCH),X64) + ARCH = x64 else - ifeq ($(word 1, $(PROCESSOR_IDENTIFIER)),EM64T) - ARCH=x64 - else - ARCH=i586 - endif + ARCH = i586 endif endif + EXESUFFIX = .exe + # These need to be different depending on MKS or CYGWIN + ifeq ($(findstring cygdrive,$(shell (cd C:/ && pwd))), ) + GETMIXEDPATH=dosname -s + else + GETMIXEDPATH=cygpath -m -s + endif endif +# Utilities used +CD = cd +CP = cp +ECHO = echo +MKDIR = mkdir +ZIP = zip + # Root of this test area (important to use full paths in some places) TEST_ROOT := $(shell pwd) -# Default bundle of all test results (passed or not) -JPRT_ARCHIVE_BUNDLE=$(TEST_ROOT)/JPRT_ARCHIVE_BUNDLE.zip - -# Default home for JTREG -ifeq ($(PLATFORM), windows) - JT_HOME = J:/svc/jct-tools3.2.2_02 - JTREG_KEY_OPTION=-k:!ignore +# Root of all test results +ifdef ALT_OUTPUTDIR + ABS_OUTPUTDIR = $(ALT_OUTPUTDIR) else - JT_HOME = /java/svc/jct-tools3.2.2_02 - JTREG_KEY_OPTION=-k:\!ignore + ABS_OUTPUTDIR = $(TEST_ROOT)/../build/$(PLATFORM)-$(ARCH) +endif +ABS_BUILD_ROOT = $(ABS_OUTPUTDIR) +ABS_TEST_OUTPUT_DIR := $(ABS_BUILD_ROOT)/testoutput + +# Expect JPRT to set PRODUCT_HOME (the product or jdk in this case to test) +ifndef PRODUCT_HOME + # Try to use j2sdk-image if it exists + ABS_JDK_IMAGE = $(ABS_BUILD_ROOT)/j2sdk-image + PRODUCT_HOME := \ + $(shell \ + if [ -d $(ABS_JDK_IMAGE) ] ; then \ + $(ECHO) "$(ABS_JDK_IMAGE)"; \ + else \ + $(ECHO) "$(ABS_BUILD_ROOT)" ; \ + fi) + PRODUCT_HOME := $(PRODUCT_HOME) endif -# Default JTREG to run -JTREG = $(JT_HOME)/$(JCT_PLATFORM)/bin/jtreg +# Expect JPRT to set JPRT_PRODUCT_ARGS (e.g. -server etc.) +# Should be passed into 'java' only. +ifdef JPRT_PRODUCT_ARGS + JAVA_ARGS = $(JPRT_PRODUCT_ARGS) +endif -# Default JDK to test -JAVA_HOME = $(TEST_ROOT)/../build/$(PLATFORM)-$(ARCH) +# Expect JPRT to set JPRT_PRODUCT_VM_ARGS (e.g. -Xcomp etc.) +# Should be passed into anything running the vm (java, javac, javadoc, ...). +ifdef JPRT_PRODUCT_VM_ARGS + JAVA_VM_ARGS = $(JPRT_PRODUCT_VM_ARGS) +endif -# The test directories to run -DEFAULT_TESTDIRS = demo/jvmti/gctest demo/jvmti/hprof -TESTDIRS = $(DEFAULT_TESTDIRS) +# Expect JPRT to set JPRT_ARCHIVE_BUNDLE (path to zip bundle for results) +ARCHIVE_BUNDLE = $(ABS_TEST_OUTPUT_DIR)/ARCHIVE_BUNDLE.zip +ifdef JPRT_ARCHIVE_BUNDLE + ARCHIVE_BUNDLE = $(JPRT_ARCHIVE_BUNDLE) +endif -# Root of all test results -JTREG_OUTPUT_DIR = $(TEST_ROOT)/o_$(PLATFORM)-$(ARCH) +# How to create the test bundle (pass or fail, we want to create this) +# Follow command with ";$(BUNDLE_UP_AND_EXIT)", so it always gets executed. +ZIP_UP_RESULTS = ( $(MKDIR) -p `dirname $(ARCHIVE_BUNDLE)` \ + && $(CD) $(ABS_TEST_OUTPUT_DIR) \ + && $(ZIP) -q -r $(ARCHIVE_BUNDLE) . ) +BUNDLE_UP_AND_EXIT = ( exitCode=$$? && $(ZIP_UP_RESULTS) && exit $${exitCode} ) -# Export this setting and pass it in. -#JAVA_TOOL_OPTIONS = -Djava.awt.headless=true -#export JAVA_TOOL_OPTIONS +################################################################ -# Default make rule -all: clean check tests $(JPRT_ARCHIVE_BUNDLE) - @echo "Testing completed successfully" +# Default make rule (runs jtreg_tests) +all: jtreg_tests + @$(ECHO) "Testing completed successfully" -# Chaeck to make sure these directories exist -check: $(JT_HOME) $(JAVA_HOME) $(JTREG) - -# Run the tests -tests: FRC - @echo "Using export JAVA_TOOL_OPTIONS=$(JAVA_TOOL_OPTIONS)" - @rm -f -r $(JTREG_OUTPUT_DIR) - @mkdir -p $(JTREG_OUTPUT_DIR) - $(JTREG) -a -v:fail,error \ - $(JTREG_KEY_OPTION) \ - -r:$(JTREG_OUTPUT_DIR)/JTreport \ - -w:$(JTREG_OUTPUT_DIR)/JTwork \ - -jdk:$(JAVA_HOME) \ - $(JAVA_TOOL_OPTIONS:%=-vmoption:%) \ - $(JAVA_ARGS:%=-vmoption:%) \ - $(TESTDIRS) - -# Bundle up the results -$(JPRT_ARCHIVE_BUNDLE): FRC - @rm -f $@ - @mkdir -p $(@D) - ( cd $(JTREG_OUTPUT_DIR) && zip -q -r $@ . ) +# Prep for output +prep: clean + @$(MKDIR) -p $(ABS_TEST_OUTPUT_DIR) + @$(MKDIR) -p `dirname $(ARCHIVE_BUNDLE)` # Cleanup clean: - rm -f -r $(JTREG_OUTPUT_DIR) - rm -f $(JPRT_ARCHIVE_BUNDLE) + $(RM) -r $(ABS_TEST_OUTPUT_DIR) + $(RM) $(ARCHIVE_BUNDLE) -# Used to force a target rules to run -FRC: +################################################################ + +# jtreg tests + +# Expect JT_HOME to be set for jtreg tests. (home for jtreg) +JT_HOME = $(SLASH_JAVA)/re/jtreg/4.0/promoted/latest/binaries/jtreg +ifdef JPRT_JTREG_HOME + JT_HOME = $(JPRT_JTREG_HOME) +endif + +# Expect JPRT to set TESTDIRS to the jtreg test dirs +ifndef TESTDIRS + TESTDIRS = demo/jvmti/gctest demo/jvmti/hprof +endif + +# Default JTREG to run (win32 script works for everybody) +JTREG = $(JT_HOME)/win32/bin/jtreg + +jtreg_tests: prep $(JT_HOME) $(PRODUCT_HOME) $(JTREG) + $(RM) $(JTREG).orig + cp $(JTREG) $(JTREG).orig + $(RM) $(JTREG) + sed -e 's@-J\*@-J-*@' $(JTREG).orig > $(JTREG) + chmod a+x $(JTREG) + ( JT_HOME=$(shell $(GETMIXEDPATH) "$(JT_HOME)"); \ + export JT_HOME; \ + $(shell $(GETMIXEDPATH) "$(JTREG)") \ + -a -v:fail,error \ + -ignore:quiet \ + $(EXTRA_JTREG_OPTIONS) \ + -r:$(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)")/JTreport \ + -w:$(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)")/JTwork \ + -jdk:$(shell $(GETMIXEDPATH) "$(PRODUCT_HOME)") \ + $(JAVA_ARGS:%=-javaoptions:%) \ + $(JAVA_VM_ARGS:%=-vmoption:%) \ + $(TESTDIRS) \ + ) ; $(BUNDLE_UP_AND_EXIT) + +PHONY_LIST += jtreg_tests + +################################################################ + +# packtest + +# Expect JPRT to set JPRT_PACKTEST_HOME. +PACKTEST_HOME = /net/jprt-web.sfbay.sun.com/jprt/allproducts/packtest +ifdef JPRT_PACKTEST_HOME + PACKTEST_HOME = $(JPRT_PACKTEST_HOME) +endif + +packtest: prep $(PACKTEST_HOME)/ptest $(PRODUCT_HOME) + ( $(CD) $(PACKTEST_HOME) && \ + $(PACKTEST_HOME)/ptest \ + -t "$(PRODUCT_HOME)" \ + $(PACKTEST_STRESS_OPTION) \ + $(EXTRA_PACKTEST_OPTIONS) \ + -W $(ABS_TEST_OUTPUT_DIR) \ + $(JAVA_ARGS:%=-J %) \ + $(JAVA_VM_ARGS:%=-J %) \ + ) ; $(BUNDLE_UP_AND_EXIT) + +packtest_stress: PACKTEST_STRESS_OPTION=-s +packtest_stress: packtest + +PHONY_LIST += packtest packtest_stress + +################################################################ + +# vmsqe tests + +# Expect JPRT to set JPRT_VMSQE_HOME. +VMSQE_HOME = /java/sqe/comp/vm/testbase/sqe/vm/current/build/latest/vm +ifdef JPRT_VMSQE_HOME + VMSQE_HOME = $(JPRT_VMSQE_HOME) +endif + +# Expect JPRT to set JPRT_RUNVMSQE_HOME. +RUNVMSQE_HOME = /net/jprt-web.sfbay.sun.com/jprt/allproducts/runvmsqe +ifdef JPRT_RUNVMSQE_HOME + RUNVMSQE_HOME = $(JPRT_RUNVMSQE_HOME) +endif + +# Expect JPRT to set JPRT_TONGA3_HOME. +TONGA3_HOME = /java/sqe//tools/gtee/harness/tonga +ifdef JPRT_TONGA3_HOME + TONGA3_HOME = $(JPRT_TONGA3_HOME) +endif + +RUNVMSQE_BIN = $(RUNVMSQE_HOME)/bin/runvmsqe + +vmsqe_tests: prep $(VMSQE_HOME)/vm $(TONGA3_HOME) $(RUNVMSQE_BIN) $(PRODUCT_HOME) + $(RM) -r $(ABS_TEST_OUTPUT_DIR)/vmsqe + ( $(CD) $(ABS_TEST_OUTPUT_DIR) && \ + $(RUNVMSQE_BIN) \ + -jdk "$(PRODUCT_HOME)" \ + -o "$(ABS_TEST_OUTPUT_DIR)/vmsqe" \ + -testbase "$(VMSQE_HOME)/vm" \ + -tonga "$(TONGA3_HOME)" \ + -tongajdk "$(ALT_BOOTDIR)" \ + $(JAVA_ARGS) \ + $(JAVA_VM_ARGS) \ + $(RUNVMSQE_TEST_OPTION) \ + $(EXTRA_RUNVMSQE_OPTIONS) \ + ) ; $(BUNDLE_UP_AND_EXIT) + +vmsqe_jdwp: RUNVMSQE_TEST_OPTION=-jdwp +vmsqe_jdwp: vmsqe_tests + +vmsqe_jdi: RUNVMSQE_TEST_OPTION=-jdi +vmsqe_jdi: vmsqe_tests + +vmsqe_jdb: RUNVMSQE_TEST_OPTION=-jdb +vmsqe_jdb: vmsqe_tests + +vmsqe_quick-jdi: RUNVMSQE_TEST_OPTION=-quick-jdi +vmsqe_quick-jdi: vmsqe_tests + +vmsqe_sajdi: RUNVMSQE_TEST_OPTION=-sajdi +vmsqe_sajdi: vmsqe_tests + +vmsqe_jvmti: RUNVMSQE_TEST_OPTION=-jvmti +vmsqe_jvmti: vmsqe_tests + +vmsqe_hprof: RUNVMSQE_TEST_OPTION=-hprof +vmsqe_hprof: vmsqe_tests + +vmsqe_monitoring: RUNVMSQE_TEST_OPTION=-monitoring +vmsqe_monitoring: vmsqe_tests + +PHONY_LIST += vmsqe_jdwp vmsqe_jdi vmsqe_jdb vmsqe_quick-jdi vmsqe_sajdi \ + vmsqe_jvmti vmsqe_hprof vmsqe_monitoring vmsqe_tests + +################################################################ + +# jck tests + +JCK_WORK_DIR = $(ABS_TEST_OUTPUT_DIR)/JCKwork +JCK_REPORT_DIR = $(ABS_TEST_OUTPUT_DIR)/JCKreport +JCK_PROPERTIES = $(ABS_TEST_OUTPUT_DIR)/jck.properties +JCK_CONFIG = $(ABS_TEST_OUTPUT_DIR)/jck.config + +JCK_JAVA_EXE = $(PRODUCT_HOME)/bin/java$(EXESUFFIX) + +JCK_JAVATEST_JAR = $(JCK_HOME)/lib/javatest.jar +JCK_JAVATEST = $(ALT_BOOTDIR)/bin/java -jar $(JCK_JAVATEST_JAR) + +$(JCK_CONFIG): $(TEST_ROOT)/JCK-$(JCK_BUNDLE_NAME)-$(JCK_RELEASE)-base.jti + $(RM) $@ + $(MKDIR) -p $(@D) + $(CP) $< $@ + +$(JCK_PROPERTIES): $(PRODUCT_HOME) $(JCK_JAVA_EXE) + $(RM) $@ + $(MKDIR) -p $(@D) + $(ECHO) "jck.env.compiler.compRefExecute.cmdAsFile=$(JCK_JAVA_EXE)" >> $@ + $(ECHO) "jck.env.compiler.compRefExecute.systemRoot=$(SYSTEMROOT)" >> $@ + $(ECHO) "jck.env.compiler.testCompile.testCompileAPImultiJVM.cmdAsFile=$(JCK_JAVA_EXE)" >> $@ + $(ECHO) "jck.tests.tests=$(JCK_BUNDLE_TESTDIRS)" >> $@ + +jck_tests: prep $(JCK_HOME) $(JCK_PROPERTIES) $(JCK_CONFIG) $(JCK_JAVATEST_JAR) + $(MKDIR) -p $(JCK_WORK_DIR) + ( $(JCK_JAVATEST) \ + -verbose:commands,non-pass \ + -testSuite $(JCK_HOME) \ + -workDir $(JCK_WORK_DIR) \ + -config $(JCK_CONFIG) \ + -set -file $(JCK_PROPERTIES) \ + -runtests \ + -writeReport $(JCK_REPORT_DIR) \ + ) ; $(BUNDLE_UP_AND_EXIT) + +PHONY_LIST += jck_tests + +################################################################ + +# jck6 tests + +JCK6_RELEASE = 6b +JCK6_DEFAULT_HOME = $(SLASH_JAVA)/re/jck/$(JCK6_RELEASE)/archive/fcs/binaries + +# Expect JPRT to set JPRT_JCK6COMPILER_HOME. +JCK6COMPILER_HOME = $(JCK6_DEFAULT_HOME)/JCK-compiler-$(JCK6_RELEASE) +ifdef JPRT_JCK6COMPILER_HOME + JCK6COMPILER_HOME = $(JPRT_JCK6COMPILER_HOME) +endif + +# Expect JPRT to set JPRT_JCK6RUNTIME_HOME. +JCK6RUNTIME_HOME = $(JCK6_DEFAULT_HOME)/JCK-runtime-$(JCK6_RELEASE) +ifdef JPRT_JCK6RUNTIME_HOME + JCK6RUNTIME_HOME = $(JPRT_JCK6RUNTIME_HOME) +endif + +# Expect JPRT to set JPRT_JCK6DEVTOOLS_HOME. +JCK6DEVTOOLS_HOME = $(JCK6_DEFAULT_HOME)/JCK-devtools-$(JCK6_RELEASE) +ifdef JPRT_JCK6DEVTOOLS_HOME + JCK6DEVTOOLS_HOME = $(JPRT_JCK6DEVTOOLS_HOME) +endif + +jck6_tests: JCK_HOME=$(JCK6_HOME) +jck6_tests: JCK_RELEASE=$(JCK6_RELEASE) +jck6_tests: jck_tests + +jck6compiler: JCK6_HOME=$(JCK6COMPILER_HOME) +jck6compiler: JCK_BUNDLE_NAME=compiler +jck6compiler: jck6_tests + +jck6compiler_lang: JCK_BUNDLE_TESTDIRS=lang +jck6compiler_lang: jck6compiler + +jck6runtime: JCK6_HOME=$(JCK6RUNTIME_HOME) +jck6runtime: JCK_BUNDLE_NAME=runtime +jck6runtime: jck6_tests + +jck6runtime_lang: JCK_BUNDLE_TESTDIRS=lang +jck6runtime_lang: jck6runtime + +jck6devtools: JCK6_HOME=$(JCK6DEVTOOLS_HOME) +jck6devtools: JCK_BUNDLE_NAME=devtools +jck6devtools: jck6_tests + +jck6devtools_lang: JCK_BUNDLE_TESTDIRS=lang +jck6devtools_lang: jck6devtools + +PHONY_LIST += jck6compiler jck6runtime jck6devtools jck6_tests \ + jck6compiler_lang jck6runtime_lang jck6devtools_lang + +################################################################ + +# jck7 tests + +JCK7_RELEASE = 7 +JCK7_DEFAULT_HOME = $(SLASH_JAVA)/re/jck/$(JCK7_RELEASE)/archive/fcs/binaries + +# Expect JPRT to set JPRT_JCK7COMPILER_HOME. +JCK7COMPILER_HOME = $(JCK7_DEFAULT_HOME)/JCK-compiler-$(JCK7_RELEASE) +ifdef JPRT_JCK7COMPILER_HOME + JCK7COMPILER_HOME = $(JPRT_JCK7COMPILER_HOME) +endif + +# Expect JPRT to set JPRT_JCK7RUNTIME_HOME. +JCK7RUNTIME_HOME = $(JCK7_DEFAULT_HOME)/JCK-runtime-$(JCK7_RELEASE) +ifdef JPRT_JCK7RUNTIME_HOME + JCK7RUNTIME_HOME = $(JPRT_JCK7RUNTIME_HOME) +endif + +# Expect JPRT to set JPRT_JCK7DEVTOOLS_HOME. +JCK7DEVTOOLS_HOME = $(JCK7_DEFAULT_HOME)/JCK-devtools-$(JCK7_RELEASE) +ifdef JPRT_JCK7DEVTOOLS_HOME + JCK7DEVTOOLS_HOME = $(JPRT_JCK7DEVTOOLS_HOME) +endif + +jck7_tests: JCK_HOME=$(JCK7_HOME) +jck7_tests: JCK_RELEASE=$(JCK7_RELEASE) +jck7_tests: jck_tests + +jck7compiler: JCK7_HOME=$(JCK7COMPILER_HOME) +jck7compiler: JCK_BUNDLE_NAME=compiler +jck7compiler: jck7_tests + +jck7compiler_lang: JCK_BUNDLE_TESTDIRS=lang +jck7compiler_lang: jck7compiler + +jck7runtime: JCK7_HOME=$(JCK7RUNTIME_HOME) +jck7runtime: JCK_BUNDLE_NAME=runtime +jck7runtime: jck7_tests + +jck7runtime_lang: JCK_BUNDLE_TESTDIRS=lang +jck7runtime_lang: jck7runtime + +jck7devtools: JCK7_HOME=$(JCK7DEVTOOLS_HOME) +jck7devtools: JCK_BUNDLE_NAME=devtools +jck7devtools: jck7_tests + +jck7devtools_lang: JCK_BUNDLE_TESTDIRS=lang +jck7devtools_lang: jck7devtools + +PHONY_LIST += jck7compiler jck7runtime jck7devtools jck7_tests \ + jck7compiler_lang jck7runtime_lang jck7devtools_lang + +################################################################ # Phony targets (e.g. these are not filenames) -.PHONY: all tests clean check +.PHONY: all clean prep $(PHONY_LIST) + +################################################################ From c9ce349372fe80f7b0e4cf2da2fd18156a417452 Mon Sep 17 00:00:00 2001 From: Kelly O'Hair Date: Tue, 31 Mar 2009 16:14:14 -0700 Subject: [PATCH 231/292] 6824012: Add jdk regression tests to default jprt jobs A work in progress on adding to the jprt testing. Reviewed-by: tbell --- jdk/make/jprt.properties | 13 +++++++++++++ jdk/test/java/io/File/GetXSpace.java | 1 + jdk/test/java/lang/Thread/StartOOMTest.java | 1 + jdk/test/java/util/logging/LoggingDeadlock2.java | 2 +- 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/jdk/make/jprt.properties b/jdk/make/jprt.properties index c909f36aa3c..a1e7e5100ba 100644 --- a/jdk/make/jprt.properties +++ b/jdk/make/jprt.properties @@ -53,6 +53,19 @@ jprt.solaris_x64.build.platform.match32=solaris_i586_5.10 # Standard list of jprt test targets for this workspace jprt.test.targets=*-*-*-jvm98 +jprt.regression.test.targets= \ + *-*-*-java/lang, \ + *-*-*-java/security, \ + *-*-*-java/text, \ + *-*-*-java/util + +#jprt.regression.test.targets= \ +# *-*-*-java/awt, \ +# *-*-*-java/beans, \ +# *-*-*-java/io, \ +# *-*-*-java/net, \ +# *-*-*-java/nio, \ +# *-*-*-java/rmi, \ # Directories needed to build jprt.bundle.exclude.src.dirs=build diff --git a/jdk/test/java/io/File/GetXSpace.java b/jdk/test/java/io/File/GetXSpace.java index a2855e7b372..345c3384668 100644 --- a/jdk/test/java/io/File/GetXSpace.java +++ b/jdk/test/java/io/File/GetXSpace.java @@ -24,6 +24,7 @@ /** * @test * @bug 4057701 6286712 6364377 + * @ignore until 6492634 and 6501010 is fixed * @run build GetXSpace * @run shell GetXSpace.sh * @summary Basic functionality of File.get-X-Space methods. diff --git a/jdk/test/java/lang/Thread/StartOOMTest.java b/jdk/test/java/lang/Thread/StartOOMTest.java index dd8b519453e..260d0929703 100644 --- a/jdk/test/java/lang/Thread/StartOOMTest.java +++ b/jdk/test/java/lang/Thread/StartOOMTest.java @@ -24,6 +24,7 @@ /* * @test * @bug 6379235 + * @ignore until 6721694 is fixed * @run main/othervm -server -Xmx32m -Xms32m -Xss256m StartOOMTest * @summary ThreadGroup accounting mistake possible with failure of Thread.start() */ diff --git a/jdk/test/java/util/logging/LoggingDeadlock2.java b/jdk/test/java/util/logging/LoggingDeadlock2.java index 47831935226..50de62abfcc 100644 --- a/jdk/test/java/util/logging/LoggingDeadlock2.java +++ b/jdk/test/java/util/logging/LoggingDeadlock2.java @@ -24,7 +24,7 @@ /* * @test * @bug 6467152 - * + * @ignore until 6716076 is fixed * @summary deadlock occurs in LogManager initialization and JVM termination * @author Serguei Spitsyn / Hittachi * From 1870624c08204c56a9f5c46935bbbd52012950e1 Mon Sep 17 00:00:00 2001 From: Mandy Chung Date: Tue, 31 Mar 2009 23:52:04 -0700 Subject: [PATCH 232/292] 6819110: Lazily load Sun digest provider for jar verification Lazily call Providers.getSunProvider() instead of at static initializer Reviewed-by: mullan --- .../classes/sun/security/util/ManifestEntryVerifier.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/jdk/src/share/classes/sun/security/util/ManifestEntryVerifier.java b/jdk/src/share/classes/sun/security/util/ManifestEntryVerifier.java index c528d95c8b1..b713f16e768 100644 --- a/jdk/src/share/classes/sun/security/util/ManifestEntryVerifier.java +++ b/jdk/src/share/classes/sun/security/util/ManifestEntryVerifier.java @@ -44,8 +44,6 @@ public class ManifestEntryVerifier { private static final Debug debug = Debug.getInstance("jar"); - private static final Provider digestProvider = Providers.getSunProvider(); - /** the created digest objects */ HashMap createdDigests; @@ -127,7 +125,7 @@ public class ManifestEntryVerifier { try { digest = MessageDigest.getInstance - (algorithm, digestProvider); + (algorithm, Providers.getSunProvider()); createdDigests.put(algorithm, digest); } catch (NoSuchAlgorithmException nsae) { // ignore From c81e6c29c17c27ad6c0a4e857582ba2f937a7aba Mon Sep 17 00:00:00 2001 From: Tim Bell Date: Wed, 1 Apr 2009 04:44:30 -0700 Subject: [PATCH 233/292] 6824595: OpenJDK fix breaks product build for jdk7 Reviewed-by: xdono, ohair --- jdk/make/Makefile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/jdk/make/Makefile b/jdk/make/Makefile index 27781781f62..c78e4c27e01 100644 --- a/jdk/make/Makefile +++ b/jdk/make/Makefile @@ -328,6 +328,11 @@ else $(ECHO) "Rule $@ does not apply on $(PLATFORM)-$(ARCH)" endif +# +# Binary Plug rules and macros +# +include $(BUILDDIR)/common/internal/BinaryPlugs.gmk + # # Get top level sccs_get rule # From 0a24bf67c20aa9e91530197799d51af241393ece Mon Sep 17 00:00:00 2001 From: Anthony Petrov Date: Wed, 1 Apr 2009 19:05:47 +0400 Subject: [PATCH 234/292] 6818312: com.sun.awt.SecurityWarning.getSize() always reports (0, 0) on X11 The fix got pushed with 6693253. However the test was omitted. Here it comes. Reviewed-by: dcherepanov, art --- .../GetSizeShouldNotReturnZero.java | 392 ++++++++++++++++++ 1 file changed, 392 insertions(+) create mode 100644 jdk/test/com/sun/awt/SecurityWarning/GetSizeShouldNotReturnZero.java diff --git a/jdk/test/com/sun/awt/SecurityWarning/GetSizeShouldNotReturnZero.java b/jdk/test/com/sun/awt/SecurityWarning/GetSizeShouldNotReturnZero.java new file mode 100644 index 00000000000..96f8f14ad46 --- /dev/null +++ b/jdk/test/com/sun/awt/SecurityWarning/GetSizeShouldNotReturnZero.java @@ -0,0 +1,392 @@ +/* + * Copyright 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 %W% %E% + @bug 6818312 + @summary The size returned by SecurityWarning.getSize() should not be zero + @author anthony.petrov@sun.com: area=awt.toplevel + @library ../../../../java/awt/regtesthelpers + @build Util + @run main GetSizeShouldNotReturnZero +*/ + +/** + * GetSizeShouldNotReturnZero.java + * + * summary: The size returned by SecurityWarning.getSize() should not be zero + */ + +import java.awt.*; +import java.awt.event.*; +import java.security.Permission; +import test.java.awt.regtesthelpers.Util; +import com.sun.awt.SecurityWarning; + +public class GetSizeShouldNotReturnZero +{ + private static void init() + { + String[] instructions = + { + "This is an AUTOMATIC test, simply wait until it is done.", + "The result (passed or failed) will be shown in the", + "message window below." + }; + Sysout.createDialog( ); + Sysout.printInstructions( instructions ); + + + // Install the security manager so that all subsequently created + // windows display the security warning. + System.setSecurityManager(new SecurityManager() { + + @Override + public void checkPermission(Permission perm) { + } + + @Override + public boolean checkTopLevelWindow(Object window) { + return false; + } + }); + + Frame f = new Frame(); + f.setSize(100, 100); + f.setVisible(true); + + Robot robot = Util.createRobot(); + Util.waitForIdle(robot); + + Dimension size = SecurityWarning.getSize(f); + if (size.width == 0 || size.height == 0) { + fail("Reported security warning size: " + size); + return; + } + pass(); + }//End init() + + + + /***************************************************** + * Standard Test Machinery Section + * DO NOT modify anything in this section -- it's a + * standard chunk of code which has all of the + * synchronisation necessary for the test harness. + * By keeping it the same in all tests, it is easier + * to read and understand someone else's test, as + * well as insuring that all tests behave correctly + * with the test harness. + * There is a section following this for test- + * classes + ******************************************************/ + private static boolean theTestPassed = false; + private static boolean testGeneratedInterrupt = false; + private static String failureMessage = ""; + + private static Thread mainThread = null; + + private static int sleepTime = 300000; + + // Not sure about what happens if multiple of this test are + // instantiated in the same VM. Being static (and using + // static vars), it aint gonna work. Not worrying about + // it for now. + public static void main( String args[] ) throws InterruptedException + { + mainThread = Thread.currentThread(); + try + { + init(); + } + catch( TestPassedException e ) + { + //The test passed, so just return from main and harness will + // interepret this return as a pass + return; + } + //At this point, neither test pass nor test fail has been + // called -- either would have thrown an exception and ended the + // test, so we know we have multiple threads. + + //Test involves other threads, so sleep and wait for them to + // called pass() or fail() + try + { + Thread.sleep( sleepTime ); + //Timed out, so fail the test + throw new RuntimeException( "Timed out after " + sleepTime/1000 + " seconds" ); + } + catch (InterruptedException e) + { + //The test harness may have interrupted the test. If so, rethrow the exception + // so that the harness gets it and deals with it. + if( ! testGeneratedInterrupt ) throw e; + + //reset flag in case hit this code more than once for some reason (just safety) + testGeneratedInterrupt = false; + + if ( theTestPassed == false ) + { + throw new RuntimeException( failureMessage ); + } + } + + }//main + + public static synchronized void setTimeoutTo( int seconds ) + { + sleepTime = seconds * 1000; + } + + public static synchronized void pass() + { + Sysout.println( "The test passed." ); + Sysout.println( "The test is over, hit Ctl-C to stop Java VM" ); + //first check if this is executing in main thread + if ( mainThread == Thread.currentThread() ) + { + //Still in the main thread, so set the flag just for kicks, + // and throw a test passed exception which will be caught + // and end the test. + theTestPassed = true; + throw new TestPassedException(); + } + theTestPassed = true; + testGeneratedInterrupt = true; + mainThread.interrupt(); + }//pass() + + public static synchronized void fail() + { + //test writer didn't specify why test failed, so give generic + fail( "it just plain failed! :-)" ); + } + + public static synchronized void fail( String whyFailed ) + { + Sysout.println( "The test failed: " + whyFailed ); + Sysout.println( "The test is over, hit Ctl-C to stop Java VM" ); + //check if this called from main thread + if ( mainThread == Thread.currentThread() ) + { + //If main thread, fail now 'cause not sleeping + throw new RuntimeException( whyFailed ); + } + theTestPassed = false; + testGeneratedInterrupt = true; + failureMessage = whyFailed; + mainThread.interrupt(); + }//fail() + +}// class GetSizeShouldNotReturnZero + +//This exception is used to exit from any level of call nesting +// when it's determined that the test has passed, and immediately +// end the test. +class TestPassedException extends RuntimeException +{ +} + +//*********** End Standard Test Machinery Section ********** + + +//************ Begin classes defined for the test **************** + +// if want to make listeners, here is the recommended place for them, then instantiate +// them in init() + +/* Example of a class which may be written as part of a test +class NewClass implements anInterface + { + static int newVar = 0; + + public void eventDispatched(AWTEvent e) + { + //Counting events to see if we get enough + eventCount++; + + if( eventCount == 20 ) + { + //got enough events, so pass + + GetSizeShouldNotReturnZero.pass(); + } + else if( tries == 20 ) + { + //tried too many times without getting enough events so fail + + GetSizeShouldNotReturnZero.fail(); + } + + }// eventDispatched() + + }// NewClass class + +*/ + + +//************** End classes defined for the test ******************* + + + + +/**************************************************** + Standard Test Machinery + DO NOT modify anything below -- it's a standard + chunk of code whose purpose is to make user + interaction uniform, and thereby make it simpler + to read and understand someone else's test. + ****************************************************/ + +/** + This is part of the standard test machinery. + It creates a dialog (with the instructions), and is the interface + for sending text messages to the user. + To print the instructions, send an array of strings to Sysout.createDialog + WithInstructions method. Put one line of instructions per array entry. + To display a message for the tester to see, simply call Sysout.println + with the string to be displayed. + This mimics System.out.println but works within the test harness as well + as standalone. + */ + +class Sysout +{ + private static TestDialog dialog; + + public static void createDialogWithInstructions( String[] instructions ) + { + dialog = new TestDialog( new Frame(), "Instructions" ); + dialog.printInstructions( instructions ); + dialog.setVisible(true); + 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.setVisible(true); + 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 ); + System.out.println(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(); + + setVisible(true); + }// 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" ); + System.out.println(messageIn); + } + +}// TestDialog class + + From 1e18bf2d6e535a8c774f91d33809ea3fa638ee18 Mon Sep 17 00:00:00 2001 From: Kelly O'Hair Date: Wed, 1 Apr 2009 09:08:54 -0700 Subject: [PATCH 235/292] 6824583: regtest TimeUnit/Basic.java fails intermittently on Windows - again Reviewed-by: dholmes --- jdk/test/java/util/concurrent/TimeUnit/Basic.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/jdk/test/java/util/concurrent/TimeUnit/Basic.java b/jdk/test/java/util/concurrent/TimeUnit/Basic.java index 7a956410231..bae284d6c88 100644 --- a/jdk/test/java/util/concurrent/TimeUnit/Basic.java +++ b/jdk/test/java/util/concurrent/TimeUnit/Basic.java @@ -60,10 +60,11 @@ public class Basic { equal(1000L, MICROSECONDS.toNanos(1)); long t0 = System.nanoTime(); - MILLISECONDS.sleep(3); + MILLISECONDS.sleep(3); /* See windows bug 6313903, might not sleep */ long elapsedMillis = (System.nanoTime() - t0)/(1000L * 1000L); System.out.printf("elapsed=%d%n", elapsedMillis); - check(elapsedMillis >= 3); + check(elapsedMillis >= 0); + /* Might not sleep on windows: check(elapsedMillis >= 3); */ check(elapsedMillis < 1000); //---------------------------------------------------------------- From 4d34a77121f9d9869b08416bb3c63afd84a365a7 Mon Sep 17 00:00:00 2001 From: Tom Rodriguez Date: Wed, 1 Apr 2009 11:45:01 -0700 Subject: [PATCH 236/292] 6823454: Oop-typed loadP yields invalid pointer (0x1) on SPECjbb2005 at OSRed method entry Reviewed-by: kvn, jrose --- hotspot/src/share/vm/opto/parse1.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hotspot/src/share/vm/opto/parse1.cpp b/hotspot/src/share/vm/opto/parse1.cpp index 12b75fb327f..da9537eb3c4 100644 --- a/hotspot/src/share/vm/opto/parse1.cpp +++ b/hotspot/src/share/vm/opto/parse1.cpp @@ -95,7 +95,7 @@ Node *Parse::fetch_interpreter_state(int index, switch( bt ) { // Signature is flattened case T_INT: l = new (C, 3) LoadINode( 0, mem, adr, TypeRawPtr::BOTTOM ); break; case T_FLOAT: l = new (C, 3) LoadFNode( 0, mem, adr, TypeRawPtr::BOTTOM ); break; - case T_ADDRESS: + case T_ADDRESS: l = new (C, 3) LoadPNode( 0, mem, adr, TypeRawPtr::BOTTOM, TypeRawPtr::BOTTOM ); break; case T_OBJECT: l = new (C, 3) LoadPNode( 0, mem, adr, TypeRawPtr::BOTTOM, TypeInstPtr::BOTTOM ); break; case T_LONG: case T_DOUBLE: { From 4be7c3c67284ddb9949bf81f21bb7a5e17c71698 Mon Sep 17 00:00:00 2001 From: Paul Hohensee Date: Wed, 1 Apr 2009 16:38:01 -0400 Subject: [PATCH 237/292] 6819213: revive sun.boot.library.path Support multiplex and mutable sun.boot.library.path Reviewed-by: acorn, dcubed, xlu --- hotspot/src/os/linux/vm/os_linux.cpp | 42 +++++- hotspot/src/os/solaris/vm/os_solaris.cpp | 42 +++++- hotspot/src/os/windows/vm/os_windows.cpp | 69 ++++++--- hotspot/src/share/vm/runtime/arguments.cpp | 24 ++-- hotspot/src/share/vm/runtime/arguments.hpp | 7 +- hotspot/src/share/vm/runtime/hpi.hpp | 22 ++- hotspot/src/share/vm/runtime/os.cpp | 55 +++++++- hotspot/src/share/vm/runtime/os.hpp | 1 + .../6819213/TestBootNativeLibraryPath.java | 133 ++++++++++++++++++ 9 files changed, 345 insertions(+), 50 deletions(-) create mode 100644 hotspot/test/runtime/6819213/TestBootNativeLibraryPath.java diff --git a/hotspot/src/os/linux/vm/os_linux.cpp b/hotspot/src/os/linux/vm/os_linux.cpp index 3788eac461e..b4705e4a7f2 100644 --- a/hotspot/src/os/linux/vm/os_linux.cpp +++ b/hotspot/src/os/linux/vm/os_linux.cpp @@ -1518,21 +1518,51 @@ const char* os::dll_file_extension() { return ".so"; } const char* os::get_temp_directory() { return "/tmp/"; } -void os::dll_build_name( - char* buffer, size_t buflen, const char* pname, const char* fname) { - // copied from libhpi +static bool file_exists(const char* filename) { + struct stat statbuf; + if (filename == NULL || strlen(filename) == 0) { + return false; + } + return os::stat(filename, &statbuf) == 0; +} + +void os::dll_build_name(char* buffer, size_t buflen, + const char* pname, const char* fname) { + // Copied from libhpi const size_t pnamelen = pname ? strlen(pname) : 0; - /* Quietly truncate on buffer overflow. Should be an error. */ + // Quietly truncate on buffer overflow. Should be an error. if (pnamelen + strlen(fname) + 10 > (size_t) buflen) { *buffer = '\0'; return; } if (pnamelen == 0) { - sprintf(buffer, "lib%s.so", fname); + snprintf(buffer, buflen, "lib%s.so", fname); + } else if (strchr(pname, *os::path_separator()) != NULL) { + int n; + char** pelements = split_path(pname, &n); + for (int i = 0 ; i < n ; i++) { + // Really shouldn't be NULL, but check can't hurt + if (pelements[i] == NULL || strlen(pelements[i]) == 0) { + continue; // skip the empty path values + } + snprintf(buffer, buflen, "%s/lib%s.so", pelements[i], fname); + if (file_exists(buffer)) { + break; + } + } + // release the storage + for (int i = 0 ; i < n ; i++) { + if (pelements[i] != NULL) { + FREE_C_HEAP_ARRAY(char, pelements[i]); + } + } + if (pelements != NULL) { + FREE_C_HEAP_ARRAY(char*, pelements); + } } else { - sprintf(buffer, "%s/lib%s.so", pname, fname); + snprintf(buffer, buflen, "%s/lib%s.so", pname, fname); } } diff --git a/hotspot/src/os/solaris/vm/os_solaris.cpp b/hotspot/src/os/solaris/vm/os_solaris.cpp index 23b4ff2f5f2..ce201c3faca 100644 --- a/hotspot/src/os/solaris/vm/os_solaris.cpp +++ b/hotspot/src/os/solaris/vm/os_solaris.cpp @@ -1827,21 +1827,51 @@ const char* os::dll_file_extension() { return ".so"; } const char* os::get_temp_directory() { return "/tmp/"; } -void os::dll_build_name( - char* buffer, size_t buflen, const char* pname, const char* fname) { - // copied from libhpi +static bool file_exists(const char* filename) { + struct stat statbuf; + if (filename == NULL || strlen(filename) == 0) { + return false; + } + return os::stat(filename, &statbuf) == 0; +} + +void os::dll_build_name(char* buffer, size_t buflen, + const char* pname, const char* fname) { + // Copied from libhpi const size_t pnamelen = pname ? strlen(pname) : 0; - /* Quietly truncate on buffer overflow. Should be an error. */ + // Quietly truncate on buffer overflow. Should be an error. if (pnamelen + strlen(fname) + 10 > (size_t) buflen) { *buffer = '\0'; return; } if (pnamelen == 0) { - sprintf(buffer, "lib%s.so", fname); + snprintf(buffer, buflen, "lib%s.so", fname); + } else if (strchr(pname, *os::path_separator()) != NULL) { + int n; + char** pelements = split_path(pname, &n); + for (int i = 0 ; i < n ; i++) { + // really shouldn't be NULL but what the heck, check can't hurt + if (pelements[i] == NULL || strlen(pelements[i]) == 0) { + continue; // skip the empty path values + } + snprintf(buffer, buflen, "%s/lib%s.so", pelements[i], fname); + if (file_exists(buffer)) { + break; + } + } + // release the storage + for (int i = 0 ; i < n ; i++) { + if (pelements[i] != NULL) { + FREE_C_HEAP_ARRAY(char, pelements[i]); + } + } + if (pelements != NULL) { + FREE_C_HEAP_ARRAY(char*, pelements); + } } else { - sprintf(buffer, "%s/lib%s.so", pname, fname); + snprintf(buffer, buflen, "%s/lib%s.so", pname, fname); } } diff --git a/hotspot/src/os/windows/vm/os_windows.cpp b/hotspot/src/os/windows/vm/os_windows.cpp index cc3c6202d65..0ae4c3e8131 100644 --- a/hotspot/src/os/windows/vm/os_windows.cpp +++ b/hotspot/src/os/windows/vm/os_windows.cpp @@ -1004,26 +1004,61 @@ const char * os::get_temp_directory() } } -void os::dll_build_name(char *holder, size_t holderlen, - const char* pname, const char* fname) -{ - // copied from libhpi - const size_t pnamelen = pname ? strlen(pname) : 0; - const char c = (pnamelen > 0) ? pname[pnamelen-1] : 0; +static bool file_exists(const char* filename) { + if (filename == NULL || strlen(filename) == 0) { + return false; + } + return GetFileAttributes(filename) != INVALID_FILE_ATTRIBUTES; +} - /* Quietly truncates on buffer overflow. Should be an error. */ - if (pnamelen + strlen(fname) + 10 > holderlen) { - *holder = '\0'; - return; - } +void os::dll_build_name(char *buffer, size_t buflen, + const char* pname, const char* fname) { + // Copied from libhpi + const size_t pnamelen = pname ? strlen(pname) : 0; + const char c = (pnamelen > 0) ? pname[pnamelen-1] : 0; - if (pnamelen == 0) { - sprintf(holder, "%s.dll", fname); - } else if (c == ':' || c == '\\') { - sprintf(holder, "%s%s.dll", pname, fname); - } else { - sprintf(holder, "%s\\%s.dll", pname, fname); + // Quietly truncates on buffer overflow. Should be an error. + if (pnamelen + strlen(fname) + 10 > buflen) { + *buffer = '\0'; + return; + } + + if (pnamelen == 0) { + jio_snprintf(buffer, buflen, "%s.dll", fname); + } else if (c == ':' || c == '\\') { + jio_snprintf(buffer, buflen, "%s%s.dll", pname, fname); + } else if (strchr(pname, *os::path_separator()) != NULL) { + int n; + char** pelements = split_path(pname, &n); + for (int i = 0 ; i < n ; i++) { + char* path = pelements[i]; + // Really shouldn't be NULL, but check can't hurt + size_t plen = (path == NULL) ? 0 : strlen(path); + if (plen == 0) { + continue; // skip the empty path values + } + const char lastchar = path[plen - 1]; + if (lastchar == ':' || lastchar == '\\') { + jio_snprintf(buffer, buflen, "%s%s.dll", path, fname); + } else { + jio_snprintf(buffer, buflen, "%s\\%s.dll", path, fname); + } + if (file_exists(buffer)) { + break; + } } + // release the storage + for (int i = 0 ; i < n ; i++) { + if (pelements[i] != NULL) { + FREE_C_HEAP_ARRAY(char, pelements[i]); + } + } + if (pelements != NULL) { + FREE_C_HEAP_ARRAY(char*, pelements); + } + } else { + jio_snprintf(buffer, buflen, "%s\\%s.dll", pname, fname); + } } // Needs to be in os specific directory because windows requires another diff --git a/hotspot/src/share/vm/runtime/arguments.cpp b/hotspot/src/share/vm/runtime/arguments.cpp index 05a84d581e9..b454864baf6 100644 --- a/hotspot/src/share/vm/runtime/arguments.cpp +++ b/hotspot/src/share/vm/runtime/arguments.cpp @@ -852,16 +852,13 @@ bool Arguments::add_property(const char* prop) { FreeHeap(value); } return true; - } - else if (strcmp(key, "sun.java.command") == 0) { - + } else if (strcmp(key, "sun.java.command") == 0) { _java_command = value; // don't add this property to the properties exposed to the java application FreeHeap(key); return true; - } - else if (strcmp(key, "sun.java.launcher.pid") == 0) { + } else if (strcmp(key, "sun.java.launcher.pid") == 0) { // launcher.pid property is private and is processed // in process_sun_java_launcher_properties(); // the sun.java.launcher property is passed on to the java application @@ -870,13 +867,14 @@ bool Arguments::add_property(const char* prop) { FreeHeap(value); } return true; - } - else if (strcmp(key, "java.vendor.url.bug") == 0) { + } else if (strcmp(key, "java.vendor.url.bug") == 0) { // save it in _java_vendor_url_bug, so JVM fatal error handler can access // its value without going through the property list or making a Java call. _java_vendor_url_bug = value; + } else if (strcmp(key, "sun.boot.library.path") == 0) { + PropertyList_unique_add(&_system_properties, key, value, true); + return true; } - // Create new property and add at the end of the list PropertyList_unique_add(&_system_properties, key, value); return true; @@ -895,7 +893,7 @@ void Arguments::set_mode_flags(Mode mode) { // Ensure Agent_OnLoad has the correct initial values. // This may not be the final mode; mode may change later in onload phase. PropertyList_unique_add(&_system_properties, "java.vm.info", - (char*)Abstract_VM_Version::vm_info_string()); + (char*)Abstract_VM_Version::vm_info_string(), false); UseInterpreter = true; UseCompiler = true; @@ -2767,7 +2765,7 @@ void Arguments::PropertyList_add(SystemProperty** plist, const char* k, char* v) } // This add maintains unique property key in the list. -void Arguments::PropertyList_unique_add(SystemProperty** plist, const char* k, char* v) { +void Arguments::PropertyList_unique_add(SystemProperty** plist, const char* k, char* v, jboolean append) { if (plist == NULL) return; @@ -2775,7 +2773,11 @@ void Arguments::PropertyList_unique_add(SystemProperty** plist, const char* k, c SystemProperty* prop; for (prop = *plist; prop != NULL; prop = prop->next()) { if (strcmp(k, prop->key()) == 0) { - prop->set_value(v); + if (append) { + prop->append_value(v); + } else { + prop->set_value(v); + } return; } } diff --git a/hotspot/src/share/vm/runtime/arguments.hpp b/hotspot/src/share/vm/runtime/arguments.hpp index b3efa55cbdd..c11aef0001a 100644 --- a/hotspot/src/share/vm/runtime/arguments.hpp +++ b/hotspot/src/share/vm/runtime/arguments.hpp @@ -475,10 +475,13 @@ class Arguments : AllStatic { // System properties static void init_system_properties(); - // Proptery List manipulation + // Property List manipulation static void PropertyList_add(SystemProperty** plist, SystemProperty *element); static void PropertyList_add(SystemProperty** plist, const char* k, char* v); - static void PropertyList_unique_add(SystemProperty** plist, const char* k, char* v); + static void PropertyList_unique_add(SystemProperty** plist, const char* k, char* v) { + PropertyList_unique_add(plist, k, v, false); + } + static void PropertyList_unique_add(SystemProperty** plist, const char* k, char* v, jboolean append); static const char* PropertyList_get_value(SystemProperty* plist, const char* key); static int PropertyList_count(SystemProperty* pl); static const char* PropertyList_get_key_at(SystemProperty* pl,int index); diff --git a/hotspot/src/share/vm/runtime/hpi.hpp b/hotspot/src/share/vm/runtime/hpi.hpp index 1e05ca7525a..506b911ca12 100644 --- a/hotspot/src/share/vm/runtime/hpi.hpp +++ b/hotspot/src/share/vm/runtime/hpi.hpp @@ -90,7 +90,7 @@ public: static inline struct protoent* get_proto_by_name(char* name); // HPI_LibraryInterface - static inline void dll_build_name(char *buf, int buf_len, char* path, + static inline void dll_build_name(char *buf, int buf_len, const char* path, const char *name); static inline void* dll_load(const char *name, char *ebuf, int ebuflen); static inline void dll_unload(void *lib); @@ -137,7 +137,15 @@ public: return result; \ } - +#define VM_HPIDECL_VOID(name, names, func, arg_type, arg_print, arg) \ + inline void hpi::name arg_type { \ + if (TraceHPI) { \ + tty->print("hpi::" names "("); \ + tty->print arg_print; \ + tty->print(") = "); \ + } \ + func arg; \ + } #define HPIDECL_VOID(name, names, intf, func, arg_type, arg_print, arg) \ inline void hpi::name arg_type { \ @@ -197,11 +205,11 @@ HPIDECL(fsize, "fsize", _file, FileSizeFD, int, "%d", (fd, size)); // HPI_LibraryInterface -HPIDECL_VOID(dll_build_name, "dll_build_name", _library, BuildLibName, - (char *buf, int buf_len, char *path, const char *name), - ("buf = %p, buflen = %d, path = %s, name = %s", - buf, buf_len, path, name), - (buf, buf_len, path, name)); +VM_HPIDECL_VOID(dll_build_name, "dll_build_name", os::dll_build_name, + (char *buf, int buf_len, const char *path, const char *name), + ("buf = %p, buflen = %d, path = %s, name = %s", + buf, buf_len, path, name), + (buf, buf_len, path, name)); VM_HPIDECL(dll_load, "dll_load", os::dll_load, void *, "(void *)%p", diff --git a/hotspot/src/share/vm/runtime/os.cpp b/hotspot/src/share/vm/runtime/os.cpp index c88d91e4d99..f23f6af42e7 100644 --- a/hotspot/src/share/vm/runtime/os.cpp +++ b/hotspot/src/share/vm/runtime/os.cpp @@ -863,7 +863,6 @@ char* os::format_boot_path(const char* format_string, bool os::set_boot_path(char fileSep, char pathSep) { - const char* home = Arguments::get_java_home(); int home_len = (int)strlen(home); @@ -893,6 +892,60 @@ bool os::set_boot_path(char fileSep, char pathSep) { return true; } +/* + * Splits a path, based on its separator, the number of + * elements is returned back in n. + * It is the callers responsibility to: + * a> check the value of n, and n may be 0. + * b> ignore any empty path elements + * c> free up the data. + */ +char** os::split_path(const char* path, int* n) { + *n = 0; + if (path == NULL || strlen(path) == 0) { + return NULL; + } + const char psepchar = *os::path_separator(); + char* inpath = (char*)NEW_C_HEAP_ARRAY(char, strlen(path) + 1); + if (inpath == NULL) { + return NULL; + } + strncpy(inpath, path, strlen(path)); + int count = 1; + char* p = strchr(inpath, psepchar); + // Get a count of elements to allocate memory + while (p != NULL) { + count++; + p++; + p = strchr(p, psepchar); + } + char** opath = (char**) NEW_C_HEAP_ARRAY(char*, count); + if (opath == NULL) { + return NULL; + } + + // do the actual splitting + p = inpath; + for (int i = 0 ; i < count ; i++) { + size_t len = strcspn(p, os::path_separator()); + if (len > JVM_MAXPATHLEN) { + return NULL; + } + // allocate the string and add terminator storage + char* s = (char*)NEW_C_HEAP_ARRAY(char, len + 1); + if (s == NULL) { + return NULL; + } + strncpy(s, p, len); + s[len] = '\0'; + opath[i] = s; + p += len + 1; + } + FREE_C_HEAP_ARRAY(char, inpath); + *n = count; + return opath; +} + void os::set_memory_serialize_page(address page) { int count = log2_intptr(sizeof(class JavaThread)) - log2_intptr(64); _mem_serialize_page = (volatile int32_t *)page; diff --git a/hotspot/src/share/vm/runtime/os.hpp b/hotspot/src/share/vm/runtime/os.hpp index e655d3e34b0..41408583200 100644 --- a/hotspot/src/share/vm/runtime/os.hpp +++ b/hotspot/src/share/vm/runtime/os.hpp @@ -607,6 +607,7 @@ class os: AllStatic { char fileSep, char pathSep); static bool set_boot_path(char fileSep, char pathSep); + static char** split_path(const char* path, int* n); }; // Note that "PAUSE" is almost always used with synchronization diff --git a/hotspot/test/runtime/6819213/TestBootNativeLibraryPath.java b/hotspot/test/runtime/6819213/TestBootNativeLibraryPath.java new file mode 100644 index 00000000000..dc49db66122 --- /dev/null +++ b/hotspot/test/runtime/6819213/TestBootNativeLibraryPath.java @@ -0,0 +1,133 @@ +/* + * Copyright 2008 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 TestBootNativeLibraryPath.java + * @bug 6819213 + * @compile -XDignore.symbol.file TestBootNativeLibraryPath.java + * @summary verify sun.boot.native.library.path is expandable on 32 bit systems + * @run main TestBootNativeLibraryPath + * @author ksrini +*/ + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.PrintStream; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.tools.JavaCompiler; +import javax.tools.ToolProvider; + +public class TestBootNativeLibraryPath { + + private static final String TESTFILE = "Test6"; + + static void createTestClass() throws IOException { + FileOutputStream fos = new FileOutputStream(TESTFILE + ".java"); + PrintStream ps = new PrintStream(fos); + ps.println("public class " + TESTFILE + "{"); + ps.println("public static void main(String[] args) {\n"); + ps.println("System.out.println(System.getProperty(\"sun.boot.library.path\"));\n"); + ps.println("}}\n"); + ps.close(); + fos.close(); + + JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); + String javacOpts[] = {TESTFILE + ".java"}; + if (javac.run(null, null, null, javacOpts) != 0) { + throw new RuntimeException("compilation of " + TESTFILE + ".java Failed"); + } + } + + static List doExec(String... args) { + String javaCmd = System.getProperty("java.home") + "/bin/java"; + if (!new File(javaCmd).exists()) { + javaCmd = System.getProperty("java.home") + "/bin/java.exe"; + } + + ArrayList cmds = new ArrayList(); + cmds.add(javaCmd); + for (String x : args) { + cmds.add(x); + } + System.out.println("cmds=" + cmds); + ProcessBuilder pb = new ProcessBuilder(cmds); + + Map env = pb.environment(); + pb.directory(new File(".")); + + List out = new ArrayList(); + try { + pb.redirectErrorStream(true); + Process p = pb.start(); + BufferedReader rd = new BufferedReader(new InputStreamReader(p.getInputStream()),8192); + String in = rd.readLine(); + while (in != null) { + out.add(in); + System.out.println(in); + in = rd.readLine(); + } + int retval = p.waitFor(); + p.destroy(); + if (retval != 0) { + throw new RuntimeException("Error: test returned non-zero value"); + } + return out; + } catch (Exception ex) { + ex.printStackTrace(); + throw new RuntimeException(ex.getMessage()); + } + } + + public static void main(String[] args) { + try { + if (!System.getProperty("sun.arch.data.model").equals("32")) { + System.out.println("Warning: test skipped for 64-bit systems\n"); + return; + } + String osname = System.getProperty("os.name"); + if (osname.startsWith("Windows")) { + osname = "Windows"; + } + + createTestClass(); + + // Test a simple path + String libpath = File.pathSeparator + "tmp" + File.pathSeparator + "foobar"; + List processOut = null; + String sunbootlibrarypath = "-Dsun.boot.library.path=" + libpath; + processOut = doExec(sunbootlibrarypath, "-cp", ".", TESTFILE); + if (processOut == null || !processOut.get(0).endsWith(libpath)) { + throw new RuntimeException("Error: did not get expected error string"); + } + } catch (IOException ex) { + throw new RuntimeException("Unexpected error " + ex); + } + } +} From 8ed0a99cb648cf35658e32449104ae86cdcb8c7b Mon Sep 17 00:00:00 2001 From: Kelly O'Hair Date: Wed, 1 Apr 2009 16:49:43 -0700 Subject: [PATCH 238/292] 6825175: Remove or disable sanity check on binary plugs Reviewed-by: xdono --- jdk/make/common/shared/Sanity.gmk | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/jdk/make/common/shared/Sanity.gmk b/jdk/make/common/shared/Sanity.gmk index 23e3818353b..180e52196a9 100644 --- a/jdk/make/common/shared/Sanity.gmk +++ b/jdk/make/common/shared/Sanity.gmk @@ -502,13 +502,15 @@ endif ###################################################### ifdef OPENJDK sane-binary-plugs: + ifeq ($(IMPORT_BINARY_PLUGS),true) @if [ ! -d "$(BINARY_PLUGS_PATH)" ]; then \ - $(ECHO) "ERROR: Can't locate pre-built libraries. \n" \ + $(ECHO) "WARNING: Can't locate pre-built libraries. \n" \ " Please check your access to \n" \ " $(BINARY_PLUGS_PATH) \n" \ " and/or check your value of ALT_BINARY_PLUGS_PATH. \n" \ - "" >> $(ERROR_FILE); \ + "" >> $(WARNING_FILE); \ fi + endif endif ###################################################### From d2cd2518151a822ef24af8c9cbb07aa10cf30a3a Mon Sep 17 00:00:00 2001 From: Alan Bateman Date: Thu, 2 Apr 2009 11:13:56 +0100 Subject: [PATCH 239/292] 6824135: (ch) test/java/nio/channels/AsyncCloseAndInterrupt.java fails (lnx) Reviewed-by: sherman --- .../classes/sun/nio/ch/FileChannelImpl.java | 42 ++++++++++++------- .../nio/channels/AsyncCloseAndInterrupt.java | 2 +- 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/jdk/src/share/classes/sun/nio/ch/FileChannelImpl.java b/jdk/src/share/classes/sun/nio/ch/FileChannelImpl.java index 1e622e1f4ae..1d60e9615ff 100644 --- a/jdk/src/share/classes/sun/nio/ch/FileChannelImpl.java +++ b/jdk/src/share/classes/sun/nio/ch/FileChannelImpl.java @@ -128,9 +128,10 @@ public class FileChannelImpl throw new NonReadableChannelException(); synchronized (positionLock) { int n = 0; - int ti = threads.add(); + int ti = -1; try { begin(); + ti = threads.add(); if (!isOpen()) return 0; do { @@ -151,9 +152,10 @@ public class FileChannelImpl throw new NonReadableChannelException(); synchronized (positionLock) { long n = 0; - int ti = threads.add(); + int ti = -1; try { begin(); + ti = threads.add(); if (!isOpen()) return 0; do { @@ -183,9 +185,10 @@ public class FileChannelImpl throw new NonWritableChannelException(); synchronized (positionLock) { int n = 0; - int ti = threads.add(); + int ti = -1; try { begin(); + ti = threads.add(); if (!isOpen()) return 0; do { @@ -206,9 +209,10 @@ public class FileChannelImpl throw new NonWritableChannelException(); synchronized (positionLock) { long n = 0; - int ti = threads.add(); + int ti = -1; try { begin(); + ti = threads.add(); if (!isOpen()) return 0; do { @@ -239,9 +243,10 @@ public class FileChannelImpl ensureOpen(); synchronized (positionLock) { long p = -1; - int ti = threads.add(); + int ti = -1; try { begin(); + ti = threads.add(); if (!isOpen()) return 0; do { @@ -262,9 +267,10 @@ public class FileChannelImpl throw new IllegalArgumentException(); synchronized (positionLock) { long p = -1; - int ti = threads.add(); + int ti = -1; try { begin(); + ti = threads.add(); if (!isOpen()) return null; do { @@ -283,9 +289,10 @@ public class FileChannelImpl ensureOpen(); synchronized (positionLock) { long s = -1; - int ti = threads.add(); + int ti = -1; try { begin(); + ti = threads.add(); if (!isOpen()) return -1; do { @@ -311,9 +318,10 @@ public class FileChannelImpl synchronized (positionLock) { int rv = -1; long p = -1; - int ti = threads.add(); + int ti = -1; try { begin(); + ti = threads.add(); if (!isOpen()) return null; @@ -350,9 +358,10 @@ public class FileChannelImpl public void force(boolean metaData) throws IOException { ensureOpen(); int rv = -1; - int ti = threads.add(); + int ti = -1; try { begin(); + ti = threads.add(); if (!isOpen()) return; do { @@ -406,9 +415,10 @@ public class FileChannelImpl return IOStatus.UNSUPPORTED; long n = -1; - int ti = threads.add(); + int ti = -1; try { begin(); + ti = threads.add(); if (!isOpen()) return -1; do { @@ -612,9 +622,10 @@ public class FileChannelImpl throw new NonReadableChannelException(); ensureOpen(); int n = 0; - int ti = threads.add(); + int ti = -1; try { begin(); + ti = threads.add(); if (!isOpen()) return -1; do { @@ -637,9 +648,10 @@ public class FileChannelImpl throw new NonWritableChannelException(); ensureOpen(); int n = 0; - int ti = threads.add(); + int ti = -1; try { begin(); + ti = threads.add(); if (!isOpen()) return -1; do { @@ -731,9 +743,10 @@ public class FileChannelImpl throw new NonReadableChannelException(); long addr = -1; - int ti = threads.add(); + int ti = -1; try { begin(); + ti = threads.add(); if (!isOpen()) return null; if (size() < position + size) { // Extend file size @@ -900,9 +913,10 @@ public class FileChannelImpl FileLockTable flt = fileLockTable(); flt.add(fli); boolean i = true; - int ti = threads.add(); + int ti = -1; try { begin(); + ti = threads.add(); if (!isOpen()) return null; int result = nd.lock(fd, true, position, size, shared); diff --git a/jdk/test/java/nio/channels/AsyncCloseAndInterrupt.java b/jdk/test/java/nio/channels/AsyncCloseAndInterrupt.java index 834e7431eb6..1755d0170dc 100644 --- a/jdk/test/java/nio/channels/AsyncCloseAndInterrupt.java +++ b/jdk/test/java/nio/channels/AsyncCloseAndInterrupt.java @@ -22,7 +22,7 @@ */ /* @test - * @bug 4460583 4470470 4840199 6419424 6710579 6596323 + * @bug 4460583 4470470 4840199 6419424 6710579 6596323 6824135 * @summary Comprehensive test of asynchronous closing and interruption * @author Mark Reinhold */ From 15bf5db9c7ee5f48ba5b5c35af24f51cba23b92c Mon Sep 17 00:00:00 2001 From: Alan Bateman Date: Thu, 2 Apr 2009 11:19:34 +0100 Subject: [PATCH 240/292] 6666739: (ref) ReferenceQueue.poll() doesn't scale well 6711667: (ref) Update SoftReference timestamp only if clock advances Forward port from 6u14; originally fixed by Tom Rodriguez in earlier update Reviewed-by: martin --- jdk/src/share/classes/java/lang/ref/ReferenceQueue.java | 4 +++- jdk/src/share/classes/java/lang/ref/SoftReference.java | 9 ++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/jdk/src/share/classes/java/lang/ref/ReferenceQueue.java b/jdk/src/share/classes/java/lang/ref/ReferenceQueue.java index 872ee14f8e2..9882844e5a8 100644 --- a/jdk/src/share/classes/java/lang/ref/ReferenceQueue.java +++ b/jdk/src/share/classes/java/lang/ref/ReferenceQueue.java @@ -51,7 +51,7 @@ public class ReferenceQueue { static private class Lock { }; private Lock lock = new Lock(); - private Reference head = null; + private volatile Reference head = null; private long queueLength = 0; boolean enqueue(Reference r) { /* Called only by Reference class */ @@ -95,6 +95,8 @@ public class ReferenceQueue { * otherwise null */ public Reference poll() { + if (head == null) + return null; synchronized (lock) { return reallyPoll(); } diff --git a/jdk/src/share/classes/java/lang/ref/SoftReference.java b/jdk/src/share/classes/java/lang/ref/SoftReference.java index 35c6710d18e..4a6428efaf4 100644 --- a/jdk/src/share/classes/java/lang/ref/SoftReference.java +++ b/jdk/src/share/classes/java/lang/ref/SoftReference.java @@ -63,11 +63,13 @@ package java.lang.ref; public class SoftReference extends Reference { - /* Timestamp clock, updated by the garbage collector + /** + * Timestamp clock, updated by the garbage collector */ static private long clock; - /* Timestamp updated by each invocation of the get method. The VM may use + /** + * Timestamp updated by each invocation of the get method. The VM may use * this field when selecting soft references to be cleared, but it is not * required to do so. */ @@ -108,7 +110,8 @@ public class SoftReference extends Reference { */ public T get() { T o = super.get(); - if (o != null) this.timestamp = clock; + if (o != null && this.timestamp != clock) + this.timestamp = clock; return o; } From f83fd900a959b77329bf08652252d4670a89000e Mon Sep 17 00:00:00 2001 From: Alan Bateman Date: Thu, 2 Apr 2009 16:31:44 +0100 Subject: [PATCH 241/292] 6824141: test/java/rmi/activation/rmidViaInheritedChannel tests fail Reviewed-by: peterjones --- .../InheritedChannelNotServerSocket.java | 9 ++++++++- .../rmidViaInheritedChannel/RmidViaInheritedChannel.java | 9 ++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/jdk/test/java/rmi/activation/rmidViaInheritedChannel/InheritedChannelNotServerSocket.java b/jdk/test/java/rmi/activation/rmidViaInheritedChannel/InheritedChannelNotServerSocket.java index 301c6a66f4c..0faa5ed7ea6 100644 --- a/jdk/test/java/rmi/activation/rmidViaInheritedChannel/InheritedChannelNotServerSocket.java +++ b/jdk/test/java/rmi/activation/rmidViaInheritedChannel/InheritedChannelNotServerSocket.java @@ -22,7 +22,7 @@ */ /* @test - * @bug 6261402 + * @bug 6261402 6824141 * @summary If rmid has an inherited channel that is not a server * socket (such as it if was started using rsh/rcmd), then it should * function normally. @@ -37,6 +37,7 @@ import java.io.IOException; import java.net.Socket; +import java.net.ProtocolFamily; import java.nio.channels.Channel; import java.nio.channels.DatagramChannel; import java.nio.channels.Pipe; @@ -137,6 +138,12 @@ public class InheritedChannelNotServerSocket { return provider.openDatagramChannel(); } + public DatagramChannel openDatagramChannel(ProtocolFamily family) + throws IOException + { + return provider.openDatagramChannel(family); + } + public Pipe openPipe() throws IOException { return provider.openPipe(); } diff --git a/jdk/test/java/rmi/activation/rmidViaInheritedChannel/RmidViaInheritedChannel.java b/jdk/test/java/rmi/activation/rmidViaInheritedChannel/RmidViaInheritedChannel.java index c37dd6250c5..79265dd8e4a 100644 --- a/jdk/test/java/rmi/activation/rmidViaInheritedChannel/RmidViaInheritedChannel.java +++ b/jdk/test/java/rmi/activation/rmidViaInheritedChannel/RmidViaInheritedChannel.java @@ -22,7 +22,7 @@ */ /* @test - * @bug 4295885 + * @bug 4295885 6824141 * @summary rmid should be startable from inetd * @author Ann Wollrath * @@ -36,6 +36,7 @@ import java.io.IOException; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.ServerSocket; +import java.net.ProtocolFamily; import java.nio.channels.*; import java.nio.channels.spi.*; import java.rmi.Remote; @@ -126,6 +127,12 @@ public class RmidViaInheritedChannel implements Callback { return provider.openDatagramChannel(); } + public DatagramChannel openDatagramChannel(ProtocolFamily family) + throws IOException + { + return provider.openDatagramChannel(family); + } + public Pipe openPipe() throws IOException { From 1f5324fed4147a7b6834c746bbdc87a92db89cc4 Mon Sep 17 00:00:00 2001 From: Karen Kinnear Date: Thu, 2 Apr 2009 14:26:42 -0400 Subject: [PATCH 242/292] 6825642: nsk sajdi tests fail with NullPointerException Reviewed-by: xlu, coleenp, kamg, swamyv --- .../share/classes/sun/jvm/hotspot/HotSpotTypeDataBase.java | 2 ++ .../agent/src/share/classes/sun/jvm/hotspot/runtime/VM.java | 6 +++--- hotspot/src/share/vm/runtime/vmStructs.cpp | 1 - 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/HotSpotTypeDataBase.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/HotSpotTypeDataBase.java index 82f5ac44d0b..5e56a0e3f36 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/HotSpotTypeDataBase.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/HotSpotTypeDataBase.java @@ -306,6 +306,8 @@ public class HotSpotTypeDataBase extends BasicTypeDataBase { entryAddr = entryAddr.addOffsetTo(intConstantEntryArrayStride); } while (nameAddr != null); + String symbol = "heapOopSize"; // global int constant and value is initialized at runtime. + addIntConstant(symbol, (int)lookupInProcess(symbol).getCIntegerAt(0, 4, false)); } private void readVMLongConstants() { diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/VM.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/VM.java index b215abcd5a5..44fb1a817ea 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/VM.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/VM.java @@ -343,13 +343,13 @@ public class VM { } soleInstance = new VM(db, debugger, debugger.getMachineDescription().isBigEndian()); + debugger.putHeapConst(soleInstance.getHeapOopSize(), Universe.getNarrowOopBase(), + Universe.getNarrowOopShift()); + for (Iterator iter = vmInitializedObservers.iterator(); iter.hasNext(); ) { ((Observer) iter.next()).update(null, null); } - debugger.putHeapConst(soleInstance.getHeapOopSize(), Universe.getNarrowOopBase(), - Universe.getNarrowOopShift()); - } /** This is used by the debugging system */ diff --git a/hotspot/src/share/vm/runtime/vmStructs.cpp b/hotspot/src/share/vm/runtime/vmStructs.cpp index 7a688dbb33f..2de7bbdf56f 100644 --- a/hotspot/src/share/vm/runtime/vmStructs.cpp +++ b/hotspot/src/share/vm/runtime/vmStructs.cpp @@ -1320,7 +1320,6 @@ static inline uint64_t cast_uint64_t(size_t x) /****************/ \ \ declare_constant(oopSize) \ - declare_constant(heapOopSize) \ declare_constant(LogBytesPerWord) \ declare_constant(BytesPerLong) \ \ From 78e97626561318e4714b222f1807c99eff353768 Mon Sep 17 00:00:00 2001 From: Alan Bateman Date: Thu, 2 Apr 2009 19:47:24 +0100 Subject: [PATCH 243/292] 6824477: (se) Selector.select fails with IOException: "Invalid argument" if maximum file descriptors is low Reviewed-by: sherman --- .../sun/nio/ch/DevPollArrayWrapper.java | 105 ++++++------------ .../nio/channels/Selector/LotsOfUpdates.java | 38 +++++++ .../nio/channels/Selector/lots_of_updates.sh | 49 ++++++++ 3 files changed, 122 insertions(+), 70 deletions(-) create mode 100644 jdk/test/java/nio/channels/Selector/LotsOfUpdates.java create mode 100644 jdk/test/java/nio/channels/Selector/lots_of_updates.sh diff --git a/jdk/src/solaris/classes/sun/nio/ch/DevPollArrayWrapper.java b/jdk/src/solaris/classes/sun/nio/ch/DevPollArrayWrapper.java index f569c2dbe09..53693383eed 100644 --- a/jdk/src/solaris/classes/sun/nio/ch/DevPollArrayWrapper.java +++ b/jdk/src/solaris/classes/sun/nio/ch/DevPollArrayWrapper.java @@ -76,20 +76,19 @@ class DevPollArrayWrapper { // Base address of the native pollArray private long pollArrayAddress; + // Array of pollfd structs used for driver updates + private AllocatedNativeObject updatePollArray; + // Maximum number of POLL_FD structs to update at once - private int MAX_UPDATE_SIZE = 10000; + private int MAX_UPDATE_SIZE = Math.min(OPEN_MAX, 10000); DevPollArrayWrapper() { int allocationSize = NUM_POLLFDS * SIZE_POLLFD; pollArray = new AllocatedNativeObject(allocationSize, true); pollArrayAddress = pollArray.address(); + allocationSize = MAX_UPDATE_SIZE * SIZE_POLLFD; + updatePollArray = new AllocatedNativeObject(allocationSize, true); wfd = init(); - - for (int i=0; i 0) { - // Construct a pollfd array with updated masks; we may overallocate - // by some amount because if the events are already POLLREMOVE - // then the second pollfd of that pair will not be needed. The - // number of entries is limited to a reasonable number to avoid - // allocating a lot of memory. - int maxUpdates = Math.min(updateSize * 2, MAX_UPDATE_SIZE); - int allocationSize = maxUpdates * SIZE_POLLFD; - AllocatedNativeObject updatePollArray = - new AllocatedNativeObject(allocationSize, true); + while (updateList.size() > 0) { + // We have to insert a dummy node in between each + // real update to use POLLREMOVE on the fd first because + // otherwise the changes are simply OR'd together + int index = 0; + Updator u = null; + while ((u = updateList.poll()) != null) { + // First add pollfd struct to clear out this fd + putPollFD(updatePollArray, index, u.fd, POLLREMOVE); + index++; + // Now add pollfd to update this fd, if necessary + if (u.mask != POLLREMOVE) { + putPollFD(updatePollArray, index, u.fd, (short)u.mask); + index++; + } - try { - synchronized (updateList) { - while (updateList.size() > 0) { - // We have to insert a dummy node in between each - // real update to use POLLREMOVE on the fd first because - // otherwise the changes are simply OR'd together - int index = 0; - Updator u = null; - while ((u = updateList.poll()) != null) { - // First add pollfd struct to clear out this fd - putPollFD(updatePollArray, index, u.fd, POLLREMOVE); - index++; - // Now add pollfd to update this fd, if necessary - if (u.mask != POLLREMOVE) { - putPollFD(updatePollArray, index, u.fd, - (short)u.mask); - index++; - } - - // Check against the max allocation size; these are - // all we will process. Valid index ranges from 0 to - // (maxUpdates - 1) and we can use up to 2 per loop - if (index > maxUpdates - 2) - break; - } - // Register the changes with /dev/poll - registerMultiple(wfd, updatePollArray.address(), index); - } + // Check against the max update size; these are + // all we will process. Valid index ranges from 0 to + // (MAX_UPDATE_SIZE - 1) and we can use up to 2 per loop + if (index > MAX_UPDATE_SIZE - 2) + break; } - } finally { - // Free the native array - updatePollArray.free(); - // BUG: If an exception was thrown then the selector now believes - // that the last set of changes was updated but it probably - // was not. This should not be a likely occurrence. - } + // Register the changes with /dev/poll + registerMultiple(wfd, updatePollArray.address(), index); + } } } @@ -275,7 +239,8 @@ class DevPollArrayWrapper { private native int init(); private native void register(int wfd, int fd, int mask); - private native void registerMultiple(int wfd, long address, int len); + private native void registerMultiple(int wfd, long address, int len) + throws IOException; private native int poll0(long pollAddress, int numfds, long timeout, int wfd); private static native void interrupt(int fd); diff --git a/jdk/test/java/nio/channels/Selector/LotsOfUpdates.java b/jdk/test/java/nio/channels/Selector/LotsOfUpdates.java new file mode 100644 index 00000000000..71018fa8d32 --- /dev/null +++ b/jdk/test/java/nio/channels/Selector/LotsOfUpdates.java @@ -0,0 +1,38 @@ +/* + * Copyright 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. + */ + +import java.nio.channels.*; +import java.io.IOException; + +public class LotsOfUpdates { + public static void main(String[] args) throws IOException { + Selector sel = Selector.open(); + SocketChannel sc = SocketChannel.open(); + sc.configureBlocking(false); + SelectionKey key = sc.register(sel, 0); + for (int i=0; i<50000; i++) { + key.interestOps(0); + } + sel.selectNow(); + } +} diff --git a/jdk/test/java/nio/channels/Selector/lots_of_updates.sh b/jdk/test/java/nio/channels/Selector/lots_of_updates.sh new file mode 100644 index 00000000000..5054f18cc32 --- /dev/null +++ b/jdk/test/java/nio/channels/Selector/lots_of_updates.sh @@ -0,0 +1,49 @@ +# +# Copyright 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 6824477 +# @summary Selector.select can fail with IOException "Invalid argument" on +# Solaris if maximum number of file descriptors is less than 10000 +# @build LotsOfUpdates +# @run shell lots_of_updates.sh + +OS=`uname -s` +case "$OS" in + Windows_* ) + echo "ulimit not on Windows" + exit 0 + ;; + * ) + CLASSPATH=${TESTCLASSES}:${TESTSRC} + ;; +esac +export CLASSPATH + +# hard limit needs to be less than 10000 for this bug +NOFILES=`ulimit -n -H` +if [ "$NOFILES" = "unlimited" ] || [ $NOFILES -ge 10000 ]; then + ulimit -n 2048 +fi + +${TESTJAVA}/bin/java LotsOfUpdates From 208dfa22cd051963f5b9feda33d74da3eeed189d Mon Sep 17 00:00:00 2001 From: Kelly O'Hair Date: Thu, 2 Apr 2009 15:04:33 -0700 Subject: [PATCH 244/292] 6825765: Further adjustments to regression tests run by jprt Reviewed-by: tbell --- jdk/test/java/lang/reflect/Method/InheritedMethods.java | 1 + 1 file changed, 1 insertion(+) diff --git a/jdk/test/java/lang/reflect/Method/InheritedMethods.java b/jdk/test/java/lang/reflect/Method/InheritedMethods.java index 943767fb85f..7b54f7b1edc 100644 --- a/jdk/test/java/lang/reflect/Method/InheritedMethods.java +++ b/jdk/test/java/lang/reflect/Method/InheritedMethods.java @@ -23,6 +23,7 @@ /* @test @bug 4471738 + @ignore until 6825739 fixed @summary Failure to properly traverse class hierarchy in Class.getMethod() */ From 21aa30606a26191e0418ab9fdfd04d9ecfe155a0 Mon Sep 17 00:00:00 2001 From: Xueming Shen Date: Thu, 2 Apr 2009 15:35:46 -0700 Subject: [PATCH 245/292] 4681995: Add support for large (> 4GB) zip/jar files The ZIP64 format support is added for > 4GB jar/zip files Reviewed-by: alanb, martin --- .../classes/java/util/zip/ZipConstants64.java | 77 +++++++ .../share/classes/java/util/zip/ZipEntry.java | 8 +- .../classes/java/util/zip/ZipInputStream.java | 76 +++++-- .../java/util/zip/ZipOutputStream.java | 174 +++++++++++++--- .../share/classes/java/util/zip/package.html | 8 +- jdk/src/share/native/java/util/zip/zip_util.c | 104 +++++++++- jdk/src/share/native/java/util/zip/zip_util.h | 38 +++- .../native/java/util/zip/zlib-1.1.3/zlib.h | 4 +- jdk/test/java/util/zip/LargeZip.java | 193 ++++++++++++++++++ .../java/util/zip/ZipFile/LargeZipFile.java | 1 - 10 files changed, 629 insertions(+), 54 deletions(-) create mode 100644 jdk/src/share/classes/java/util/zip/ZipConstants64.java create mode 100644 jdk/test/java/util/zip/LargeZip.java diff --git a/jdk/src/share/classes/java/util/zip/ZipConstants64.java b/jdk/src/share/classes/java/util/zip/ZipConstants64.java new file mode 100644 index 00000000000..1bf3b1841b4 --- /dev/null +++ b/jdk/src/share/classes/java/util/zip/ZipConstants64.java @@ -0,0 +1,77 @@ +/* + * Copyright 1995-1996 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. + */ + +package java.util.zip; + +/* + * This class defines the constants that are used by the classes + * which manipulate Zip64 files. + */ + +class ZipConstants64 { + + /* + * ZIP64 constants + */ + static final long ZIP64_ENDSIG = 0x06064b50L; // "PK\006\006" + static final long ZIP64_LOCSIG = 0x07064b50L; // "PK\006\007" + static final int ZIP64_ENDHDR = 56; // ZIP64 end header size + static final int ZIP64_LOCHDR = 20; // ZIP64 end loc header size + static final int ZIP64_EXTHDR = 24; // EXT header size + static final int ZIP64_EXTID = 0x0001; // Extra field Zip64 header ID + + static final int ZIP64_MAGICCOUNT = 0xFFFF; + static final long ZIP64_MAGICVAL = 0xFFFFFFFFL; + + /* + * Zip64 End of central directory (END) header field offsets + */ + static final int ZIP64_ENDLEN = 4; // size of zip64 end of central dir + static final int ZIP64_ENDVEM = 12; // version made by + static final int ZIP64_ENDVER = 14; // version needed to extract + static final int ZIP64_ENDNMD = 16; // number of this disk + static final int ZIP64_ENDDSK = 20; // disk number of start + static final int ZIP64_ENDTOD = 24; // total number of entries on this disk + static final int ZIP64_ENDTOT = 32; // total number of entries + static final int ZIP64_ENDSIZ = 40; // central directory size in bytes + static final int ZIP64_ENDOFF = 48; // offset of first CEN header + static final int ZIP64_ENDEXT = 56; // zip64 extensible data sector + + /* + * Zip64 End of central directory locator field offsets + */ + static final int ZIP64_LOCDSK = 4; // disk number start + static final int ZIP64_LOCOFF = 8; // offset of zip64 end + static final int ZIP64_LOCTOT = 16; // total number of disks + + /* + * Zip64 Extra local (EXT) header field offsets + */ + static final int ZIP64_EXTCRC = 4; // uncompressed file crc-32 value + static final int ZIP64_EXTSIZ = 8; // compressed size, 8-byte + static final int ZIP64_EXTLEN = 16; // uncompressed size, 8-byte + + private ZipConstants64() {} +} diff --git a/jdk/src/share/classes/java/util/zip/ZipEntry.java b/jdk/src/share/classes/java/util/zip/ZipEntry.java index bcc27e63a0f..6c16a9adb15 100644 --- a/jdk/src/share/classes/java/util/zip/ZipEntry.java +++ b/jdk/src/share/classes/java/util/zip/ZipEntry.java @@ -1,5 +1,5 @@ /* - * Copyright 1995-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1995-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 @@ -144,11 +144,13 @@ class ZipEntry implements ZipConstants, Cloneable { * Sets the uncompressed size of the entry data. * @param size the uncompressed size in bytes * @exception IllegalArgumentException if the specified size is less - * than 0 or greater than 0xFFFFFFFF bytes + * than 0, is greater than 0xFFFFFFFF when + * ZIP64 format is not supported, + * or is less than 0 when ZIP64 is supported * @see #getSize() */ public void setSize(long size) { - if (size < 0 || size > 0xFFFFFFFFL) { + if (size < 0) { throw new IllegalArgumentException("invalid entry size"); } this.size = size; diff --git a/jdk/src/share/classes/java/util/zip/ZipInputStream.java b/jdk/src/share/classes/java/util/zip/ZipInputStream.java index e8f0ebdc5d9..1b9b93415cb 100644 --- a/jdk/src/share/classes/java/util/zip/ZipInputStream.java +++ b/jdk/src/share/classes/java/util/zip/ZipInputStream.java @@ -1,5 +1,5 @@ /* - * Copyright 1996-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -29,6 +29,7 @@ import java.io.InputStream; import java.io.IOException; import java.io.EOFException; import java.io.PushbackInputStream; +import static java.util.zip.ZipConstants64.*; /** * This class implements an input stream filter for reading files in the @@ -285,6 +286,29 @@ class ZipInputStream extends InflaterInputStream implements ZipConstants { byte[] bb = new byte[len]; readFully(bb, 0, len); e.setExtra(bb); + // extra fields are in "HeaderID(2)DataSize(2)Data... format + if (e.csize == ZIP64_MAGICVAL || e.size == ZIP64_MAGICVAL) { + int off = 0; + while (off + 4 < len) { + int sz = get16(bb, off + 2); + if (get16(bb, off) == ZIP64_EXTID) { + off += 4; + // LOC extra zip64 entry MUST include BOTH original and + // compressed file size fields + if (sz < 16 || (off + sz) > len ) { + // Invalid zip64 extra fields, simply skip. Even it's + // rare, it's possible the entry size happens to be + // the magic value and it "accidnetly" has some bytes + // in extra match the id. + return e; + } + e.size = get64(bb, off); + e.csize = get64(bb, off + 8); + break; + } + off += (sz + 4); + } + } } return e; } @@ -375,18 +399,36 @@ class ZipInputStream extends InflaterInputStream implements ZipConstants { } if ((flag & 8) == 8) { /* "Data Descriptor" present */ - readFully(tmpbuf, 0, EXTHDR); - long sig = get32(tmpbuf, 0); - if (sig != EXTSIG) { // no EXTSIG present - e.crc = sig; - e.csize = get32(tmpbuf, EXTSIZ - EXTCRC); - e.size = get32(tmpbuf, EXTLEN - EXTCRC); - ((PushbackInputStream)in).unread( - tmpbuf, EXTHDR - EXTCRC - 1, EXTCRC); + if (inf.getBytesWritten() > ZIP64_MAGICVAL || + inf.getBytesRead() > ZIP64_MAGICVAL) { + // ZIP64 format + readFully(tmpbuf, 0, ZIP64_EXTHDR); + long sig = get32(tmpbuf, 0); + if (sig != EXTSIG) { // no EXTSIG present + e.crc = sig; + e.csize = get64(tmpbuf, ZIP64_EXTSIZ - ZIP64_EXTCRC); + e.size = get64(tmpbuf, ZIP64_EXTLEN - ZIP64_EXTCRC); + ((PushbackInputStream)in).unread( + tmpbuf, ZIP64_EXTHDR - ZIP64_EXTCRC - 1, ZIP64_EXTCRC); + } else { + e.crc = get32(tmpbuf, ZIP64_EXTCRC); + e.csize = get64(tmpbuf, ZIP64_EXTSIZ); + e.size = get64(tmpbuf, ZIP64_EXTLEN); + } } else { - e.crc = get32(tmpbuf, EXTCRC); - e.csize = get32(tmpbuf, EXTSIZ); - e.size = get32(tmpbuf, EXTLEN); + readFully(tmpbuf, 0, EXTHDR); + long sig = get32(tmpbuf, 0); + if (sig != EXTSIG) { // no EXTSIG present + e.crc = sig; + e.csize = get32(tmpbuf, EXTSIZ - EXTCRC); + e.size = get32(tmpbuf, EXTLEN - EXTCRC); + ((PushbackInputStream)in).unread( + tmpbuf, EXTHDR - EXTCRC - 1, EXTCRC); + } else { + e.crc = get32(tmpbuf, EXTCRC); + e.csize = get32(tmpbuf, EXTSIZ); + e.size = get32(tmpbuf, EXTLEN); + } } } if (e.size != inf.getBytesWritten()) { @@ -433,6 +475,14 @@ class ZipInputStream extends InflaterInputStream implements ZipConstants { * The bytes are assumed to be in Intel (little-endian) byte order. */ private static final long get32(byte b[], int off) { - return get16(b, off) | ((long)get16(b, off+2) << 16); + return (get16(b, off) | ((long)get16(b, off+2) << 16)) & 0xffffffffL; + } + + /* + * Fetches signed 64-bit value from byte array at specified offset. + * The bytes are assumed to be in Intel (little-endian) byte order. + */ + private static final long get64(byte b[], int off) { + return get32(b, off) | (get32(b, off+4) << 32); } } diff --git a/jdk/src/share/classes/java/util/zip/ZipOutputStream.java b/jdk/src/share/classes/java/util/zip/ZipOutputStream.java index 797a37392fe..bd44d3213cf 100644 --- a/jdk/src/share/classes/java/util/zip/ZipOutputStream.java +++ b/jdk/src/share/classes/java/util/zip/ZipOutputStream.java @@ -1,5 +1,5 @@ /* - * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -29,6 +29,7 @@ import java.io.OutputStream; import java.io.IOException; import java.util.Vector; import java.util.HashSet; +import static java.util.zip.ZipConstants64.*; /** * This class implements an output stream filter for writing files in the @@ -343,26 +344,52 @@ class ZipOutputStream extends DeflaterOutputStream implements ZipConstants { private void writeLOC(XEntry xentry) throws IOException { ZipEntry e = xentry.entry; int flag = xentry.flag; + int elen = (e.extra != null) ? e.extra.length : 0; + boolean hasZip64 = false; + writeInt(LOCSIG); // LOC header signature - writeShort(version(e)); // version needed to extract - writeShort(flag); // general purpose bit flag - writeShort(e.method); // compression method - writeInt(e.time); // last modification time + if ((flag & 8) == 8) { + writeShort(version(e)); // version needed to extract + writeShort(flag); // general purpose bit flag + writeShort(e.method); // compression method + writeInt(e.time); // last modification time + // store size, uncompressed size, and crc-32 in data descriptor // immediately following compressed entry data writeInt(0); writeInt(0); writeInt(0); } else { - writeInt(e.crc); // crc-32 - writeInt(e.csize); // compressed size - writeInt(e.size); // uncompressed size + if (e.csize >= ZIP64_MAGICVAL || e.size >= ZIP64_MAGICVAL) { + hasZip64 = true; + writeShort(45); // ver 4.5 for zip64 + } else { + writeShort(version(e)); // version needed to extract + } + writeShort(flag); // general purpose bit flag + writeShort(e.method); // compression method + writeInt(e.time); // last modification time + writeInt(e.crc); // crc-32 + if (hasZip64) { + writeInt(ZIP64_MAGICVAL); + writeInt(ZIP64_MAGICVAL); + elen += 20; //headid(2) + size(2) + size(8) + csize(8) + } else { + writeInt(e.csize); // compressed size + writeInt(e.size); // uncompressed size + } } byte[] nameBytes = getUTF8Bytes(e.name); writeShort(nameBytes.length); - writeShort(e.extra != null ? e.extra.length : 0); + writeShort(elen); writeBytes(nameBytes, 0, nameBytes.length); + if (hasZip64) { + writeShort(ZIP64_EXTID); + writeShort(16); + writeLong(e.size); + writeLong(e.csize); + } if (e.extra != null) { writeBytes(e.extra, 0, e.extra.length); } @@ -375,8 +402,13 @@ class ZipOutputStream extends DeflaterOutputStream implements ZipConstants { private void writeEXT(ZipEntry e) throws IOException { writeInt(EXTSIG); // EXT header signature writeInt(e.crc); // crc-32 - writeInt(e.csize); // compressed size - writeInt(e.size); // uncompressed size + if (e.csize >= ZIP64_MAGICVAL || e.size >= ZIP64_MAGICVAL) { + writeLong(e.csize); + writeLong(e.size); + } else { + writeInt(e.csize); // compressed size + writeInt(e.size); // uncompressed size + } } /* @@ -387,18 +419,49 @@ class ZipOutputStream extends DeflaterOutputStream implements ZipConstants { ZipEntry e = xentry.entry; int flag = xentry.flag; int version = version(e); + + long csize = e.csize; + long size = e.size; + long offset = xentry.offset; + int e64len = 0; + boolean hasZip64 = false; + if (e.csize >= ZIP64_MAGICVAL) { + csize = ZIP64_MAGICVAL; + e64len += 8; // csize(8) + hasZip64 = true; + } + if (e.size >= ZIP64_MAGICVAL) { + size = ZIP64_MAGICVAL; // size(8) + e64len += 8; + hasZip64 = true; + } + if (xentry.offset >= ZIP64_MAGICVAL) { + offset = ZIP64_MAGICVAL; + e64len += 8; // offset(8) + hasZip64 = true; + } writeInt(CENSIG); // CEN header signature - writeShort(version); // version made by - writeShort(version); // version needed to extract + if (hasZip64) { + writeShort(45); // ver 4.5 for zip64 + writeShort(45); + } else { + writeShort(version); // version made by + writeShort(version); // version needed to extract + } writeShort(flag); // general purpose bit flag writeShort(e.method); // compression method writeInt(e.time); // last modification time writeInt(e.crc); // crc-32 - writeInt(e.csize); // compressed size - writeInt(e.size); // uncompressed size + writeInt(csize); // compressed size + writeInt(size); // uncompressed size byte[] nameBytes = getUTF8Bytes(e.name); writeShort(nameBytes.length); - writeShort(e.extra != null ? e.extra.length : 0); + if (hasZip64) { + // + headid(2) + datasize(2) + writeShort(e64len + 4 + (e.extra != null ? e.extra.length : 0)); + } else { + writeShort(e.extra != null ? e.extra.length : 0); + } byte[] commentBytes; if (e.comment != null) { commentBytes = getUTF8Bytes(e.comment); @@ -410,8 +473,18 @@ class ZipOutputStream extends DeflaterOutputStream implements ZipConstants { writeShort(0); // starting disk number writeShort(0); // internal file attributes (unused) writeInt(0); // external file attributes (unused) - writeInt(xentry.offset); // relative offset of local header + writeInt(offset); // relative offset of local header writeBytes(nameBytes, 0, nameBytes.length); + if (hasZip64) { + writeShort(ZIP64_EXTID);// Zip64 extra + writeShort(e64len); + if (size == ZIP64_MAGICVAL) + writeLong(e.size); + if (csize == ZIP64_MAGICVAL) + writeLong(e.csize); + if (offset == ZIP64_MAGICVAL) + writeLong(xentry.offset); + } if (e.extra != null) { writeBytes(e.extra, 0, e.extra.length); } @@ -424,15 +497,50 @@ class ZipOutputStream extends DeflaterOutputStream implements ZipConstants { * Writes end of central directory (END) header. */ private void writeEND(long off, long len) throws IOException { + boolean hasZip64 = false; + long xlen = len; + long xoff = off; + if (xlen >= ZIP64_MAGICVAL) { + xlen = ZIP64_MAGICVAL; + hasZip64 = true; + } + if (xoff >= ZIP64_MAGICVAL) { + xoff = ZIP64_MAGICVAL; + hasZip64 = true; + } int count = xentries.size(); - writeInt(ENDSIG); // END record signature - writeShort(0); // number of this disk - writeShort(0); // central directory start disk - writeShort(count); // number of directory entries on disk - writeShort(count); // total number of directory entries - writeInt(len); // length of central directory - writeInt(off); // offset of central directory - if (comment != null) { // zip file comment + if (count >= ZIP64_MAGICCOUNT) { + count = ZIP64_MAGICCOUNT; + hasZip64 = true; + } + if (hasZip64) { + long off64 = written; + //zip64 end of central directory record + writeInt(ZIP64_ENDSIG); // zip64 END record signature + writeLong(ZIP64_ENDHDR - 12); // size of zip64 end + writeShort(45); // version made by + writeShort(45); // version needed to extract + writeInt(0); // number of this disk + writeInt(0); // central directory start disk + writeLong(xentries.size()); // number of directory entires on disk + writeLong(xentries.size()); // number of directory entires + writeLong(len); // length of central directory + writeLong(off); // offset of central directory + + //zip64 end of central directory locator + writeInt(ZIP64_LOCSIG); // zip64 END locator signature + writeInt(0); // zip64 END start disk + writeLong(off64); // offset of zip64 END + writeInt(1); // total number of disks (?) + } + writeInt(ENDSIG); // END record signature + writeShort(0); // number of this disk + writeShort(0); // central directory start disk + writeShort(count); // number of directory entries on disk + writeShort(count); // total number of directory entries + writeInt(xlen); // length of central directory + writeInt(xoff); // offset of central directory + if (comment != null) { // zip file comment byte[] b = getUTF8Bytes(comment); writeShort(b.length); writeBytes(b, 0, b.length); @@ -463,6 +571,22 @@ class ZipOutputStream extends DeflaterOutputStream implements ZipConstants { written += 4; } + /* + * Writes a 64-bit int to the output stream in little-endian byte order. + */ + private void writeLong(long v) throws IOException { + OutputStream out = this.out; + out.write((int)((v >>> 0) & 0xff)); + out.write((int)((v >>> 8) & 0xff)); + out.write((int)((v >>> 16) & 0xff)); + out.write((int)((v >>> 24) & 0xff)); + out.write((int)((v >>> 32) & 0xff)); + out.write((int)((v >>> 40) & 0xff)); + out.write((int)((v >>> 48) & 0xff)); + out.write((int)((v >>> 56) & 0xff)); + written += 8; + } + /* * Writes an array of bytes to the output stream. */ diff --git a/jdk/src/share/classes/java/util/zip/package.html b/jdk/src/share/classes/java/util/zip/package.html index d32e0fa0f4a..d4b59263678 100644 --- a/jdk/src/share/classes/java/util/zip/package.html +++ b/jdk/src/share/classes/java/util/zip/package.html @@ -45,6 +45,13 @@ input streams. Info-ZIP Application Note 970311 - a detailed description of the Info-ZIP format upon which the java.util.zip classes are based. +

      + +

    • An implementation may optionally support the ZIP64(tm) format extensions + defined by the + + PKWARE ZIP File Format Specification. The ZIP64(tm) format extensions + are used to overcome the size limitations of the original ZIP format.

    • ZLIB Compressed Data Format Specification version 3.3 @@ -70,7 +77,6 @@ input streams.
    • CRC-32 checksum is described in RFC 1952 (above)

    • Adler-32 checksum is described in RFC 1950 (above) - diff --git a/jdk/src/share/native/java/util/zip/zip_util.c b/jdk/src/share/native/java/util/zip/zip_util.c index f381629712c..89f52ae3bcc 100644 --- a/jdk/src/share/native/java/util/zip/zip_util.c +++ b/jdk/src/share/native/java/util/zip/zip_util.c @@ -312,6 +312,38 @@ findEND(jzfile *zip, void *endbuf) return -1; /* END header not found */ } +/* + * Searches for the ZIP64 end of central directory (END) header. The + * contents of the ZIP64 END header will be read and placed in end64buf. + * Returns the file position of the ZIP64 END header, otherwise returns + * -1 if the END header was not found or an error occurred. + * + * The ZIP format specifies the "position" of each related record as + * ... + * [central directory] + * [zip64 end of central directory record] + * [zip64 end of central directory locator] + * [end of central directory record] + * + * The offset of zip64 end locator can be calculated from endpos as + * "endpos - ZIP64_LOCHDR". + * The "offset" of zip64 end record is stored in zip64 end locator. + */ +static jlong +findEND64(jzfile *zip, void *end64buf, jlong endpos) +{ + char loc64[ZIP64_LOCHDR]; + jlong end64pos; + if (readFullyAt(zip->zfd, loc64, ZIP64_LOCHDR, endpos - ZIP64_LOCHDR) == -1) { + return -1; // end64 locator not found + } + end64pos = ZIP64_LOCOFF(loc64); + if (readFullyAt(zip->zfd, end64buf, ZIP64_ENDHDR, end64pos) == -1) { + return -1; // end64 record not found + } + return end64pos; +} + /* * Returns a hash code value for a C-style NUL-terminated string. */ @@ -463,7 +495,7 @@ static jlong readCEN(jzfile *zip, jint knownTotal) { /* Following are unsigned 32-bit */ - jlong endpos, cenpos, cenlen; + jlong endpos, end64pos, cenpos, cenlen, cenoff; /* Following are unsigned 16-bit */ jint total, tablelen, i, j; unsigned char *cenbuf = NULL; @@ -474,6 +506,7 @@ readCEN(jzfile *zip, jint knownTotal) jlong offset; #endif unsigned char endbuf[ENDHDR]; + jint endhdrlen = ENDHDR; jzcell *entries; jint *table; @@ -490,13 +523,27 @@ readCEN(jzfile *zip, jint knownTotal) /* Get position and length of central directory */ cenlen = ENDSIZ(endbuf); + cenoff = ENDOFF(endbuf); + total = ENDTOT(endbuf); + if (cenlen == ZIP64_MAGICVAL || cenoff == ZIP64_MAGICVAL || + total == ZIP64_MAGICCOUNT) { + unsigned char end64buf[ZIP64_ENDHDR]; + if ((end64pos = findEND64(zip, end64buf, endpos)) != -1) { + cenlen = ZIP64_ENDSIZ(end64buf); + cenoff = ZIP64_ENDOFF(end64buf); + total = (jint)ZIP64_ENDTOT(end64buf); + endpos = end64pos; + endhdrlen = ZIP64_ENDHDR; + } + } + if (cenlen > endpos) ZIP_FORMAT_ERROR("invalid END header (bad central directory size)"); cenpos = endpos - cenlen; /* Get position of first local file (LOC) header, taking into * account that there may be a stub prefixed to the zip file. */ - zip->locpos = cenpos - ENDOFF(endbuf); + zip->locpos = cenpos - cenoff; if (zip->locpos < 0) ZIP_FORMAT_ERROR("invalid END header (bad central directory offset)"); @@ -527,7 +574,7 @@ readCEN(jzfile *zip, jint knownTotal) out the page size in order to make offset to be multiples of page size. */ - zip->mlen = cenpos - offset + cenlen + ENDHDR; + zip->mlen = cenpos - offset + cenlen + endhdrlen; zip->offset = offset; mappedAddr = mmap64(0, zip->mlen, PROT_READ, MAP_SHARED, zip->zfd, (off64_t) offset); zip->maddr = (mappedAddr == (void*) MAP_FAILED) ? NULL : @@ -551,8 +598,13 @@ readCEN(jzfile *zip, jint knownTotal) * is a 2-byte field, but we (and other zip implementations) * support approx. 2**31 entries, we do not trust ENDTOT, but * treat it only as a strong hint. When we call ourselves - * recursively, knownTotal will have the "true" value. */ - total = (knownTotal != -1) ? knownTotal : ENDTOT(endbuf); + * recursively, knownTotal will have the "true" value. + * + * Keep this path alive even with the Zip64 END support added, just + * for zip files that have more than 0xffff entries but don't have + * the Zip64 enabled. + */ + total = (knownTotal != -1) ? knownTotal : total; entries = zip->entries = calloc(total, sizeof(entries[0])); tablelen = zip->tablelen = ((total/2) | 1); // Odd -> fewer collisions table = zip->table = malloc(tablelen * sizeof(table[0])); @@ -854,6 +906,7 @@ typedef enum { ACCESS_RANDOM, ACCESS_SEQUENTIAL } AccessHint; static jzentry * newEntry(jzfile *zip, jzcell *zc, AccessHint accessHint) { + jlong locoff; jint nlen, elen, clen; jzentry *ze; char *cen; @@ -880,18 +933,55 @@ newEntry(jzfile *zip, jzcell *zc, AccessHint accessHint) ze->size = CENLEN(cen); ze->csize = (CENHOW(cen) == STORED) ? 0 : CENSIZ(cen); ze->crc = CENCRC(cen); - ze->pos = -(zip->locpos + CENOFF(cen)); + locoff = CENOFF(cen); + ze->pos = -(zip->locpos + locoff); if ((ze->name = malloc(nlen + 1)) == NULL) goto Catch; memcpy(ze->name, cen + CENHDR, nlen); ze->name[nlen] = '\0'; if (elen > 0) { + char *extra = cen + CENHDR + nlen; + /* This entry has "extra" data */ if ((ze->extra = malloc(elen + 2)) == NULL) goto Catch; ze->extra[0] = (unsigned char) elen; ze->extra[1] = (unsigned char) (elen >> 8); - memcpy(ze->extra+2, cen + CENHDR + nlen, elen); + memcpy(ze->extra+2, extra, elen); + if (ze->csize == ZIP64_MAGICVAL || ze->size == ZIP64_MAGICVAL || + locoff == ZIP64_MAGICVAL) { + jint off = 0; + while ((off + 4) < elen) { // spec: HeaderID+DataSize+Data + jint sz = SH(extra, off + 2); + if (SH(extra, off) == ZIP64_EXTID) { + off += 4; + if (ze->size == ZIP64_MAGICVAL) { + // if invalid zip64 extra fields, just skip + if (sz < 8 || (off + 8) > elen) + break; + ze->size = LL(extra, off); + sz -= 8; + off += 8; + } + if (ze->csize == ZIP64_MAGICVAL) { + if (sz < 8 || (off + 8) > elen) + break; + ze->csize = LL(extra, off); + sz -= 8; + off += 8; + } + if (locoff == ZIP64_MAGICVAL) { + if (sz < 8 || (off + 8) > elen) + break; + ze->pos = -(zip->locpos + LL(extra, off)); + sz -= 8; + off += 8; + } + break; + } + off += (sz + 4); + } + } } if (clen > 0) { diff --git a/jdk/src/share/native/java/util/zip/zip_util.h b/jdk/src/share/native/java/util/zip/zip_util.h index 3814ad02d4f..7ad11715e5a 100644 --- a/jdk/src/share/native/java/util/zip/zip_util.h +++ b/jdk/src/share/native/java/util/zip/zip_util.h @@ -38,9 +38,13 @@ #define CENSIG 0x02014b50L /* "PK\001\002" */ #define ENDSIG 0x06054b50L /* "PK\005\006" */ +#define ZIP64_ENDSIG 0x06064b50L /* "PK\006\006" */ +#define ZIP64_LOCSIG 0x07064b50L /* "PK\006\007" */ + /* * Header sizes including signatures */ + #ifdef USE_MMAP #define SIGSIZ 4 #endif @@ -49,12 +53,22 @@ #define CENHDR 46 #define ENDHDR 22 +#define ZIP64_ENDHDR 56 // ZIP64 end header size +#define ZIP64_LOCHDR 20 // ZIP64 end loc header size +#define ZIP64_EXTHDR 24 // EXT header size +#define ZIP64_EXTID 1 // Extra field Zip64 header ID + +#define ZIP64_MAGICVAL 0xffffffffLL +#define ZIP64_MAGICCOUNT 0xffff + + /* * Header field access macros */ #define CH(b, n) (((unsigned char *)(b))[n]) #define SH(b, n) (CH(b, n) | (CH(b, n+1) << 8)) -#define LG(b, n) (SH(b, n) | (SH(b, n+2) << 16)) +#define LG(b, n) ((SH(b, n) | (SH(b, n+2) << 16)) &0xffffffffUL) +#define LL(b, n) (((jlong)LG(b, n)) | (((jlong)LG(b, n+4)) << 32)) #define GETSIG(b) LG(b, 0) /* @@ -105,6 +119,26 @@ #define ENDOFF(b) LG(b, 16) /* central directory offset */ #define ENDCOM(b) SH(b, 20) /* size of zip file comment */ +/* + * Macros for getting Zip64 end of central directory header fields + */ +#define ZIP64_ENDLEN(b) LL(b, 4) /* size of zip64 end of central dir */ +#define ZIP64_ENDVEM(b) SH(b, 12) /* version made by */ +#define ZIP64_ENDVER(b) SH(b, 14) /* version needed to extract */ +#define ZIP64_ENDNMD(b) LG(b, 16) /* number of this disk */ +#define ZIP64_ENDDSK(b) LG(b, 20) /* disk number of start */ +#define ZIP64_ENDTOD(b) LL(b, 24) /* total number of entries on this disk */ +#define ZIP64_ENDTOT(b) LL(b, 32) /* total number of entries */ +#define ZIP64_ENDSIZ(b) LL(b, 40) /* central directory size in bytes */ +#define ZIP64_ENDOFF(b) LL(b, 48) /* offset of first CEN header */ + +/* + * Macros for getting Zip64 end of central directory locator fields + */ +#define ZIP64_LOCDSK(b) LG(b, 4) /* disk number start */ +#define ZIP64_LOCOFF(b) LL(b, 8) /* offset of zip64 end */ +#define ZIP64_LOCTOT(b) LG(b, 16) /* total number of disks */ + /* * Supported compression methods */ @@ -145,7 +179,7 @@ typedef struct jzentry { /* Zip file entry */ */ typedef struct jzcell { unsigned int hash; /* 32 bit hashcode on name */ - unsigned int cenpos; /* Offset of central directory file header */ + jlong cenpos; /* Offset of central directory file header */ unsigned int next; /* hash chain: index into jzfile->entries */ } jzcell; diff --git a/jdk/src/share/native/java/util/zip/zlib-1.1.3/zlib.h b/jdk/src/share/native/java/util/zip/zlib-1.1.3/zlib.h index 9576715b2fa..00fdf06007d 100644 --- a/jdk/src/share/native/java/util/zip/zlib-1.1.3/zlib.h +++ b/jdk/src/share/native/java/util/zip/zlib-1.1.3/zlib.h @@ -106,11 +106,11 @@ struct internal_state; typedef struct z_stream_s { Bytef *next_in; /* next input byte */ uInt avail_in; /* number of bytes available at next_in */ - uLong total_in; /* total nb of input bytes read so far */ + long long total_in; /* total nb of input bytes read so far */ Bytef *next_out; /* next output byte should be put there */ uInt avail_out; /* remaining free space at next_out */ - uLong total_out; /* total nb of bytes output so far */ + long long total_out; /* total nb of bytes output so far */ char *msg; /* last error message, NULL if no error */ struct internal_state FAR *state; /* not visible by applications */ diff --git a/jdk/test/java/util/zip/LargeZip.java b/jdk/test/java/util/zip/LargeZip.java new file mode 100644 index 00000000000..e49950261b6 --- /dev/null +++ b/jdk/test/java/util/zip/LargeZip.java @@ -0,0 +1,193 @@ +/* + * Copyright 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. 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. + */ + +import java.io.*; +import java.nio.*; +import java.util.*; +import java.util.zip.*; + +public class LargeZip { + // If true, don't delete large ZIP file created for test. + static final boolean debug = System.getProperty("debug") != null; + + //static final int DATA_LEN = 1024 * 1024; + static final int DATA_LEN = 80 * 1024; + static final int DATA_SIZE = 8; + + static long fileSize = 6L * 1024L * 1024L * 1024L; // 6GB + + static boolean userFile = false; + + static byte[] data; + static File largeFile; + static String lastEntryName; + + /* args can be empty, in which case check a 3 GB file which is created for + * this test (and then deleted). Or it can be a number, in which case + * that designates the size of the file that's created for this test (and + * then deleted). Or it can be the name of a file to use for the test, in + * which case it is *not* deleted. Note that in this last case, the data + * comparison might fail. + */ + static void realMain (String[] args) throws Throwable { + if (args.length > 0) { + try { + fileSize = Long.parseLong(args[0]); + System.out.println("Testing with file of size " + fileSize); + } catch (NumberFormatException ex) { + largeFile = new File(args[0]); + if (!largeFile.exists()) { + throw new Exception("Specified file " + args[0] + " does not exist"); + } + userFile = true; + System.out.println("Testing with user-provided file " + largeFile); + } + } + File testDir = null; + if (largeFile == null) { + testDir = new File(System.getProperty("test.scratch", "."), + "LargeZip"); + if (testDir.exists()) { + if (!testDir.delete()) { + throw new Exception("Cannot delete already-existing test directory"); + } + } + check(!testDir.exists() && testDir.mkdirs()); + largeFile = new File(testDir, "largezip.zip"); + createLargeZip(); + } + + readLargeZip1(); + readLargeZip2(); + + if (!userFile && !debug) { + check(largeFile.delete()); + check(testDir.delete()); + } + } + + static void createLargeZip() throws Throwable { + int iterations = DATA_LEN / DATA_SIZE; + ByteBuffer bb = ByteBuffer.allocate(DATA_SIZE); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + for (int i = 0; i < iterations; i++) { + bb.putDouble(0, Math.random()); + baos.write(bb.array(), 0, DATA_SIZE); + } + data = baos.toByteArray(); + + ZipOutputStream zos = new ZipOutputStream( + new BufferedOutputStream(new FileOutputStream(largeFile))); + long length = 0; + while (length < fileSize) { + ZipEntry ze = new ZipEntry("entry-" + length); + lastEntryName = ze.getName(); + zos.putNextEntry(ze); + zos.write(data, 0, data.length); + zos.closeEntry(); + length = largeFile.length(); + } + System.out.println("Last entry written is " + lastEntryName); + zos.close(); + } + + static void readLargeZip1() throws Throwable { + ZipFile zipFile = new ZipFile(largeFile); + ZipEntry entry = null; + String entryName = null; + int count = 0; + Enumeration entries = zipFile.entries(); + while (entries.hasMoreElements()) { + entry = entries.nextElement(); + entryName = entry.getName(); + count++; + } + System.out.println("Number of entries read: " + count); + System.out.println("Last entry read is " + entryName); + check(!entry.isDirectory()); + if (check(entryName.equals(lastEntryName))) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + InputStream is = zipFile.getInputStream(entry); + byte buf[] = new byte[4096]; + int len; + while ((len = is.read(buf)) >= 0) { + baos.write(buf, 0, len); + } + baos.close(); + is.close(); + check(Arrays.equals(data, baos.toByteArray())); + } + } + + + static void readLargeZip2() throws Throwable { + ZipInputStream zis = new ZipInputStream( + new BufferedInputStream(new FileInputStream(largeFile))); + ZipEntry entry = null; + String entryName = null; + int count = 0; + while ((entry = zis.getNextEntry()) != null) { + entryName = entry.getName(); + if (entryName.equals(lastEntryName)) { + break; + } + count++; + } + System.out.println("Number of entries read: " + count); + System.out.println("Last entry read is " + entryName); + check(!entry.isDirectory()); + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + + byte buf[] = new byte[4096]; + int len; + while ((len = zis.read(buf)) >= 0) { + baos.write(buf, 0, len); + } + baos.close(); + check(Arrays.equals(data, baos.toByteArray())); + check(zis.getNextEntry() == null); + zis.close(); + } + + + //--------------------- Infrastructure --------------------------- + static volatile int passed = 0, failed = 0; + static void pass() {passed++;} + static void pass(String msg) {System.out.println(msg); passed++;} + static void fail() {failed++; Thread.dumpStack();} + static void fail(String msg) {System.out.println(msg); fail();} + static void unexpected(Throwable t) {failed++; t.printStackTrace();} + static void unexpected(Throwable t, String msg) { + System.out.println(msg); failed++; t.printStackTrace();} + static boolean check(boolean cond) {if (cond) pass(); else fail(); return cond;} + static void equal(Object x, Object y) { + if (x == null ? y == null : x.equals(y)) pass(); + else fail(x + " not equal to " + y);} + public static void main(String[] args) throws Throwable { + try {realMain(args);} catch (Throwable t) {unexpected(t);} + System.out.println("\nPassed = " + passed + " failed = " + failed); + if (failed > 0) throw new AssertionError("Some tests failed");} +} diff --git a/jdk/test/java/util/zip/ZipFile/LargeZipFile.java b/jdk/test/java/util/zip/ZipFile/LargeZipFile.java index 479bac48bef..d228a5f93e3 100644 --- a/jdk/test/java/util/zip/ZipFile/LargeZipFile.java +++ b/jdk/test/java/util/zip/ZipFile/LargeZipFile.java @@ -158,4 +158,3 @@ public class LargeZipFile { System.out.println("\nPassed = " + passed + " failed = " + failed); if (failed > 0) throw new AssertionError("Some tests failed");} } - From 21e44848b0b8c95e44be126e96e69d1a29ffc6e1 Mon Sep 17 00:00:00 2001 From: Xiomara Jayasena Date: Thu, 2 Apr 2009 16:51:36 -0700 Subject: [PATCH 246/292] Added tag jdk7-b53 for changeset 149237542285 --- .hgtags-top-repo | 1 + 1 file changed, 1 insertion(+) diff --git a/.hgtags-top-repo b/.hgtags-top-repo index 5ac8ad95712..a3bb161285f 100644 --- a/.hgtags-top-repo +++ b/.hgtags-top-repo @@ -27,3 +27,4 @@ aee93a8992d2389121eb610c00a86196f3e2b9b0 jdk7-b49 5111e13e44e542fe945b47ab154546daec36737d jdk7-b50 0f0189d55ce4a1f7840da7582ac7d970b3b7ab15 jdk7-b51 4264c2fe66493e57c411045a1b61377796641e45 jdk7-b52 +c235f4a8559d196879c56af80159f67ee5d0e720 jdk7-b53 From a91d2cfe7afc0145ec28c7b2069109962d76a81e Mon Sep 17 00:00:00 2001 From: Xiomara Jayasena Date: Thu, 2 Apr 2009 16:51:38 -0700 Subject: [PATCH 247/292] Added tag jdk7-b53 for changeset 66f056cc8fd4 --- corba/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/corba/.hgtags b/corba/.hgtags index 91ac5a1ccae..8ad020f432f 100644 --- a/corba/.hgtags +++ b/corba/.hgtags @@ -27,3 +27,4 @@ d70978bc64bc7a04be7797ab0dcd9b7b1b3a6bff jdk7-b49 0edbd0074b02b42b2b83cc47cb391d4869b7a8ec jdk7-b50 3eb8f1047a7402a9a79937d1c39560e931e91da2 jdk7-b51 bec82237d694f9802b820fa11bbb4f7fa9bf8e77 jdk7-b52 +3c4d73194f6f89f040ae3b2d257335dfa8a1b2b5 jdk7-b53 From f907f0a9d24e050a6678ea0d347c5220349d9a70 Mon Sep 17 00:00:00 2001 From: Xiomara Jayasena Date: Thu, 2 Apr 2009 16:51:41 -0700 Subject: [PATCH 248/292] Added tag jdk7-b53 for changeset 94c3ff1a20d0 --- hotspot/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/hotspot/.hgtags b/hotspot/.hgtags index 475bfa37988..30fc9e5e179 100644 --- a/hotspot/.hgtags +++ b/hotspot/.hgtags @@ -27,3 +27,4 @@ bcb33806d186561c781992e5f4d8a90bb033f9f0 jdk7-b48 dae503d9f04c1a11e182dbf7f770509c28dc0609 jdk7-b50 2581d90c6c9b2012da930eb4742add94a03069a0 jdk7-b51 1b1e8f1a4fe8cebc01c022484f78148e17b62a0d jdk7-b52 +032c6af894dae8d939b3dd31d82042549e7793e0 jdk7-b53 From b1371af3b757bb37b54a90b854a18a8907b96b5c Mon Sep 17 00:00:00 2001 From: Xiomara Jayasena Date: Thu, 2 Apr 2009 16:51:46 -0700 Subject: [PATCH 249/292] Added tag jdk7-b53 for changeset d14d2d3caaf1 --- jaxp/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/jaxp/.hgtags b/jaxp/.hgtags index 8951b3d1ac5..d1208e38760 100644 --- a/jaxp/.hgtags +++ b/jaxp/.hgtags @@ -27,3 +27,4 @@ d711ad1954b294957737ea386cfd4d3c05028a36 jdk7-b47 e8514e2be76d90889ebdb90d627aca2db5c150c6 jdk7-b50 ae890d80d5dffcd4dc77a1f17d768e192d1852c7 jdk7-b51 69ad87dc25cbcaaaded4727199395ad0c78bc427 jdk7-b52 +e8837366d3fd72f7c7a47ebfdbd5106c16156f12 jdk7-b53 From 223f8354addce077625f9c3374ea5d54a58a119a Mon Sep 17 00:00:00 2001 From: Xiomara Jayasena Date: Thu, 2 Apr 2009 16:51:48 -0700 Subject: [PATCH 250/292] Added tag jdk7-b53 for changeset b52ef22dd797 --- jaxws/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/jaxws/.hgtags b/jaxws/.hgtags index 62bf7fdbd4d..0aca2ee92b5 100644 --- a/jaxws/.hgtags +++ b/jaxws/.hgtags @@ -27,3 +27,4 @@ af4a3eeb7812a5d09a241c50b51b3c648a9d45c1 jdk7-b46 5be52db581f1ea91ab6e0eb34ba7f439125bfb16 jdk7-b50 41a66a42791ba90bff489af72cbfea71be9b40a5 jdk7-b51 e646890d18b770f625f14ed4ad5c50554d8d3d8b jdk7-b52 +b250218eb2e534384667ec73e3713e684667fd4c jdk7-b53 From 9d4aff2eaf2760e6c1b328e8a3552552b3e8ed2d Mon Sep 17 00:00:00 2001 From: Xiomara Jayasena Date: Thu, 2 Apr 2009 16:51:55 -0700 Subject: [PATCH 251/292] Added tag jdk7-b53 for changeset 05e04a29c589 --- jdk/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/jdk/.hgtags b/jdk/.hgtags index 39ec72bb7a9..a611fd31d77 100644 --- a/jdk/.hgtags +++ b/jdk/.hgtags @@ -27,3 +27,4 @@ b4ac413b1f129eeef0acab3f31081c1b7dfe3b27 jdk7-b47 58ba2cd5a25053684ec53205d95edeeaa0006f13 jdk7-b50 fea0898259ae41c73620b1815aa48f036216155c jdk7-b51 bcbeadb4a5d759b29e876ee2c83401e91ff22f60 jdk7-b52 +a2033addca678f9e4c0d92ffa1e389171cc9321d jdk7-b53 From 6103649b6b24549638bf78d99b9dff0989da668e Mon Sep 17 00:00:00 2001 From: Xiomara Jayasena Date: Thu, 2 Apr 2009 16:52:05 -0700 Subject: [PATCH 252/292] Added tag jdk7-b53 for changeset e053a98a8120 --- langtools/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/langtools/.hgtags b/langtools/.hgtags index 0ea2c411d86..20846492199 100644 --- a/langtools/.hgtags +++ b/langtools/.hgtags @@ -27,3 +27,4 @@ d17d927ad9bdfafae32451645d182acb7bed7be6 jdk7-b49 46f2f6ed96f13fc49fec3d1b6aa616686128cb57 jdk7-b50 8c55d5b0ed71ed3a749eb97e4eab79b4831649b8 jdk7-b51 29329051d483d39f66073752ba4afbf29d893cfe jdk7-b52 +dbdeb4a7581b2a8699644b91cae6793cb01953f7 jdk7-b53 From 067a3d9ad63aae04be1c0b52ca10026b11a4f68e Mon Sep 17 00:00:00 2001 From: Erik Trimble Date: Thu, 2 Apr 2009 17:37:07 -0700 Subject: [PATCH 253/292] 6825815: Bump HS15 build number to 05 and update copyright date of HOTSPOT_VM_COPYRIGHT Update the HS15 Build number to 05 and fix copyright date of HOTSPOT_VM_COPYRIGHT Reviewed-by: jcoomes --- hotspot/make/hotspot_version | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hotspot/make/hotspot_version b/hotspot/make/hotspot_version index f3f6bc5d15b..64a2efe6dd1 100644 --- a/hotspot/make/hotspot_version +++ b/hotspot/make/hotspot_version @@ -31,11 +31,11 @@ # # Don't put quotes (fail windows build). -HOTSPOT_VM_COPYRIGHT=Copyright 2008 +HOTSPOT_VM_COPYRIGHT=Copyright 2009 HS_MAJOR_VER=15 HS_MINOR_VER=0 -HS_BUILD_NUMBER=04 +HS_BUILD_NUMBER=05 JDK_MAJOR_VER=1 JDK_MINOR_VER=7 From b01525e89b428c9ef8e6712bc0cf2637f3b31172 Mon Sep 17 00:00:00 2001 From: Weijun Wang Date: Fri, 3 Apr 2009 11:36:19 +0800 Subject: [PATCH 254/292] 6825352: support self-issued certificate in keytool Reviewed-by: xuelei --- .../classes/sun/security/tools/KeyTool.java | 41 +++++------ .../sun/security/tools/keytool/selfissued.sh | 69 +++++++++++++++++++ 2 files changed, 88 insertions(+), 22 deletions(-) create mode 100644 jdk/test/sun/security/tools/keytool/selfissued.sh diff --git a/jdk/src/share/classes/sun/security/tools/KeyTool.java b/jdk/src/share/classes/sun/security/tools/KeyTool.java index 1ce3ab21a02..9b4b16fa11d 100644 --- a/jdk/src/share/classes/sun/security/tools/KeyTool.java +++ b/jdk/src/share/classes/sun/security/tools/KeyTool.java @@ -2545,7 +2545,19 @@ public final class KeyTool { * Returns true if the certificate is self-signed, false otherwise. */ private boolean isSelfSigned(X509Certificate cert) { - return cert.getSubjectDN().equals(cert.getIssuerDN()); + return signedBy(cert, cert); + } + + private boolean signedBy(X509Certificate end, X509Certificate ca) { + if (!ca.getSubjectDN().equals(end.getIssuerDN())) { + return false; + } + try { + end.verify(ca.getPublicKey()); + return true; + } catch (Exception e) { + return false; + } } /** @@ -2869,20 +2881,18 @@ public final class KeyTool { Certificate tmpCert = replyCerts[0]; replyCerts[0] = replyCerts[i]; replyCerts[i] = tmpCert; - Principal issuer = ((X509Certificate)replyCerts[0]).getIssuerDN(); + + X509Certificate thisCert = (X509Certificate)replyCerts[0]; for (i=1; i < replyCerts.length-1; i++) { - // find a cert in the reply whose "subject" is the same as the - // given "issuer" + // find a cert in the reply who signs thisCert int j; for (j=i; j chain, Hashtable> certs) { - Principal subject = certToVerify.getSubjectDN(); Principal issuer = certToVerify.getIssuerDN(); - if (subject.equals(issuer)) { + if (isSelfSigned(certToVerify)) { // reached self-signed root cert; // no verification needed because it's trusted. chain.addElement(certToVerify); diff --git a/jdk/test/sun/security/tools/keytool/selfissued.sh b/jdk/test/sun/security/tools/keytool/selfissued.sh new file mode 100644 index 00000000000..e6e06c040b3 --- /dev/null +++ b/jdk/test/sun/security/tools/keytool/selfissued.sh @@ -0,0 +1,69 @@ +# +# Copyright 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 6825352 +# @summary support self-issued certificate in keytool +# +# @run shell selfissued.sh +# + +if [ "${TESTJAVA}" = "" ] ; then + JAVAC_CMD=`which javac` + TESTJAVA=`dirname $JAVAC_CMD`/.. +fi + +# set platform-dependent variables +OS=`uname -s` +case "$OS" in + Windows_* ) + FS="\\" + ;; + * ) + FS="/" + ;; +esac + +KS=selfsigned.jks +KT="$TESTJAVA${FS}bin${FS}keytool -storepass changeit -keypass changeit -keystore $KS" + +rm $KS + +$KT -alias ca -dname CN=CA -genkeypair +$KT -alias me -dname CN=CA -genkeypair +$KT -alias e1 -dname CN=E1 -genkeypair +$KT -alias e2 -dname CN=E2 -genkeypair + +# me signed by ca, self-issued +$KT -alias me -certreq | $KT -alias ca -gencert | $KT -alias me -importcert + +# Import e1 signed by me, should add me and ca +$KT -alias e1 -certreq | $KT -alias me -gencert | $KT -alias e1 -importcert +$KT -alias e1 -list -v | grep '\[3\]' || { echo Bad E1; exit 1; } + +# Import (e2 signed by me,ca,me), should reorder to (e2,me,ca) +( $KT -alias e2 -certreq | $KT -alias me -gencert; $KT -exportcert -alias ca; $KT -exportcert -alias me ) | $KT -alias e2 -importcert +$KT -alias e2 -list -v | grep '\[3\]' || { echo Bad E2; exit 1; } + +echo Good + From 9676f044cbe3cd528617d2fd9984e0306f2aa3f9 Mon Sep 17 00:00:00 2001 From: Alan Bateman Date: Fri, 3 Apr 2009 22:10:36 +0100 Subject: [PATCH 255/292] 6823609: (se) Selector.select hangs on Windows under load Reviewed-by: sherman --- .../sun/nio/ch/WindowsSelectorImpl.java | 39 +++++----- .../channels/Selector/HelperSlowToDie.java | 75 +++++++++++++++++++ 2 files changed, 97 insertions(+), 17 deletions(-) create mode 100644 jdk/test/java/nio/channels/Selector/HelperSlowToDie.java diff --git a/jdk/src/windows/classes/sun/nio/ch/WindowsSelectorImpl.java b/jdk/src/windows/classes/sun/nio/ch/WindowsSelectorImpl.java index 5457a2cfb2c..5df8c8cd6c0 100644 --- a/jdk/src/windows/classes/sun/nio/ch/WindowsSelectorImpl.java +++ b/jdk/src/windows/classes/sun/nio/ch/WindowsSelectorImpl.java @@ -34,7 +34,6 @@ import java.nio.channels.Selector; import java.nio.channels.ClosedSelectorException; import java.nio.channels.Pipe; import java.nio.channels.SelectableChannel; -import java.nio.channels.SelectionKey; import java.io.IOException; import java.util.List; import java.util.ArrayList; @@ -72,7 +71,7 @@ final class WindowsSelectorImpl extends SelectorImpl { private int threadsCount = 0; // A list of helper threads for select. - private final List threads = new ArrayList(); + private final List threads = new ArrayList(); //Pipe used as a wakeup object. private final Pipe wakeupPipe; @@ -201,7 +200,7 @@ final class WindowsSelectorImpl extends SelectorImpl { Thread.currentThread().interrupt(); } } - if (thread.index >= threads.size()) { // redundant thread + if (thread.isZombie()) { // redundant thread return true; // will cause run() to exit. } else { thread.lastRun = runsCounter; // update lastRun @@ -388,9 +387,10 @@ final class WindowsSelectorImpl extends SelectorImpl { // Represents a helper thread used for select. private final class SelectThread extends Thread { - private int index; // index of this thread - SubSelector subSelector; + private final int index; // index of this thread + final SubSelector subSelector; private long lastRun = 0; // last run number + private volatile boolean zombie; // Creates a new thread private SelectThread(int i) { this.index = i; @@ -398,6 +398,12 @@ final class WindowsSelectorImpl extends SelectorImpl { //make sure we wait for next round of poll this.lastRun = startLock.runsCounter; } + void makeZombie() { + zombie = true; + } + boolean isZombie() { + return zombie; + } public void run() { while (true) { // poll loop // wait for the start of poll. If this thread has become @@ -432,7 +438,7 @@ final class WindowsSelectorImpl extends SelectorImpl { } else if (threadsCount < threads.size()) { // Some threads become redundant. Remove them from the threads List. for (int i = threads.size() - 1 ; i >= threadsCount; i--) - threads.remove(i); + threads.remove(i).makeZombie(); } } @@ -468,10 +474,9 @@ final class WindowsSelectorImpl extends SelectorImpl { updateCount++; int numKeysUpdated = 0; numKeysUpdated += subSelector.processSelectedKeys(updateCount); - Iterator it = threads.iterator(); - while (it.hasNext()) - numKeysUpdated += ((SelectThread)it.next()).subSelector. - processSelectedKeys(updateCount); + for (SelectThread t: threads) { + numKeysUpdated += t.subSelector.processSelectedKeys(updateCount); + } return numKeysUpdated; } @@ -495,13 +500,13 @@ final class WindowsSelectorImpl extends SelectorImpl { } pollWrapper.free(); pollWrapper = null; - selectedKeys = null; - channelArray = null; - threads.clear(); - // Call startThreads. All remaining helper threads now exit, - // since threads.size() = 0; - startLock.startThreads(); - } + selectedKeys = null; + channelArray = null; + // Make all remaining helper threads exit + for (SelectThread t: threads) + t.makeZombie(); + startLock.startThreads(); + } } } } diff --git a/jdk/test/java/nio/channels/Selector/HelperSlowToDie.java b/jdk/test/java/nio/channels/Selector/HelperSlowToDie.java new file mode 100644 index 00000000000..d3cb7e64efc --- /dev/null +++ b/jdk/test/java/nio/channels/Selector/HelperSlowToDie.java @@ -0,0 +1,75 @@ +/* + * Copyright 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 6823609 + * @summary Selector.select can hangs on Windows for cases where a helper thread + * becomes redudant but a new helper is immediately needed. + */ + +import java.nio.channels.*; +import java.io.IOException; + +public class HelperSlowToDie { + private static final int CHANNELS_PER_THREAD = 1023; + private static volatile boolean done; + + public static void main(String[] args) throws IOException { + Selector sel = Selector.open(); + + // register channels + SocketChannel[] channels = new SocketChannel[CHANNELS_PER_THREAD]; + for (int i=0; i Date: Mon, 6 Apr 2009 08:59:33 +0100 Subject: [PATCH 256/292] 4890703: Support SDP (sol) Reviewed-by: michaelm --- jdk/make/java/net/FILES_c.gmk | 4 + jdk/make/java/net/Makefile | 17 +- jdk/make/java/net/mapfile-vers | 1 + jdk/make/sun/net/FILES_java.gmk | 5 + .../java/net/AbstractPlainSocketImpl.java | 11 + .../AsynchronousServerSocketChannelImpl.java | 2 + .../nio/ch/AsynchronousSocketChannelImpl.java | 2 + .../sun/nio/ch/ServerSocketChannelImpl.java | 2 + .../classes/sun/nio/ch/SocketChannelImpl.java | 8 + jdk/src/solaris/classes/sun/net/NetHooks.java | 122 +++++++ .../classes/sun/net/spi/SdpProvider.java | 339 ++++++++++++++++++ .../ch/UnixAsynchronousSocketChannelImpl.java | 6 + jdk/src/solaris/lib/sdp/sdp.conf.template | 30 ++ .../solaris/native/sun/net/spi/SdpProvider.c | 74 ++++ .../native/sun/nio/ch/FileChannelImpl.c | 2 + jdk/src/windows/classes/sun/net/NetHooks.java | 59 +++ jdk/test/sun/net/sdp/ProbeIB.java | 59 +++ jdk/test/sun/net/sdp/Sanity.java | 168 +++++++++ jdk/test/sun/net/sdp/sanity.sh | 72 ++++ 19 files changed, 981 insertions(+), 2 deletions(-) create mode 100644 jdk/src/solaris/classes/sun/net/NetHooks.java create mode 100644 jdk/src/solaris/classes/sun/net/spi/SdpProvider.java create mode 100644 jdk/src/solaris/lib/sdp/sdp.conf.template create mode 100644 jdk/src/solaris/native/sun/net/spi/SdpProvider.c create mode 100644 jdk/src/windows/classes/sun/net/NetHooks.java create mode 100644 jdk/test/sun/net/sdp/ProbeIB.java create mode 100644 jdk/test/sun/net/sdp/Sanity.java create mode 100644 jdk/test/sun/net/sdp/sanity.sh diff --git a/jdk/make/java/net/FILES_c.gmk b/jdk/make/java/net/FILES_c.gmk index 2eb4daa2cbb..0e638816d10 100644 --- a/jdk/make/java/net/FILES_c.gmk +++ b/jdk/make/java/net/FILES_c.gmk @@ -39,6 +39,10 @@ FILES_c = \ ResolverConfigurationImpl.c \ DefaultProxySelector.c +ifeq ($(PLATFORM), solaris) + FILES_c += SdpProvider.c +endif + ifeq ($(PLATFORM), linux) FILES_c += linux_close.c endif diff --git a/jdk/make/java/net/Makefile b/jdk/make/java/net/Makefile index b9a3defdb8c..203b059a388 100644 --- a/jdk/make/java/net/Makefile +++ b/jdk/make/java/net/Makefile @@ -108,11 +108,24 @@ CLASSES.export += java.lang.Integer java.io.FileDescriptor java.net.InetAddressI # LOCALE_SET_DEFINITION = jre -properties: $(LIBDIR) $(LIBDIR)/net.properties +MISC_FILES = $(LIBDIR) $(LIBDIR)/net.properties $(LIBDIR)/net.properties: $(SHARE_SRC)/lib/net.properties @$(RM) $@ $(CP) $< $@ -build: properties +# +# SDP configuration template +# +ifeq ($(PLATFORM), solaris) +SDP_PATH = sdp/sdp.conf.template +SDP_CONF = $(LIBDIR)/$(SDP_PATH) +$(SDP_CONF): $(PLATFORM_SRC)/lib/$(SDP_PATH) + @$(RM) $* + $(install-file) + +MISC_FILES += $(SDP_CONF) +endif + +build: $(MISC_FILES) diff --git a/jdk/make/java/net/mapfile-vers b/jdk/make/java/net/mapfile-vers index d9803f8f944..c30803cbfef 100644 --- a/jdk/make/java/net/mapfile-vers +++ b/jdk/make/java/net/mapfile-vers @@ -90,6 +90,7 @@ SUNWprivate_1.1 { Java_sun_net_dns_ResolverConfigurationImpl_fallbackDomain0; Java_sun_net_spi_DefaultProxySelector_init; Java_sun_net_spi_DefaultProxySelector_getSystemProxy; + Java_sun_net_spi_SdpProvider_convert; NET_AllocSockaddr; NET_SockaddrToInetAddress; NET_SockaddrEqualsInetAddress; diff --git a/jdk/make/sun/net/FILES_java.gmk b/jdk/make/sun/net/FILES_java.gmk index 55b6477fc26..1ab771a37f1 100644 --- a/jdk/make/sun/net/FILES_java.gmk +++ b/jdk/make/sun/net/FILES_java.gmk @@ -39,6 +39,7 @@ FILES_java = \ sun/net/TransferProtocolClient.java \ sun/net/ConnectionResetException.java \ sun/net/NetProperties.java \ + sun/net/NetHooks.java \ sun/net/util/IPAddressUtil.java \ sun/net/dns/ResolverConfiguration.java \ sun/net/dns/ResolverConfigurationImpl.java \ @@ -123,3 +124,7 @@ FILES_java = \ ifeq ($(PLATFORM), windows) FILES_java += sun/net/www/protocol/http/NTLMAuthSequence.java endif + +ifeq ($(PLATFORM), solaris) + FILES_java += sun/net/spi/SdpProvider.java +endif diff --git a/jdk/src/share/classes/java/net/AbstractPlainSocketImpl.java b/jdk/src/share/classes/java/net/AbstractPlainSocketImpl.java index 597783bf730..18af8d6db64 100644 --- a/jdk/src/share/classes/java/net/AbstractPlainSocketImpl.java +++ b/jdk/src/share/classes/java/net/AbstractPlainSocketImpl.java @@ -33,6 +33,7 @@ import java.io.FileDescriptor; import java.io.ByteArrayOutputStream; import sun.net.ConnectionResetException; +import sun.net.NetHooks; /** * Default Socket Implementation. This implementation does @@ -304,6 +305,11 @@ abstract class AbstractPlainSocketImpl extends SocketImpl */ synchronized void doConnect(InetAddress address, int port, int timeout) throws IOException { + synchronized (fdLock) { + if (!closePending && (socket == null || !socket.isBound())) { + NetHooks.beforeTcpConnect(fd, address, port); + } + } try { FileDescriptor fd = acquireFD(); try { @@ -339,6 +345,11 @@ abstract class AbstractPlainSocketImpl extends SocketImpl protected synchronized void bind(InetAddress address, int lport) throws IOException { + synchronized (fdLock) { + if (!closePending && (socket == null || !socket.isBound())) { + NetHooks.beforeTcpBind(fd, address, lport); + } + } socketBind(address, lport); if (socket != null) socket.setBound(); diff --git a/jdk/src/share/classes/sun/nio/ch/AsynchronousServerSocketChannelImpl.java b/jdk/src/share/classes/sun/nio/ch/AsynchronousServerSocketChannelImpl.java index b4fcb9c2c30..49231930159 100644 --- a/jdk/src/share/classes/sun/nio/ch/AsynchronousServerSocketChannelImpl.java +++ b/jdk/src/share/classes/sun/nio/ch/AsynchronousServerSocketChannelImpl.java @@ -37,6 +37,7 @@ import java.util.HashSet; import java.util.Collections; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; +import sun.net.NetHooks; /** * Base implementation of AsynchronousServerSocketChannel. @@ -131,6 +132,7 @@ abstract class AsynchronousServerSocketChannelImpl synchronized (stateLock) { if (localAddress != null) throw new AlreadyBoundException(); + NetHooks.beforeTcpBind(fd, isa.getAddress(), isa.getPort()); Net.bind(fd, isa.getAddress(), isa.getPort()); Net.listen(fd, backlog < 1 ? 50 : backlog); localAddress = Net.localAddress(fd); diff --git a/jdk/src/share/classes/sun/nio/ch/AsynchronousSocketChannelImpl.java b/jdk/src/share/classes/sun/nio/ch/AsynchronousSocketChannelImpl.java index 09637fbae1b..84b81a0c8b0 100644 --- a/jdk/src/share/classes/sun/nio/ch/AsynchronousSocketChannelImpl.java +++ b/jdk/src/share/classes/sun/nio/ch/AsynchronousSocketChannelImpl.java @@ -38,6 +38,7 @@ import java.util.HashSet; import java.util.Collections; import java.util.concurrent.*; import java.util.concurrent.locks.*; +import sun.net.NetHooks; /** * Base implementation of AsynchronousSocketChannel @@ -387,6 +388,7 @@ abstract class AsynchronousSocketChannelImpl throw new AlreadyBoundException(); InetSocketAddress isa = (local == null) ? new InetSocketAddress(0) : Net.checkAddress(local); + NetHooks.beforeTcpBind(fd, isa.getAddress(), isa.getPort()); Net.bind(fd, isa.getAddress(), isa.getPort()); localAddress = Net.localAddress(fd); } diff --git a/jdk/src/share/classes/sun/nio/ch/ServerSocketChannelImpl.java b/jdk/src/share/classes/sun/nio/ch/ServerSocketChannelImpl.java index d509198aee2..0b0e4b6aee2 100644 --- a/jdk/src/share/classes/sun/nio/ch/ServerSocketChannelImpl.java +++ b/jdk/src/share/classes/sun/nio/ch/ServerSocketChannelImpl.java @@ -31,6 +31,7 @@ import java.net.*; import java.nio.channels.*; import java.nio.channels.spi.*; import java.util.*; +import sun.net.NetHooks; /** @@ -191,6 +192,7 @@ class ServerSocketChannelImpl SecurityManager sm = System.getSecurityManager(); if (sm != null) sm.checkListen(isa.getPort()); + NetHooks.beforeTcpBind(fd, isa.getAddress(), isa.getPort()); Net.bind(fd, isa.getAddress(), isa.getPort()); Net.listen(fd, backlog < 1 ? 50 : backlog); synchronized (stateLock) { diff --git a/jdk/src/share/classes/sun/nio/ch/SocketChannelImpl.java b/jdk/src/share/classes/sun/nio/ch/SocketChannelImpl.java index 20944774d4e..ec4f8f5754b 100644 --- a/jdk/src/share/classes/sun/nio/ch/SocketChannelImpl.java +++ b/jdk/src/share/classes/sun/nio/ch/SocketChannelImpl.java @@ -32,6 +32,7 @@ import java.nio.ByteBuffer; import java.nio.channels.*; import java.nio.channels.spi.*; import java.util.*; +import sun.net.NetHooks; /** @@ -526,6 +527,7 @@ class SocketChannelImpl throw new AlreadyBoundException(); InetSocketAddress isa = (local == null) ? new InetSocketAddress(0) : Net.checkAddress(local); + NetHooks.beforeTcpBind(fd, isa.getAddress(), isa.getPort()); Net.bind(fd, isa.getAddress(), isa.getPort()); localAddress = Net.localAddress(fd); } @@ -577,6 +579,12 @@ class SocketChannelImpl if (!isOpen()) { return false; } + // notify hook only if unbound + if (localAddress == null) { + NetHooks.beforeTcpConnect(fd, + isa.getAddress(), + isa.getPort()); + } readerThread = NativeThread.current(); } for (;;) { diff --git a/jdk/src/solaris/classes/sun/net/NetHooks.java b/jdk/src/solaris/classes/sun/net/NetHooks.java new file mode 100644 index 00000000000..f847934190c --- /dev/null +++ b/jdk/src/solaris/classes/sun/net/NetHooks.java @@ -0,0 +1,122 @@ +/* + * Copyright 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. 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. + */ + +package sun.net; + +import java.net.InetAddress; +import java.io.FileDescriptor; +import java.io.IOException; +import java.security.AccessController; +import java.security.PrivilegedAction; +import sun.security.action.GetPropertyAction; + +/** + * Defines static methods to be invoked prior to binding or connecting TCP sockets. + */ + +public final class NetHooks { + + /** + * A provider with hooks to allow sockets be converted prior to binding or + * connecting a TCP socket. + * + *

      Concrete implementations of this class should define a zero-argument + * constructor and implement the abstract methods specified below. + */ + public static abstract class Provider { + /** + * Initializes a new instance of this class. + */ + protected Provider() {} + + /** + * Invoked prior to binding a TCP socket. + */ + public abstract void implBeforeTcpBind(FileDescriptor fdObj, + InetAddress address, + int port) + throws IOException; + + /** + * Invoked prior to connecting an unbound TCP socket. + */ + public abstract void implBeforeTcpConnect(FileDescriptor fdObj, + InetAddress address, + int port) + throws IOException; + } + + /** + * For now, we load the SDP provider on Solaris. In the future this may + * be changed to use the ServiceLoader facility to allow the deployment of + * other providers. + */ + private static Provider loadProvider(final String cn) { + return AccessController + .doPrivileged(new PrivilegedAction() { + @Override public Provider run() { + Class c; + try { + c = (Class)Class.forName(cn, true, null); + } catch (ClassNotFoundException x) { + throw new AssertionError(x); + } + try { + return c.newInstance(); + } catch (IllegalAccessException x) { + throw new AssertionError(x); + } catch (InstantiationException x) { + throw new AssertionError(x); + } + }}); + } + private static final Provider provider = AccessController + .doPrivileged(new GetPropertyAction("os.name")).equals("SunOS") ? + loadProvider("sun.net.spi.SdpProvider") : null; + + /** + * Invoke prior to binding a TCP socket. + */ + public static void beforeTcpBind(FileDescriptor fdObj, + InetAddress address, + int port) + throws IOException + { + if (provider != null) + provider.implBeforeTcpBind(fdObj, address, port); + } + + /** + * Invoke prior to connecting an unbound TCP socket. + */ + public static void beforeTcpConnect(FileDescriptor fdObj, + InetAddress address, + int port) + throws IOException + { + if (provider != null) + provider.implBeforeTcpConnect(fdObj, address, port); + } +} diff --git a/jdk/src/solaris/classes/sun/net/spi/SdpProvider.java b/jdk/src/solaris/classes/sun/net/spi/SdpProvider.java new file mode 100644 index 00000000000..4ae7d9fa58c --- /dev/null +++ b/jdk/src/solaris/classes/sun/net/spi/SdpProvider.java @@ -0,0 +1,339 @@ +/* + * Copyright 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. 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. + */ + +package sun.net.spi; + +import sun.net.NetHooks; +import java.net.InetAddress; +import java.net.Inet4Address; +import java.net.UnknownHostException; +import java.util.*; +import java.io.File; +import java.io.FileDescriptor; +import java.io.IOException; +import java.io.PrintStream; + +import sun.misc.SharedSecrets; +import sun.misc.JavaIOFileDescriptorAccess; + +/** + * A NetHooks provider that converts sockets from the TCP to SDP protocol prior + * to binding or connecting. + */ + +public class SdpProvider extends NetHooks.Provider { + private static final JavaIOFileDescriptorAccess fdAccess = + SharedSecrets.getJavaIOFileDescriptorAccess(); + + // maximum port + private static final int MAX_PORT = 65535; + + // indicates if SDP is enabled and the rules for when the protocol is used + private final boolean enabled; + private final List rules; + + // logging for debug purposes + private PrintStream log; + + public SdpProvider() { + // if this property is not defined then there is nothing to do. + String file = System.getProperty("com.sun.sdp.conf"); + if (file == null) { + this.enabled = false; + this.rules = null; + return; + } + + // load configuration file + List list = null; + if (file != null) { + try { + list = loadRulesFromFile(file); + } catch (IOException e) { + fail("Error reading %s: %s", file, e.getMessage()); + } + } + + // check if debugging is enabled + PrintStream out = null; + String logfile = System.getProperty("com.sun.sdp.debug"); + if (logfile != null) { + out = System.out; + if (logfile.length() > 0) { + try { + out = new PrintStream(logfile); + } catch (IOException ignore) { } + } + } + + this.enabled = !list.isEmpty(); + this.rules = list; + this.log = out; + } + + // supported actions + private static enum Action { + BIND, + CONNECT; + } + + // a rule for matching a bind or connect request + private static interface Rule { + boolean match(Action action, InetAddress address, int port); + } + + // rule to match port[-end] + private static class PortRangeRule implements Rule { + private final Action action; + private final int portStart; + private final int portEnd; + PortRangeRule(Action action, int portStart, int portEnd) { + this.action = action; + this.portStart = portStart; + this.portEnd = portEnd; + } + Action action() { + return action; + } + @Override + public boolean match(Action action, InetAddress address, int port) { + return (action == this.action && + port >= this.portStart && + port <= this.portEnd); + } + } + + // rule to match address[/prefix] port[-end] + private static class AddressPortRangeRule extends PortRangeRule { + private final byte[] addressAsBytes; + private final int prefixByteCount; + private final byte mask; + AddressPortRangeRule(Action action, InetAddress address, + int prefix, int port, int end) + { + super(action, port, end); + this.addressAsBytes = address.getAddress(); + this.prefixByteCount = prefix >> 3; + this.mask = (byte)(0xff << (8 - (prefix % 8))); + } + @Override + public boolean match(Action action, InetAddress address, int port) { + if (action != action()) + return false; + byte[] candidate = address.getAddress(); + // same address type? + if (candidate.length != addressAsBytes.length) + return false; + // check bytes + for (int i=0; i loadRulesFromFile(String file) + throws IOException + { + Scanner scanner = new Scanner(new File(file)); + try { + List result = new ArrayList(); + while (scanner.hasNextLine()) { + String line = scanner.nextLine().trim(); + + // skip blank lines and comments + if (line.length() == 0 || line.charAt(0) == '#') + continue; + + // must have 3 fields + String[] s = line.split("\\s+"); + if (s.length != 3) { + fail("Malformed line '%s'", line); + continue; + } + + // first field is the action ("bind" or "connect") + Action action = null; + for (Action a: Action.values()) { + if (s[0].equalsIgnoreCase(a.name())) { + action = a; + break; + } + } + if (action == null) { + fail("Action '%s' not recognized", s[0]); + continue; + } + + // * port[-end] + int[] ports = parsePortRange(s[2]); + if (ports.length == 0) { + fail("Malformed port range '%s'", s[2]); + continue; + } + + // match all addresses + if (s[1].equals("*")) { + result.add(new PortRangeRule(action, ports[0], ports[1])); + continue; + } + + // hostname | ipaddress[/prefix] + int pos = s[1].indexOf('/'); + try { + if (pos < 0) { + // hostname or ipaddress (no prefix) + InetAddress[] addresses = InetAddress.getAllByName(s[1]); + for (InetAddress address: addresses) { + int prefix = + (address instanceof Inet4Address) ? 32 : 128; + result.add(new AddressPortRangeRule(action, address, + prefix, ports[0], ports[1])); + } + } else { + // ipaddress/prefix + InetAddress address = InetAddress + .getByName(s[1].substring(0, pos)); + int prefix = -1; + try { + prefix = Integer.parseInt(s[1].substring(pos+1)); + if (address instanceof Inet4Address) { + // must be 1-31 + if (prefix < 0 || prefix > 32) prefix = -1; + } else { + // must be 1-128 + if (prefix < 0 || prefix > 128) prefix = -1; + } + } catch (NumberFormatException e) { + } + + if (prefix > 0) { + result.add(new AddressPortRangeRule(action, + address, prefix, ports[0], ports[1])); + } else { + fail("Malformed prefix '%s'", s[1]); + continue; + } + } + } catch (UnknownHostException uhe) { + fail("Unknown host or malformed IP address '%s'", s[1]); + continue; + } + } + return result; + } finally { + scanner.close(); + } + } + + // converts unbound TCP socket to a SDP socket if it matches the rules + private void convertTcpToSdpIfMatch(FileDescriptor fdObj, + Action action, + InetAddress address, + int port) + throws IOException + { + boolean matched = false; + for (Rule rule: rules) { + if (rule.match(action, address, port)) { + int fd = fdAccess.get(fdObj); + convert(fd); + matched = true; + break; + } + } + if (log != null) { + String addr = (address instanceof Inet4Address) ? + address.getHostAddress() : "[" + address.getHostAddress() + "]"; + if (matched) { + log.format("%s to %s:%d (socket converted to SDP protocol)\n", action, addr, port); + } else { + log.format("%s to %s:%d (no match)\n", action, addr, port); + } + } + } + + @Override + public void implBeforeTcpBind(FileDescriptor fdObj, + InetAddress address, + int port) + throws IOException + { + if (enabled) + convertTcpToSdpIfMatch(fdObj, Action.BIND, address, port); + } + + @Override + public void implBeforeTcpConnect(FileDescriptor fdObj, + InetAddress address, + int port) + throws IOException + { + if (enabled) + convertTcpToSdpIfMatch(fdObj, Action.CONNECT, address, port); + } + + // -- native methods -- + private static native void convert(int fd) throws IOException; +} diff --git a/jdk/src/solaris/classes/sun/nio/ch/UnixAsynchronousSocketChannelImpl.java b/jdk/src/solaris/classes/sun/nio/ch/UnixAsynchronousSocketChannelImpl.java index 78ed152d3a1..e80f202bdff 100644 --- a/jdk/src/solaris/classes/sun/nio/ch/UnixAsynchronousSocketChannelImpl.java +++ b/jdk/src/solaris/classes/sun/nio/ch/UnixAsynchronousSocketChannelImpl.java @@ -32,6 +32,7 @@ import java.util.concurrent.*; import java.io.IOException; import java.io.FileDescriptor; import java.security.AccessController; +import sun.net.NetHooks; import sun.security.action.GetPropertyAction; /** @@ -305,6 +306,7 @@ class UnixAsynchronousSocketChannelImpl sm.checkConnect(isa.getAddress().getHostAddress(), isa.getPort()); // check and set state + boolean notifyBeforeTcpConnect; synchronized (stateLock) { if (state == ST_CONNECTED) throw new AlreadyConnectedException(); @@ -312,12 +314,16 @@ class UnixAsynchronousSocketChannelImpl throw new ConnectionPendingException(); state = ST_PENDING; pendingRemote = remote; + notifyBeforeTcpConnect = (localAddress == null); } AbstractFuture result = null; Throwable e = null; try { begin(); + // notify hook if unbound + if (notifyBeforeTcpConnect) + NetHooks.beforeTcpConnect(fd, isa.getAddress(), isa.getPort()); int n = Net.connect(fd, isa.getAddress(), isa.getPort()); if (n == IOStatus.UNAVAILABLE) { // connection could not be established immediately diff --git a/jdk/src/solaris/lib/sdp/sdp.conf.template b/jdk/src/solaris/lib/sdp/sdp.conf.template new file mode 100644 index 00000000000..71cb5c2ce84 --- /dev/null +++ b/jdk/src/solaris/lib/sdp/sdp.conf.template @@ -0,0 +1,30 @@ +# +# Configuration file to enable InfiniBand Sockets Direct Protocol. +# +# Each line that does not start with a comment (#) is a rule to indicate when +# the SDP transport protocol should be used. The format of a rule is as follows: +# ("bind"|"connect") 1*LWSP-char (hostname|ipaddress["/"prefix]) 1*LWSP-char ("*"|port)["-"("*"|port)] +# +# A "bind" rule indicates that the SDP protocol transport should be used when +# a TCP socket binds to an address/port that matches the rule. A "connect" rule +# indicates that the SDP protocol transport should be used when an unbound +# TCP socket attempts to connect to an address/port that matches the rule. +# Addresses may be specified as hostnames or literal Internet Protocol (IP) +# addresses. When a literal IP address is used then a prefix length may be used +# to indicate the number of bits for matching (useful when a block of addresses +# or subnet is allocated to the InfiniBand fabric). + +# Use SDP for all sockets that bind to specific local addresses +#bind 192.168.1.1 * +#bind fe80::21b:24ff:fe3d:7896 * + +# Use SDP for all sockets that bind to the wildcard address in a port range +#bind 0.0.0.0 5000-5999 +#bind ::0 5000-5999 + +# Use SDP when connecting to all application services on 192.168.1.* +#connect 192.168.1.0/24 1024-* + +# Use SDP when connecting to the http server or MySQL database on hpccluster. +#connect hpccluster.foo.com 80 +#connect hpccluster.foo.com 3306 diff --git a/jdk/src/solaris/native/sun/net/spi/SdpProvider.c b/jdk/src/solaris/native/sun/net/spi/SdpProvider.c new file mode 100644 index 00000000000..00d7f4ba6dc --- /dev/null +++ b/jdk/src/solaris/native/sun/net/spi/SdpProvider.c @@ -0,0 +1,74 @@ +/* + * Copyright 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. 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. + */ + +#include +#include + +#if defined(__solaris__) && !defined(PROTO_SDP) +#define PROTO_SDP 257 +#endif + +#include "jni.h" +#include "jni_util.h" +#include "net_util.h" + +#define RESTARTABLE(_cmd, _result) do { \ + do { \ + _result = _cmd; \ + } while((_result == -1) && (errno == EINTR)); \ +} while(0) + +JNIEXPORT void JNICALL +Java_sun_net_spi_SdpProvider_convert(JNIEnv *env, jclass cls, jint fd) +{ +#ifdef PROTO_SDP + int domain = ipv6_available() ? AF_INET6 : AF_INET; + int s = socket(domain, SOCK_STREAM, PROTO_SDP); + if (s < 0) { + JNU_ThrowIOExceptionWithLastError(env, "socket"); + } else { + int arg, len, res; + struct linger linger; + + /* copy socket options that are relevant to SDP */ + len = sizeof(arg); + if (getsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char*)&arg, &len) == 0) + setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char*)&arg, len); + len = sizeof(arg); + if (getsockopt(fd, SOL_SOCKET, SO_OOBINLINE, (char*)&arg, &len) == 0) + setsockopt(s, SOL_SOCKET, SO_OOBINLINE, (char*)&arg, len); + len = sizeof(linger); + if (getsockopt(fd, SOL_SOCKET, SO_LINGER, (void*)&linger, &len) == 0) + setsockopt(s, SOL_SOCKET, SO_LINGER, (char*)&linger, len); + + RESTARTABLE(dup2(s, fd), res); + if (res < 0) + JNU_ThrowIOExceptionWithLastError(env, "dup2"); + RESTARTABLE(close(s), res); + } +#else + JNU_ThrowInternalError(env, "should not reach here"); +#endif +} diff --git a/jdk/src/solaris/native/sun/nio/ch/FileChannelImpl.c b/jdk/src/solaris/native/sun/nio/ch/FileChannelImpl.c index 7b37e6168b8..c1c3cc9e826 100644 --- a/jdk/src/solaris/native/sun/nio/ch/FileChannelImpl.c +++ b/jdk/src/solaris/native/sun/nio/ch/FileChannelImpl.c @@ -231,6 +231,8 @@ Java_sun_nio_ch_FileChannelImpl_transferTo0(JNIEnv *env, jobject this, if (result < 0) { if (errno == EAGAIN) return IOS_UNAVAILABLE; + if (errno == EOPNOTSUPP) + return IOS_UNSUPPORTED_CASE; if ((errno == EINVAL) && ((ssize_t)count >= 0)) return IOS_UNSUPPORTED_CASE; if (errno == EINTR) diff --git a/jdk/src/windows/classes/sun/net/NetHooks.java b/jdk/src/windows/classes/sun/net/NetHooks.java new file mode 100644 index 00000000000..0d8f60b3a42 --- /dev/null +++ b/jdk/src/windows/classes/sun/net/NetHooks.java @@ -0,0 +1,59 @@ +/* + * Copyright 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. 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. + */ +package sun.net; + +import java.net.InetAddress; +import java.io.FileDescriptor; +import java.io.IOException; + +/** + * Defines static methods to ensure that any installed net hooks are invoked + * prior to binding or connecting TCP sockets. + */ + +public final class NetHooks { + + /** + * Invoke prior to binding a TCP socket. + */ + public static void beforeTcpBind(FileDescriptor fdObj, + InetAddress address, + int port) + throws IOException + { + // nothing to do + } + + /** + * Invoke prior to connecting an unbound TCP socket. + */ + public static void beforeTcpConnect(FileDescriptor fdObj, + InetAddress address, + int port) + throws IOException + { + // nothing to do + } +} diff --git a/jdk/test/sun/net/sdp/ProbeIB.java b/jdk/test/sun/net/sdp/ProbeIB.java new file mode 100644 index 00000000000..ac2a4b72d74 --- /dev/null +++ b/jdk/test/sun/net/sdp/ProbeIB.java @@ -0,0 +1,59 @@ +/* + * Copyright 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. + */ + +import java.io.File; +import java.io.IOException; +import java.net.NetworkInterface; +import java.net.InetAddress; +import java.util.Scanner; +import java.util.Enumeration; + +/** + * Probes for InfiniBand devices plumbed with IP addresses. + */ + +public class ProbeIB { + public static void main(String[] args) throws IOException { + Scanner s = new Scanner(new File("/etc/path_to_inst")); + try { + while (s.hasNextLine()) { + String line = s.nextLine(); + if (line.startsWith("#")) + continue; + String[] fields = line.split("\\s+"); + if (!fields[2].equals("\"ibd\"")) + continue; + String name = fields[2].substring(1, fields[2].length()-1) + fields[1]; + NetworkInterface ni = NetworkInterface.getByName(name); + if (ni != null) { + Enumeration addrs = ni.getInetAddresses(); + while (addrs.hasMoreElements()) { + System.out.println(addrs.nextElement().getHostAddress()); + } + } + } + } finally { + s.close(); + } + } +} diff --git a/jdk/test/sun/net/sdp/Sanity.java b/jdk/test/sun/net/sdp/Sanity.java new file mode 100644 index 00000000000..2c8d55e00af --- /dev/null +++ b/jdk/test/sun/net/sdp/Sanity.java @@ -0,0 +1,168 @@ +/* + * Copyright 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. + */ + +import java.net.*; +import java.io.*; +import java.nio.channels.*; +import java.util.Enumeration; + +/** + * Sanity check Socket/ServerSocket and each of the stream-oriented channels + * on each IP address plumbed to the network adapters. + */ + +public class Sanity { + public static void main(String[] args) throws Exception { + Enumeration nifs = NetworkInterface.getNetworkInterfaces(); + while (nifs.hasMoreElements()) { + NetworkInterface ni = nifs.nextElement(); + Enumeration addrs = ni.getInetAddresses(); + while (addrs.hasMoreElements()) { + InetAddress addr = addrs.nextElement(); + test(addr); + } + } + } + + static void test(InetAddress addr) throws Exception { + System.out.println(addr.getHostAddress()); + + // ServerSocketChannel.bind + ServerSocketChannel ssc = ServerSocketChannel.open(); + try { + ssc.bind(new InetSocketAddress(addr, 0)); + int port = ((InetSocketAddress)(ssc.getLocalAddress())).getPort(); + + // SocketChannel.connect (implicit bind) + SocketChannel client = SocketChannel.open(); + try { + client.connect(new InetSocketAddress(addr, port)); + SocketChannel peer = ssc.accept(); + try { + testConnection(Channels.newOutputStream(client), + Channels.newInputStream(peer)); + } finally { + peer.close(); + } + } finally { + client.close(); + } + + // SocketChannel.connect (explicit bind) + client = SocketChannel.open(); + try { + client.bind(new InetSocketAddress(addr, 0)) + .connect(new InetSocketAddress(addr, port)); + ssc.accept().close(); + } finally { + client.close(); + } + } finally { + ssc.close(); + } + + // AsynchronousServerSocketChannel.bind + AsynchronousServerSocketChannel server = + AsynchronousServerSocketChannel.open(); + try { + server.bind(new InetSocketAddress(addr, 0)); + int port = ((InetSocketAddress)(server.getLocalAddress())).getPort(); + + // AsynchronousSocketChannel.connect (implicit bind) + AsynchronousSocketChannel client = AsynchronousSocketChannel.open(); + try { + client.connect(new InetSocketAddress(addr, port)).get(); + AsynchronousSocketChannel peer = server.accept().get(); + try { + testConnection(Channels.newOutputStream(client), + Channels.newInputStream(peer)); + } finally { + peer.close(); + } + } finally { + client.close(); + } + + // AsynchronousSocketChannel.connect (explicit bind) + client = AsynchronousSocketChannel.open(); + try { + client.bind(new InetSocketAddress(addr, 0)) + .connect(new InetSocketAddress(addr, port)).get(); + server.accept().get().close(); + } finally { + client.close(); + } + } finally { + server.close(); + } + + // ServerSocket.bind + ServerSocket ss = new ServerSocket(); + try { + ss.bind(new InetSocketAddress(addr, 0)); + int port = ss.getLocalPort(); + + // Socket.connect (implicit bind) + Socket s = new Socket(); + try { + s.connect(new InetSocketAddress(addr, port)); + Socket peer = ss.accept(); + try { + testConnection(s.getOutputStream(), peer.getInputStream()); + } finally { + peer.close(); + } + } finally { + s.close(); + } + + // Socket.connect (explicit bind) + s = new Socket(); + try { + s.bind(new InetSocketAddress(addr, 0)); + s.connect(new InetSocketAddress(addr, port)); + ss.accept().close(); + } finally { + s.close(); + } + } finally { + ss.close(); + } + } + + static void testConnection(OutputStream out, InputStream in) + throws IOException + { + byte[] msg = "hello".getBytes(); + out.write(msg); + + byte[] ba = new byte[100]; + int nread = 0; + while (nread < msg.length) { + int n = in.read(ba); + if (n < 0) + throw new IOException("EOF not expected!"); + nread += n; + } + } +} diff --git a/jdk/test/sun/net/sdp/sanity.sh b/jdk/test/sun/net/sdp/sanity.sh new file mode 100644 index 00000000000..baca9feccef --- /dev/null +++ b/jdk/test/sun/net/sdp/sanity.sh @@ -0,0 +1,72 @@ +# +# Copyright 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 4890703 +# @summary Unit test for Solaris SDP support +# @build ProbeIB Sanity +# @run shell sanity.sh + +# Check we are on Solaris and that SDP is enabled +OS=`uname -s` +if [ "$OS" != "SunOS" ]; then + echo "This is a Solaris-only test" + exit 0 +fi +SDPADM=/usr/sbin/sdpadm +if [ ! -f ${SDPADM} ]; then + echo "SDP not available" + exit 0 +fi +${SDPADM} status|grep Enabled +if [ $? != 0 ]; then + echo "SDP not enabled" + exit 0 +fi + +if [ -z "$TESTJAVA" ]; then + JAVA=java + TESTCLASSES=. + TESTSRC=. +else + JAVA="${TESTJAVA}/bin/java" +fi + +CLASSPATH=${TESTCLASSES}:${TESTSRC} +export CLASSPATH + +# Probe for IP addresses plumbed to IB interfaces +$JAVA -Djava.net.preferIPv4Stack=true ProbeIB > ib_addrs + +# Create sdp.conf +SDPCONF=sdp.conf +rm ${SDPCONF} +touch ${SDPCONF} +cat ib_addrs | while read ADDR +do + echo "bind ${ADDR} *" > ${SDPCONF} + echo "connect ${ADDR} *" >> ${SDPCONF} +done + +# Sanity check +$JAVA -Djava.net.preferIPv4Stack=true -Dcom.sun.sdp.conf=${SDPCONF} -Dcom.sun.sdp.debug Sanity From 2c63f90f199f55837e1d8d62b45c6b6e09d3673c Mon Sep 17 00:00:00 2001 From: Peter Zhelezniakov Date: Mon, 6 Apr 2009 13:06:24 +0400 Subject: [PATCH 257/292] 6635110: GTK problem when testing Sun Studio IDE on snv_77 with jdk1.6 using Gnome window manager GTKIconFactory icons should protect against null context passed in Reviewed-by: rupashka --- .../java/swing/plaf/gtk/GTKIconFactory.java | 38 ++++++----- .../sun/java/swing/plaf/gtk/Test6635110.java | 65 +++++++++++++++++++ 2 files changed, 86 insertions(+), 17 deletions(-) create mode 100644 jdk/test/com/sun/java/swing/plaf/gtk/Test6635110.java diff --git a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKIconFactory.java b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKIconFactory.java index 850aa154b83..23df1928fd4 100644 --- a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKIconFactory.java +++ b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKIconFactory.java @@ -279,20 +279,22 @@ class GTKIconFactory { public void paintIcon(SynthContext context, Graphics g, int x, int y, int w, int h) { - JToolBar toolbar = (JToolBar)context.getComponent(); - Orientation orientation = - (toolbar.getOrientation() == JToolBar.HORIZONTAL ? - Orientation.HORIZONTAL : Orientation.VERTICAL); + if (context != null) { + JToolBar toolbar = (JToolBar)context.getComponent(); + Orientation orientation = + (toolbar.getOrientation() == JToolBar.HORIZONTAL ? + Orientation.HORIZONTAL : Orientation.VERTICAL); - if (style == null) { - style = SynthLookAndFeel.getStyleFactory().getStyle( - context.getComponent(), GTKRegion.HANDLE_BOX); + if (style == null) { + style = SynthLookAndFeel.getStyleFactory().getStyle( + context.getComponent(), GTKRegion.HANDLE_BOX); + } + context = new SynthContext(toolbar, GTKRegion.HANDLE_BOX, + style, SynthConstants.ENABLED); + + GTKPainter.INSTANCE.paintIcon(context, g, + getMethod(), x, y, w, h, orientation); } - context = new SynthContext(toolbar, GTKRegion.HANDLE_BOX, - style, SynthConstants.ENABLED); - - GTKPainter.INSTANCE.paintIcon(context, g, - getMethod(), x, y, w, h, orientation); } public int getIconWidth(SynthContext context) { @@ -336,12 +338,14 @@ class GTKIconFactory { public void paintIcon(SynthContext context, Graphics g, int x, int y, int w, int h) { - ArrowType arrowDir = ArrowType.RIGHT; - if (!context.getComponent().getComponentOrientation().isLeftToRight()) { - arrowDir = ArrowType.LEFT; + if (context != null) { + ArrowType arrowDir = ArrowType.RIGHT; + if (!context.getComponent().getComponentOrientation().isLeftToRight()) { + arrowDir = ArrowType.LEFT; + } + GTKPainter.INSTANCE.paintIcon(context, g, + getMethod(), x, y, w, h, arrowDir); } - GTKPainter.INSTANCE.paintIcon(context, g, - getMethod(), x, y, w, h, arrowDir); } } } diff --git a/jdk/test/com/sun/java/swing/plaf/gtk/Test6635110.java b/jdk/test/com/sun/java/swing/plaf/gtk/Test6635110.java new file mode 100644 index 00000000000..c82cf126893 --- /dev/null +++ b/jdk/test/com/sun/java/swing/plaf/gtk/Test6635110.java @@ -0,0 +1,65 @@ +/* + * Copyright 2008 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 6635110 + @summary GTK icons should not throw NPE when called by non-GTK UI + @author Peter Zhelezniakov + @run main Test6635110 +*/ + +import com.sun.java.swing.plaf.gtk.GTKLookAndFeel; +import javax.swing.*; +import java.awt.*; +import java.awt.image.BufferedImage; +import javax.swing.plaf.basic.*; + + +public class Test6635110 implements Runnable { + + static final int WIDTH = 160; + static final int HEIGHT = 80; + final BufferedImage IMAGE = + new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_ARGB); + + @Override public void run() { + JMenu menu = new JMenu("menu"); + menu.setUI(new BasicMenuUI()); + paint(menu); + + JToolBar tb = new JToolBar(); + tb.setFloatable(true); + tb.setUI(new BasicToolBarUI()); + paint(tb); + } + + void paint(Component c) { + c.setSize(WIDTH, HEIGHT); + c.paint(IMAGE.getGraphics()); + } + + public static void main(String[] args) throws Exception { + UIManager.setLookAndFeel(new GTKLookAndFeel()); + SwingUtilities.invokeAndWait(new Test6635110()); + } +} From c10f593c2c68c2d4f10774357c3ba4ae5c07013a Mon Sep 17 00:00:00 2001 From: Valerie Peng Date: Mon, 6 Apr 2009 18:46:20 -0700 Subject: [PATCH 258/292] 4735126: (cl) ClassLoader.loadClass locks all instances in chain when delegating Added support for parallel-capable class loaders Reviewed-by: alanb --- jdk/make/java/java/mapfile-vers | 5 +- jdk/src/share/classes/java/lang/Class.java | 16 +- .../share/classes/java/lang/ClassLoader.java | 444 ++++++++++++------ .../classes/java/net/URLClassLoader.java | 64 ++- .../java/security/SecureClassLoader.java | 31 +- jdk/src/share/classes/sun/misc/Launcher.java | 45 +- jdk/src/share/native/java/lang/ClassLoader.c | 20 +- .../java/lang/ClassLoader/deadlock/Alice.java | 29 ++ .../java/lang/ClassLoader/deadlock/Bob.java | 29 ++ .../deadlock/DelegatingLoader.java | 93 ++++ .../lang/ClassLoader/deadlock/Starter.java | 105 +++++ .../lang/ClassLoader/deadlock/SupAlice.java | 29 ++ .../lang/ClassLoader/deadlock/SupBob.java | 29 ++ .../ClassLoader/deadlock/TestCrossDelegate.sh | 105 +++++ .../deadlock/TestOneWayDelegate.sh | 105 +++++ 15 files changed, 937 insertions(+), 212 deletions(-) create mode 100644 jdk/test/java/lang/ClassLoader/deadlock/Alice.java create mode 100644 jdk/test/java/lang/ClassLoader/deadlock/Bob.java create mode 100644 jdk/test/java/lang/ClassLoader/deadlock/DelegatingLoader.java create mode 100644 jdk/test/java/lang/ClassLoader/deadlock/Starter.java create mode 100644 jdk/test/java/lang/ClassLoader/deadlock/SupAlice.java create mode 100644 jdk/test/java/lang/ClassLoader/deadlock/SupBob.java create mode 100644 jdk/test/java/lang/ClassLoader/deadlock/TestCrossDelegate.sh create mode 100644 jdk/test/java/lang/ClassLoader/deadlock/TestOneWayDelegate.sh diff --git a/jdk/make/java/java/mapfile-vers b/jdk/make/java/java/mapfile-vers index 77a78301af7..a9231b4d648 100644 --- a/jdk/make/java/java/mapfile-vers +++ b/jdk/make/java/java/mapfile-vers @@ -1,5 +1,5 @@ # -# Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1997-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 @@ -135,7 +135,8 @@ SUNWprivate_1.1 { Java_java_lang_ClassLoader_00024NativeLibrary_find; Java_java_lang_ClassLoader_00024NativeLibrary_load; Java_java_lang_ClassLoader_00024NativeLibrary_unload; - Java_java_lang_ClassLoader_registerNatives; + Java_java_lang_ClassLoader_getCaller; + Java_java_lang_ClassLoader_registerNatives; Java_java_lang_Compiler_registerNatives; Java_java_lang_Double_longBitsToDouble; Java_java_lang_Double_doubleToRawLongBits; diff --git a/jdk/src/share/classes/java/lang/Class.java b/jdk/src/share/classes/java/lang/Class.java index 63f56764d45..4ba497c64cf 100644 --- a/jdk/src/share/classes/java/lang/Class.java +++ b/jdk/src/share/classes/java/lang/Class.java @@ -1,5 +1,5 @@ /* - * Copyright 1994-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1994-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 @@ -2846,14 +2846,14 @@ public final if (loader == null) return desiredAssertionStatus0(this); - synchronized(loader) { - // If the classloader has been initialized with - // the assertion directives, ask it. Otherwise, - // ask the VM. - return (loader.classAssertionStatus == null ? - desiredAssertionStatus0(this) : - loader.desiredAssertionStatus(getName())); + // If the classloader has been initialized with the assertion + // directives, ask it. Otherwise, ask the VM. + synchronized(loader.assertionLock) { + if (loader.classAssertionStatus != null) { + return loader.desiredAssertionStatus(getName()); + } } + return desiredAssertionStatus0(this); } // Retrieves the desired assertion status of this class from the VM diff --git a/jdk/src/share/classes/java/lang/ClassLoader.java b/jdk/src/share/classes/java/lang/ClassLoader.java index c0caa01dcf3..cc0987a5864 100644 --- a/jdk/src/share/classes/java/lang/ClassLoader.java +++ b/jdk/src/share/classes/java/lang/ClassLoader.java @@ -1,5 +1,5 @@ /* - * Copyright 1994-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1994-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 @@ -40,14 +40,17 @@ import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; import java.security.ProtectionDomain; import java.security.cert.Certificate; +import java.util.Collections; import java.util.Enumeration; -import java.util.Hashtable; import java.util.HashMap; import java.util.HashSet; import java.util.Set; import java.util.Stack; import java.util.Map; import java.util.Vector; +import java.util.Hashtable; +import java.util.WeakHashMap; +import java.util.concurrent.ConcurrentHashMap; import sun.misc.ClassFileTransformer; import sun.misc.CompoundEnumeration; import sun.misc.Resource; @@ -91,6 +94,17 @@ import sun.security.util.SecurityConstants; * called the "bootstrap class loader", does not itself have a parent but may * serve as the parent of a ClassLoader instance. * + *

      Class loaders that support concurrent loading of classes are known as + * parallel capable class loaders and are required to register + * themselves at their class initialization time by invoking the + * {@link + * #registerAsParallelCapable ClassLoader.registerAsParallelCapable} + * method. In environments in which the delegation model is not strictly + * hierarchical, class loaders need to be parallel capable, otherise class + * loading can lead to deadlocks because the loader lock is held for the + * duration of the class loading process (see {@link #loadClass + * loadClass} methods). + * *

      Normally, the Java virtual machine loads classes from the local file * system in a platform-dependent manner. For example, on UNIX systems, the * virtual machine loads classes from the directory defined by the @@ -160,31 +174,51 @@ import sun.security.util.SecurityConstants; public abstract class ClassLoader { private static native void registerNatives(); + + // Set of classes which are registered as parallel capable class loaders + private static final Set> parallelLoaders + = Collections.newSetFromMap(Collections.synchronizedMap + (new WeakHashMap, Boolean>())); + static { registerNatives(); + parallelLoaders.add(ClassLoader.class); } // If initialization succeed this is set to true and security checks will // succeed. Otherwise the object is not initialized and the object is // useless. - private boolean initialized = false; + private final boolean initialized; // The parent class loader for delegation - private ClassLoader parent; + // Note: VM hardcoded the offset of this field, thus all new fields + // must be added *after* it. + private final ClassLoader parent; + + // Maps class name to the corresponding lock object when the current + // class loader is parallel capable. + // Note: VM also uses this field to decide if the current class loader + // is parallel capable and the appropriate lock object for class loading. + private final ConcurrentHashMap parallelLockMap; // Hashtable that maps packages to certs - private Hashtable package2certs - = new Hashtable(11); + private final Map package2certs; // Shared among all packages with unsigned classes - Certificate[] nocerts; + private static final Certificate[] nocerts = new Certificate[0]; - // The classes loaded by this class loader. The only purpose of this table + // The classes loaded by this class loader. The only purpose of this table // is to keep the classes from being GC'ed until the loader is GC'ed. - private Vector> classes = new Vector>(); + private final Vector> classes = new Vector>(); + + // The "default" domain. Set as the default ProtectionDomain on newly + // created classes. + private final ProtectionDomain defaultDomain = + new ProtectionDomain(new CodeSource(null, (Certificate[]) null), + null, this, null); // The initiating protection domains for all classes loaded by this loader - private Set domains = new HashSet(); + private final Set domains; // Invoked by the VM to record every loaded class with this loader. void addClass(Class c) { @@ -193,7 +227,9 @@ public abstract class ClassLoader { // The packages defined in this class loader. Each package name is mapped // to its corresponding Package object. - private HashMap packages = new HashMap(); + // @GuardedBy("itself") + private final HashMap packages = + new HashMap(); /** * Creates a new class loader using the specified parent class loader for @@ -220,6 +256,19 @@ public abstract class ClassLoader { security.checkCreateClassLoader(); } this.parent = parent; + if (parallelLoaders.contains(this.getClass())) { + parallelLockMap = new ConcurrentHashMap(); + package2certs = new ConcurrentHashMap(); + domains = + Collections.synchronizedSet(new HashSet()); + assertionLock = new Object(); + } else { + // no finer-grained lock; lock on the classloader instance + parallelLockMap = null; + package2certs = new Hashtable(); + domains = new HashSet(); + assertionLock = this; + } initialized = true; } @@ -244,10 +293,22 @@ public abstract class ClassLoader { security.checkCreateClassLoader(); } this.parent = getSystemClassLoader(); + if (parallelLoaders.contains(this.getClass())) { + parallelLockMap = new ConcurrentHashMap(); + package2certs = new ConcurrentHashMap(); + domains = + Collections.synchronizedSet(new HashSet()); + assertionLock = new Object(); + } else { + // no finer-grained lock; lock on the classloader instance + parallelLockMap = null; + package2certs = new Hashtable(); + domains = new HashSet(); + assertionLock = this; + } initialized = true; } - // -- Class -- /** @@ -296,6 +357,10 @@ public abstract class ClassLoader { *

      Subclasses of ClassLoader are encouraged to override {@link * #findClass(String)}, rather than this method.

      * + *

      Unless overridden, this method synchronizes on the result of + * {@link #getClassLoadingLock getClassLoadingLock} method + * during the entire class loading process. + * * @param name * The binary name of the class * @@ -307,37 +372,80 @@ public abstract class ClassLoader { * @throws ClassNotFoundException * If the class could not be found */ - protected synchronized Class loadClass(String name, boolean resolve) + protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException { - // First, check if the class has already been loaded - Class c = findLoadedClass(name); - if (c == null) { - try { - if (parent != null) { - c = parent.loadClass(name, false); - } else { - c = findBootstrapClass0(name); + synchronized (getClassLoadingLock(name)) { + // First, check if the class has already been loaded + Class c = findLoadedClass(name); + if (c == null) { + try { + if (parent != null) { + c = parent.loadClass(name, false); + } else { + c = findBootstrapClass0(name); + } + } catch (ClassNotFoundException e) { + // If still not found, then invoke findClass in order + // to find the class. + c = findClass(name); } - } catch (ClassNotFoundException e) { - // If still not found, then invoke findClass in order - // to find the class. - c = findClass(name); + } + if (resolve) { + resolveClass(c); + } + return c; + } + } + + /** + * Returns the lock object for class loading operations. + * For backward compatibility, the default implementation of this method + * behaves as follows. If this ClassLoader object is registered as + * parallel capable, the method returns a dedicated object associated + * with the specified class name. Otherwise, the method returns this + * ClassLoader object.

      + * + * @param className + * The name of the to-be-loaded class + * + * @return the lock for class loading operations + * + * @throws NullPointerException + * If registered as parallel capable and className is null + * + * @see #loadClass(String, boolean) + * + * @since 1.7 + */ + protected Object getClassLoadingLock(String className) { + Object lock = this; + if (parallelLockMap != null) { + Object newLock = new Object(); + lock = parallelLockMap.putIfAbsent(className, newLock); + if (lock == null) { + lock = newLock; } } - if (resolve) { - resolveClass(c); - } - return c; + return lock; } // This method is invoked by the virtual machine to load a class. - private synchronized Class loadClassInternal(String name) + private Class loadClassInternal(String name) throws ClassNotFoundException { - return loadClass(name); + // For backward compatibility, explicitly lock on 'this' when + // the current class loader is not parallel capable. + if (parallelLockMap == null) { + synchronized (this) { + return loadClass(name); + } + } else { + return loadClass(name); + } } + // Invoked by the VM after loading class with this loader. private void checkPackageAccess(Class cls, ProtectionDomain pd) { final SecurityManager sm = System.getSecurityManager(); if (sm != null) { @@ -486,31 +594,32 @@ public abstract class ClassLoader { /* Determine protection domain, and check that: - not define java.* class, - - signer of this class matches signers for the rest of the classes in package. + - signer of this class matches signers for the rest of the classes in + package. */ private ProtectionDomain preDefineClass(String name, - ProtectionDomain protectionDomain) + ProtectionDomain pd) { if (!checkName(name)) throw new NoClassDefFoundError("IllegalName: " + name); if ((name != null) && name.startsWith("java.")) { - throw new SecurityException("Prohibited package name: " + - name.substring(0, name.lastIndexOf('.'))); + throw new SecurityException + ("Prohibited package name: " + + name.substring(0, name.lastIndexOf('.'))); } - if (protectionDomain == null) { - protectionDomain = getDefaultDomain(); + if (pd == null) { + pd = defaultDomain; } - if (name != null) - checkCerts(name, protectionDomain.getCodeSource()); + if (name != null) checkCerts(name, pd.getCodeSource()); - return protectionDomain; + return pd; } - private String defineClassSourceLocation(ProtectionDomain protectionDomain) + private String defineClassSourceLocation(ProtectionDomain pd) { - CodeSource cs = protectionDomain.getCodeSource(); + CodeSource cs = pd.getCodeSource(); String source = null; if (cs != null && cs.getLocation() != null) { source = cs.getLocation().toString(); @@ -519,14 +628,15 @@ public abstract class ClassLoader { } private Class defineTransformedClass(String name, byte[] b, int off, int len, - ProtectionDomain protectionDomain, + ProtectionDomain pd, ClassFormatError cfe, String source) throws ClassFormatError { // Class format error - try to transform the bytecode and // define the class again // - ClassFileTransformer[] transformers = ClassFileTransformer.getTransformers(); + ClassFileTransformer[] transformers = + ClassFileTransformer.getTransformers(); Class c = null; if (transformers != null) { @@ -535,7 +645,7 @@ public abstract class ClassLoader { // Transform byte code using transformer byte[] tb = transformer.transform(b, off, len); c = defineClass1(name, tb, 0, tb.length, - protectionDomain, source); + pd, source); break; } catch (ClassFormatError cfe2) { // If ClassFormatError occurs, try next transformer @@ -552,11 +662,10 @@ public abstract class ClassLoader { return c; } - private void postDefineClass(Class c, ProtectionDomain protectionDomain) + private void postDefineClass(Class c, ProtectionDomain pd) { - if (protectionDomain.getCodeSource() != null) { - Certificate certs[] = - protectionDomain.getCodeSource().getCertificates(); + if (pd.getCodeSource() != null) { + Certificate certs[] = pd.getCodeSource().getCertificates(); if (certs != null) setSigners(c, certs); } @@ -641,7 +750,8 @@ public abstract class ClassLoader { try { c = defineClass1(name, b, off, len, protectionDomain, source); } catch (ClassFormatError cfe) { - c = defineTransformedClass(name, b, off, len, protectionDomain, cfe, source); + c = defineTransformedClass(name, b, off, len, protectionDomain, cfe, + source); } postDefineClass(c, protectionDomain); @@ -656,10 +766,10 @@ public abstract class ClassLoader { * specified in the documentation for {@link #defineClass(String, byte[], * int, int)}. Before the class can be used it must be resolved. * - *

      The rules about the first class defined in a package determining the set of - * certificates for the package, and the restrictions on class names are identical - * to those specified in the documentation for {@link #defineClass(String, byte[], - * int, int, ProtectionDomain)}. + *

      The rules about the first class defined in a package determining the + * set of certificates for the package, and the restrictions on class names + * are identical to those specified in the documentation for {@link + * #defineClass(String, byte[], int, int, ProtectionDomain)}. * *

      An invocation of this method of the form * cl.defineClass(name, @@ -668,12 +778,13 @@ public abstract class ClassLoader { * *

      * ...
      - * byte[] temp = new byte[
      bBuffer.{@link java.nio.ByteBuffer#remaining - * remaining}()];
      + * byte[] temp = new byte[
      bBuffer.{@link + * java.nio.ByteBuffer#remaining remaining}()];
      *
      bBuffer.{@link java.nio.ByteBuffer#get(byte[]) * get}(temp);
      * return {@link #defineClass(String, byte[], int, int, ProtectionDomain) - *
      cl.defineClass}(name, temp, 0, temp.length, pd);
      + *
      cl.defineClass}(name, temp, 0, + * temp.length, pd);
      *
      * * @param name @@ -682,9 +793,9 @@ public abstract class ClassLoader { * * @param b * The bytes that make up the class data. The bytes from positions - * b.position() through b.position() + b.limit() -1 - * should have the format of a valid class file as defined by the Java Virtual + * b.position() through b.position() + b.limit() -1 + * should have the format of a valid class file as defined by + * the Java Virtual * Machine Specification. * * @param protectionDomain @@ -738,11 +849,13 @@ public abstract class ClassLoader { String source = defineClassSourceLocation(protectionDomain); try { - c = defineClass2(name, b, b.position(), len, protectionDomain, source); + c = defineClass2(name, b, b.position(), len, protectionDomain, + source); } catch (ClassFormatError cfe) { byte[] tb = new byte[len]; b.get(tb); // get bytes out of byte buffer. - c = defineTransformedClass(name, tb, 0, len, protectionDomain, cfe, source); + c = defineTransformedClass(name, tb, 0, len, protectionDomain, cfe, + source); } postDefineClass(c, protectionDomain); @@ -769,33 +882,29 @@ public abstract class ClassLoader { return true; } - private synchronized void checkCerts(String name, CodeSource cs) { + private void checkCerts(String name, CodeSource cs) { int i = name.lastIndexOf('.'); String pname = (i == -1) ? "" : name.substring(0, i); - Certificate[] pcerts = package2certs.get(pname); - if (pcerts == null) { - // first class in this package gets to define which - // certificates must be the same for all other classes - // in this package - if (cs != null) { - pcerts = cs.getCertificates(); - } - if (pcerts == null) { - if (nocerts == null) - nocerts = new Certificate[0]; - pcerts = nocerts; - } - package2certs.put(pname, pcerts); - } else { - Certificate[] certs = null; - if (cs != null) { - certs = cs.getCertificates(); - } - if (!compareCerts(pcerts, certs)) { - throw new SecurityException("class \""+ name + - "\"'s signer information does not match signer information of other classes in the same package"); + Certificate[] certs = null; + if (cs != null) { + certs = cs.getCertificates(); + } + Certificate[] pcerts = null; + if (parallelLockMap == null) { + synchronized (this) { + pcerts = package2certs.get(pname); + if (pcerts == null) { + package2certs.put(pname, (certs == null? nocerts:certs)); + } } + } else { + pcerts = ((ConcurrentHashMap)package2certs). + putIfAbsent(pname, (certs == null? nocerts:certs)); + } + if (pcerts != null && !compareCerts(pcerts, certs)) { + throw new SecurityException("class \""+ name + + "\"'s signer information does not match signer information of other classes in the same package"); } } @@ -1075,6 +1184,47 @@ public abstract class ClassLoader { return java.util.Collections.emptyEnumeration(); } + // index 0: java.lang.ClassLoader.class + // index 1: the immediate caller of index 0. + // index 2: the immediate caller of index 1. + private static native Class getCaller(int index); + + /** + * Registers the caller class loader as parallel capable. + * In order for the registration to succeed, all super classes + * of the caller class loader must also be registered as + * parallel capable when this method is called.

      + * Note that once a class loader is registered as + * parallel capable, there is no way to change it back. + * In addition, registration should be done statically before + * any instance of the caller classloader being constructed.

      + * + * @return true if the caller is successfully registered as + * parallel capable and false if otherwise. + * + * @since 1.7 + */ + protected static boolean registerAsParallelCapable() { + Class caller = getCaller(1); + Class superCls = caller.getSuperclass(); + boolean result = false; + // Explicit synchronization needed for composite action + synchronized (parallelLoaders) { + if (!parallelLoaders.contains(caller)) { + if (parallelLoaders.contains(superCls)) { + // register the immediate caller as parallel capable + // if and only if all of its super classes are. + // Note: given current classloading sequence, if + // the immediate super class is parallel capable, + // all the super classes higher up must be too. + result = true; + parallelLoaders.add(caller); + } + } else result = true; + } + return result; + } + /** * Find a resource of the specified name from the search path used to load * classes. This method locates the resource through the system class @@ -1141,7 +1291,8 @@ public abstract class ClassLoader { private static Enumeration getBootstrapResources(String name) throws IOException { - final Enumeration e = getBootstrapClassPath().getResources(name); + final Enumeration e = + getBootstrapClassPath().getResources(name); return new Enumeration () { public URL nextElement() { return e.nextElement().getURL(); @@ -1377,9 +1528,11 @@ public abstract class ClassLoader { } // The class loader for the system + // @GuardedBy("ClassLoader.class") private static ClassLoader scl; // Set to true once the system class loader has been set + // @GuardedBy("ClassLoader.class") private static boolean sclSet; @@ -1592,19 +1745,6 @@ public abstract class ClassLoader { } } - // The "default" domain. Set as the default ProtectionDomain on newly - // created classes. - private ProtectionDomain defaultDomain = null; - - // Returns (and initializes) the default domain. - private synchronized ProtectionDomain getDefaultDomain() { - if (defaultDomain == null) { - CodeSource cs = new CodeSource(null, (Certificate[]) null); - defaultDomain = new ProtectionDomain(cs, null, this, null); - } - return defaultDomain; - } - // All native library names we've loaded. private static Vector loadedLibraryNames = new Vector(); @@ -1622,8 +1762,8 @@ public abstract class ClassLoader { = new Stack(); // The paths searched for libraries - static private String usr_paths[]; - static private String sys_paths[]; + private static String usr_paths[]; + private static String sys_paths[]; private static String[] initializePath(String propname) { String ldpath = System.getProperty(propname, ""); @@ -1803,7 +1943,10 @@ public abstract class ClassLoader { // -- Assertion management -- + final Object assertionLock; + // The default toggle for assertion checking. + // @GuardedBy("assertionLock") private boolean defaultAssertionStatus = false; // Maps String packageName to Boolean package default assertion status Note @@ -1811,12 +1954,14 @@ public abstract class ClassLoader { // is null then we are delegating assertion status queries to the VM, i.e., // none of this ClassLoader's assertion status modification methods have // been invoked. + // @GuardedBy("assertionLock") private Map packageAssertionStatus = null; // Maps String fullyQualifiedClassName to Boolean assertionStatus If this // field is null then we are delegating assertion status queries to the VM, // i.e., none of this ClassLoader's assertion status modification methods // have been invoked. + // @GuardedBy("assertionLock") Map classAssertionStatus = null; /** @@ -1834,11 +1979,13 @@ public abstract class ClassLoader { * * @since 1.4 */ - public synchronized void setDefaultAssertionStatus(boolean enabled) { - if (classAssertionStatus == null) - initializeJavaAssertionMaps(); + public void setDefaultAssertionStatus(boolean enabled) { + synchronized (assertionLock) { + if (classAssertionStatus == null) + initializeJavaAssertionMaps(); - defaultAssertionStatus = enabled; + defaultAssertionStatus = enabled; + } } /** @@ -1878,13 +2025,14 @@ public abstract class ClassLoader { * * @since 1.4 */ - public synchronized void setPackageAssertionStatus(String packageName, - boolean enabled) - { - if (packageAssertionStatus == null) - initializeJavaAssertionMaps(); + public void setPackageAssertionStatus(String packageName, + boolean enabled) { + synchronized (assertionLock) { + if (packageAssertionStatus == null) + initializeJavaAssertionMaps(); - packageAssertionStatus.put(packageName, enabled); + packageAssertionStatus.put(packageName, enabled); + } } /** @@ -1909,13 +2057,13 @@ public abstract class ClassLoader { * * @since 1.4 */ - public synchronized void setClassAssertionStatus(String className, - boolean enabled) - { - if (classAssertionStatus == null) - initializeJavaAssertionMaps(); + public void setClassAssertionStatus(String className, boolean enabled) { + synchronized (assertionLock) { + if (classAssertionStatus == null) + initializeJavaAssertionMaps(); - classAssertionStatus.put(className, enabled); + classAssertionStatus.put(className, enabled); + } } /** @@ -1928,15 +2076,16 @@ public abstract class ClassLoader { * * @since 1.4 */ - public synchronized void clearAssertionStatus() { + public void clearAssertionStatus() { /* * Whether or not "Java assertion maps" are initialized, set * them to empty maps, effectively ignoring any present settings. */ - classAssertionStatus = new HashMap(); - packageAssertionStatus = new HashMap(); - - defaultAssertionStatus = false; + synchronized (assertionLock) { + classAssertionStatus = new HashMap(); + packageAssertionStatus = new HashMap(); + defaultAssertionStatus = false; + } } /** @@ -1961,39 +2110,40 @@ public abstract class ClassLoader { * * @since 1.4 */ - synchronized boolean desiredAssertionStatus(String className) { - Boolean result; + boolean desiredAssertionStatus(String className) { + synchronized (assertionLock) { + // assert classAssertionStatus != null; + // assert packageAssertionStatus != null; - // assert classAssertionStatus != null; - // assert packageAssertionStatus != null; - - // Check for a class entry - result = classAssertionStatus.get(className); - if (result != null) - return result.booleanValue(); - - // Check for most specific package entry - int dotIndex = className.lastIndexOf("."); - if (dotIndex < 0) { // default package - result = packageAssertionStatus.get(null); + // Check for a class entry + Boolean result = classAssertionStatus.get(className); if (result != null) return result.booleanValue(); - } - while(dotIndex > 0) { - className = className.substring(0, dotIndex); - result = packageAssertionStatus.get(className); - if (result != null) - return result.booleanValue(); - dotIndex = className.lastIndexOf(".", dotIndex-1); - } - // Return the classloader default - return defaultAssertionStatus; + // Check for most specific package entry + int dotIndex = className.lastIndexOf("."); + if (dotIndex < 0) { // default package + result = packageAssertionStatus.get(null); + if (result != null) + return result.booleanValue(); + } + while(dotIndex > 0) { + className = className.substring(0, dotIndex); + result = packageAssertionStatus.get(className); + if (result != null) + return result.booleanValue(); + dotIndex = className.lastIndexOf(".", dotIndex-1); + } + + // Return the classloader default + return defaultAssertionStatus; + } } // Set up the assertions with information provided by the VM. + // Note: Should only be called inside a synchronized block private void initializeJavaAssertionMaps() { - // assert Thread.holdsLock(this); + // assert Thread.holdsLock(assertionLock); classAssertionStatus = new HashMap(); packageAssertionStatus = new HashMap(); diff --git a/jdk/src/share/classes/java/net/URLClassLoader.java b/jdk/src/share/classes/java/net/URLClassLoader.java index afb92b8c938..601601a5652 100644 --- a/jdk/src/share/classes/java/net/URLClassLoader.java +++ b/jdk/src/share/classes/java/net/URLClassLoader.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -74,10 +74,10 @@ import sun.security.util.SecurityConstants; */ public class URLClassLoader extends SecureClassLoader implements Closeable { /* The search path for classes and resources */ - URLClassPath ucp; + private final URLClassPath ucp; /* The context to be used when loading classes and resources */ - private AccessControlContext acc; + private final AccessControlContext acc; /** * Constructs a new URLClassLoader for the given URLs. The URLs will be @@ -105,7 +105,19 @@ public class URLClassLoader extends SecureClassLoader implements Closeable { security.checkCreateClassLoader(); } ucp = new URLClassPath(urls); - acc = AccessController.getContext(); + this.acc = AccessController.getContext(); + } + + URLClassLoader(URL[] urls, ClassLoader parent, + AccessControlContext acc) { + super(parent); + // this is to make the stack depth consistent with 1.1 + SecurityManager security = System.getSecurityManager(); + if (security != null) { + security.checkCreateClassLoader(); + } + ucp = new URLClassPath(urls); + this.acc = acc; } /** @@ -136,7 +148,18 @@ public class URLClassLoader extends SecureClassLoader implements Closeable { security.checkCreateClassLoader(); } ucp = new URLClassPath(urls); - acc = AccessController.getContext(); + this.acc = AccessController.getContext(); + } + + URLClassLoader(URL[] urls, AccessControlContext acc) { + super(); + // this is to make the stack depth consistent with 1.1 + SecurityManager security = System.getSecurityManager(); + if (security != null) { + security.checkCreateClassLoader(); + } + ucp = new URLClassPath(urls); + this.acc = acc; } /** @@ -599,17 +622,14 @@ public class URLClassLoader extends SecureClassLoader implements Closeable { public static URLClassLoader newInstance(final URL[] urls, final ClassLoader parent) { // Save the caller's context - AccessControlContext acc = AccessController.getContext(); + final AccessControlContext acc = AccessController.getContext(); // Need a privileged block to create the class loader URLClassLoader ucl = AccessController.doPrivileged( new PrivilegedAction() { public URLClassLoader run() { - return new FactoryURLClassLoader(urls, parent); + return new FactoryURLClassLoader(urls, parent, acc); } }); - // Now set the context on the loader using the one we saved, - // not the one inside the privileged block... - ucl.acc = acc; return ucl; } @@ -626,18 +646,14 @@ public class URLClassLoader extends SecureClassLoader implements Closeable { */ public static URLClassLoader newInstance(final URL[] urls) { // Save the caller's context - AccessControlContext acc = AccessController.getContext(); + final AccessControlContext acc = AccessController.getContext(); // Need a privileged block to create the class loader URLClassLoader ucl = AccessController.doPrivileged( new PrivilegedAction() { public URLClassLoader run() { - return new FactoryURLClassLoader(urls); + return new FactoryURLClassLoader(urls, acc); } }); - - // Now set the context on the loader using the one we saved, - // not the one inside the privileged block... - ucl.acc = acc; return ucl; } @@ -649,20 +665,26 @@ public class URLClassLoader extends SecureClassLoader implements Closeable { } } ); + ClassLoader.registerAsParallelCapable(); } } final class FactoryURLClassLoader extends URLClassLoader { - FactoryURLClassLoader(URL[] urls, ClassLoader parent) { - super(urls, parent); + static { + ClassLoader.registerAsParallelCapable(); } - FactoryURLClassLoader(URL[] urls) { - super(urls); + FactoryURLClassLoader(URL[] urls, ClassLoader parent, + AccessControlContext acc) { + super(urls, parent, acc); } - public final synchronized Class loadClass(String name, boolean resolve) + FactoryURLClassLoader(URL[] urls, AccessControlContext acc) { + super(urls, acc); + } + + public final Class loadClass(String name, boolean resolve) throws ClassNotFoundException { // First check if we have permission to access the package. This diff --git a/jdk/src/share/classes/java/security/SecureClassLoader.java b/jdk/src/share/classes/java/security/SecureClassLoader.java index fac4596359c..ff11f38aaaa 100644 --- a/jdk/src/share/classes/java/security/SecureClassLoader.java +++ b/jdk/src/share/classes/java/security/SecureClassLoader.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -45,14 +45,19 @@ public class SecureClassLoader extends ClassLoader { * succeed. Otherwise the object is not initialized and the object is * useless. */ - private boolean initialized = false; + private final boolean initialized; // HashMap that maps CodeSource to ProtectionDomain - private HashMap pdcache = + // @GuardedBy("pdcache") + private final HashMap pdcache = new HashMap(11); private static final Debug debug = Debug.getInstance("scl"); + static { + ClassLoader.registerAsParallelCapable(); + } + /** * Creates a new SecureClassLoader using the specified parent * class loader for delegation. @@ -136,10 +141,7 @@ public class SecureClassLoader extends ClassLoader { byte[] b, int off, int len, CodeSource cs) { - if (cs == null) - return defineClass(name, b, off, len); - else - return defineClass(name, b, off, len, getProtectionDomain(cs)); + return defineClass(name, b, off, len, getProtectionDomain(cs)); } /** @@ -172,10 +174,7 @@ public class SecureClassLoader extends ClassLoader { protected final Class defineClass(String name, java.nio.ByteBuffer b, CodeSource cs) { - if (cs == null) - return defineClass(name, b, (ProtectionDomain)null); - else - return defineClass(name, b, getProtectionDomain(cs)); + return defineClass(name, b, getProtectionDomain(cs)); } /** @@ -209,12 +208,10 @@ public class SecureClassLoader extends ClassLoader { if (pd == null) { PermissionCollection perms = getPermissions(cs); pd = new ProtectionDomain(cs, perms, this, null); - if (pd != null) { - pdcache.put(cs, pd); - if (debug != null) { - debug.println(" getPermissions "+ pd); - debug.println(""); - } + pdcache.put(cs, pd); + if (debug != null) { + debug.println(" getPermissions "+ pd); + debug.println(""); } } } diff --git a/jdk/src/share/classes/sun/misc/Launcher.java b/jdk/src/share/classes/sun/misc/Launcher.java index a64986e6260..030d3e571a1 100644 --- a/jdk/src/share/classes/sun/misc/Launcher.java +++ b/jdk/src/share/classes/sun/misc/Launcher.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-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 @@ -120,7 +120,10 @@ public class Launcher { * The class loader used for loading installed extensions. */ static class ExtClassLoader extends URLClassLoader { - private File[] dirs; + + static { + ClassLoader.registerAsParallelCapable(); + } /** * create an ExtClassLoader. The ExtClassLoader is created @@ -146,12 +149,12 @@ public class Launcher { } }); } catch (java.security.PrivilegedActionException e) { - throw (IOException) e.getException(); + throw (IOException) e.getException(); } } void addExtURL(URL url) { - super.addURL(url); + super.addURL(url); } /* @@ -159,7 +162,6 @@ public class Launcher { */ public ExtClassLoader(File[] dirs) throws IOException { super(getExtURLs(dirs), null, factory); - this.dirs = dirs; } private static File[] getExtDirs() { @@ -206,20 +208,27 @@ public class Launcher { */ public String findLibrary(String name) { name = System.mapLibraryName(name); - for (int i = 0; i < dirs.length; i++) { - // Look in architecture-specific subdirectory first - String arch = System.getProperty("os.arch"); - if (arch != null) { - File file = new File(new File(dirs[i], arch), name); + URL[] urls = super.getURLs(); + File prevDir = null; + for (int i = 0; i < urls.length; i++) { + // Get the ext directory from the URL + File dir = new File(urls[i].getPath()).getParentFile(); + if (dir != null && !dir.equals(prevDir)) { + // Look in architecture-specific subdirectory first + String arch = System.getProperty("os.arch"); + if (arch != null) { + File file = new File(new File(dir, arch), name); + if (file.exists()) { + return file.getAbsolutePath(); + } + } + // Then check the extension directory + File file = new File(dir, name); if (file.exists()) { return file.getAbsolutePath(); } } - // Then check the extension directory - File file = new File(dirs[i], name); - if (file.exists()) { - return file.getAbsolutePath(); - } + prevDir = dir; } return null; } @@ -248,6 +257,10 @@ public class Launcher { */ static class AppClassLoader extends URLClassLoader { + static { + ClassLoader.registerAsParallelCapable(); + } + public static ClassLoader getAppClassLoader(final ClassLoader extcl) throws IOException { @@ -281,7 +294,7 @@ public class Launcher { /** * Override loadClass so we can checkPackageAccess. */ - public synchronized Class loadClass(String name, boolean resolve) + public Class loadClass(String name, boolean resolve) throws ClassNotFoundException { int i = name.lastIndexOf('.'); diff --git a/jdk/src/share/native/java/lang/ClassLoader.c b/jdk/src/share/native/java/lang/ClassLoader.c index 6f5960af5bf..bedf87ce7e6 100644 --- a/jdk/src/share/native/java/lang/ClassLoader.c +++ b/jdk/src/share/native/java/lang/ClassLoader.c @@ -1,5 +1,5 @@ /* - * Copyright 1996-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -437,3 +437,21 @@ Java_java_lang_ClassLoader_00024NativeLibrary_find (*env)->ReleaseStringUTFChars(env, name, cname); return res; } + +JNIEXPORT jobject JNICALL +Java_java_lang_ClassLoader_getCaller(JNIEnv *env, jclass cls, jint index) +{ + jobjectArray jcallerStack; + int len; + + jcallerStack = JVM_GetClassContext(env); + if ((*env)->ExceptionCheck(env)) { + return NULL; + } + len = (*env)->GetArrayLength(env, jcallerStack); + if (index < len) { + return (*env)->GetObjectArrayElement(env, jcallerStack, index); + } + return NULL; +} + diff --git a/jdk/test/java/lang/ClassLoader/deadlock/Alice.java b/jdk/test/java/lang/ClassLoader/deadlock/Alice.java new file mode 100644 index 00000000000..9fae5e411a8 --- /dev/null +++ b/jdk/test/java/lang/ClassLoader/deadlock/Alice.java @@ -0,0 +1,29 @@ +/* + * Copyright 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. + */ +package comSA; + +public class Alice extends comSB.SupAlice { + static { + System.out.println("comSA.Alice loaded"); + } +} diff --git a/jdk/test/java/lang/ClassLoader/deadlock/Bob.java b/jdk/test/java/lang/ClassLoader/deadlock/Bob.java new file mode 100644 index 00000000000..ca0c279ec91 --- /dev/null +++ b/jdk/test/java/lang/ClassLoader/deadlock/Bob.java @@ -0,0 +1,29 @@ +/* + * Copyright 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. + */ +package comSB; + +public class Bob extends comSA.SupBob { + static { + System.out.println("comSB.Bob loaded"); + } +} diff --git a/jdk/test/java/lang/ClassLoader/deadlock/DelegatingLoader.java b/jdk/test/java/lang/ClassLoader/deadlock/DelegatingLoader.java new file mode 100644 index 00000000000..def58c9e53c --- /dev/null +++ b/jdk/test/java/lang/ClassLoader/deadlock/DelegatingLoader.java @@ -0,0 +1,93 @@ +/* + * Copyright 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. + */ + +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.locks.*; +import java.lang.reflect.*; + +public class DelegatingLoader extends URLClassLoader { + + private DelegatingLoader delLoader; + private String[] delClasses; + + static { + boolean supportParallel = false; + try { + Class c = Class.forName("java.lang.ClassLoader"); + Method m = c.getDeclaredMethod("registerAsParallelCapable", + new Class[0]); + m.setAccessible(true); + Object result = (Boolean) m.invoke(null); + if (result instanceof Boolean) { + supportParallel = ((Boolean) result).booleanValue(); + } else { + // Should never happen + System.out.println("Error: ClassLoader.registerAsParallelCapable() did not return a boolean!"); + System.exit(1); + } + } catch (NoSuchMethodException nsme) { + System.out.println("No ClassLoader.registerAsParallelCapable() API"); + } catch (NoSuchMethodError nsme2) { + System.out.println("No ClassLoader.registerAsParallelCapable() API"); + } catch (Exception ex) { + ex.printStackTrace(); + // Exit immediately to indicate an error + System.exit(1); + } + System.out.println("Parallel ClassLoader registration: " + + supportParallel); + } + + public DelegatingLoader(URL urls[]) { + super(urls); + System.out.println("DelegatingLoader using URL " + urls[0]); + } + + public void setDelegate(String[] delClasses, DelegatingLoader delLoader) { + this.delClasses = delClasses; + this.delLoader = delLoader; + } + + public Class loadClass(String className, boolean resolve) + throws ClassNotFoundException { + for (int i = 0; i < delClasses.length; i++) { + if (delClasses[i].equals(className)) { + Starter.log("Delegating class loading for " + className); + try { + Thread.sleep(500); + } catch (InterruptedException ie) { + return null; + } + return delLoader.loadClass(className, resolve); + } + } + + Starter.log("Loading local class " + className); +// synchronized (getClassLoadingLock(className)) { + return super.loadClass(className, resolve); +// } + } +} diff --git a/jdk/test/java/lang/ClassLoader/deadlock/Starter.java b/jdk/test/java/lang/ClassLoader/deadlock/Starter.java new file mode 100644 index 00000000000..c23edb92d31 --- /dev/null +++ b/jdk/test/java/lang/ClassLoader/deadlock/Starter.java @@ -0,0 +1,105 @@ +/* + * Copyright 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. + */ + +import java.net.MalformedURLException; +import java.net.URL; + +public class Starter implements Runnable { + + private String id; + private DelegatingLoader dl; + private String startClass; + + private static DelegatingLoader saLoader, sbLoader; + + public static void log(String line) { + System.out.println(line); + } + + public static void main(String[] args) { + URL[] urlsa = new URL[1]; + URL[] urlsb = new URL[1]; + try { + String testDir = System.getProperty("test.classes", "."); + String sep = System.getProperty("file.separator"); + urlsa[0] = new URL("file://" + testDir + sep + "SA" + sep); + urlsb[0] = new URL("file://" + testDir + sep + "SB" + sep); + } catch (MalformedURLException e) { + e.printStackTrace(); + } + // Set up Classloader delegation hierarchy + saLoader = new DelegatingLoader(urlsa); + sbLoader = new DelegatingLoader(urlsb); + + String[] saClasses = { "comSA.SupBob", "comSA.Alice" }; + String[] sbClasses = { "comSB.SupAlice", "comSB.Bob" }; + + saLoader.setDelegate(sbClasses, sbLoader); + sbLoader.setDelegate(saClasses, saLoader); + + // test one-way delegate + String testType = args[0]; + if (testType.equals("one-way")) { + test("comSA.Alice", "comSA.SupBob"); + } else if (testType.equals("cross")) { + // test cross delegate + test("comSA.Alice", "comSB.Bob"); + } else { + System.out.println("ERROR: unsupported - " + testType); + } + } + + private static void test(String clsForSA, String clsForSB) { + Starter ia = new Starter("SA", saLoader, clsForSA); + Starter ib = new Starter("SB", sbLoader, clsForSB); + new Thread(ia).start(); + new Thread(ib).start(); + } + + public static void sleep() { + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + log("Thread interrupted"); + } + } + + private Starter(String id, DelegatingLoader dl, String startClass) { + this.id = id; + this.dl = dl; + this.startClass = startClass; + } + + public void run() { + log("Spawned thread " + id + " running"); + try { + // To mirror the WAS deadlock, need to ensure class load + // is routed via the VM. + Class.forName(startClass, true, dl); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + log("Thread " + id + " terminating"); + } +} diff --git a/jdk/test/java/lang/ClassLoader/deadlock/SupAlice.java b/jdk/test/java/lang/ClassLoader/deadlock/SupAlice.java new file mode 100644 index 00000000000..4b04580e01b --- /dev/null +++ b/jdk/test/java/lang/ClassLoader/deadlock/SupAlice.java @@ -0,0 +1,29 @@ +/* + * Copyright 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. + */ +package comSB; + +public class SupAlice { + static { + System.out.println("comSB.SupAlice loaded"); + } +} diff --git a/jdk/test/java/lang/ClassLoader/deadlock/SupBob.java b/jdk/test/java/lang/ClassLoader/deadlock/SupBob.java new file mode 100644 index 00000000000..05cfde319fd --- /dev/null +++ b/jdk/test/java/lang/ClassLoader/deadlock/SupBob.java @@ -0,0 +1,29 @@ +/* + * Copyright 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. + */ +package comSA; + +public class SupBob { + static { + System.out.println("comSA.SupBob loaded"); + } +} diff --git a/jdk/test/java/lang/ClassLoader/deadlock/TestCrossDelegate.sh b/jdk/test/java/lang/ClassLoader/deadlock/TestCrossDelegate.sh new file mode 100644 index 00000000000..5c1a1aeb653 --- /dev/null +++ b/jdk/test/java/lang/ClassLoader/deadlock/TestCrossDelegate.sh @@ -0,0 +1,105 @@ +# +# Copyright 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 4735126 +# @summary (cl) ClassLoader.loadClass locks all instances in chain +# when delegating +# +# @run shell/timeout=10 TestCrossDelegate.sh + +# if running by hand on windows, change TESTSRC and TESTCLASSES to "." +if [ "${TESTSRC}" = "" ] ; then + TESTSRC=`pwd` +fi +if [ "${TESTCLASSES}" = "" ] ; then + TESTCLASSES=`pwd` +fi + +# if running by hand on windows, change this to appropriate value +if [ "${TESTJAVA}" = "" ] ; then + echo "TESTJAVA not set. Test cannot execute." + echo "FAILED!!!" + exit 1 +fi +echo TESTSRC=${TESTSRC} +echo TESTCLASSES=${TESTCLASSES} +echo TESTJAVA=${TESTJAVA} +echo "" + +# set platform-specific variables +OS=`uname -s` +case "$OS" in + SunOS ) + FS="/" + ;; + Linux ) + FS="/" + ;; + Windows* ) + FS="\\" + ;; +esac + +# compile test +${TESTJAVA}${FS}bin${FS}javac \ + -d ${TESTCLASSES} \ + ${TESTSRC}${FS}Starter.java ${TESTSRC}${FS}DelegatingLoader.java + +STATUS=$? +if [ ${STATUS} -ne 0 ] +then + exit ${STATUS} +fi + +# set up test +${TESTJAVA}${FS}bin${FS}javac \ + -d ${TESTCLASSES}${FS} \ + ${TESTSRC}${FS}Alice.java ${TESTSRC}${FS}SupBob.java \ + ${TESTSRC}${FS}Bob.java ${TESTSRC}${FS}SupAlice.java + +cd ${TESTCLASSES} +DIRS="SA SB" +for dir in $DIRS +do + if [ -d ${dir} ]; then + rm -rf ${dir} + fi + mkdir ${dir} + mv com${dir} ${dir} +done + +# run test +${TESTJAVA}${FS}bin${FS}java \ + -verbose:class -XX:+TraceClassLoading -cp . \ + -Dtest.classes=${TESTCLASSES} \ + Starter cross +# -XX:+UnlockDiagnosticVMOptions -XX:+UnsyncloadClass \ + +# save error status +STATUS=$? + +# clean up +rm -rf ${TESTCLASSES}${FS}SA ${TESTCLASSES}${FS}SB + +# return +exit ${STATUS} diff --git a/jdk/test/java/lang/ClassLoader/deadlock/TestOneWayDelegate.sh b/jdk/test/java/lang/ClassLoader/deadlock/TestOneWayDelegate.sh new file mode 100644 index 00000000000..1f6a08ff342 --- /dev/null +++ b/jdk/test/java/lang/ClassLoader/deadlock/TestOneWayDelegate.sh @@ -0,0 +1,105 @@ +# +# Copyright 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 4735126 +# @summary (cl) ClassLoader.loadClass locks all instances in chain +# when delegating +# +# @run shell/timeout=10 TestOneWayDelegate.sh + +# if running by hand on windows, change TESTSRC and TESTCLASSES to "." +if [ "${TESTSRC}" = "" ] ; then + TESTSRC=`pwd` +fi +if [ "${TESTCLASSES}" = "" ] ; then + TESTCLASSES=`pwd` +fi + +# if running by hand on windows, change this to appropriate value +if [ "${TESTJAVA}" = "" ] ; then + echo "TESTJAVA not set. Test cannot execute." + echo "FAILED!!!" + exit 1 +fi +echo TESTSRC=${TESTSRC} +echo TESTCLASSES=${TESTCLASSES} +echo TESTJAVA=${TESTJAVA} +echo "" + +# set platform-specific variables +OS=`uname -s` +case "$OS" in + SunOS ) + FS="/" + ;; + Linux ) + FS="/" + ;; + Windows* ) + FS="\\" + ;; +esac + +# compile test +${TESTJAVA}${FS}bin${FS}javac \ + -d ${TESTCLASSES} \ + ${TESTSRC}${FS}Starter.java ${TESTSRC}${FS}DelegatingLoader.java + +STATUS=$? +if [ ${STATUS} -ne 0 ] +then + exit ${STATUS} +fi + +# set up test +${TESTJAVA}${FS}bin${FS}javac \ + -d ${TESTCLASSES}${FS} \ + ${TESTSRC}${FS}Alice.java ${TESTSRC}${FS}SupBob.java \ + ${TESTSRC}${FS}Bob.java ${TESTSRC}${FS}SupAlice.java + +cd ${TESTCLASSES} +DIRS="SA SB" +for dir in $DIRS +do + if [ -d ${dir} ]; then + rm -rf ${dir} + fi + mkdir ${dir} + mv com${dir} ${dir} +done + +# run test +${TESTJAVA}${FS}bin${FS}java \ + -verbose:class -XX:+TraceClassLoading -cp . \ + -Dtest.classes=${TESTCLASSES} \ + Starter one-way +# -XX:+UnlockDiagnosticVMOptions -XX:+UnsyncloadClass \ + +# save error status +STATUS=$? + +# clean up +rm -rf ${TESTCLASSES}${FS}SA ${TESTCLASSES}${FS}SB + +# return +exit ${STATUS} From a2a7ded4d4cbdc085dde4db0af6ddf4e0bb5c724 Mon Sep 17 00:00:00 2001 From: Valerie Peng Date: Mon, 6 Apr 2009 18:52:03 -0700 Subject: [PATCH 259/292] 6440846: (cl) Deadlock between AppClassLoader and ExtClassLoader Fixed a deadlock between the two class loaders Reviewed-by: alanb --- .../sun/security/jca/ProviderConfig.java | 72 ++++---------- .../ClassLoaderDeadlock/CreateSerialized.java | 35 +++++++ .../ClassLoaderDeadlock/Deadlock2.java | 70 +++++++++++++ .../Security/ClassLoaderDeadlock/Deadlock2.sh | 99 +++++++++++++++++++ 4 files changed, 221 insertions(+), 55 deletions(-) create mode 100644 jdk/test/java/security/Security/ClassLoaderDeadlock/CreateSerialized.java create mode 100644 jdk/test/java/security/Security/ClassLoaderDeadlock/Deadlock2.java create mode 100644 jdk/test/java/security/Security/ClassLoaderDeadlock/Deadlock2.sh diff --git a/jdk/src/share/classes/sun/security/jca/ProviderConfig.java b/jdk/src/share/classes/sun/security/jca/ProviderConfig.java index 9b40307b166..576c6803204 100644 --- a/jdk/src/share/classes/sun/security/jca/ProviderConfig.java +++ b/jdk/src/share/classes/sun/security/jca/ProviderConfig.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-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 @@ -60,37 +60,6 @@ final class ProviderConfig { // use by doLoadProvider() private final static Class[] CL_STRING = { String.class }; - // lock to use while loading a provider. it ensures that each provider - // is loaded only once and that we can detect recursion. - // NOTE that because of 4944382 we use the system classloader as lock. - // By using the same lock to load classes as to load providers we avoid - // deadlock due to lock ordering. However, this class may be initialized - // early in the startup when the system classloader has not yet been set - // up. Use a temporary lock object if that is the case. - // Any of this may break if the class loading implementation is changed. - private static volatile Object LOCK = new Object(); - - private static Object getLock() { - Object o = LOCK; - // check if lock is already set to the class loader - if (o instanceof ClassLoader) { - return o; - } - Object cl = AccessController.doPrivileged( - new PrivilegedAction() { - public Object run() { - return ClassLoader.getSystemClassLoader(); - } - }); - // check if class loader initialized now (non-null) - if (cl != null) { - LOCK = cl; - o = cl; - } - return o; - } - - // name of the provider class private final String className; @@ -194,7 +163,7 @@ final class ProviderConfig { /** * Get the provider object. Loads the provider if it is not already loaded. */ - Provider getProvider() { + synchronized Provider getProvider() { // volatile variable load Provider p = provider; if (p != null) { @@ -203,30 +172,23 @@ final class ProviderConfig { if (shouldLoad() == false) { return null; } - synchronized (getLock()) { - p = provider; - if (p != null) { - // loaded by another thread while we were blocked on lock - return p; + if (isLoading) { + // because this method is synchronized, this can only + // happen if there is recursion. + if (debug != null) { + debug.println("Recursion loading provider: " + this); + new Exception("Call trace").printStackTrace(); } - if (isLoading) { - // because this method is synchronized, this can only - // happen if there is recursion. - if (debug != null) { - debug.println("Recursion loading provider: " + this); - new Exception("Call trace").printStackTrace(); - } - return null; - } - try { - isLoading = true; - tries++; - p = doLoadProvider(); - } finally { - isLoading = false; - } - provider = p; + return null; } + try { + isLoading = true; + tries++; + p = doLoadProvider(); + } finally { + isLoading = false; + } + provider = p; return p; } diff --git a/jdk/test/java/security/Security/ClassLoaderDeadlock/CreateSerialized.java b/jdk/test/java/security/Security/ClassLoaderDeadlock/CreateSerialized.java new file mode 100644 index 00000000000..89595ed428e --- /dev/null +++ b/jdk/test/java/security/Security/ClassLoaderDeadlock/CreateSerialized.java @@ -0,0 +1,35 @@ +/* + * Copyright 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. + */ +import java.io.*; +import sun.misc.*; + +public class CreateSerialized { + public static void main(String[] args) throws Exception { + Object o = new com.sun.crypto.provider.SunJCE(); + + FileOutputStream fos = new FileOutputStream("object.tmp"); + ObjectOutputStream objectOutputStream = new ObjectOutputStream(fos); + objectOutputStream.writeObject(o); + fos.close(); + } +} diff --git a/jdk/test/java/security/Security/ClassLoaderDeadlock/Deadlock2.java b/jdk/test/java/security/Security/ClassLoaderDeadlock/Deadlock2.java new file mode 100644 index 00000000000..b5938d1de88 --- /dev/null +++ b/jdk/test/java/security/Security/ClassLoaderDeadlock/Deadlock2.java @@ -0,0 +1,70 @@ +/* + * Copyright 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. + */ +import java.io.*; +import javax.xml.parsers.DocumentBuilderFactory; +import java.security.*; + +public class Deadlock2 { + public static void main(String[] args) throws Exception { + File file = new File("object.tmp"); + final byte[] bytes = new byte[(int) file.length()]; + FileInputStream fileInputStream = new FileInputStream(file); + int read = fileInputStream.read(bytes); + if (read != file.length()) { + throw new Exception("Didn't read all"); + } + Thread.sleep(1000); + + Runnable xmlRunnable = new Runnable() { + public void run() { + try { + DocumentBuilderFactory.newInstance(); + } catch (Exception e) { + e.printStackTrace(); + } + } + }; + + Runnable readObjectRunnable = new Runnable() { + public void run() { + try { + ObjectInputStream objectInputStream = + new ObjectInputStream(new ByteArrayInputStream(bytes)); + Object o = objectInputStream.readObject(); + System.out.println(o.getClass()); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + Thread thread1 = new Thread(readObjectRunnable, "Read Object"); + Thread thread2 = new Thread(xmlRunnable, "XML"); + + thread1.start(); + thread2.start(); + + thread1.join(); + thread2.join(); + } +} diff --git a/jdk/test/java/security/Security/ClassLoaderDeadlock/Deadlock2.sh b/jdk/test/java/security/Security/ClassLoaderDeadlock/Deadlock2.sh new file mode 100644 index 00000000000..750e2a7d3a1 --- /dev/null +++ b/jdk/test/java/security/Security/ClassLoaderDeadlock/Deadlock2.sh @@ -0,0 +1,99 @@ +#!/bin/sh + +# +# Copyright 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 6440846 +# @summary make sure we do not deadlock between ExtClassLoader and AppClassLoader +# @author Valerie Peng +# @run shell/timeout=20 Deadlock2.sh + +# set a few environment variables so that the shell-script can run stand-alone +# in the source directory + +if [ "${TESTSRC}" = "" ] ; then + TESTSRC="." +fi + +if [ "${TESTCLASSES}" = "" ] ; then + TESTCLASSES="." +fi + +if [ "${TESTJAVA}" = "" ] ; then + echo "TESTJAVA not set. Test cannot execute." + echo "FAILED!!!" + exit 1 +fi + +# set platform-dependent variables +OS=`uname -s` +case "$OS" in + SunOS ) + PATHSEP=":" + FILESEP="/" + ;; + Linux ) + PATHSEP=":" + FILESEP="/" + ;; + Windows* ) + PATHSEP=";" + FILESEP="\\" + ;; + * ) + echo "Unrecognized system!" + exit 1; + ;; +esac + +# remove old class files +cd ${TESTCLASSES} +rm -f Deadlock2*.class +if [ -d testlib ] ; then + rm -rf testlib +fi +cp -r ${TESTJAVA}${FILESEP}lib${FILESEP}ext testlib + +# compile and package the test program +${TESTJAVA}${FILESEP}bin${FILESEP}javac \ + -d ${TESTCLASSES} \ + ${TESTSRC}${FILESEP}CreateSerialized.java \ + ${TESTSRC}${FILESEP}Deadlock2.java + +${TESTJAVA}${FILESEP}bin${FILESEP}jar \ + -cvf testlib${FILESEP}Deadlock2.jar \ + Deadlock2*.class + +rm Deadlock2*.class + +# create serialized object and run the test +${TESTJAVA}${FILESEP}bin${FILESEP}java CreateSerialized +${TESTJAVA}${FILESEP}bin${FILESEP}java -Djava.ext.dirs=${TESTCLASSES}${FILESEP}testlib Deadlock2 +STATUS=$? + +# clean up +rm object.tmp CreateSerialized.class +rm -rf testlib +exit ${STATUS} From 193bce6e2e733ae5c1039cf52c9a7e1c104e9571 Mon Sep 17 00:00:00 2001 From: Dmitry Cherepanov Date: Tue, 7 Apr 2009 10:27:18 +0400 Subject: [PATCH 260/292] 6663040: Using com.sun.awt.AWTUtilities do not give warning while compilation Reviewed-by: yan, anthony --- .../classes/com/sun/tools/javac/resources/legacy.properties | 1 + 1 file changed, 1 insertion(+) diff --git a/langtools/src/share/classes/com/sun/tools/javac/resources/legacy.properties b/langtools/src/share/classes/com/sun/tools/javac/resources/legacy.properties index 6e7f6bed786..762d94adb25 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/resources/legacy.properties +++ b/langtools/src/share/classes/com/sun/tools/javac/resources/legacy.properties @@ -24,6 +24,7 @@ # com.sun.accessibility.internal.resources = tiger legacy +com.sun.awt = tiger legacy com.sun.beans = tiger legacy com.sun.corba.se.impl.activation = tiger legacy com.sun.corba.se.impl.copyobject = tiger legacy From 406119889a5b2442c31e7ed82ef085f057ff6310 Mon Sep 17 00:00:00 2001 From: Peter Zhelezniakov Date: Tue, 7 Apr 2009 12:40:58 +0400 Subject: [PATCH 261/292] 6740974: api/javax_swing/PopupFactory/index.html#Ctor[PopupFactory2002] fails with NPE Reviewed-by: malenkov --- jdk/src/share/classes/javax/swing/PopupFactory.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/jdk/src/share/classes/javax/swing/PopupFactory.java b/jdk/src/share/classes/javax/swing/PopupFactory.java index 753959cea1f..1eb6d1b5405 100644 --- a/jdk/src/share/classes/javax/swing/PopupFactory.java +++ b/jdk/src/share/classes/javax/swing/PopupFactory.java @@ -552,14 +552,15 @@ public class PopupFactory { boolean result = false; Component component = getComponent(); if (owner != null && component != null) { - Container parent = (Container) SwingUtilities.getRoot(owner); int popupWidth = component.getWidth(); int popupHeight = component.getHeight(); - Rectangle parentBounds = parent.getBounds(); + + Container parent = (Container) SwingUtilities.getRoot(owner); if (parent instanceof JFrame || parent instanceof JDialog || parent instanceof JWindow) { + Rectangle parentBounds = parent.getBounds(); Insets i = parent.getInsets(); parentBounds.x += i.left; parentBounds.y += i.top; @@ -577,11 +578,11 @@ public class PopupFactory { .contains(x, y, popupWidth, popupHeight); } } else if (parent instanceof JApplet) { + Rectangle parentBounds = parent.getBounds(); Point p = parent.getLocationOnScreen(); parentBounds.x = p.x; parentBounds.y = p.y; - result = parentBounds - .contains(x, y, popupWidth, popupHeight); + result = parentBounds.contains(x, y, popupWidth, popupHeight); } } return result; From 67bb035b94ad692ac264e625c8169950a074c613 Mon Sep 17 00:00:00 2001 From: Weijun Wang Date: Wed, 8 Apr 2009 13:54:34 +0800 Subject: [PATCH 262/292] 4811968: ASN.1 (X509Certificate) implementations don't handle large OID components Reviewed-by: xuelei --- .../sun/security/util/ObjectIdentifier.java | 771 +++++++++++------- jdk/test/sun/security/util/Oid/OidFormat.java | 19 +- jdk/test/sun/security/util/Oid/S11N.sh | 164 ++++ .../sun/security/util/Oid/SerialTest.java | 66 ++ 4 files changed, 732 insertions(+), 288 deletions(-) create mode 100644 jdk/test/sun/security/util/Oid/S11N.sh create mode 100644 jdk/test/sun/security/util/Oid/SerialTest.java diff --git a/jdk/src/share/classes/sun/security/util/ObjectIdentifier.java b/jdk/src/share/classes/sun/security/util/ObjectIdentifier.java index 2ad04c0b360..717e5bcf65e 100644 --- a/jdk/src/share/classes/sun/security/util/ObjectIdentifier.java +++ b/jdk/src/share/classes/sun/security/util/ObjectIdentifier.java @@ -26,7 +26,8 @@ package sun.security.util; import java.io.*; - +import java.math.BigInteger; +import java.util.Arrays; /** * Represent an ISO Object Identifier. @@ -44,105 +45,186 @@ import java.io.*; * hierarchy, and other organizations can easily acquire the ability * to assign such unique identifiers. * - * * @author David Brownell * @author Amit Kapoor * @author Hemma Prafullchandra */ + final public class ObjectIdentifier implements Serializable { - /** use serialVersionUID from JDK 1.1. for interoperability */ + /** + * We use the DER value (no tag, no length) as the internal format + * @serial + */ + private byte[] encoding = null; + + private transient volatile String stringForm; + + /* + * IMPORTANT NOTES FOR CODE CHANGES (bug 4811968) IN JDK 1.7.0 + * =========================================================== + * + * (Almost) serialization compatibility with old versions: + * + * serialVersionUID is unchanged. Old field "component" is changed to + * type Object so that "poison" (unknown object type for old versions) + * can be put inside if there are huge components that cannot be saved + * as integers. + * + * New version use the new filed "encoding" only. + * + * Below are all 4 cases in a serialization/deserialization process: + * + * 1. old -> old: Not covered here + * 2. old -> new: There's no "encoding" field, new readObject() reads + * "components" and "componentLen" instead and inits correctly. + * 3. new -> new: "encoding" field exists, new readObject() uses it + * (ignoring the other 2 fields) and inits correctly. + * 4. new -> old: old readObject() only recognizes "components" and + * "componentLen" fields. If no huge components are involved, they + * are serialized as legal values and old object can init correctly. + * Otherwise, old object cannot recognize the form (component not int[]) + * and throw a ClassNotFoundException at deserialization time. + * + * Therfore, for the first 3 cases, exact compatibility is preserved. In + * the 4th case, non-huge OID is still supportable in old versions, while + * huge OID is not. + */ private static final long serialVersionUID = 8697030238860181294L; - private static final int maxFirstComponent = 2; - private static final int maxSecondComponent = 39; /** - * Constructs an object identifier from a string. This string - * should be of the form 1.23.34.45.56 etc. + * Changed to Object + * @serial + */ + private Object components = null; // path from root + /** + * @serial + */ + private int componentLen = -1; // how much is used. + + // Is the components field calculated? + transient private boolean componentsCalculated = false; + + private void readObject(ObjectInputStream is) + throws IOException, ClassNotFoundException { + is.defaultReadObject(); + + if (encoding == null) { // from an old version + init((int[])components, componentLen); + } + } + + private void writeObject(ObjectOutputStream os) + throws IOException { + if (!componentsCalculated) { + int[] comps = toIntArray(); + if (comps != null) { // every one understands this + components = comps; + componentLen = comps.length; + } else { + components = HugeOidNotSupportedByOldJDK.theOne; + } + componentsCalculated = true; + } + os.defaultWriteObject(); + } + + static class HugeOidNotSupportedByOldJDK implements Serializable { + private static final long serialVersionUID = 1L; + static HugeOidNotSupportedByOldJDK theOne = new HugeOidNotSupportedByOldJDK(); + } + + /** + * Constructs, from a string. This string should be of the form 1.23.56. + * Validity check included. */ public ObjectIdentifier (String oid) throws IOException { int ch = '.'; - int start = 0; + int start = 0; int end = 0; - // Calculate length of oid - componentLen = 0; - while ((end = oid.indexOf(ch,start)) != -1) { - start = end + 1; - componentLen += 1; - } - componentLen += 1; - components = new int[componentLen]; + int pos = 0; + byte[] tmp = new byte[oid.length()]; + int first = 0, second; + int count = 0; - start = 0; - int i = 0; - String comp = null; try { - while ((end = oid.indexOf(ch,start)) != -1) { - comp = oid.substring(start,end); - components[i++] = Integer.valueOf(comp).intValue(); + String comp = null; + do { + int length = 0; // length of one section + end = oid.indexOf(ch,start); + if (end == -1) { + comp = oid.substring(start); + length = oid.length() - start; + } else { + comp = oid.substring(start,end); + length = end - start; + } + + if (length > 9) { + BigInteger bignum = new BigInteger(comp); + if (count == 0) { + checkFirstComponent(bignum); + first = bignum.intValue(); + } else { + if (count == 1) { + checkSecondComponent(first, bignum); + bignum = bignum.add(BigInteger.valueOf(40*first)); + } else { + checkOtherComponent(count, bignum); + } + pos += pack7Oid(bignum, tmp, pos); + } + } else { + int num = Integer.parseInt(comp); + if (count == 0) { + checkFirstComponent(num); + first = num; + } else { + if (count == 1) { + checkSecondComponent(first, num); + num += 40 * first; + } else { + checkOtherComponent(count, num); + } + pos += pack7Oid(num, tmp, pos); + } + } start = end + 1; - } - comp = oid.substring(start); - components[i] = Integer.valueOf(comp).intValue(); + count++; + } while (end != -1); + + checkCount(count); + encoding = new byte[pos]; + System.arraycopy(tmp, 0, encoding, 0, pos); + this.stringForm = oid; + } catch (IOException ioe) { // already detected by checkXXX + throw ioe; } catch (Exception e) { throw new IOException("ObjectIdentifier() -- Invalid format: " + e.toString(), e); } - checkValidOid(components, componentLen); - this.stringForm = oid; } /** - * Check if the values make a legal OID. There must be at least 2 - * components and they must be all non-negative. The first component - * should be 0,1 or 2. When the first component is 0 or 1, the - * second component should be less than or equal to 39 - * - * @param values the components that will make the OID - * @param len the number of components to check. Note that the allocation - * size of values may be longer than len. - * In this case, only the first len items are checked. - * @exception IOException if this is not a legal OID - */ - private void checkValidOid(int[] values, int len) throws IOException { - if (values == null || len < 2) { - throw new IOException("ObjectIdentifier() -- " + - "Must be at least two oid components "); - } - - for (int i=0; i maxFirstComponent) { - throw new IOException("ObjectIdentifier() -- " + - "First oid component is invalid "); - } - - if (values[0] < 2 && values[1] > maxSecondComponent) { - throw new IOException("ObjectIdentifier() -- " + - "Second oid component is invalid "); - } - } - /** - * Constructs an object ID from an array of integers. This - * is used to construct constant object IDs. + * Constructor, from an array of integers. + * Validity check included. */ public ObjectIdentifier (int values []) throws IOException { - checkValidOid(values, values.length); - components = values.clone(); - componentLen = values.length; + checkCount(values.length); + checkFirstComponent(values[0]); + checkSecondComponent(values[0], values[1]); + for (int i=2; i bufferEnd; - ) { - component = getComponent (in); - if (component < 0) { - throw new IOException( - "ObjectIdentifier() -- " + - "component values must be nonnegative"); - } - if (first_subid) { - int X, Y; - - /* - * NOTE: the allocation quantum is large enough that we know - * we don't have to reallocate here! - */ - if (component < 40) - X = 0; - else if (component < 80) - X = 1; - else - X = 2; - Y = component - ( X * 40); - components [0] = X; - components [1] = Y; - componentLen = 2; - - first_subid = false; - - } else { - - /* - * Other components are encoded less exotically. The only - * potential trouble is the need to grow the array. - */ - if (componentLen >= components.length) { - int tmp_components []; - - tmp_components = new int [components.length - + allocationQuantum]; - System.arraycopy (components, 0, tmp_components, 0, - components.length); - components = tmp_components; - } - components [componentLen++] = component; - } - } - - checkValidOid(components, componentLen); - - /* - * Final sanity check -- if we didn't use exactly the number of bytes - * specified, something's quite wrong. - */ - if (in.available () != bufferEnd) { - throw new IOException ( - "ObjectIdentifier() -- malformed input data"); + try { + return new ObjectIdentifier(values); + } catch (IOException ex) { + throw new RuntimeException(ex); + // Should not happen, internal calls always uses legal values. } } - /* * n.b. the only public interface is DerOutputStream.putOID() */ void encode (DerOutputStream out) throws IOException { - DerOutputStream bytes = new DerOutputStream (); - int i; - - // According to ISO X.660, when the 1st component is 0 or 1, the 2nd - // component is restricted to be less than or equal to 39, thus make - // it small enough to be encoded into one single byte. - if (components[0] < 2) { - bytes.write ((components [0] * 40) + components [1]); - } else { - putComponent(bytes, (components [0] * 40) + components [1]); - } - for (i = 2; i < componentLen; i++) - putComponent (bytes, components [i]); - - /* - * Now that we've constructed the component, encode - * it in the stream we were given. - */ - out.write (DerValue.tag_ObjectId, bytes); - } - - /* - * Tricky OID component parsing technique ... note that one bit - * per octet is lost, this returns at most 28 bits of component. - * Also, notice this parses in big-endian format. - */ - private static int getComponent (DerInputStream in) - throws IOException - { - int retval, i, tmp; - - for (i = 0, retval = 0; i < 4; i++) { - retval <<= 7; - tmp = in.getByte (); - retval |= (tmp & 0x07f); - if ((tmp & 0x080) == 0) - return retval; - } - - throw new IOException ("ObjectIdentifier() -- component value too big"); - } - - /* - * Reverse of the above routine. Notice it needs to emit in - * big-endian form, so it buffers the output until it's ready. - * (Minimum length encoding is a DER requirement.) - */ - private static void putComponent (DerOutputStream out, int val) - throws IOException - { - int i; - // TODO: val must be <128*128*128*128 here, otherwise, 4 bytes is not - // enough to hold it. Will address this later. - byte buf [] = new byte [4] ; - - for (i = 0; i < 4; i++) { - buf [i] = (byte) (val & 0x07f); - val >>>= 7; - if (val == 0) - break; - } - for ( ; i > 0; --i) - out.write (buf [i] | 0x080); - out.write (buf [0]); - } - - // XXX this API should probably facilitate the JDK sort utility - - /** - * Compares this identifier with another, for sorting purposes. - * An identifier does not precede itself. - * - * @param other identifer that may precede this one. - * @return true iff other precedes this one - * in a particular sorting order. - */ - public boolean precedes (ObjectIdentifier other) - { - int i; - - // shorter IDs go first - if (other == this || componentLen < other.componentLen) - return false; - if (other.componentLen < componentLen) - return true; - - // for each component, the lesser component goes first - for (i = 0; i < componentLen; i++) { - if (other.components [i] < components [i]) - return true; - } - - // identical IDs don't precede each other - return false; + out.write (DerValue.tag_ObjectId, encoding); } /** @@ -398,6 +331,7 @@ class ObjectIdentifier implements Serializable * * @return true iff the names are identical. */ + @Override public boolean equals(Object obj) { if (this == obj) { return true; @@ -406,23 +340,71 @@ class ObjectIdentifier implements Serializable return false; } ObjectIdentifier other = (ObjectIdentifier)obj; - if (componentLen != other.componentLen) { - return false; - } - for (int i = 0; i < componentLen; i++) { - if (components[i] != other.components[i]) { - return false; - } - } - return true; + return Arrays.equals(encoding, other.encoding); } + @Override public int hashCode() { - int h = componentLen; - for (int i = 0; i < componentLen; i++) { - h += components[i] * 37; + return Arrays.hashCode(encoding); + } + + /** + * Private helper method for serialization. To be compatible with old + * versions of JDK. + * @return components in an int array, if all the components are less than + * Integer.MAX_VALUE. Otherwise, null. + */ + private int[] toIntArray() { + int length = encoding.length; + int[] result = new int[20]; + int which = 0; + int fromPos = 0; + for (int i = 0; i < length; i++) { + if ((encoding[i] & 0x80) == 0) { + // one section [fromPos..i] + if (i - fromPos + 1 > 4) { + BigInteger big = new BigInteger(pack(encoding, fromPos, i-fromPos+1, 7, 8)); + if (fromPos == 0) { + result[which++] = 2; + BigInteger second = big.subtract(BigInteger.valueOf(80)); + if (second.compareTo(BigInteger.valueOf(Integer.MAX_VALUE)) == 1) { + return null; + } else { + result[which++] = second.intValue(); + } + } else { + if (big.compareTo(BigInteger.valueOf(Integer.MAX_VALUE)) == 1) { + return null; + } else { + result[which++] = big.intValue(); + } + } + } else { + int retval = 0; + for (int j = fromPos; j <= i; j++) { + retval <<= 7; + byte tmp = encoding[j]; + retval |= (tmp & 0x07f); + } + if (fromPos == 0) { + if (retval < 80) { + result[which++] = retval / 40; + result[which++] = retval % 40; + } else { + result[which++] = 2; + result[which++] = retval - 80; + } + } else { + result[which++] = retval; + } + } + fromPos = i+1; + } + if (which >= result.length) { + result = Arrays.copyOf(result, which + 10); + } } - return h; + return Arrays.copyOf(result, which); } /** @@ -431,15 +413,52 @@ class ObjectIdentifier implements Serializable * user-friendly descriptive strings, since those strings * will not be understood everywhere. */ + @Override public String toString() { String s = stringForm; if (s == null) { - StringBuffer sb = new StringBuffer(componentLen * 4); - for (int i = 0; i < componentLen; i++) { - if (i != 0) { - sb.append('.'); + int length = encoding.length; + StringBuffer sb = new StringBuffer(length * 4); + + int fromPos = 0; + for (int i = 0; i < length; i++) { + if ((encoding[i] & 0x80) == 0) { + // one section [fromPos..i] + if (fromPos != 0) { // not the first segment + sb.append('.'); + } + if (i - fromPos + 1 > 4) { // maybe big integer + BigInteger big = new BigInteger(pack(encoding, fromPos, i-fromPos+1, 7, 8)); + if (fromPos == 0) { + // first section encoded with more than 4 bytes, + // must be 2.something + sb.append("2."); + sb.append(big.subtract(BigInteger.valueOf(80))); + } else { + sb.append(big); + } + } else { // small integer + int retval = 0; + for (int j = fromPos; j <= i; j++) { + retval <<= 7; + byte tmp = encoding[j]; + retval |= (tmp & 0x07f); + } + if (fromPos == 0) { + if (retval < 80) { + sb.append(retval/40); + sb.append('.'); + sb.append(retval%40); + } else { + sb.append("2."); + sb.append(retval - 80); + } + } else { + sb.append(retval); + } + } + fromPos = i+1; } - sb.append(components[i]); } s = sb.toString(); stringForm = s; @@ -447,15 +466,197 @@ class ObjectIdentifier implements Serializable return s; } - /* - * To simplify, we assume no individual component of an object ID is - * larger than 32 bits. Then we represent the path from the root as - * an array that's (usually) only filled at the beginning. + /** + * Repack all bits from input to output. On the both sides, only a portion + * (from the least significant bit) of the 8 bits in a byte is used. This + * number is defined as the number of useful bits (NUB) for the array. All the + * used bits from the input byte array and repacked into the output in the + * exactly same order. The output bits are aligned so that the final bit of + * the input (the least significant bit in the last byte), when repacked as + * the final bit of the output, is still at the least significant position. + * Zeroes will be padded on the left side of the first output byte if + * necessary. All unused bits in the output are also zeroed. + * + * For example: if the input is 01001100 with NUB 8, the output which + * has a NUB 6 will look like: + * 00000001 00001100 + * The first 2 bits of the output bytes are unused bits. The other bits + * turn out to be 000001 001100. While the 8 bits on the right are from + * the input, the left 4 zeroes are padded to fill the 6 bits space. + * + * @param in the input byte array + * @param ioffset start point inside in + * @param ilength number of bytes to repack + * @param iw NUB for input + * @param ow NUB for output + * @return the repacked bytes */ - private int components []; // path from root - private int componentLen; // how much is used. + private static byte[] pack(byte[] in, int ioffset, int ilength, int iw, int ow) { + assert (iw > 0 && iw <= 8): "input NUB must be between 1 and 8"; + assert (ow > 0 && ow <= 8): "output NUB must be between 1 and 8"; - private transient volatile String stringForm; + if (iw == ow) { + return in.clone(); + } - private static final int allocationQuantum = 5; // >= 2 + int bits = ilength * iw; // number of all used bits + byte[] out = new byte[(bits+ow-1)/ow]; + + // starting from the 0th bit in the input + int ipos = 0; + + // the number of padding 0's needed in the output, skip them + int opos = (bits+ow-1)/ow*ow-bits; + + while(ipos < bits) { + int count = iw - ipos%iw; // unpacked bits in current input byte + if (count > ow - opos%ow) { // free space available in output byte + count = ow - opos%ow; // choose the smaller number + } + // and move them! + out[opos/ow] |= // paste! + (((in[ioffset+ipos/iw]+256) // locate the byte (+256 so that it's never negative) + >> (iw-ipos%iw-count)) // move to the end of a byte + & ((1 << (count))-1)) // zero out all other bits + << (ow-opos%ow-count); // move to the output position + ipos += count; // advance + opos += count; // advance + } + return out; + } + + /** + * Repack from NUB 8 to a NUB 7 OID sub-identifier, remove all + * unnecessary 0 headings, set the first bit of all non-tail + * output bytes to 1 (as ITU-T Rec. X.690 8.19.2 says), and + * paste it into an existing byte array. + * @param out the existing array to be pasted into + * @param ooffset the starting position to paste + * @return the number of bytes pasted + */ + private static int pack7Oid(byte[] in, int ioffset, int ilength, byte[] out, int ooffset) { + byte[] pack = pack(in, ioffset, ilength, 8, 7); + int firstNonZero = pack.length-1; // paste at least one byte + for (int i=pack.length-2; i>=0; i--) { + if (pack[i] != 0) { + firstNonZero = i; + } + pack[i] |= 0x80; + } + System.arraycopy(pack, firstNonZero, out, ooffset, pack.length-firstNonZero); + return pack.length-firstNonZero; + } + + /** + * Repack from NUB 7 to NUB 8, remove all unnecessary 0 + * headings, and paste it into an existing byte array. + * @param out the existing array to be pasted into + * @param ooffset the starting position to paste + * @return the number of bytes pasted + */ + private static int pack8(byte[] in, int ioffset, int ilength, byte[] out, int ooffset) { + byte[] pack = pack(in, ioffset, ilength, 7, 8); + int firstNonZero = pack.length-1; // paste at least one byte + for (int i=pack.length-2; i>=0; i--) { + if (pack[i] != 0) { + firstNonZero = i; + } + } + System.arraycopy(pack, firstNonZero, out, ooffset, pack.length-firstNonZero); + return pack.length-firstNonZero; + } + + /** + * Pack the int into a OID sub-identifier DER encoding + */ + private static int pack7Oid(int input, byte[] out, int ooffset) { + byte[] b = new byte[4]; + b[0] = (byte)(input >> 24); + b[1] = (byte)(input >> 16); + b[2] = (byte)(input >> 8); + b[3] = (byte)(input); + return pack7Oid(b, 0, 4, out, ooffset); + } + + /** + * Pack the BigInteger into a OID subidentifier DER encoding + */ + private static int pack7Oid(BigInteger input, byte[] out, int ooffset) { + byte[] b = input.toByteArray(); + return pack7Oid(b, 0, b.length, out, ooffset); + } + + /** + * Private methods to check validity of OID. They must be -- + * 1. at least 2 components + * 2. all components must be non-negative + * 3. the first must be 0, 1 or 2 + * 4. if the first is 0 or 1, the second must be <40 + */ + + /** + * Check the DER encoding. Since DER encoding defines that the integer bits + * are unsigned, so there's no need to check the MSB. + */ + private static void check(byte[] encoding) throws IOException { + int length = encoding.length; + if (length < 1 || // too short + (encoding[length - 1] & 0x80) != 0) { // not ended + throw new IOException("ObjectIdentifier() -- " + + "Invalid DER encoding, not ended"); + } + for (int i=0; i 2) { + throw new IOException("ObjectIdentifier() -- " + + "First oid component is invalid "); + } + } + private static void checkFirstComponent(BigInteger first) throws IOException { + if (first.signum() == -1 || + first.compareTo(BigInteger.valueOf(2)) == 1) { + throw new IOException("ObjectIdentifier() -- " + + "First oid component is invalid "); + } + } + private static void checkSecondComponent(int first, int second) throws IOException { + if (second < 0 || first != 2 && second > 39) { + throw new IOException("ObjectIdentifier() -- " + + "Second oid component is invalid "); + } + } + private static void checkSecondComponent(int first, BigInteger second) throws IOException { + if (second.signum() == -1 || + first != 2 && + second.compareTo(BigInteger.valueOf(39)) == 1) { + throw new IOException("ObjectIdentifier() -- " + + "Second oid component is invalid "); + } + } + private static void checkOtherComponent(int i, int num) throws IOException { + if (num < 0) { + throw new IOException("ObjectIdentifier() -- " + + "oid component #" + (i+1) + " must be non-negative "); + } + } + private static void checkOtherComponent(int i, BigInteger num) throws IOException { + if (num.signum() == -1) { + throw new IOException("ObjectIdentifier() -- " + + "oid component #" + (i+1) + " must be non-negative "); + } + } } diff --git a/jdk/test/sun/security/util/Oid/OidFormat.java b/jdk/test/sun/security/util/Oid/OidFormat.java index 9de4a757ea7..10b7fdd9ee5 100644 --- a/jdk/test/sun/security/util/Oid/OidFormat.java +++ b/jdk/test/sun/security/util/Oid/OidFormat.java @@ -63,9 +63,22 @@ public class OidFormat { "1.2.3", "1.2.3445", "1.3.6.1.4.1.42.2.17", // 4811968: ASN.1 cannot handle huge OID components - //"2.16.764.1.3101555394.1.0.100.2.1", - //"1.2.2147483647.4", - //"1.2.268435456.4", + "2.16.764.1.3101555394.1.0.100.2.1", + "2.2726957624935694386592435", // as huge as possible + "1.2.777777777777777777", + "1.2.888888888888888888.111111111111111.2222222222222.33333333333333333.44444444444444", + "1.2." + + "1111111111111111111111111111111111111111111111111111111111111." + + "2222222222222222222222222222222222222222222222222222222222222222." + + "333333333333333333333333333333333333333333333333333333333333333." + + "4444444444444444444444444444444444444444444444444444444." + + "55555555555555555555555555555555555555555555555555555555555555555555555." + + "666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666." + + "77777777777777777777777777777777777777777777777777777777777777777777777777." + + "8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888." + + "9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999", + "1.2.2147483647.4", + "1.2.268435456.4", }; for (String s: goodOids) { diff --git a/jdk/test/sun/security/util/Oid/S11N.sh b/jdk/test/sun/security/util/Oid/S11N.sh new file mode 100644 index 00000000000..77341e8a91b --- /dev/null +++ b/jdk/test/sun/security/util/Oid/S11N.sh @@ -0,0 +1,164 @@ +# +# Copyright 2004-2005 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 4811968 +# @summary Serialization compatibility with old versions +# @author Weijun Wang +# +# set a few environment variables so that the shell-script can run stand-alone +# in the source directory + +if [ "${TESTSRC}" = "" ] ; then + TESTSRC="." +fi +if [ "${TESTCLASSES}" = "" ] ; then + TESTCLASSES="." +fi +if [ "${TESTJAVA}" = "" ] ; then + echo "TESTJAVA not set. Test cannot execute." + echo "FAILED!!!" + exit 1 +fi + +# set platform-dependent variables +PF="" + +OS=`uname -s` +case "$OS" in + SunOS ) + FS="/" + ARCH=`isainfo` + case "$ARCH" in + sparc* ) + PF="solaris-sparc" + ;; + i[3-6]86 ) + PF="solaris-i586" + ;; + amd64* ) + PF="solaris-amd64" + ;; + * ) + echo "Unsupported System: Solaris ${ARCH}" + exit 0; + ;; + esac + ;; + Linux ) + ARCH=`uname -m` + FS="/" + case "$ARCH" in + i[3-6]86 ) + PF="linux-i586" + ;; + amd64* ) + PF="linux-amd64" + ;; + * ) + echo "Unsupported System: Linux ${ARCH}" + exit 0; + ;; + esac + ;; + Windows* ) + FS="\\" + PF="windows-i586" + + # 'uname -m' does not give us enough information - + # should rely on $PROCESSOR_IDENTIFIER (as is done in Defs-windows.gmk), + # but JTREG does not pass this env variable when executing a shell script. + # + # execute test program - rely on it to exit if platform unsupported + + ;; + * ) + echo "Unsupported System: ${OS}" + exit 0; + ;; +esac + +# the test code + +${TESTJAVA}${FS}bin${FS}javac -source 1.3 -target 1.3 -d . ${TESTSRC}${FS}SerialTest.java || exit 10 + +OLDJAVA=" + /java/re/j2se/1.6.0/latest/binaries/${PF} + /java/re/j2se/1.5.0/latest/binaries/${PF} + /java/re/j2se/1.4.2/latest/binaries/${PF} +" + +SMALL=" + 0.0 + 1.1 + 2.2 + 1.2.3456 + 1.2.2147483647.4 + 1.2.268435456.4 +" + +HUGE=" + 2.16.764.1.3101555394.1.0.100.2.1 + 1.2.2147483648.4 + 2.3.4444444444444444444444 + 1.2.888888888888888888.111111111111111.2222222222222.33333333333333333.44444444444444 +" + +for oid in ${SMALL}; do + echo ${oid} + # new -> + ${TESTJAVA}${FS}bin${FS}java SerialTest out ${oid} > tmp.oid.serial || exit 1 + # -> new + ${TESTJAVA}${FS}bin${FS}java SerialTest in ${oid} < tmp.oid.serial || exit 2 + for oldj in ${OLDJAVA}; do + if [ -d ${oldj} ]; then + echo ${oldj} + # -> old + ${oldj}${FS}bin${FS}java SerialTest in ${oid} < tmp.oid.serial || exit 3 + # old -> + ${oldj}${FS}bin${FS}java SerialTest out ${oid} > tmp.oid.serial.old || exit 4 + # -> new + ${TESTJAVA}${FS}bin${FS}java SerialTest in ${oid} < tmp.oid.serial.old || exit 5 + fi + done +done + +for oid in ${HUGE}; do + echo ${oid} + # new -> + ${TESTJAVA}${FS}bin${FS}java SerialTest out ${oid} > tmp.oid.serial || exit 1 + # -> new + ${TESTJAVA}${FS}bin${FS}java SerialTest in ${oid} < tmp.oid.serial || exit 2 + for oldj in ${OLDJAVA}; do + if [ -d ${oldj} ]; then + echo ${oldj} + # -> old + ${oldj}${FS}bin${FS}java SerialTest badin < tmp.oid.serial || exit 3 + fi + done +done + +rm -f tmp.oid.serial +rm -f tmp.oid.serial.old +rm -f SerialTest.class + +exit 0 diff --git a/jdk/test/sun/security/util/Oid/SerialTest.java b/jdk/test/sun/security/util/Oid/SerialTest.java new file mode 100644 index 00000000000..2c8516eaa6a --- /dev/null +++ b/jdk/test/sun/security/util/Oid/SerialTest.java @@ -0,0 +1,66 @@ +/* + * Copyright 2004 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. + */ + +/* + * read S11.sh + */ +import java.io.*; +import sun.security.util.*; + +/** + * Test OID serialization between versions + * + * java SerialTest out oid // write a OID into System.out + * java SerialTest in oid // read from System.in and compare it with oid + * java SerialTest badin // make sure *cannot* read from System.in + */ +class SerialTest { + public static void main(String[] args) throws Exception { + if (args[0].equals("out")) + out(args[1]); + else if (args[0].equals("in")) + in(args[1]); + else + badin(); + } + + static void in(String oid) throws Exception { + ObjectIdentifier o = (ObjectIdentifier) (new ObjectInputStream(System.in).readObject()); + if (!o.toString().equals(oid)) + throw new Exception("Read Fail " + o + ", not " + oid); + } + + static void badin() throws Exception { + boolean pass = true; + try { + new ObjectInputStream(System.in).readObject(); + } catch (Exception e) { + pass = false; + } + if (pass) throw new Exception("Should fail but not"); + } + + static void out(String oid) throws Exception { + new ObjectOutputStream(System.out).writeObject(new ObjectIdentifier(oid)); + } +} From 7e58d1b49748554f6e72c48c82984bebae5fcf60 Mon Sep 17 00:00:00 2001 From: Xueming Shen Date: Wed, 8 Apr 2009 09:21:06 -0700 Subject: [PATCH 263/292] 6827871: Cleanup leftover code in CharToByteJohab.java Removed the leftover data tables Reviewed-by: alanb --- .../share/classes/sun/io/CharToByteJohab.java | 4724 ----------------- 1 file changed, 4724 deletions(-) diff --git a/jdk/src/share/classes/sun/io/CharToByteJohab.java b/jdk/src/share/classes/sun/io/CharToByteJohab.java index 37ed253a7bb..b3b609d85f0 100644 --- a/jdk/src/share/classes/sun/io/CharToByteJohab.java +++ b/jdk/src/share/classes/sun/io/CharToByteJohab.java @@ -46,4728 +46,4 @@ public class CharToByteJohab extends CharToByteDoubleByte { super.index1 = nioCoder.getEncoderIndex1(); super.index2 = nioCoder.getEncoderIndex2(); } - - private final static String innerIndex0= - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0020\u0021\"\u0023\u0024\u0025\u0026\'"+ - "\u0028\u0029\u002A\u002B\u002C\u002D\u002E\u002F"+ - "\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037"+ - "\u0038\u0039\u003A\u003B\u003C\u003D\u003E\u003F"+ - "\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047"+ - "\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F"+ - "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057"+ - "\u0058\u0059\u005A\u005B\\\u005D\u005E\u005F"+ - "\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067"+ - "\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F"+ - "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077"+ - "\u0078\u0079\u007A\u007B\u007C\u007D\u007E\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uD9AE\u0000\u0000\uD9B4\u0000\u0000\uD967"+ - "\uD937\u0000\uDCA3\u0000\u0000\uD939\u0000\u0000"+ - "\uD956\uD94E\uDD99\uDD9A\uD9A5\u0000\uD9D2\uD934"+ - "\uD9AC\uDD98\uDCAC\u0000\uDCF9\uDCF6\uDCFA\uD9AF"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uDCA1\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uDCA2\u0000\u0000\u0000\u0000\u0000\u0000\uD94F"+ - "\uDCAA\u0000\u0000\u0000\u0000\u0000\uDCAD\uDD3C"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uDD31\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uDD33\u0000\u0000\u0000\u0000\u0000\u0000\uD950"+ - "\uDD3A\u0000\u0000\u0000\u0000\u0000\uDD3D\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uDD32\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uDCA4\uDD34"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uDD35\uDCA6\uDD36\u0000\u0000\u0000\u0000"+ - "\uDD37\u0000\u0000\u0000\u0000\u0000\u0000\uDCA8"+ - "\uDD38\uDCA9\uDD39\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uDD40\uDCAF\uDD3F\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uDCAB\uDD3B\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uDCAE\uDD3E"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uD9A7"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uD9B0\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uD9A8\uD9AB\uD9AA\uD9AD\u0000\uD9A9\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uDB51\uDB52\uDB53\uDB54\uDB55\uDB56\uDB57"+ - "\uDB58\uDB59\uDB5A\uDB5B\uDB5C\uDB5D\uDB5E\uDB5F"+ - "\uDB60\uDB61\u0000\uDB62\uDB63\uDB64\uDB65\uDB66"+ - "\uDB67\uDB68\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uDB71\uDB72\uDB73\uDB74\uDB75\uDB76\uDB77"+ - "\uDB78\uDB79\uDB7A\uDB7B\uDB7C\uDB7D\uDB7E\uDB91"+ - "\uDB92\uDB93\u0000\uDB94\uDB95\uDB96\uDB97\uDB98"+ - "\uDB99\uDB9A\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uDEA7\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uDEA1\uDEA2\uDEA3\uDEA4\uDEA5\uDEA6\uDEA8\uDEA9"+ - "\uDEAA\uDEAB\uDEAC\uDEAD\uDEAE\uDEAF\uDEB0\uDEB1"+ - "\uDEB2\uDEB3\uDEB4\uDEB5\uDEB6\uDEB7\uDEB8\uDEB9"+ - "\uDEBA\uDEBB\uDEBC\uDEBD\uDEBE\uDEBF\uDEC0\uDEC1"+ - "\uDED1\uDED2\uDED3\uDED4\uDED5\uDED6\uDED8\uDED9"+ - "\uDEDA\uDEDB\uDEDC\uDEDD\uDEDE\uDEDF\uDEE0\uDEE1"+ - "\uDEE2\uDEE3\uDEE4\uDEE5\uDEE6\uDEE7\uDEE8\uDEE9"+ - "\uDEEA\uDEEB\uDEEC\uDEED\uDEEE\uDEEF\uDEF0\uDEF1"+ - "\u0000\uDED7\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uD93A\u0000\u0000"+ - "\uD93E\uD93F\u0000\u0000\uD940\uD941\u0000\u0000"+ - "\uD9D3\uD9D4\u0000\u0000\u0000\uD935\uD936\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uD9B6\u0000\uD957\uD958\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uD968\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uDD9B\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uDD9C"+ - "\u0000\uDD9D\uDD9E\uDD9F\uDDA0\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uD959\u0000\u0000\u0000\u0000"+ - "\u0000\uD9B5\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uDC34\u0000\u0000\uD9E0\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uD9E5\uD9E2\u0000\u0000\u0000\uDC69\u0000"+ - "\u0000\u0000\u0000\uD95A\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uDCF7\uDCF8\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uDCFB\uDCFC\uDCFD\uDCFE\u0000"+ - "\uDB40\uDB41\uDB42\uDB43\uDB44\uDB45\uDB46\uDB47"+ - "\uDB48\uDB49\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uDB31\uDB32\uDB33\uDB34\uDB35\uDB36\uDB37\uDB38"+ - "\uDB39\uDB3A\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uD977\uD978\uD976\uD979\uD97A\uD9D5\uD9D8\uD9D6"+ - "\uD9D9\uD9D7\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uD9A1\u0000\uD9A2\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uD9A3\u0000\uD963\uD9A4\u0000\u0000\u0000\uD964"+ - "\uD996\u0000\u0000\uD997\u0000\u0000\u0000\uD9B3"+ - "\u0000\uD9B2\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uD97E\u0000\u0000\uD992\uD954\u0000"+ - "\uD960\u0000\u0000\u0000\u0000\uD93B\u0000\uD99E"+ - "\uD99F\uD99D\uD99C\uD994\uD995\u0000\uD9B1\u0000"+ - "\u0000\u0000\u0000\u0000\uD955\uD993\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uD93D\uD991\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uD966\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uD951\uD965\u0000\u0000\uD952\uD953\u0000\u0000"+ - "\u0000\u0000\uD97C\uD97D\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uD99A\uD99B\u0000\u0000\uD998\uD999"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uD9C1\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uD961\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uD962\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uDCE7\uDCE8\uDCE9\uDCEA\uDCEB\uDCEC\uDCED\uDCEE"+ - "\uDCEF\uDCF0\uDCF1\uDCF2\uDCF3\uDCF4\uDCF5\u0000"+ - "\u0000\u0000\u0000\u0000\uDD77\uDD78\uDD79\uDD7A"+ - "\uDD7B\uDD7C\uDD7D\uDD7E\uDD91\uDD92\uDD93\uDD94"+ - "\uDD95\uDD96\uDD97\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uDD5D\uDD5E\uDD5F\uDD60"+ - "\uDD61\uDD62\uDD63\uDD64\uDD65\uDD66\uDD67\uDD68"+ - "\uDD69\uDD6A\uDD6B\uDD6C\uDD6D\uDD6E\uDD6F\uDD70"+ - "\uDD71\uDD72\uDD73\uDD74\uDD75\uDD76\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uDCCD\uDCCE\uDCCF\uDCD0\uDCD1\uDCD2\uDCD3\uDCD4"+ - "\uDCD5\uDCD6\uDCD7\uDCD8\uDCD9\uDCDA\uDCDB\uDCDC"+ - "\uDCDD\uDCDE\uDCDF\uDCE0\uDCE1\uDCE2\uDCE3\uDCE4"+ - "\uDCE5\uDCE6\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uDBA1\uDBAC\uDBA2\uDBAD\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uDBA3\uDBC8\uDBC7\uDBAE"+ - "\uDBA4\uDBC2\uDBC1\uDBAF\uDBA6\uDBC6\uDBC5\uDBB1"+ - "\uDBA5\uDBC4\uDBC3\uDBB0\uDBA7\uDBBC\uDBC9\uDBCA"+ - "\uDBB7\uDBCB\uDBCC\uDBB2\uDBA9\uDBBE\uDBCD\uDBCE"+ - "\uDBB9\uDBCF\uDBD0\uDBB4\uDBA8\uDBD1\uDBD2\uDBB8"+ - "\uDBBD\uDBD3\uDBD4\uDBB3\uDBAA\uDBD5\uDBD6\uDBBA"+ - "\uDBBF\uDBD7\uDBD8\uDBB5\uDBAB\uDBD9\uDBDA\uDBBB"+ - "\uDBDB\uDBDC\uDBC0\uDBDD\uDBDE\uDBDF\uDBE0\uDBE1"+ - "\uDBE2\uDBE3\uDBE4\uDBB6\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uD9C6\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uD971\uD970\u0000\uD9C3\uD9C7\uD9C8\uD9CB\uD9CA"+ - "\uD9C9\uD9CC\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uD973\uD972\u0000\u0000\uD9BA\uD9B9"+ - "\u0000\u0000\u0000\u0000\uD975\uD974\u0000\u0000"+ - "\uD9B8\uD9B7\u0000\u0000\u0000\u0000\uD96F\uD96E"+ - "\uD9C2\u0000\u0000\uD96B\u0000\u0000\uD96D\uD96C"+ - "\uD9C4\uD9C5\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uD96A\uD969\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uD9CF\uD9CE"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uD9D0\u0000\uD9D1\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uD95F\u0000\uD95E\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uD9BC\uD9BD\u0000\uD9C0\uD9BB\uD9BE\u0000\uD9BF"+ - "\uD9CD\uD9DB\uD9DC\u0000\uD9DD\uD9DA\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uD931\uD932\uD933\uD938\u0000\u0000\u0000\u0000"+ - "\uD944\uD945\uD946\uD947\uD948\uD949\uD94A\uD94B"+ - "\uD94C\uD94D\u0000\uD97B\uD942\uD943\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uDDA1\uDDA2\uDDA3\uDDA4\uDDA5\uDDA6\uDDA7"+ - "\uDDA8\uDDA9\uDDAA\uDDAB\uDDAC\uDDAD\uDDAE\uDDAF"+ - "\uDDB0\uDDB1\uDDB2\uDDB3\uDDB4\uDDB5\uDDB6\uDDB7"+ - "\uDDB8\uDDB9\uDDBA\uDDBB\uDDBC\uDDBD\uDDBE\uDDBF"+ - "\uDDC0\uDDC1\uDDC2\uDDC3\uDDC4\uDDC5\uDDC6\uDDC7"+ - "\uDDC8\uDDC9\uDDCA\uDDCB\uDDCC\uDDCD\uDDCE\uDDCF"+ - "\uDDD0\uDDD1\uDDD2\uDDD3\uDDD4\uDDD5\uDDD6\uDDD7"+ - "\uDDD8\uDDD9\uDDDA\uDDDB\uDDDC\uDDDD\uDDDE\uDDDF"+ - "\uDDE0\uDDE1\uDDE2\uDDE3\uDDE4\uDDE5\uDDE6\uDDE7"+ - "\uDDE8\uDDE9\uDDEA\uDDEB\uDDEC\uDDED\uDDEE\uDDEF"+ - "\uDDF0\uDDF1\uDDF2\uDDF3\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uDE31\uDE32\uDE33\uDE34\uDE35\uDE36\uDE37"+ - "\uDE38\uDE39\uDE3A\uDE3B\uDE3C\uDE3D\uDE3E\uDE3F"+ - "\uDE40\uDE41\uDE42\uDE43\uDE44\uDE45\uDE46\uDE47"+ - "\uDE48\uDE49\uDE4A\uDE4B\uDE4C\uDE4D\uDE4E\uDE4F"+ - "\uDE50\uDE51\uDE52\uDE53\uDE54\uDE55\uDE56\uDE57"+ - "\uDE58\uDE59\uDE5A\uDE5B\uDE5C\uDE5D\uDE5E\uDE5F"+ - "\uDE60\uDE61\uDE62\uDE63\uDE64\uDE65\uDE66\uDE67"+ - "\uDE68\uDE69\uDE6A\uDE6B\uDE6C\uDE6D\uDE6E\uDE6F"+ - "\uDE70\uDE71\uDE72\uDE73\uDE74\uDE75\uDE76\uDE77"+ - "\uDE78\uDE79\uDE7A\uDE7B\uDE7C\uDE7D\uDE7E\uDE91"+ - "\uDE92\uDE93\uDE94\uDE95\uDE96\uDE97\uDE98\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u8841\u8C41\u8444\u9041\u8446\u8447\u9441"+ - "\u9841\u9C41\u844A\u844B\u844C\u844D\u844E\u844F"+ - "\u8450\uA041\uA441\uA841\u8454\uAC41\uB041\uB441"+ - "\uB841\uBC41\uC041\uC441\uC841\uCC41\uD041\u8461"+ - "\u8481\u84A1\u84C1\u84E1\u8541\u8561\u8581\u85A1"+ - "\u85C1\u85E1\u8641\u8661\u8681\u86A1\u86C1\u86E1"+ - "\u8741\u8761\u8781\u87A1\uDAD4\uDAD5\uDAD6\uDAD7"+ - "\uDAD8\uDAD9\uDADA\uDADB\uDADC\uDADD\uDADE\uDADF"+ - "\uDAE0\uDAE1\uDAE2\uDAE3\uDAE4\uDAE5\uDAE6\uDAE7"+ - "\uDAE8\uDAE9\uDAEA\uDAEB\uDAEC\uDAED\uDAEE\uDAEF"+ - "\uDAF0\uDAF1\uDAF2\uDAF3\uDAF4\uDAF5\uDAF6\uDAF7"+ - "\uDAF8\uDAF9\uDAFA\uDAFB\uDAFC\uDAFD\uDAFE\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uDD41\uDD42\uDD43\uDD44\uDD45\uDD46\uDD47\uDD48"+ - "\uDD49\uDD4A\uDD4B\uDD4C\uDD4D\uDD4E\uDD4F\uDD50"+ - "\uDD51\uDD52\uDD53\uDD54\uDD55\uDD56\uDD57\uDD58"+ - "\uDD59\uDD5A\uDD5B\uDD5C\uD9DF\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uDCB1\uDCB2\uDCB3\uDCB4\uDCB5\uDCB6\uDCB7\uDCB8"+ - "\uDCB9\uDCBA\uDCBB\uDCBC\uDCBD\uDCBE\uDCBF\uDCC0"+ - "\uDCC1\uDCC2\uDCC3\uDCC4\uDCC5\uDCC6\uDCC7\uDCC8"+ - "\uDCC9\uDCCA\uDCCB\uDCCC\u0000\u0000\u0000\uD9DE"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"; - - private final static String innerIndex1= - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uDC59\uDC5A\uDC5B\uDC5C\uDC5D\u0000\u0000\u0000"+ - "\uDC4A\uDC4B\uDC6C\uDC6D\uDC6E\uDC46\uDC47\uDC48"+ - "\uDC64\uDC65\uDC66\uDC67\uDC68\uDC31\uDC32\uDC33"+ - "\uDC35\uDC3B\uDC3C\uDC3D\uDC3E\uDC3F\uDC40\uDC41"+ - "\uDC42\uDC43\uDC44\uDC37\uDC38\uDC39\uDC3A\uDC4D"+ - "\uDC4E\uDC75\uDC76\uDC77\uDC78\uDC71\uDC72\uDC73"+ - "\uDC4F\uDC50\uDC51\uDC52\uDC53\uDC54\uDC55\uDC56"+ - "\uDC57\uDC58\uDC5E\uDC5F\uDC60\uDC61\uDC62\uDC63"+ - "\uDC6A\uDC6B\uD9E3\uDC7C\uDC36\uDC70\uDC91\uD9E1"+ - "\uDC4C\uDC7D\uDC45\u0000\u0000\u0000\u0000\uDC49"+ - "\uDC7A\u0000\u0000\uDC7B\u0000\u0000\uDC6F\u0000"+ - "\uD9E4\u0000\u0000\uDC74\uDC7E\uDC79\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF179\uF2CB\u0000\uF662\u0000\u0000\u0000\uE742"+ - "\uF1DB\uEAB2\uEABE\uF7BB\u0000\uE996\u0000\u0000"+ - "\u0000\uF5E4\u0000\u0000\uF4A6\uE9E0\uEBA6\u0000"+ - "\uE29A\uE940\u0000\u0000\u0000\u0000\uECAA\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF3E9\u0000\u0000"+ - "\u0000\u0000\uE1FA\u0000\u0000\u0000\u0000\u0000"+ - "\uF93F\uE4A1\u0000\uF3AB\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEED1\uE43C\u0000\uE29B\u0000\u0000"+ - "\u0000\u0000\u0000\uF3FD\u0000\uEA4F\uF8BA\uF7B9"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE262\u0000"+ - "\uECAB\uF0E0\u0000\u0000\u0000\uE29C\uE0F7\uEDA5"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE071\u0000\uE55C\u0000\u0000"+ - "\u0000\u0000\u0000\uF071\u0000\u0000\uE973\uEAAD"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE0EB\u0000"+ - "\u0000\u0000\uE5AF\u0000\u0000\u0000\uE697\u0000"+ - "\uEDF8\u0000\u0000\uEA50\uF133\u0000\uEFCD\u0000"+ - "\uF037\uEFF6\uF8BB\u0000\uEEE9\uF2CC\u0000\u0000"+ - "\uE376\u0000\u0000\uEA51\u0000\u0000\uED3C\u0000"+ - "\u0000\uE75C\uF7F1\u0000\uE26F\uF834\uEE42\u0000"+ - "\uF89D\u0000\u0000\uF84D\uE158\uF2CD\uE5D5\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE4A2\u0000"+ - "\u0000\u0000\uF161\u0000\u0000\u0000\u0000\u0000"+ - "\uED37\uF162\u0000\u0000\uF641\u0000\u0000\uE29D"+ - "\u0000\u0000\uE361\uE0BF\u0000\uF1A4\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF1A8\uEA52\uF672\uF1DC"+ - "\uE997\uEB49\u0000\u0000\u0000\uE55E\u0000\uF545"+ - "\u0000\u0000\u0000\uE4DB\uE645\uF134\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uED76\u0000\uF3EA\u0000\u0000\u0000\uE0EC\uE0C0"+ - "\u0000\u0000\u0000\uF194\u0000\u0000\u0000\u0000"+ - "\u0000\uE37A\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF7F2\uF135\uE36F\u0000\uEEEA\uE37B\uE961"+ - "\uE8E9\uF9CC\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE8D7"+ - "\u0000\u0000\u0000\u0000\uE871\u0000\uE646\u0000"+ - "\uECDF\u0000\uEA53\u0000\uEA54\uE031\u0000\u0000"+ - "\u0000\u0000\u0000\uF27C\u0000\u0000\uE4A3\uF247"+ - "\uF75F\u0000\u0000\u0000\u0000\uF058\uF248\uF3AC"+ - "\uF3A5\uEFCE\u0000\u0000\u0000\uF7BC\u0000\u0000"+ - "\u0000\uEDF9\uF17A\uE9D6\uF1C2\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF735\u0000\u0000\u0000\u0000\u0000\uEDBA"+ - "\uE8D8\u0000\u0000\uE032\u0000\u0000\uE3CD\u0000"+ - "\u0000\u0000\uF27D\u0000\u0000\u0000\uF17B\uEA55"+ - "\u0000\uECE0\u0000\uE059\uF479\u0000\uE5CE\u0000"+ - "\uF646\u0000\uE252\uE657\u0000\uECB4\u0000\uF3AD"+ - "\u0000\uF072\u0000\u0000\u0000\u0000\uE6C2\u0000"+ - "\uF4A7\u0000\u0000\uE1EA\u0000\uF0EE\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE7B2\uF9A5"+ - "\u0000\u0000\u0000\u0000\u0000\uF665\uE5E2\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF745"+ - "\u0000\u0000\uE197\uF5B5\uED3D\u0000\u0000\u0000"+ - "\u0000\uEEEB\uF3D5\u0000\u0000\u0000\uF34B\u0000"+ - "\u0000\uEFB5\u0000\uE159\uF865\u0000\u0000\uEBD4"+ - "\u0000\u0000\uE6D6\u0000\u0000\uE951\u0000\uEA56"+ - "\uF891\uECE1\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uEBF3\uE998"+ - "\u0000\uE29E\u0000\uE8C4\u0000\uF793\u0000\u0000"+ - "\uE974\u0000\uEDEF\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE941\u0000\u0000\u0000\uE5D6\u0000"+ - "\u0000\uF4DA\u0000\uE0C1\u0000\uE8C3\u0000\u0000"+ - "\u0000\uE7FA\uE4EE\u0000\u0000\u0000\uF848\u0000"+ - "\u0000\uF9A6\uF0EF\u0000\uF536\u0000\uE15A\uF4A8"+ - "\u0000\uF4DB\u0000\uE8A7\uF647\u0000\uE2E6\uF394"+ - "\uE0DA\u0000\uEED2\uE6C3\uF692\uEF6E\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uEDA6\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uEDE7\u0000\u0000\u0000\uE033"+ - "\uE137\uF059\u0000\u0000\u0000\u0000\u0000\uF746"+ - "\u0000\u0000\u0000\u0000\u0000\uF835\u0000\u0000"+ - "\u0000\u0000\uF3AE\u0000\uF2CE\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE0ED\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF640\uF2CF\uEFCF\u0000"+ - "\uF6DE\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE263\u0000\u0000\u0000\u0000\uE999\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE8A8\u0000\u0000"+ - "\u0000\uE0F8\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEAA1\uE9E1\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF5CA\uEFB6\u0000\u0000"+ - "\u0000\u0000\uEEEC\uF27E\u0000\uF4F0\u0000\uEABF"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE15B\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE351\u0000\u0000"+ - "\u0000\uF562\uEB4A\u0000\u0000\u0000\u0000\uEAC0"+ - "\u0000\uE270\u0000\u0000\u0000\uE962\uF9EA\u0000"+ - "\u0000\u0000\uE698\u0000\u0000\u0000\uF05A\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEF79\u0000\uECAC"+ - "\u0000\u0000\u0000\u0000\u0000\uF4D0\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE034\u0000\uE8F8\u0000\u0000\u0000\uEA57"+ - "\uF0F0\uF3D6\u0000\u0000\uEDE2\u0000\uE15C\u0000"+ - "\u0000\uE0FB\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF073\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEAC1"+ - "\u0000\uE67D\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEFD0\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF249\u0000\u0000\u0000\u0000\uE5E3"+ - "\u0000\u0000\uE3D3\u0000\uEDF0\u0000\u0000\u0000"+ - "\uEF44\uF0C3\u0000\uF03A\uF89E\uF5F6\uF34C\uF9D4"+ - "\uEB4B\uE253\u0000\uE34A\uF6BA\uE795\uF6CD\u0000"+ - "\u0000\u0000\uED3E\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE56F\u0000\u0000\u0000"+ - "\u0000\u0000\uE377\u0000\u0000\uF19F\u0000\uE43E"+ - "\uF291\uE5D7\uF074\uF732\uE1EB\uE6BF\uF8B1\u0000"+ - "\u0000\uE1EC\u0000\u0000\u0000\uE942\uE37C\uE29F"+ - "\uF292\u0000\u0000\u0000\uE152\u0000\u0000\u0000"+ - "\uE37D\u0000\u0000\u0000\u0000\u0000\uEDF7\u0000"+ - "\u0000\u0000\uF4FC\u0000\u0000\uF232\u0000\u0000"+ - "\u0000\u0000\uE7B3\u0000\u0000\uE796\u0000\uEFB7"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE23E\u0000\u0000\u0000\u0000\uE7A2\u0000\u0000"+ - "\u0000\u0000\uE793\u0000\uE55F\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uEDA7\uE5D2"+ - "\u0000\u0000\u0000\u0000\u0000\uE639\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF532\u0000\uF3D7\u0000"+ - "\u0000\uE5D8\u0000\uF34D\uE6D0\uE560\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE6CF\uF0EA\uF9EB\u0000"+ - "\u0000\uE8ED\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF955\uE0C2\u0000\u0000\u0000\u0000\uF9D5\u0000"+ - "\uF558\uEF7A\uF5F3\u0000\u0000\uF7DE\u0000\u0000"+ - "\uE4EF\u0000\u0000\uF163\u0000\u0000\uE9C2\uF2B7"+ - "\uEED4\u0000\uE05A\u0000\u0000\u0000\uE7FB\u0000"+ - "\u0000\uF89F\u0000\u0000\u0000\u0000\u0000\uE63A"+ - "\u0000\u0000\u0000\u0000\u0000\uF59A\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF6F7\uE93C\u0000\u0000"+ - "\u0000\uE6D7\uEAA2\u0000\u0000\u0000\uE24E\u0000"+ - "\uE4F0\u0000\u0000\u0000\u0000\u0000\uF334\uEBEC"+ - "\uE2E7\uF4CB\uF1A9\uE04E\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF591\u0000\u0000\u0000\uF65E"+ - "\u0000\u0000\uEA9D\uE34B\uE5B7\uF293\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF538\u0000\uE99A\u0000"+ - "\u0000\u0000\u0000\uE0A7\u0000\uE85E\u0000\u0000"+ - "\u0000\uEB76\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF1A5\uF294\u0000\u0000\u0000\u0000\uE99B"+ - "\u0000\u0000\uF7DC\u0000\u0000\uF4DC\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF794\u0000\uF59B"+ - "\u0000\u0000\u0000\uF993\u0000\u0000\u0000\uE34C"+ - "\uE8F9\uE6B1\u0000\u0000\u0000\uE0FC\u0000\u0000"+ - "\u0000\uF335\uE0FD\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE5F4\u0000\u0000\u0000\uE1ED"+ - "\uE035\u0000\u0000\uE63B\uE352\u0000\u0000\u0000"+ - "\u0000\uF34E\uE44D\uE134\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF846\u0000"+ - "\u0000\uE15D\u0000\uE89C\u0000\uF65F\u0000\uEFB8"+ - "\u0000\uE797\u0000\u0000\u0000\uE15E\u0000\u0000"+ - "\u0000\u0000\uE6CD\u0000\u0000\uE561\uEFED\u0000"+ - "\uE07B\uE7E2\u0000\uF9B2\u0000\uECAD\uE65C\uE7B4"+ - "\u0000\u0000\uEBA7\uF263\uE353\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF9B3\u0000\uE5E4\u0000\u0000"+ - "\uE2E8\u0000\uF1C3\uE342\u0000\u0000\uE2A0\uE838"+ - "\u0000\u0000\u0000\u0000\u0000\uF760\u0000\u0000"+ - "\uF9D6\u0000\u0000\u0000\u0000\uF761\u0000\uF762"+ - "\uE963\u0000\u0000\u0000\u0000\uE9E2\uF8F9\uE9C1"+ - "\u0000\uECB5\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF1DD\uE254\u0000\uE0A1\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE9E3\u0000\u0000\u0000\u0000\uF96D"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF7AF\u0000\u0000\u0000\u0000\u0000\uE49D"+ - "\uE2A1\uED38\u0000\uF546\uF1A0\u0000\u0000\uECAE"+ - "\uEEED\uF9C1\uE872\u0000\u0000\uE743\u0000\u0000"+ - "\u0000\uE9E4\uF391\uF693\uF892\u0000\u0000\uE3F5"+ - "\u0000\u0000\uE85F\u0000\uE964\u0000\uE936\u0000"+ - "\uF2BF\u0000\u0000\u0000\u0000\u0000\uE25F\u0000"+ - "\uEB69\u0000\u0000\u0000\u0000\u0000\u0000\uE7D6"+ - "\uF164\uF05B\u0000\u0000\uE04F\uE5B0\u0000\uE2E9"+ - "\u0000\u0000\u0000\u0000\u0000\uF3ED\u0000\uE15F"+ - "\u0000\u0000\u0000\u0000\uED9A\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uED7D\u0000\u0000\u0000\u0000"+ - "\uE6D8\u0000\uF9A7\u0000\u0000\u0000\u0000\uF03B"+ - "\uF642\u0000\u0000\u0000\u0000\uE2F0\uF7BD\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEE96\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE0DB\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF4D1\u0000\u0000\u0000\u0000"+ - "\uEFD1\uF4A9\uE370\uEFD2\u0000\uE873\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uEC62\u0000\uF632\uEBF4"+ - "\u0000\u0000\u0000\uE874\u0000\u0000\u0000\u0000"+ - "\u0000\uEED5\uF5BF\uE2A2\uE1AF\uE2A3\u0000\u0000"+ - "\u0000\uE1B0\uF3FE\uE333\uEBAF\uF733\u0000\uE036"+ - "\uF6BB\uF47A\uEA58\uEFD3\u0000\u0000\u0000\u0000"+ - "\uEA59\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF9DE\uE050\u0000\u0000\u0000"+ - "\uF7EA\uE3CE\uF264\u0000\uE562\uE7A3\uF9A8\uE6D9"+ - "\uF6CE\uF84E\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE2D6\u0000\uE6F0\u0000\uF0E1"+ - "\uF755\u0000\u0000\u0000\u0000\u0000\uE99C\u0000"+ - "\u0000\uE9C3\u0000\uF7DF\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uEEEF\u0000\u0000\u0000\u0000"+ - "\uF9E5\uF633\u0000\uE7FC\uF9A9\u0000\uEEEE\u0000"+ - "\u0000\u0000\uE5E5\u0000\u0000\u0000\u0000\u0000"+ - "\uF2D0\u0000\uE1B1\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF6A2\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF3B2\u0000\uF3B1\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE1B2\u0000\uE83B\u0000\uE037\u0000\u0000"+ - "\u0000\u0000\u0000\uECE2\uF8BC\uE7A4\u0000\u0000"+ - "\uF24A\u0000\u0000\u0000\u0000\u0000\uF763\u0000"+ - "\u0000\u0000\u0000\u0000\uF8FA\u0000\uE2A4\u0000"+ - "\uE99D\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF673\u0000\u0000\u0000"+ - "\uF1AA\u0000\u0000\uF431\uE271\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF836\u0000\u0000\u0000\u0000"+ - "\uF7E0\u0000\u0000\u0000\u0000\uF166\u0000\u0000"+ - "\uED7E\uF7A1\u0000\u0000\uF8EF\u0000\u0000\u0000"+ - "\uF7EB\uF233\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF03C\u0000\u0000\u0000\uE038\u0000\u0000"+ - "\uF59C\u0000\u0000\u0000\u0000\uE1D6\uF998\u0000"+ - "\u0000\u0000\uF559\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF764\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF736\u0000\uEA5A\uF456"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE6DA\u0000"+ - "\uE4D0\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE755\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF076"+ - "\u0000\uF4DD\u0000\u0000\u0000\uED6A\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF674\u0000"+ - "\u0000\u0000\u0000\u0000\uF694\u0000\uEAC2\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE7FD"+ - "\u0000\u0000\u0000\uE198\u0000\u0000\uE4BA\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uED3F\u0000"+ - "\u0000\u0000\u0000\uF7E1\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF336\u0000\u0000\u0000"+ - "\uE0D3\u0000\u0000\u0000\uEB4C\u0000\uF55A\uE59C"+ - "\u0000\uF9AA\uF7E2\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF547\uF9C2\uF940\u0000\uF9EC\uE072\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF9BD"+ - "\u0000\uF077\uEAC3\uE3D2\uE272\u0000\uE4A4\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF9AB\u0000\uEAE0"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF457\u0000\u0000\u0000"+ - "\u0000\u0000\uEEF0\u0000\uE37E\u0000\u0000\uF4AA"+ - "\u0000\u0000\u0000\uEA5B\uF648\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEBF5\uF3B3\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF6A3\u0000"+ - "\u0000\uE039\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE2A5\u0000\u0000\uEAC4"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEBB0"+ - "\u0000\u0000\uF34F\u0000\uF634\u0000\uECB6\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF856\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE391\u0000\u0000\uF9ED\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE9C4\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF999\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEE4F\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uEA3D\u0000\uF84F\u0000"+ - "\u0000\u0000\u0000\u0000\uEDF1\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF1C4\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE435\u0000\u0000\uF9EE\u0000\u0000"+ - "\u0000\uF5B6\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEBF6\uEA5C\u0000\u0000\uF96E\u0000"+ - "\uF167\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE1DD\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE647\uE1B3\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF765\uEDD8\u0000\u0000\u0000"+ - "\uE2EA\u0000\u0000\uE2D0\u0000\uF05C\u0000\u0000"+ - "\u0000\u0000\uF03E\uF03D\u0000\u0000\uE4F1\u0000"+ - "\uE4A5\u0000\u0000\u0000\u0000\u0000\u0000\uF6CF"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF234\u0000\u0000\u0000\u0000\uE334\u0000\u0000"+ - "\uF432\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE392\u0000\u0000\u0000\u0000"+ - "\uF433\u0000\uF6F8\u0000\u0000\u0000\u0000\uE343"+ - "\u0000\u0000\uE8A9\u0000\u0000\uE4BB\uE07C\u0000"+ - "\uF3A6\uE0D5\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF6E7\u0000\u0000\uE1DE\u0000\uF6A4\u0000"+ - "\u0000\u0000\uF750\u0000\u0000\u0000\uE4DD\u0000"+ - "\uE160\u0000\u0000\u0000\u0000\uE2A6\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF695\u0000\u0000\u0000"+ - "\u0000\u0000\uEBF7\u0000\u0000\u0000\u0000\u0000"+ - "\uE4DC\u0000\u0000\uF8A0\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF837\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF0D9\u0000\uE2A7\uF03F\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uED91\u0000\u0000\u0000\uEFB9"+ - "\uF3D8\u0000\u0000\uE768\u0000\u0000\uEB94\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEE44"+ - "\uE99E\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF4F1\u0000\u0000\u0000\uECD0\u0000\u0000\uF49D"+ - "\u0000\uE8C6\uE393\u0000\uE394\u0000\u0000\u0000"+ - "\uE2DC\u0000\uE4D1\u0000\u0000\uE141\uF6D8\u0000"+ - "\uE0A8\uF0BC\uED4E\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF56C\u0000"+ - "\u0000\uE952\u0000\u0000\uF337\u0000\u0000\uEE50"+ - "\u0000\u0000\uE07D\u0000\u0000\u0000\u0000\uEF7B"+ - "\uEDE8\uE953\u0000\u0000\uF1DE\uE4F2\u0000\u0000"+ - "\u0000\u0000\uE199\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE264\uEEAB\u0000\u0000\u0000\uE0C3"+ - "\u0000\uEBB1\u0000\u0000\uF6B2\u0000\u0000\uE4F3"+ - "\uE4D2\u0000\uF5C0\u0000\u0000\u0000\uEADD\u0000"+ - "\u0000\uF295\uEEF1\u0000\uF9B4\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF458\u0000\u0000"+ - "\u0000\uF4D2\u0000\u0000\uF296\u0000\uEC63\u0000"+ - "\u0000\u0000\u0000\uE161\u0000\uEAEA\u0000\u0000"+ - "\u0000\uEFBA\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE7D7\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF5CD\u0000\uF3F2\uF857"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE7F8\uE552\u0000\u0000\u0000\u0000\uF675\u0000"+ - "\u0000\u0000\u0000\uE9C5\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEEF2\uF1DF\u0000\u0000\uE05B\u0000"+ - "\u0000\uE8FA\u0000\u0000\u0000\uEF45\u0000\uE4A6"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF9B5\u0000"+ - "\u0000\uF7C9\u0000\uED72\u0000\uF8BD\u0000\u0000"+ - "\uE6A4\uE255\u0000\u0000\u0000\u0000\uE265\uE676"+ - "\u0000\u0000\u0000\u0000\uEDBD\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uEA5D\uF195\u0000\u0000\uF1E0"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF17C\uF8BE\uEAEB\u0000\uEBF8\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF7BE"+ - "\u0000\u0000\u0000\u0000\uE395\uEB3A\uEF72\u0000"+ - "\u0000\uEC64\uE49F\u0000\uEDA8\u0000\u0000\u0000"+ - "\u0000\u0000\uE7D3\u0000\u0000\u0000\u0000\uE4DE"+ - "\u0000\uF548\uF6BC\uE99F\u0000\uEF7C\uED77\u0000"+ - "\u0000\uECF7\u0000\u0000\u0000\u0000\u0000\uF138"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF893\u0000"+ - "\u0000\u0000\u0000\u0000\uEDF2\u0000\u0000\uE396"+ - "\uE43F\uE975\u0000\u0000\u0000\u0000\uE335\uF3B4"+ - "\uF941\uE19A\u0000\u0000\uE9C6\uF861\u0000\uF6DF"+ - "\u0000\u0000\uF838\u0000\u0000\u0000\u0000\u0000"+ - "\uF297\u0000\uEA5E\u0000\u0000\u0000\u0000\uEEF3"+ - "\u0000\u0000\uF6AC\uF0C4\uF1E1\uEB3B\uE9C7\u0000"+ - "\u0000\u0000\u0000\uE443\uE44F\u0000\u0000\u0000"+ - "\uE05C\u0000\u0000\u0000\u0000\uF8BF\u0000\u0000"+ - "\u0000\u0000\uEDFD\uE9E5\uE75D\u0000\u0000\u0000"+ - "\u0000\u0000\uF196\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE397\u0000\u0000\uEF7D\uE362"+ - "\u0000\uE7D8\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF676\u0000\u0000"+ - "\uE8AA\u0000\u0000\u0000\uF6E0\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE769\u0000\uF533\u0000\u0000\uF56D\u0000"+ - "\u0000\u0000\u0000\uF2D1\u0000\u0000\uE7B5\u0000"+ - "\u0000\uF1AB\u0000\uECB7\u0000\u0000\u0000\u0000"+ - "\uF24B\uE1B4\u0000\uEB95\uF05D\u0000\u0000\u0000"+ - "\u0000\uF197\uEF7E\u0000\uE0A9\uF3AF\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE05D\u0000"+ - "\uF139\u0000\uF47B\u0000\uF9EF\u0000\uF7F3\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEE51\u0000\u0000\uF168\u0000\u0000\u0000\uF1AC"+ - "\u0000\uF05E\u0000\uEF6F\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uEA5F\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE436\u0000\u0000\uEEF4\uE3D6\u0000\u0000\uEE52"+ - "\uECE3\u0000\u0000\u0000\u0000\uED40\u0000\u0000"+ - "\u0000\uE744\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF635\u0000"+ - "\u0000\u0000\u0000\u0000\uF4DE\u0000\u0000\u0000"+ - "\u0000\uE6A5\u0000\u0000\u0000\u0000\uF6E8\u0000"+ - "\u0000\uEF56\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF8E6\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE9E6\u0000\u0000\u0000\uE9A0\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE76A\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE83C\uF040\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uECB8\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE03A\uEBF9\u0000\uF041\u0000\u0000\u0000"+ - "\u0000\uF47C\u0000\u0000\uF87E\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF265\u0000\u0000\u0000\u0000\uF7F4\u0000"+ - "\u0000\uE47C\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF8FB\u0000\u0000"+ - "\u0000\uF9F0\u0000\uEB4D\uE273\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF756\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEA3E\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEAC5\u0000\u0000\uEDBE\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF1AD\uF87A\u0000\u0000\uE1EE\uF1A6\u0000\uF1AE"+ - "\uF37D\u0000\uE9A1\u0000\uF1AF\uF99A\u0000\uE77B"+ - "\u0000\u0000\u0000\uE19B\uE1B5\u0000\u0000\u0000"+ - "\u0000\uF839\u0000\uEBDD\u0000\u0000\u0000\u0000"+ - "\uEC65\uF1CF\u0000\u0000\u0000\uE9A2\u0000\u0000"+ - "\uF7CA\u0000\uF078\u0000\uEDED\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE4EB\u0000\uEFD4"+ - "\uEBFA\uED5C\u0000\uEBE4\uEF57\u0000\u0000\uE26B"+ - "\u0000\u0000\u0000\uE965\u0000\uF6B5\uF995\uF395"+ - "\uE23F\uF3B5\uF2D2\uEF58\uF0F1\u0000\u0000\u0000"+ - "\u0000\u0000\uE0D4\uEB4E\uECF8\uF079\uF942\u0000"+ - "\u0000\u0000\u0000\u0000\uEB96\u0000\uE2E0\u0000"+ - "\uF235\u0000\u0000\uF83A\uEE53\uEBB2\uE03B\u0000"+ - "\uECE4\uEFBB\u0000\u0000\u0000\u0000\u0000\uEC66"+ - "\uF4F2\u0000\uF266\uF042\uE398\uF169\uE85B\uE2A8"+ - "\u0000\u0000\u0000\u0000\uE9A3\u0000\u0000\u0000"+ - "\uE76B\u0000\uF7CE\uEFD5\uECD1\u0000\u0000\uE44C"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE73C\uF4CC"+ - "\u0000\uE1FB\uF666\u0000\uEEF5\uEF91\uECF9\uE44B"+ - "\uF4F3\uECFB\u0000\uEA60\uE240\u0000\uE699\uF3D9"+ - "\u0000\u0000\u0000\u0000\u0000\uF5C1\uE954\u0000"+ - "\uF5BB\u0000\uEA61\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE976\u0000\u0000\uEA62\u0000\u0000\uF1E2"+ - "\uF298\uF05F\uF37E\uECFC\u0000\uE4DF\uE4F4\uEBB3"+ - "\u0000\uEBB4\u0000\u0000\u0000\u0000\uF563\u0000"+ - "\u0000\uEAC6\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uEFD6\u0000\u0000\u0000"+ - "\uE8AB\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF636\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uECB9\uF0C5\uF539\uE1B6\uE49B\u0000\uE83D\uE473"+ - "\uE2D1\u0000\u0000\u0000\u0000\uE0DC\uE19C\u0000"+ - "\uE2DD\u0000\u0000\uEF39\u0000\uECBB\uECBA\u0000"+ - "\u0000\uEB6A\u0000\u0000\u0000\uF299\u0000\u0000"+ - "\u0000\u0000\u0000\uE943\u0000\u0000\u0000\u0000"+ - "\uE4F5\u0000\uE6A6\u0000\uF645\uE6DB\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uEBD5\u0000\u0000\uE57A"+ - "\u0000\uEAA3\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF9DF\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE399\uF1D4\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE0AA\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uED6B\u0000\uEBFB\uE0A2\u0000\u0000\u0000"+ - "\u0000\uE4E0\u0000\uED4F\u0000\uF8C0\u0000\uE84E"+ - "\uED5D\u0000\uE649\u0000\u0000\u0000\uF2C0\u0000"+ - "\uEBFC\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF649\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEAC7\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uED41\u0000\u0000\u0000\u0000\u0000\u0000\uE977"+ - "\uE978\u0000\u0000\u0000\uF866\u0000\uE4F6\u0000"+ - "\u0000\u0000\u0000\uF3DA\u0000\uF894\u0000\u0000"; - - private final static String innerIndex2= - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEC9F"+ - "\u0000\u0000\u0000\u0000\u0000\uE5CF\uE39A\u0000"+ - "\u0000\uE1DF\u0000\u0000\uF5CB\u0000\uED92\uE0AB"+ - "\u0000\uE6C4\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uECA0"+ - "\u0000\uE9DA\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE83E\uE07E\u0000\u0000\u0000"+ - "\uE5B9\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uECA1\u0000\u0000\uEF73\u0000\u0000\uF4AB"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE2A9"+ - "\u0000\u0000\u0000\uE4F7\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE593\u0000\u0000"+ - "\uE274\u0000\uEF94\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEDF5\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEEAE\u0000\uE64A\u0000\uEAEC\uED50\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEF74\u0000\u0000"+ - "\u0000\u0000\uE745\u0000\u0000\u0000\uED6C\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF549\uF3B6\u0000"+ - "\u0000\uEC6E\uEBB5\u0000\u0000\uE1EF\uF3A7\uE275"+ - "\uE0DD\u0000\u0000\uE7E3\u0000\u0000\uF4AC\u0000"+ - "\u0000\uE39B\uF13B\uEA63\uF6E9\u0000\u0000\uF7F5"+ - "\u0000\u0000\u0000\u0000\u0000\uEBDE\uE0EE\u0000"+ - "\u0000\u0000\uECBC\uF766\u0000\u0000\uE8EE\u0000"+ - "\u0000\u0000\u0000\u0000\uF9F1\u0000\u0000\u0000"+ - "\u0000\uF6B6\u0000\u0000\u0000\u0000\uF56E\u0000"+ - "\u0000\uF47D\u0000\uE8D9\u0000\uF338\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEBFD\u0000\u0000"+ - "\u0000\u0000\u0000\uEA64\u0000\uEB3C\u0000\u0000"+ - "\u0000\u0000\u0000\uF1E3\u0000\u0000\uE4E1\u0000"+ - "\uEAC8\u0000\u0000\u0000\u0000\uE7B6\u0000\uF9AC"+ - "\uF2D3\u0000\u0000\u0000\uED51\uF77B\u0000\uE8AC"+ - "\u0000\u0000\u0000\u0000\uF956\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE73D\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF64A"+ - "\u0000\uE8DF\uE4D3\uF757\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE05E\uF751\uE444\u0000\u0000\uE944"+ - "\uF849\uE05F\u0000\uF943\uF07A\uF07B\uE39C\u0000"+ - "\u0000\u0000\u0000\u0000\uF1E4\u0000\u0000\uE9E7"+ - "\u0000\u0000\uEAC9\u0000\u0000\u0000\u0000\uEAED"+ - "\u0000\u0000\u0000\u0000\u0000\uF24C\u0000\uF2C1"+ - "\u0000\u0000\uE162\u0000\uE9A4\u0000\u0000\u0000"+ - "\uEACA\u0000\u0000\u0000\u0000\u0000\uE4F8\uF3A8"+ - "\u0000\u0000\u0000\uE1B7\u0000\uF2D4\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uED6D\uEAEE\uE0AC"+ - "\uEFBC\u0000\u0000\u0000\u0000\u0000\uF07C\u0000"+ - "\u0000\u0000\uEACB\u0000\u0000\u0000\u0000\u0000"+ - "\uF7BF\uE63F\uE5C6\u0000\u0000\u0000\u0000\u0000"+ - "\uE2AA\u0000\u0000\uE239\u0000\u0000\uE69A\u0000"+ - "\u0000\u0000\uF3B7\uF29A\u0000\u0000\u0000\uE7D9"+ - "\uF4DF\u0000\uF758\uE256\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE5E6\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF576\u0000\u0000\uEE55\uF2D5"+ - "\u0000\u0000\uE0EF\uF96F\u0000\u0000\u0000\u0000"+ - "\u0000\uE937\u0000\u0000\uE677\u0000\u0000\u0000"+ - "\u0000\u0000\uF759\u0000\u0000\u0000\u0000\uECD2"+ - "\u0000\uECBD\u0000\uE2E1\uF350\uF16A\u0000\uE9D7"+ - "\uF8F0\u0000\u0000\uF13C\u0000\u0000\u0000\uF339"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF867\uF8C1"+ - "\u0000\uE450\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uEDB0\u0000\u0000\u0000\uF1E5\u0000\u0000"+ - "\u0000\u0000\uE0AD\u0000\uF7B0\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF6A5\u0000\uE0AE\u0000\uE83F\u0000\uE746\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE4A7\uF8B2"+ - "\u0000\uF9C4\u0000\uF13D\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF8A1\u0000\u0000\u0000\uEDE9\uEFEE"+ - "\u0000\uF4F4\uF795\uF351\uEA3F\uF740\u0000\u0000"+ - "\uF4E0\uEEAF\u0000\u0000\u0000\u0000\u0000\uE8AD"+ - "\u0000\uEE45\u0000\u0000\uF7A8\u0000\u0000\uE9D8"+ - "\uEF69\uF2D6\u0000\u0000\u0000\uE4E2\u0000\uEC6F"+ - "\u0000\u0000\uF970\uE6C8\uF9AD\u0000\u0000\u0000"+ - "\uEAEF\uE163\uE4F9\u0000\u0000\u0000\u0000\uE592"+ - "\uE8C7\uEA65\u0000\u0000\u0000\u0000\uF396\u0000"+ - "\uE5D0\uEDD9\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF957\uE966\uEC70\u0000\u0000\u0000\uE840\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF4A3\u0000\uE4EC"+ - "\u0000\uF55B\u0000\u0000\u0000\uF9C5\u0000\u0000"+ - "\u0000\u0000\u0000\uECFD\u0000\uF7B1\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE39D\uF16B\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF5BC\uF434"+ - "\uE75E\uE75F\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF5F7\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF671\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE447\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF8EC\u0000\uE9C8"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uED78"+ - "\u0000\u0000\uE451\u0000\u0000\u0000\uF767\u0000"+ - "\u0000\u0000\u0000\u0000\uE64B\uEA66\u0000\u0000"+ - "\uF6BD\uF13E\u0000\u0000\u0000\uE371\u0000\uEB97"+ - "\uF043\u0000\uE266\u0000\u0000\u0000\u0000\uE135"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF198\uEC71\uECBE\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF958\u0000\u0000"+ - "\uE1F0\u0000\uF7F6\u0000\u0000\uEAF0\u0000\u0000"+ - "\u0000\uEDBF\u0000\u0000\u0000\uE24F\u0000\u0000"+ - "\u0000\u0000\uF971\uF1B0\uF9D1\uF64B\u0000\u0000"+ - "\uF7CF\uF0DA\uE051\u0000\uE448\uE1F1\u0000\uECD3"+ - "\uF9E6\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEE7D\u0000\u0000"+ - "\u0000\uECFA\u0000\u0000\uF33A\uF7D0\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF972\u0000\uF737\u0000"+ - "\u0000\u0000\uEBE5\uF29B\u0000\u0000\u0000\uEEF6"+ - "\uF07D\u0000\u0000\uF944\uF5C2\u0000\u0000\uE6DC"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF397\u0000\uE9E8\uE4ED\uF5FC\u0000\uE84F\u0000"+ - "\uE19D\u0000\u0000\u0000\uE4FA\uF534\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF2D7\u0000\uE553"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF8E3\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF8ED\u0000\uEB3D\u0000\u0000\uF07E"+ - "\uF8B3\uED52\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF677\uE46D\u0000\uEACC\u0000\u0000\uF959\u0000"+ - "\u0000\uEDA9\uEB98\uF643\u0000\u0000\u0000\u0000"+ - "\u0000\uEBFE\u0000\u0000\u0000\u0000\uE0F0\u0000"+ - "\uF091\uF092\u0000\u0000\u0000\uE850\uF744\uF0F2"+ - "\u0000\u0000\u0000\u0000\u0000\uED53\u0000\u0000"+ - "\u0000\u0000\uEFD7\uED93\u0000\u0000\u0000\uE091"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE267"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF95A\u0000\u0000\u0000\uF4E1\u0000\u0000\uE0C4"+ - "\u0000\u0000\u0000\u0000\uECE5\u0000\uE0C5\uF044"+ - "\u0000\u0000\uEFBD\u0000\uE6C9\u0000\u0000\uF0DB"+ - "\uF1B1\u0000\uE153\uF6BE\uF95B\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF796\u0000\uE7B7\u0000\u0000"+ - "\uF4D3\uF4D4\u0000\u0000\u0000\uF6E4\u0000\uF6D1"+ - "\u0000\u0000\uE747\uE241\uE052\u0000\u0000\uF8B4"+ - "\uE0C6\u0000\u0000\uF398\u0000\u0000\uE5E7\u0000"+ - "\uF060\u0000\u0000\u0000\u0000\u0000\uE164\uE0AF"+ - "\u0000\u0000\u0000\u0000\u0000\uF53A\uEFAF\u0000"+ - "\u0000\uF5C3\uEFD8\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE9E9\u0000\u0000\u0000\uF3F3\u0000"+ - "\uE5FB\uEA4B\u0000\u0000\uF59D\u0000\u0000\u0000"+ - "\uF9F3\uF9F2\uF6A6\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE9C9\u0000\u0000\uE563"+ - "\u0000\uE138\u0000\uE851\uE165\u0000\uE7E4\u0000"+ - "\u0000\u0000\uF85A\u0000\u0000\u0000\uEDE3\u0000"+ - "\u0000\u0000\uE4BC\u0000\u0000\u0000\uE092\u0000"+ - "\u0000\u0000\u0000\uE354\u0000\u0000\u0000\uE060"+ - "\uF83B\uF0EB\uEEF8\uE7E5\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE3D7\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF4A4\u0000\u0000\u0000\uE59D\uF973"+ - "\uF868\u0000\uF4D5\u0000\uE2AB\u0000\u0000\uF0F3"+ - "\uE5FC\u0000\u0000\u0000\u0000\u0000\u0000\uE4D4"+ - "\uE1FC\u0000\uE7E6\u0000\uEC9B\uEC31\uF0D4\u0000"+ - "\uEB99\uED42\uE19E\u0000\u0000\u0000\uF8E4\u0000"+ - "\u0000\u0000\uF53B\u0000\u0000\u0000\u0000\uE34D"+ - "\u0000\uE093\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF2B8\u0000\u0000\u0000\uE6C0\u0000"+ - "\uF29C\uF9F4\u0000\u0000\uE4E3\u0000\uF8C2\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE5E8\uE8AE"+ - "\uEBB6\uF747\u0000\u0000\u0000\u0000\u0000\uEB4F"+ - "\uF8C3\uE9EA\u0000\uEC32\u0000\uF236\u0000\u0000"+ - "\u0000\u0000\u0000\uF678\u0000\u0000\u0000\u0000"+ - "\uF697\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE9CA\u0000"+ - "\u0000\uE372\u0000\u0000\u0000\u0000\uE9A6\u0000"+ - "\u0000\uE9EB\u0000\u0000\uED9B\u0000\u0000\uECAF"+ - "\uE39E\u0000\u0000\u0000\uF59E\u0000\u0000\u0000"+ - "\u0000\uE14C\uF6EA\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uEDE4\uEAF1\u0000\u0000\uF6E1\u0000\uF7F7"+ - "\uF2B9\u0000\u0000\uF768\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF7A9\u0000\u0000\u0000\u0000"+ - "\u0000\uF769\u0000\u0000\u0000\uF24D\u0000\u0000"+ - "\u0000\uE756\u0000\u0000\uED73\uF5CE\u0000\u0000"+ - "\u0000\u0000\uE9D9\u0000\u0000\u0000\u0000\uE7E7"+ - "\uE449\uE5C3\u0000\u0000\uE875\uE860\u0000\uE3D9"+ - "\uE268\u0000\uE0DE\uF53C\uE89D\u0000\uF679\uEF95"+ - "\uE2AC\uF392\u0000\uF59F\uE8C8\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE250\uECD4\uE3CF\uF3F5"+ - "\u0000\uE1F2\u0000\uE2EB\u0000\u0000\u0000\uE1B8"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uECA6\uE3DA"+ - "\u0000\uF435\u0000\u0000\u0000\u0000\u0000\uF436"+ - "\u0000\uED5E\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE4FB\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF3A9\u0000\u0000\u0000\uF459"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF2D8\uEE59\u0000\uE748\uF895\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF4B5\u0000\u0000\uF734\u0000\u0000\uE3F3"+ - "\uEE58\u0000\u0000\u0000\u0000\uF76A\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE979"+ - "\uEA67\u0000\u0000\u0000\u0000\u0000\uE0DF\u0000"+ - "\u0000\u0000\uE2EC\u0000\u0000\u0000\u0000\uF56F"+ - "\u0000\u0000\uE3F4\uE44A\u0000\u0000\u0000\uEAF2"+ - "\u0000\u0000\u0000\uEBB7\u0000\u0000\u0000\u0000"+ - "\uEC33\uE4FC\u0000\u0000\uF1E6\u0000\u0000\u0000"+ - "\u0000\u0000\uE8C9\u0000\u0000\u0000\uED9C\u0000"+ - "\uE2DE\u0000\u0000\uE260\u0000\u0000\u0000\u0000"+ - "\uE5D3\uF4F5\uF6AE\u0000\u0000\uF2C8\u0000\uE1F3"+ - "\uF5CF\uEDF3\uF352\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE061\u0000\u0000\u0000\uF093\u0000\uE336\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE7DA"+ - "\uF33B\u0000\u0000\u0000\u0000\u0000\uF0E7\u0000"+ - "\u0000\u0000\uEDC0\uF945\u0000\u0000\u0000\u0000"+ - "\u0000\uED54\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE139\uF9C6\u0000"+ - "\u0000\u0000\u0000\u0000\uF045\u0000\uEDAA\uEABA"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEBDF\u0000\uE861"+ - "\u0000\u0000\u0000\u0000\uEBB8\u0000\uEF96\uE4FD"+ - "\u0000\u0000\u0000\u0000\uEC34\u0000\u0000\u0000"+ - "\u0000\u0000\uF45A\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE876\uF6B3\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF9CD\u0000\u0000\u0000\uF4B6\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF267\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF5C4\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE734\u0000\u0000\u0000\u0000\u0000\uF437"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE7B8\uE7B9\uF2C9\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE65E\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF6CB\uEAAE\uEF97\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE445\u0000\u0000\u0000\uE4D5\u0000"+ - "\u0000\u0000\u0000\u0000\uF55C\uE89E\u0000\u0000"+ - "\u0000\u0000\u0000\uE7E8\u0000\uF6EB\uF5C9\u0000"+ - "\uF4BC\u0000\uE862\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE4B5\u0000\u0000\u0000\u0000"+ - "\u0000\uEF46\u0000\u0000\uE65F\uF54A\u0000\uF6C9"+ - "\u0000\u0000\uE13A\u0000\u0000\uF353\uE166\u0000"+ - "\u0000\u0000\uE363\u0000\uE4BD\u0000\u0000\u0000"+ - "\uE8FB\u0000\uE0E0\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE4E4\uF699\u0000\u0000\uE5BA\uF4CD\uE0E1"+ - "\u0000\u0000\u0000\u0000\uF0F4\u0000\u0000\u0000"+ - "\u0000\u0000\uF53D\u0000\uF93A\u0000\u0000\u0000"+ - "\u0000\u0000\uF6EC\u0000\u0000\u0000\uEF98\u0000"+ - "\uE877\u0000\u0000\u0000\uF6CC\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEDC1\u0000\u0000\u0000\u0000\uEB7E\u0000\u0000"+ - "\u0000\u0000\u0000\uE5FD\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE276\uF93B\uE5BB\u0000\u0000\uF438"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uEC35\uE1B9"+ - "\uF094\uE0C7\u0000\uE1F4\u0000\u0000\uE8AF\uF2D9"+ - "\u0000\u0000\u0000\u0000\u0000\uE1BA\u0000\u0000"+ - "\uF99B\u0000\u0000\u0000\u0000\uEAF3\uE277\uE852"+ - "\u0000\uE2AD\u0000\u0000\u0000\u0000\uEEF9\uF738"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF4E2\u0000"+ - "\u0000\u0000\uE094\uEAA4\u0000\u0000\uE554\u0000"+ - "\u0000\u0000\u0000\u0000\uE167\uEDC2\u0000\u0000"+ - "\u0000\u0000\uE1BB\u0000\uF2DA\uF268\u0000\uE9A7"+ - "\uEC36\u0000\u0000\u0000\u0000\u0000\uEB50\u0000"+ - "\u0000\u0000\uE640\uF75A\u0000\uF99C\u0000\uE7FE"+ - "\u0000\u0000\u0000\u0000\uEA40\u0000\u0000\u0000"+ - "\uE9EC\uE878\u0000\u0000\u0000\u0000\u0000\uE570"+ - "\u0000\uE69B\u0000\uE1D7\uEA68\u0000\u0000\uF49A"+ - "\u0000\uED66\u0000\u0000\uE355\uF53E\u0000\uE9A8"+ - "\u0000\u0000\u0000\uF1C5\uF4D6\u0000\u0000\uEA69"+ - "\uECE6\u0000\u0000\u0000\u0000\u0000\u0000\uE4A8"+ - "\u0000\uE8B0\u0000\u0000\uEDDA\uECBF\u0000\u0000"+ - "\u0000\uE8B1\u0000\u0000\u0000\uE5E9\u0000\u0000"+ - "\u0000\u0000\u0000\uEB51\uF2DB\u0000\u0000\uF379"+ - "\u0000\u0000\uE6B2\u0000\u0000\u0000\u0000\uE39F"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE7E9\u0000\u0000\uE3A0\u0000\uF17D\uE4A9\u0000"+ - "\uF439\uF354\u0000\u0000\uEC72\uEFEF\u0000\u0000"+ - "\u0000\uF7D1\u0000\u0000\uEFD9\u0000\u0000\u0000"+ - "\u0000\u0000\uEF6A\uE853\uE854\uE555\u0000\uEEFA"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE1E0\uECB0"+ - "\u0000\uE8B2\uF8C4\u0000\uF4E3\u0000\uE7A5\uF8E7"+ - "\uE9CB\uE364\u0000\uEE46\uEB3E\uF9DA\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE945\uEB9A"+ - "\uEEB1\u0000\u0000\u0000\u0000\uF5F0\u0000\uE76C"+ - "\uF1C6\u0000\u0000\u0000\u0000\uEBB9\u0000\uECC0"+ - "\uF7C0\uEFF0\u0000\u0000\uE7DB\u0000\uF4E4\u0000"+ - "\u0000\u0000\uE946\uED79\u0000\u0000\u0000\u0000"+ - "\u0000\uF355\uECC1\uF95C\uF95D\u0000\u0000\u0000"+ - "\u0000\uF45B\u0000\uF45C\u0000\u0000\u0000\uED5F"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF3DB\u0000\uF869\u0000\uF3B8\uF9F5\uEB9B"+ - "\u0000\u0000\u0000\u0000\uEEFB\uF947\uF974\uF8C5"+ - "\uECE7\uE749\u0000\uF69A\u0000\u0000\uE955\uE168"+ - "\u0000\u0000\u0000\uEB3F\uF577\u0000\uF2DC\uE2FC"+ - "\uF2DD\u0000\uF43A\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF9BE\u0000\u0000\uE03C"+ - "\uF9BB\uF9C7\u0000\u0000\u0000\u0000\uEEB2\u0000"+ - "\uF061\uEAF4\u0000\u0000\u0000\u0000\uE3EC\uED6E"+ - "\uEDC3\u0000\u0000\u0000\u0000\uE7A6\u0000\u0000"+ - "\uE1BC\u0000\uF4E5\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF1D5\u0000\u0000\uE7BA\u0000"+ - "\u0000\u0000\uF1E7\uF8B5\uF77C\u0000\u0000\u0000"+ - "\u0000\uEB77\u0000\uE169\u0000\u0000\uE556\u0000"+ - "\u0000\u0000\u0000\u0000\uEEA5\u0000\uE5F5\uE4BE"+ - "\u0000\uF99D\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uED94\u0000"+ - "\u0000\uEAF5\u0000\u0000\uEF9A\uF77D\u0000\u0000"+ - "\uE257\u0000\u0000\u0000\u0000\u0000\uF9F6\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEF68\u0000\uE1D8\uEED6\uE16A\u0000\u0000\uE073"+ - "\uEAF6\uF357\uF356\u0000\uE74A\u0000\uF3F4\uF592"+ - "\uF5CC\u0000\u0000\uF975\u0000\u0000\u0000\u0000"+ - "\uF055\uF095\u0000\uE9DB\u0000\uE967\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uEA9F\uF49B\u0000\uE5C7"+ - "\u0000\u0000\u0000\uE760\u0000\uF358\uE3A1\uE3A2"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE7D4\uE678"+ - "\uE7CA\u0000\uE841\uE757\uE972\uF4CE\uF5F4\u0000"+ - "\u0000\uF3B9\u0000\u0000\uE863\u0000\uF67A\u0000"+ - "\u0000\u0000\uE2F5\u0000\u0000\uF9AE\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE062\u0000"+ - "\u0000\uEAB4\u0000\u0000\u0000\u0000\uE6DD\uF84A"+ - "\uF237\uF5BD\u0000\uF797\u0000\u0000\uF1E8\u0000"+ - "\u0000\u0000\u0000\u0000\uE571\u0000\uE3A3\uEBD6"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF7F8\u0000\uE8CA"+ - "\uE0F9\uE564\u0000\uE7DC\u0000\uF24E\u0000\uF6ED"+ - "\u0000\u0000\u0000\uE47E\u0000\u0000\uEBE6\uF6F9"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE9ED"+ - "\u0000\uEF6B\u0000\uE8B3\u0000\u0000\u0000\uE3F7"+ - "\uEB40\u0000\u0000\uE572\u0000\uF667\u0000\uE6F9"+ - "\u0000\u0000\uE76D\u0000\uE1FD\uF43B\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE1BD"+ - "\uF752\u0000\u0000\uF43C\u0000\u0000\uE03D\uE03E"+ - "\uE2AE\u0000\u0000\u0000\u0000\u0000\uECC2\u0000"+ - "\u0000\u0000\u0000\u0000\uE947\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE8DA"+ - "\uE7BB\uE095\uF663\uEE9A\uF097\u0000\u0000\u0000"+ - "\u0000\u0000\uF098\u0000\u0000\uF69B\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE2AF\u0000\u0000\uE063\u0000\u0000\uE03F"+ - "\uE440\uF3BA\u0000\uE6B3\uECC3\uF4FD\uEA6A\u0000"+ - "\u0000\u0000\u0000\uEA6B\u0000\u0000\uF2DE\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEC73\uF29D\u0000\u0000\uEAF7\uE6CA"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE278\uE8DB\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF3BB\u0000\u0000\u0000\u0000\uEFF1"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF847\uE356\u0000\u0000\uE13B\uF238\u0000\u0000"+ - "\uE0FA\uF7F9\uE19F\uE4FE\u0000\u0000\u0000\u0000"+ - "\uED60\u0000\u0000\u0000\u0000\u0000\uF47E\u0000"+ - "\uE565\uEACD\u0000\uF948\uE3D0\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF45D\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF6D2\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE064"+ - "\u0000\uE5D9\u0000\u0000\u0000\uE76E\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE1D9"+ - "\u0000\u0000\u0000\uF239\uF64C\u0000\u0000\uE16B"+ - "\u0000\u0000\u0000\u0000\u0000\uF359\u0000\uF99E"+ - "\u0000\uEF59\uF5A0\u0000\u0000\u0000\u0000\uEEFC"+ - "\uE6DE\u0000\u0000\u0000\u0000\uEA6C\u0000\uF33C"+ - "\uE1A0\uE1E1\u0000\uEBBA\u0000\uE8EF\uE842\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE3A5\uE948\u0000\u0000"+ - "\u0000\uE798\u0000\uE3A4\u0000\uE1E2\u0000\u0000"+ - "\u0000\u0000\uE97A\u0000\u0000\uF399\u0000\uF35A"+ - "\uE34E\u0000\uE9DC\u0000\u0000\u0000\u0000\uE566"+ - "\uE4D6\u0000\u0000\u0000\u0000\u0000\u0000\uF1D0"+ - "\uE1A1\u0000\u0000\u0000\u0000\u0000\uEAB5\u0000"+ - "\u0000\u0000\uEAF8\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE531\uE242\u0000\u0000\u0000\u0000\u0000"+ - "\uEF5A\u0000\u0000\u0000\u0000\uF0F5\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uECD5\uF5D0\u0000"+ - "\u0000\u0000\uF5A1\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE7A7"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEDAB\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEE5B\u0000\uF5F1"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEDC5\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF7A3\uEB6B\uF67B\u0000\uE0F1"+ - "\u0000\uE7EA\uF5A2\u0000\u0000\u0000\uE6D1\u0000"+ - "\uE3F8\uF09A\uF09B\uE843\u0000\u0000\u0000\u0000"+ - "\uF2DF\u0000\u0000\uF3EF\u0000\uEDF6\uF24F\uEC74"+ - "\u0000\u0000\u0000\u0000\u0000\uE34F\u0000\uF83C"+ - "\uF5D1\uEEB3\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEFBE\u0000\u0000"+ - "\u0000\u0000\u0000\uF45E\uE8B4\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF95E\u0000\uE9EE"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uEEB4\u0000"+ - "\u0000\u0000\u0000\u0000\uE6B4\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF6B4\u0000\u0000\u0000\u0000"+ - "\u0000\uE1BE\u0000\uE879\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE2B0\uF6D9\uF4E6\u0000\u0000"+ - "\uE269\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE23A\u0000\uE0C8\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE337\u0000\uF35B\u0000\uE357"+ - "\u0000\u0000\uED55\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE8E0\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE5DA\u0000\uE6A7\u0000\u0000\u0000\uF250"+ - "\u0000\uF798\u0000\u0000\u0000\u0000\uF5D2\uF1E9"+ - "\u0000\uE7BC\u0000\uEDC6\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF5A3\u0000\u0000"+ - "\uE864\uEC37\uF8FC\u0000\u0000\uF3DC\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE096\u0000\u0000\u0000"+ - "\uEF9C\u0000\u0000\uE279\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEFF8\uEC75\u0000\u0000\u0000\u0000"+ - "\uE349\uE594\u0000\u0000\u0000\u0000\u0000\uE3A6"+ - "\u0000\uEACE\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF996\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE4AA\u0000\u0000\u0000\uE13C\u0000\u0000\u0000"+ - "\u0000\uF2E0\u0000\u0000\u0000\uEDE5\uE365\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE8FC"+ - "\u0000\u0000\u0000\u0000\uF976\u0000\u0000\u0000"+ - "\u0000\u0000\uE0FE\uF1EA\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uEA41\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF7E3\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE532\uE2F6\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE660\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE5EA\uF3EE\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF85B\u0000"+ - "\u0000\u0000\u0000\uEDA1\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE5B1\u0000\u0000\u0000"+ - "\u0000\u0000\uE2ED\u0000\uF1EB\u0000\u0000\u0000"+ - "\u0000\u0000\uE5B2\u0000\u0000\u0000\uE5BC\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF9E2\uF4AD\u0000\uF9DB\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEFB0\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE3A7\u0000\u0000\uF9E3\uE243\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF9E4\uF85E"+ - "\u0000\u0000\u0000\u0000\uE040\u0000\uF6A7\u0000"+ - "\uE2B1\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEE32"+ - "\u0000\uF946\uF43D\uF2E1\uF4AE\uE956\uE7EB\u0000"+ - "\u0000\u0000\uEF70\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEBA8\u0000\u0000\u0000\u0000\uE5F6"+ - "\uE2FD\u0000\u0000\uEA6D\u0000\u0000\u0000\uE7D1"+ - "\u0000\u0000\u0000\uED7A\uF45F\u0000\uF6BF\u0000"+ - "\u0000\uEC76\uEC38\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uECD6\u0000"+ - "\uF1D1\u0000\u0000\u0000\u0000\u0000\uEFF9\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE641\uEA42"+ - "\u0000\u0000\uEB78\u0000\u0000\uE4AB\u0000\uF0DC"+ - "\u0000\u0000\uEAAF\u0000\uE053\u0000\u0000\uF29E"+ - "\u0000\uF9C3\u0000\u0000\u0000\uF0F6\uE2B2\u0000"+ - "\u0000\u0000\u0000\uE7EC\u0000\uE7BD\u0000\uE76F"+ - "\u0000\u0000\uE548\uF0BE\uE9EF\u0000\uE9F0\uE9F1"+ - "\uE9F2\u0000\u0000\uE7BE\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF8C6\uE2B3\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF29F\u0000\u0000\u0000\u0000\u0000\u0000\uED3B"+ - "\u0000\uE855\u0000\uE77C\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE3A8\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uEC39\u0000\u0000\uEA4C"+ - "\uEEB5\u0000\u0000\u0000\u0000\u0000\uE8F0\u0000"+ - "\uF2E2\uF3F0\uE2B4\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE8F1\u0000"+ - "\uEB41\u0000\u0000\u0000\u0000\uEAA5\u0000\uF7D2"+ - "\u0000\u0000\uEEFD\u0000\u0000\uEE33\uF8F1\uE0B0"+ - "\uF43E\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE1E7\u0000\uEF6C\u0000\u0000\uEED7\u0000\u0000"+ - "\uF6C0\u0000\uE373\u0000\u0000\u0000\uE831\u0000"+ - "\u0000\u0000\uE14D\u0000\u0000\uE3A9\uE9CC\u0000"+ - "\u0000\uECFE\uE3AA\uEF3A\u0000\uF046\uF7FA\uEE5C"+ - "\uF668\u0000\u0000\u0000\uE557\u0000\u0000\u0000"+ - "\uE7CB\u0000\uE7D2\uE4CB\uE799\uE839\uF5F8\u0000"+ - "\u0000\uEA6E\uF43F\uF739\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE758\u0000\u0000\uF251\u0000"+ - "\u0000\u0000\u0000\uF7C1\u0000\u0000\u0000\u0000"+ - "\uE9F3\uF09C\u0000\uF64D\uEBBB\uE1BF\uF564\uEE5D"+ - "\u0000\uF95F\uF8A2\u0000\uEB6C\u0000\u0000\u0000"+ - "\u0000\uF54B\uE865\u0000\uF7B2\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF8F2\u0000\uE8F6\u0000\uEA6F"+ - "\u0000\u0000\u0000\uE8F2\u0000\u0000\u0000\u0000"+ - "\u0000\uF76C\uF6EE\uF0E8\u0000\uE49C\u0000\u0000"+ - "\uF3BC\u0000\u0000\uF86A\u0000\u0000\uE87A\uE856"+ - "\uF6C1\u0000\u0000\uEEB6\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"; - - private final static String innerIndex3= - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uEDC7\uE63C\u0000\u0000\u0000"+ - "\u0000\uE957\u0000\u0000\u0000\u0000\u0000\uEBA9"+ - "\u0000\uEC3A\u0000\uE5A6\u0000\u0000\uE567\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF460\u0000\uF09D"+ - "\u0000\uEB6D\uF8F3\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF3BD\u0000\u0000\uEC77\uF9D7\u0000"+ - "\uE258\uF047\u0000\uF950\u0000\uF9E7\uF6EF\u0000"+ - "\u0000\uE6B5\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF2BA\uF3DD\u0000\uEA43\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uEF5B\u0000\u0000\uF76D\u0000"+ - "\u0000\uF8C7\uE5C8\u0000\uE6DF\u0000\uE9A9\u0000"+ - "\u0000\u0000\u0000\u0000\uEFB1\u0000\u0000\uF83D"+ - "\uF669\uF896\u0000\u0000\u0000\u0000\u0000\uF73A"+ - "\u0000\u0000\u0000\u0000\u0000\uEE7E\u0000\uE16C"+ - "\uEBBC\uEB91\u0000\u0000\uEFBF\uF99F\uEE5E\u0000"+ - "\u0000\uEBD7\u0000\uEE5F\u0000\uF593\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uED95"+ - "\u0000\u0000\uED9D\u0000\u0000\uF7E4\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF2E3\u0000\u0000\uE2EE\uF64E\uEB42\uF9A0\uE3AB"+ - "\u0000\u0000\u0000\uE6FA\u0000\u0000\u0000\uF8C8"+ - "\u0000\uEC67\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE533\uF39A\uE6A8\u0000\u0000\u0000\uEBE7\u0000"+ - "\u0000\uE4BF\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF2E4\u0000\uE6C5\uF0E2\u0000\u0000\uF977\u0000"+ - "\u0000\uED32\u0000\uEC78\u0000\uEE60\u0000\uF8E8"+ - "\uF578\uEDF4\uF54C\uF565\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEAB6"+ - "\u0000\uF949\uF252\uE097\u0000\u0000\u0000\uF2E5"+ - "\uE0E2\uE534\u0000\uEA70\uE89F\uED56\uEF4E\u0000"+ - "\u0000\u0000\u0000\uEB6E\uF644\uF062\u0000\uF7FB"+ - "\u0000\u0000\uEB52\u0000\uE074\u0000\uEEB7\u0000"+ - "\uF09F\u0000\uE7DD\u0000\uE844\uF23A\uF8E9\u0000"+ - "\u0000\u0000\u0000\uE8CB\uE845\u0000\u0000\u0000"+ - "\u0000\u0000\uF3BE\u0000\u0000\uE4AC\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF8C9\u0000"+ - "\uEACF\u0000\u0000\uE4C0\uECD7\u0000\uF2E6\uF960"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEFC0"+ - "\u0000\u0000\u0000\uF5D3\u0000\u0000\uF16C\uF6B7"+ - "\u0000\u0000\uF048\uE3F9\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE958\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF049\u0000\u0000\u0000\u0000\u0000\uF3DE\u0000"+ - "\u0000\u0000\u0000\u0000\uE6B6\uE2B5\u0000\uE7A8"+ - "\u0000\u0000\uF17E\u0000\u0000\uE9AA\u0000\u0000"+ - "\u0000\u0000\uE1A2\uEF3E\u0000\u0000\u0000\uEBBD"+ - "\u0000\uF461\u0000\u0000\u0000\u0000\uEFC1\u0000"+ - "\u0000\u0000\uE49E\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE8B5\u0000\uF4E7\uE7A0\u0000\u0000"+ - "\u0000\uF961\u0000\uF1B2\uF53F\u0000\uF8A3\u0000"+ - "\u0000\uF951\u0000\uF23B\uE535\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF594"+ - "\u0000\u0000\u0000\u0000\uF269\u0000\u0000\u0000"+ - "\uF8CA\u0000\u0000\u0000\u0000\u0000\uE1E3\uE74B"+ - "\u0000\uEDDB\uF799\u0000\u0000\u0000\uF664\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE6A9"+ - "\u0000\uE0C9\u0000\u0000\uEE61\uF35C\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE73E\u0000\uF7D3\uE5FE\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE74C\uF440\u0000\u0000\u0000"+ - "\u0000\uEC3B\uF4E8\u0000\u0000\u0000\u0000\u0000"+ - "\uF2C2\u0000\u0000\u0000\u0000\u0000\u0000\uF1EC"+ - "\u0000\uEEB8\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE8A0\u0000\u0000\uE14E\u0000\u0000\uF49E"+ - "\uE87B\u0000\uEC68\uF1D6\u0000\u0000\uE661\uEB43"+ - "\u0000\u0000\uF962\u0000\uF0C8\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE4C1\uF35D\u0000"+ - "\uE2F7\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF1D2\u0000\uE568\uE959\uE6F1\u0000"+ - "\u0000\uEABB\u0000\u0000\uF4A5\u0000\u0000\u0000"+ - "\uF55D\u0000\u0000\u0000\u0000\uF3BF\uF741\u0000"+ - "\uEFFA\u0000\u0000\u0000\uF8CB\u0000\u0000\uE065"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF7D4\uF6CA\u0000\u0000\uE658"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF978\uF4BD"+ - "\u0000\uF2A0\u0000\uEEFE\u0000\u0000\u0000\u0000"+ - "\u0000\uE4C2\u0000\u0000\u0000\u0000\uE4B6\u0000"+ - "\uE13D\uF69C\uE642\uE468\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEED8\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uECA5\u0000\u0000"+ - "\u0000\u0000\uEEB9\u0000\u0000\u0000\u0000\uF33D"+ - "\uF8CC\uF0A1\u0000\u0000\uE536\u0000\u0000\u0000"+ - "\u0000\uF8CD\u0000\uE5BD\uF3DF\u0000\u0000\uF69D"+ - "\u0000\uEA44\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE5EB\u0000"+ - "\u0000\uEDC8\u0000\u0000\u0000\uF8A4\uE549\u0000"+ - "\u0000\uEA71\u0000\uED33\u0000\u0000\u0000\uE6B7"+ - "\u0000\uF77E\u0000\u0000\u0000\uEA45\u0000\u0000"+ - "\uE662\u0000\uF7D5\uEEBA\uF0D5\uE5F7\uF2E7\uEBBE"+ - "\u0000\u0000\u0000\uF83E\u0000\u0000\u0000\uE679"+ - "\uE67E\u0000\u0000\u0000\u0000\u0000\u0000\uEEBB"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF15B"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE5B3\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE244\u0000\u0000\u0000"+ - "\uF8A5\uEBEE\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF6A8\u0000\u0000\u0000\u0000\uF8CE\u0000\u0000"+ - "\u0000\u0000\u0000\uE74D\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF8FD\u0000\u0000\u0000\u0000"+ - "\uF979\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE2B6\u0000\u0000\u0000\uF1C7\uF23C\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE16D\u0000\u0000"+ - "\u0000\u0000\uF637\u0000\u0000\u0000\uEE9C\u0000"+ - "\u0000\u0000\uF5A4\u0000\u0000\u0000\u0000\u0000"+ - "\uF9DC\uF1B3\uE259\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF2E8\u0000\u0000\uEBBF\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF86B\uE0E3\uF6A9\u0000\uF8A6"+ - "\u0000\u0000\u0000\uE949\u0000\u0000\u0000\uF3C0"+ - "\uF1C8\uF2C3\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE63D\u0000\u0000\uF9CE\u0000\u0000\u0000\uEF31"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF8F4\uE5A7\u0000\u0000\u0000\uF3F6\u0000\uEE63"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE16E\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF742\u0000\u0000\u0000\uE97B\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF9B6\u0000\u0000\u0000"+ - "\u0000\uEDEA\u0000\u0000\uF3E0\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE8CC\uE9CD\u0000\u0000\u0000\uE558\u0000"+ - "\u0000\uE7ED\u0000\u0000\u0000\u0000\uF5A5\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEE9D\u0000\u0000\u0000\u0000\u0000\uEE64\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF9C8"+ - "\u0000\uE631\uF9BF\u0000\uF963\u0000\uF2A1\u0000"+ - "\uEEBC\u0000\u0000\u0000\u0000\u0000\uE3EE\u0000"+ - "\u0000\uEE65\u0000\u0000\uEFF2\u0000\uEAB0\u0000"+ - "\u0000\u0000\u0000\u0000\uE770\uF94A\uF9AF\uF35E"+ - "\u0000\uE8E1\u0000\u0000\uEDC9\u0000\uF1B4\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEB53\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uECD8\u0000\u0000\u0000"+ - "\u0000\uEFFB\uF038\u0000\u0000\u0000\u0000\uF9B7"+ - "\u0000\u0000\uF8A7\u0000\uEFC2\u0000\u0000\u0000"+ - "\u0000\uF9F7\u0000\u0000\u0000\u0000\u0000\uEC69"+ - "\u0000\u0000\uE97C\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uEF32\u0000\u0000\u0000"+ - "\u0000\uEE92\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF9F8\uF9F9\u0000\u0000\u0000\uF64F\u0000"+ - "\u0000\uEEA7\u0000\uEE67\u0000\u0000\u0000\u0000"+ - "\uE595\uE559\u0000\u0000\u0000\u0000\uE69C\u0000"+ - "\uE6F2\u0000\uEBC0\u0000\uE8E2\uEE68\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEEBD"+ - "\u0000\u0000\u0000\u0000\u0000\uF35F\uF4BE\uEC3C"+ - "\u0000\u0000\u0000\u0000\u0000\uF5B7\uEB92\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF9B8\uECE8\u0000\uE537\uEF9E"+ - "\uF862\u0000\u0000\u0000\u0000\u0000\uF791\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE663\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE5B4\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF360\u0000\uF6F0\uF243\u0000\u0000"+ - "\uF04A\u0000\uF063\u0000\u0000\uF1C9\uE9AB\u0000"+ - "\u0000\u0000\uEDAC\uF9A1\u0000\uEAD0\uF143\u0000"+ - "\uEAD1\u0000\u0000\u0000\u0000\u0000\uF1ED\uF748"+ - "\uF6FA\u0000\u0000\u0000\uF73B\u0000\u0000\u0000"+ - "\u0000\u0000\uF570\u0000\u0000\u0000\u0000\u0000"+ - "\uE54A\uED43\u0000\uEFDA\u0000\uEA46\u0000\uE7BF"+ - "\u0000\uE7C0\uE691\u0000\u0000\u0000\u0000\uE7CC"+ - "\u0000\uE83A\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEAE5\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF6E5\u0000\u0000\u0000\uE142\u0000\u0000"+ - "\uEAF9\uE6E0\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE54B\u0000\u0000\u0000\u0000\uF9FA"+ - "\u0000\u0000\u0000\u0000\uE143\u0000\u0000\uE8F3"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEAD2\u0000\uE25A\u0000\uF26A\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uED74\u0000"+ - "\uF8CF\u0000\u0000\u0000\u0000\u0000\u0000\uE2B7"+ - "\u0000\uF253\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE27A\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uEC3D\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE6E1\uF897\u0000\u0000\uE5C9\uF73C\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEED9\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF4E9\u0000"+ - "\u0000\u0000\u0000\uE77D\uECC4\uF393\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEF75\u0000\u0000"+ - "\u0000\uEB9C\uF254\uE7DE\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF0A2\uF0A3"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF952\uF04B"+ - "\u0000\u0000\u0000\u0000\uEF3B\uEA72\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF1EF\u0000\uEF33\u0000\u0000\u0000\u0000\uE2F1"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE54C\u0000\uF97A\u0000\u0000\u0000\u0000\u0000"+ - "\uEEBE\u0000\uF994\u0000\u0000\uE644\u0000\u0000"+ - "\uEC3E\u0000\uE4B7\uF85C\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF86C\u0000\uF1B5\uEBE3"+ - "\u0000\uEF3C\u0000\uEF6D\u0000\u0000\uF2E9\u0000"+ - "\u0000\u0000\u0000\u0000\uF54D\u0000\uE2B8\uEFDB"+ - "\uE3AC\u0000\u0000\u0000\u0000\u0000\u0000\uE857"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF0C9"+ - "\u0000\uEF5C\u0000\u0000\u0000\uEA47\u0000\u0000"+ - "\u0000\u0000\uE64C\uE4E5\u0000\u0000\u0000\u0000"+ - "\u0000\uF86D\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE866\u0000\uE041\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE858\uEAA6\u0000\uF7B3\uF462\u0000\uE054"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE25B\u0000"+ - "\u0000\uE1F5\u0000\u0000\u0000\uF9B0\uE5A8\u0000"+ - "\uF3C1\u0000\u0000\uEC79\uE95A\uF144\uF850\u0000"+ - "\u0000\uF8A8\uE338\u0000\u0000\uE87C\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE7EE"+ - "\u0000\uEB9D\u0000\u0000\u0000\uF2EA\uF86E\u0000"+ - "\u0000\uEB54\u0000\uE2B9\u0000\uE5CA\uE6E2\uEC3F"+ - "\u0000\uE6B8\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uEF5D\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF66A\u0000\u0000\u0000\u0000"+ - "\uF2A2\uEC6A\uF69E\u0000\u0000\uF8D0\uE3AD\u0000"+ - "\uE1E4\u0000\uE3AE\uE97D\uEF5E\u0000\uF39B\uE245"+ - "\uEE9E\u0000\u0000\uE6FB\uE366\uE9F5\uF6F1\u0000"+ - "\uF69F\u0000\uE8F7\u0000\u0000\u0000\u0000\uF8EA"+ - "\uEFDC\uE7C1\u0000\uF5F2\uEB55\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF064\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF7C2\u0000\uF04C"+ - "\u0000\uE455\uF8D1\uEEC0\uF0A5\u0000\uEAFA\uECA2"+ - "\uE6B9\u0000\uEFC3\u0000\uEF9F\uEF3F\u0000\u0000"+ - "\uF463\uF8A9\uE735\u0000\u0000\u0000\u0000\uE5CB"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE358\u0000"+ - "\u0000\u0000\uE3AF\uE6E3\u0000\u0000\u0000\uEB56"+ - "\u0000\uE632\u0000\uF1F0\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE6F3\u0000\u0000\u0000\uF964\u0000\uE867\uE16F"+ - "\u0000\uF464\u0000\uE3B0\u0000\uE170\u0000\uE8FD"+ - "\uF4BF\u0000\uF361\u0000\u0000\u0000\u0000\u0000"+ - "\uF94B\u0000\uEC40\u0000\u0000\uEE35\u0000\u0000"+ - "\u0000\uEC6B\u0000\u0000\u0000\uEADE\u0000\uEB57"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF491\u0000"+ - "\u0000\u0000\uE171\u0000\u0000\u0000\u0000\uE67A"+ - "\u0000\u0000\u0000\u0000\uEEC2\u0000\u0000\u0000"+ - "\uE246\u0000\uF4C0\u0000\uE1FE\u0000\u0000\u0000"+ - "\uF8D2\u0000\uF79A\uF6FB\u0000\u0000\uEF4F\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uEF47\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF1B6"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE94A\u0000\u0000\uE144\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF3F7\u0000\u0000\u0000\uEF48\u0000\u0000"+ - "\uE098\u0000\uED34\uF566\u0000\u0000\u0000\uEAE6"+ - "\u0000\u0000\u0000\uEAA7\u0000\uEAE7\uEBC1\u0000"+ - "\uEFC4\u0000\u0000\uE95B\uEFC5\u0000\u0000\u0000"+ - "\uF2A3\uF0A6\uE0A3\uECE9\u0000\u0000\u0000\uE3FB"+ - "\uF2A4\u0000\uF2EB\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE344"+ - "\u0000\u0000\u0000\u0000\uE1A3\u0000\u0000\uEF76"+ - "\u0000\uF2A5\u0000\uE4CC\uE87D\u0000\u0000\u0000"+ - "\u0000\uE6BA\u0000\uF465\uF5E5\uE7EF\u0000\u0000"+ - "\u0000\u0000\uF7B4\u0000\u0000\uE5D4\uF9CF\u0000"+ - "\u0000\u0000\uE8E3\u0000\u0000\u0000\u0000\uF3E1"+ - "\uF146\u0000\u0000\u0000\u0000\uF8FE\uE4D7\u0000"+ - "\uE3B1\u0000\uE0B1\u0000\u0000\u0000\u0000\uE3B2"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE0B2\uF3C2"+ - "\u0000\u0000\uF571\uF7B5\u0000\u0000\uEBC3\uEBC2"+ - "\u0000\uF0F7\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEAA8\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE0CA\u0000\u0000"+ - "\u0000\u0000\u0000\uEE49\u0000\u0000\u0000\u0000"+ - "\u0000\uF76E\uF7AA\uE099\u0000\uF1B7\u0000\u0000"+ - "\uE4B8\uF466\u0000\u0000\uE569\uF255\uF492\u0000"+ - "\u0000\u0000\uE042\u0000\u0000\uE94B\u0000\uF3F8"+ - "\u0000\u0000\u0000\u0000\u0000\uF147\u0000\u0000"+ - "\u0000\u0000\uEDCA\u0000\uF650\uF9DD\u0000\u0000"+ - "\uE573\uE172\u0000\uF6D4\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE6E5\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE4C3\u0000\uE736\u0000\uF651\u0000\u0000\u0000"+ - "\u0000\u0000\uE9F6\u0000\uE1C0\u0000\u0000\u0000"+ - "\uEDDC\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEDCB\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uEBC4\u0000\u0000\u0000\u0000\u0000\uEF40"+ - "\uF540\uF4EA\uE87E\u0000\uE6BB\u0000\uEC41\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE6AA\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE69D\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uED6F\u0000\uE066\u0000"+ - "\u0000\u0000\uF0A8\u0000\u0000\u0000\uE8FE\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF652\u0000\u0000\uF2BB\u0000\u0000\u0000"+ - "\u0000\uE59F\u0000\u0000\uEB58\u0000\u0000\u0000"+ - "\uEF49\u0000\uF2A6\u0000\u0000\u0000\u0000\u0000"+ - "\uE1A4\u0000\u0000\uE596\uE8A1\uE8DC\uE8DD\u0000"+ - "\u0000\u0000\u0000\u0000\uF26C\u0000\uE0CB\uF965"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE27B\u0000"+ - "\uE1C1\u0000\u0000\uF8D3\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF7AB\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF5D4\u0000\u0000\u0000\u0000\uE7A9"+ - "\u0000\u0000\uEFDD\uE8CD\u0000\u0000\uE9CE\u0000"+ - "\uEEC3\u0000\uF15C\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF7EC\u0000\u0000\u0000\uE0CC\u0000"+ - "\u0000\u0000\u0000\uEB9E\uE538\u0000\uF1D3\uE791"+ - "\u0000\uF467\u0000\uE09A\uE891\u0000\u0000\uE664"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE7CD\u0000"+ - "\u0000\u0000\uE77E\u0000\uF451\u0000\u0000\u0000"+ - "\uEAD3\u0000\u0000\u0000\uE892\u0000\uEC7A\u0000"+ - "\u0000\uEB9F\u0000\u0000\uE79A\u0000\u0000\u0000"+ - "\uF6AF\uE846\u0000\uE067\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF468\u0000"+ - "\uE79B\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF86F\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE2EF"+ - "\uE7C2\u0000\uF362\u0000\uED61\u0000\u0000\u0000"+ - "\uF4B7\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF870\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF2EC\u0000\u0000\u0000\u0000"+ - "\u0000\uEC42\u0000\uE54D\u0000\u0000\uE7CE\u0000"+ - "\u0000\u0000\u0000\uF572\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE539\u0000\u0000\u0000\u0000\uE1C2\uEEDA"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF469\u0000\u0000\u0000\u0000"+ - "\u0000\uE7AA\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE74E\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE93D\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uEC7B\uE69E\u0000\u0000"+ - "\uE09B\u0000\u0000\uE56A\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF567\uE131\u0000\u0000\uE2BA"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF5B8"+ - "\u0000\u0000\u0000\uE7C3\uE378\u0000\u0000\u0000"+ - "\u0000\u0000\uECC5\uF0F8\u0000\uF441\u0000\u0000"+ - "\u0000\uE2BB\u0000\u0000\u0000\uE4AD\uEF71\uE27C"+ - "\u0000\u0000\u0000\uEB44\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEA73\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE9F7\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF442\uF4F6\uF66B"+ - "\u0000\u0000\u0000\u0000\uE6FE\u0000\u0000\u0000"+ - "\u0000\u0000\uF76F\u0000\uF6F2\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE339\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEE6A"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF5A6\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE6BC\uE173\u0000\u0000\uEE6B"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE9DD\u0000\u0000\u0000"+ - "\u0000\uE3B3\u0000\u0000\u0000\u0000\u0000\uF2ED"+ - "\u0000\u0000\u0000\u0000\uE66E\uED96\uEBEF\u0000"+ - "\u0000\uE9F8\u0000\u0000\u0000\u0000\u0000\uEF5F"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE075\u0000\u0000\u0000\uE931"+ - "\u0000\uEB45\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF93C\uF93D\uE737\u0000\u0000\u0000"+ - "\u0000\uF1B8\u0000\u0000\u0000\uE8B6\u0000\u0000"+ - "\u0000\u0000\uE692\uF4AF\u0000\u0000\uE1A5\u0000"+ - "\uE893\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE738\u0000\u0000\u0000\uE174\u0000\u0000\uE3B4"+ - "\u0000\u0000\u0000\u0000\u0000\uE068\u0000\u0000"+ - "\u0000\u0000\u0000\uE894\u0000\u0000\u0000\u0000"+ - "\u0000\uF5A7\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF5A8\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uEE36\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE5EC\uE5F8\uE895\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uECC6\u0000\u0000\u0000\uEA74\u0000"+ - "\uEA75\uE3B5\u0000\u0000\u0000\u0000\u0000\uE3B6"+ - "\uE3B7\uF443\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEFDE\u0000\u0000\u0000\u0000\u0000\uF363\uF444"+ - "\u0000\u0000\uF364\uE0E4\uF8D4\uF5E6\uECEA\u0000"+ - "\uEA76\u0000\u0000\u0000\u0000\uEAD4\u0000\u0000"+ - "\uF79B\u0000\u0000\u0000\u0000\uF33E\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE3B8\u0000\u0000\u0000\u0000\uE66F"+ - "\u0000\uE367\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF931\uF2EE\uE968"+ - "\u0000\uEFDF\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uEDDD\uF9FB"+ - "\u0000\u0000\uEB59\u0000\u0000\u0000\uE659\u0000"+ - "\u0000\uE53A\u0000\uEDCC\u0000\u0000\u0000\u0000"+ - "\u0000\uEFE0\u0000\u0000\u0000\uE368\uF932\uE54E"+ - "\uEC43\uEA77\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE94C\uE446\uF5D5\u0000\u0000\u0000\u0000"+ - "\u0000\uE231\uF5A9\u0000\u0000\uE9F9\u0000\u0000"+ - "\uE9FA\u0000\u0000\u0000\u0000\u0000\u0000\uF365"+ - "\u0000\u0000\u0000\u0000\uF66F\u0000\uF46A\uED7B"+ - "\u0000\uF493\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF149\u0000\u0000\u0000\u0000"+ - "\uF9FC\u0000\u0000\u0000\u0000\uEBAA\u0000\u0000"+ - "\uE069\u0000\u0000\uF2EF\u0000\uF5AA\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF19B\u0000\u0000\uF73D"+ - "\u0000\uF452\uF653\u0000\uE6D2\u0000\u0000\uF7A2"+ - "\uF366\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF39C\u0000"+ - "\u0000\uF670\u0000\u0000\u0000\u0000\uEFF3\uF453"+ - "\u0000\u0000\u0000\uE53B\uE043\uE1A6\u0000\uE1C3"+ - "\uE1DA\u0000\u0000\u0000\u0000\u0000\uE7CF\u0000"+ - "\u0000\uF654\u0000\u0000\u0000\uF26D\uEEC4\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEC44"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uEAE2\uEEDB\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uEF41\u0000\uF93E\u0000\u0000\u0000\u0000"+ - "\uEDCD\u0000\u0000\u0000\uF87B\u0000\uE2BC\u0000"+ - "\u0000\uE2E2\uE1F6\u0000\u0000\uF2F0\u0000\uF54E"+ - "\u0000\uE55D\u0000\u0000\uF4B8\u0000\u0000\u0000"+ - "\uEFA1\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF494\uF4EB\u0000\uF367\u0000\u0000"+ - "\uE2D7\u0000\u0000\u0000\u0000\u0000\u0000\uE2DF"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uEF50\uEF51\u0000\u0000\u0000\uE2E3\uEFA2"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE33A\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF4C1\uE33B\u0000\uE574"+ - "\u0000\u0000\uF2BC\uE731\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE7DF"+ - "\u0000\uF4D7\u0000\u0000\u0000\uE94D\u0000\uE175"+ - "\uF1F1\u0000\u0000\uF3E2\u0000\uE56B\u0000\u0000"+ - "\u0000\u0000\uEC45\u0000\u0000\uE076\u0000\uE4AE"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE176\u0000"+ - "\u0000\uF3D3\uF5E7\u0000\u0000\u0000\u0000\uE06A"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF8EE"+ - "\u0000\uEBC5\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uEAE9\u0000\uF26E\u0000\u0000\uF6C2\u0000"+ - "\uE732\u0000\u0000\u0000\u0000\u0000\uE9AC\u0000"+ - "\u0000\u0000\u0000\u0000\uF33F\uE64D\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uEBAB\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF7B6\u0000"+ - "\u0000\uE597\u0000\uE359\uF2A7\uEC7C\u0000\uE8EA"+ - "\uE25C\uF5E8\uF6D5\u0000\uE4CD\u0000\uF4FE\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE345\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uEBA0\u0000\uEAFB\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEE6D\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEF34\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE0CD"+ - "\u0000\u0000\u0000\uF2A8\u0000\u0000\u0000\uF244"+ - "\u0000\u0000\u0000\u0000\uE868\uE3B9\u0000\uEAA9"+ - "\u0000\u0000\uF4B0\u0000\u0000\uE154\u0000\u0000"+ - "\u0000\uE247\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF2A9\u0000\u0000"+ - "\u0000\uEAD5\u0000\u0000\uF1D7\u0000\u0000\u0000"+ - "\uF256\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF2BD\uF966\u0000\u0000\uE8F4\u0000\uF2AA\uF749"+ - "\u0000\uF5E9\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uECD9\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEBC6\u0000\u0000\u0000\uE54F\u0000\u0000\u0000"+ - "\u0000\uEA78\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF37A"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF4C2\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE4AF\u0000"+ - "\u0000\uE06B\u0000\u0000\u0000\u0000\u0000\uF967"+ - "\u0000\u0000\uF1D8\uEBC7\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF568\uE643\uE9AD"+ - "\u0000\u0000\u0000\uE5BE\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF3C3\uF26F\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE67B\u0000\u0000\u0000\uF569\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE6E6\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE847\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE9FB\u0000\u0000\u0000\u0000"+ - "\u0000\uE9CF\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE733\u0000\u0000\uE869\u0000\uF368"+ - "\uF2C4\u0000\u0000\u0000\u0000\u0000\u0000\uEBD8"+ - "\u0000\u0000\u0000\u0000\u0000\uF3D4\u0000\uF1F2"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE5DB\u0000"+ - "\u0000\uE5DC\uF4C4\uE0D7\u0000\u0000\u0000\u0000"+ - "\u0000\uEC46\u0000\u0000\u0000\u0000\uF2F1\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF8D5\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE4D8\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE9D0\uF369"+ - "\uE0B3\u0000\u0000\u0000\u0000\u0000\u0000\uE5DD"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE1A7\u0000\u0000\uE33C\u0000"; - - private final static String innerIndex4= - "\uE3BA\u0000\uF3C4\u0000\uEDB3\uF8F5\uEFE1\uF9E0"+ - "\uF94C\u0000\uE832\uE833\u0000\uE431\u0000\u0000"+ - "\uE491\u0000\u0000\u0000\uEC7D\u0000\u0000\uEA79"+ - "\uE26C\uF445\uE374\uE9D1\u0000\u0000\u0000\u0000"+ - "\uEBC8\uE8B7\uEAE3\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF1B9\uF3C5\u0000\uF4CF\uE6AB"+ - "\uEBAC\u0000\u0000\uECEB\u0000\uF257\u0000\u0000"+ - "\u0000\uEBC9\uE09C\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF39D\uF871\uF36A\uE177\uE896\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE14F\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE27D\u0000"+ - "\u0000\uE5A9\uF872\u0000\u0000\u0000\uE375\u0000"+ - "\uF0D6\u0000\uF16F\u0000\u0000\u0000\uEAFC\u0000"+ - "\u0000\uF6D6\uEA7A\uE0B4\u0000\u0000\uF2BE\u0000"+ - "\u0000\uE145\u0000\u0000\u0000\u0000\u0000\uE2BD"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF2F2\uEC47"+ - "\u0000\u0000\u0000\uE178\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF39E\u0000\u0000\u0000"+ - "\uE670\u0000\uF3C6\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uEC48\uF0AB\u0000\u0000"+ - "\u0000\uE0B5\uE761\u0000\uF55E\uF4F7\u0000\u0000"+ - "\uE6C6\u0000\uE3BB\uF6AA\u0000\uF1CA\uE6D3\uE79C"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF655"+ - "\u0000\u0000\uE3CC\uE9FC\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uEAFD\u0000"+ - "\uF7E5\u0000\uEB5A\u0000\u0000\uF49F\uE4B0\u0000"+ - "\uF595\uE859\u0000\uEE6E\u0000\u0000\u0000\u0000"+ - "\uF74A\uEF60\u0000\u0000\uE79D\u0000\u0000\uF065"+ - "\u0000\u0000\u0000\u0000\uE633\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF656\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF46B\uED9E\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEF42\u0000\u0000"+ - "\u0000\u0000\u0000\uE86A\u0000\uF46C\uF8D6\uEFB2"+ - "\u0000\uF23D\u0000\uF873\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE97E\u0000\u0000\uF5EA\uEE70"+ - "\u0000\uF39F\u0000\u0000\u0000\u0000\u0000\uE6AC"+ - "\u0000\u0000\u0000\u0000\u0000\uF5C5\uF270\u0000"+ - "\u0000\uE8E5\u0000\uE9DE\u0000\u0000\uE7F0\uEFA3"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF3F9\u0000\uF454\uEB5B\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uEFA4\u0000"+ - "\u0000\uEC49\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uECB1\uF97B\uE1A8\u0000\uE146\u0000\u0000"+ - "\uF36B\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uEE4A\u0000\u0000\uE1A9\u0000\u0000\u0000"+ - "\u0000\u0000\uF4C3\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uEBD9\u0000\u0000\uF2AB"+ - "\u0000\u0000\u0000\uEEC5\u0000\u0000\uEB79\u0000"+ - "\uF4C5\u0000\u0000\uE550\uE5BF\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE9AE\u0000"+ - "\uF7FC\u0000\uE150\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uEDA2\u0000\u0000\u0000"+ - "\uE248\u0000\u0000\u0000\uE762\uF7D6\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF3AA\uE261\u0000\u0000\uF657\u0000"+ - "\uE8EB\u0000\uEAFE\u0000\u0000\uE771\u0000\uF6F3"+ - "\u0000\uE6E7\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE5A0\u0000\u0000"+ - "\uE3BC\u0000\uEDCF\u0000\uE0B6\u0000\uE848\u0000"+ - "\u0000\u0000\u0000\u0000\uE1C4\u0000\u0000\u0000"+ - "\u0000\u0000\uE64E\u0000\u0000\u0000\uEC4A\u0000"+ - "\u0000\u0000\u0000\u0000\uE2D8\u0000\u0000\u0000"+ - "\uEB5C\uF0F9\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF9FD\u0000\u0000\u0000\u0000\u0000"+ - "\uE6E8\uE0D8\u0000\u0000\u0000\uEFE2\u0000\u0000"+ - "\u0000\uEF4A\u0000\u0000\u0000\uECC7\u0000\u0000"+ - "\u0000\u0000\uF15D\u0000\uF15E\u0000\uE64F\u0000"+ - "\u0000\u0000\uECA7\u0000\uEAD6\uF9E8\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF271"+ - "\uF638\uE9FD\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF74B\u0000\uEF61\u0000\u0000\u0000\u0000"+ - "\uF7D7\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE27E\u0000\u0000\uF15F\u0000\u0000\u0000"+ - "\uEFA5\uE665\u0000\uE1C5\u0000\uF1BA\uE3BD\u0000"+ - "\u0000\uE2BE\u0000\u0000\uF14B\u0000\u0000\u0000"+ - "\uE441\u0000\u0000\u0000\u0000\uE179\u0000\uE7C4"+ - "\uEFFC\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE3BE\u0000\u0000"+ - "\u0000\u0000\u0000\uF14C\u0000\u0000\uEDAD\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF6B0\u0000\uE17A"+ - "\u0000\u0000\u0000\uE4C4\u0000\u0000\uE650\u0000"+ - "\u0000\u0000\uE69F\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uEBA1\u0000"+ - "\uEA4D\u0000\uF639\u0000\u0000\u0000\uE834\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE634"+ - "\uF5C6\u0000\uEBA2\uEFC6\u0000\u0000\u0000\uF455"+ - "\u0000\u0000\u0000\u0000\u0000\uF579\uE67C\uF0D3"+ - "\u0000\u0000\u0000\u0000\uF14D\uEC6C\uEA7B\uF36C"+ - "\u0000\uF0BF\u0000\uE6CE\uE3BF\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF5AB\u0000"+ - "\u0000\u0000\u0000\uF7FD\u0000\uE06C\u0000\u0000"+ - "\u0000\uE1C6\uF446\u0000\u0000\uE9FE\u0000\u0000"+ - "\u0000\uE147\uE8B8\u0000\u0000\u0000\u0000\uE379"+ - "\u0000\uE26D\uF0C0\u0000\uF9A2\u0000\u0000\u0000"+ - "\u0000\u0000\uF75B\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF066\uF3B0\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE8CE\u0000\uF6C3\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE8CF\uE0A4\u0000\u0000\uF770\u0000"+ - "\u0000\uF8D7\u0000\u0000\uF0CA\uEB31\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE25D\u0000\u0000\uE56C\u0000\u0000\u0000"+ - "\uF9D8\u0000\u0000\u0000\u0000\uE498\u0000\u0000"+ - "\u0000\u0000\uF447\u0000\u0000\uF898\uF63A\uF899"+ - "\uE776\u0000\uF541\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEF62\u0000\uE055\uE17B\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uEC7E\u0000\u0000\u0000\u0000"+ - "\u0000\uEC4B\u0000\uF6AD\u0000\u0000\u0000\uF771"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF4EC\u0000\u0000\u0000\u0000\uEA31\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uED9F\u0000\u0000\uECEC\u0000"+ - "\uE9AF\uE9B0\u0000\u0000\uE0B7\uEF63\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEBA3\uE470\u0000"+ - "\u0000\u0000\u0000\uF3A0\u0000\u0000\u0000\u0000"+ - "\uEFA6\uE0F2\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF1F3\uE969\uEB5D\u0000\u0000\u0000\u0000\uF6DA"+ - "\uE8B9\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE13E\u0000\uE86B\u0000\u0000\u0000\u0000\uE1C7"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE9B1\u0000\uE73F\uECA3\u0000\u0000"+ - "\uE291\u0000\u0000\uF495\u0000\u0000\u0000\u0000"+ - "\uF743\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uEB5E\u0000\uF5FD\u0000\u0000"+ - "\u0000\u0000\uF0EC\u0000\u0000\uE4C5\uF97C\uE46B"+ - "\uE57B\u0000\uEA32\u0000\u0000\u0000\uEDE6\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF340\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE5C4\u0000\u0000\u0000\u0000\u0000\u0000\uF1F4"+ - "\u0000\u0000\u0000\uECED\u0000\uEF52\u0000\uF1F5"+ - "\uE6FC\u0000\uF1BB\u0000\u0000\uF63B\u0000\u0000"+ - "\u0000\u0000\u0000\uF448\uF658\u0000\u0000\u0000"+ - "\u0000\u0000\uE4E6\uF46D\uE2BF\u0000\uF0AC\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE2C0\u0000\uEE38"+ - "\uF9E9\u0000\uE2C1\u0000\uEB6F\uEA7C\u0000\u0000"+ - "\u0000\u0000\uEB32\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF54F\uEC91\u0000\uE7F1\uF3C7"+ - "\u0000\uE0B8\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF7FE\uE8BA\uE897\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF67C\uE86C\uF874"+ - "\u0000\uEB5F\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE9B2\u0000\u0000\u0000\u0000\uEE39\u0000\uF2F3"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF4ED\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF0FA\u0000\uF7E6\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE06D\uE5DE"+ - "\u0000\uE06E\uEAE4\u0000\u0000\u0000\uEE9F\u0000"+ - "\uF5AC\u0000\u0000\u0000\u0000\u0000\uED97\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uEFE3\u0000\uF1CB\uE2E4\u0000"+ - "\u0000\u0000\uE763\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE9B3\uE57C\u0000\u0000\uF449\u0000\uEAB7"+ - "\u0000\u0000\u0000\u0000\u0000\uE0CE\uF8D8\u0000"+ - "\u0000\uE369\u0000\u0000\uE9D2\uF6F4\uEEDC\uED35"+ - "\u0000\uF933\u0000\uE8BB\u0000\u0000\u0000\uF44A"+ - "\uEFFD\uE35A\u0000\uF5D6\uE7C5\uED44\u0000\uF1A7"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF04D\uEEA0\u0000\uF6C4\uF5AD\u0000\uE7E0"+ - "\u0000\u0000\u0000\uE044\u0000\u0000\uF772\uE2C2"+ - "\u0000\uF14E\u0000\u0000\u0000\uEDB4\uE1C8\uF258"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uEEC8\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE1C9\uF7B7\u0000"+ - "\u0000\uF3E8\uE7F2\uE8F5\uE045\uE7C6\u0000\u0000"+ - "\u0000\uE759\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE7AB"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF1BC\u0000\u0000\uE764\u0000\u0000\u0000\uE96A"+ - "\u0000\uEC4C\u0000\u0000\uF97D\uF170\uE4A0\u0000"+ - "\uEFC7\uEE3A\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEC92\u0000\u0000\u0000\u0000\u0000\u0000\uF84B"+ - "\u0000\uF5AE\uF8AA\u0000\u0000\u0000\u0000\uF19D"+ - "\u0000\uF14F\uF968\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE575\u0000\u0000\u0000\uF7C3"+ - "\u0000\u0000\u0000\uF272\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE6E9\uF1F6\u0000\u0000\u0000\uEA7D\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE17C\u0000"+ - "\uECEE\u0000\u0000\u0000\u0000\u0000\uEF64\u0000"+ - "\u0000\u0000\uF89A\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE9B4\uED45\uE740\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE765\u0000\u0000"+ - "\u0000\uF57A\u0000\u0000\u0000\uE249\u0000\u0000"+ - "\u0000\uE671\uE2D2\u0000\uE346\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE232\u0000\u0000\uF4EE\u0000"+ - "\u0000\u0000\u0000\u0000\uF4F8\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE95C\u0000\uE35B\u0000\u0000\u0000\uF934"+ - "\uE1CA\uE6D4\uEA33\u0000\uED70\u0000\u0000\u0000"+ - "\u0000\uF259\u0000\u0000\u0000\uEC6D\u0000\u0000"+ - "\u0000\u0000\u0000\uF5FE\uE53C\u0000\u0000\u0000"+ - "\u0000\u0000\uE5D1\u0000\uE792\uF753\uF067\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF5D7\u0000\u0000\uE74F\u0000\u0000\u0000"+ - "\u0000\uF9C0\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF0AD\u0000\u0000\u0000\u0000\uE5AA\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uEEA8\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF25A"+ - "\u0000\u0000\u0000\uE077\u0000\u0000\u0000\u0000"+ - "\u0000\uF773\u0000\uE56D\u0000\u0000\uF068\u0000"+ - "\u0000\u0000\u0000\uF8D9\uF1F7\u0000\u0000\uEDB5"+ - "\u0000\u0000\u0000\u0000\u0000\uE33D\u0000\u0000"+ - "\u0000\u0000\uF3F1\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEC4D\u0000\u0000\u0000\uECC8\u0000\u0000\u0000"+ - "\u0000\uE7D5\u0000\u0000\uEAAA\u0000\u0000\u0000"+ - "\u0000\uE8BC\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF774\u0000\u0000\u0000\u0000\u0000"+ - "\uF3FA\u0000\u0000\uEDB6\uF4EF\u0000\u0000\uF8DA"+ - "\uEBE0\u0000\uE7AC\u0000\uF5EB\u0000\uEB46\u0000"+ - "\u0000\uEFC8\u0000\uE0CF\u0000\uECC9\u0000\u0000"+ - "\u0000\uEA7E\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEC4E\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE991\u0000\uE635\u0000"+ - "\u0000\u0000\u0000\u0000\uEC93\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE6A0\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE7A1\u0000\uE750\uE96B\u0000\u0000\uF1BD"+ - "\uEAB8\u0000\uF035\u0000\u0000\u0000\uE6AD\u0000"+ - "\u0000\uF4F9\u0000\uF1F8\u0000\uF5C7\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uEBCA\uF0E3\u0000\uF46E"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF75C\u0000\uF069"+ - "\u0000\uE4C6\u0000\uE8E6\u0000\u0000\u0000\u0000"+ - "\u0000\uF5AF\u0000\u0000\u0000\u0000\uE292\u0000"+ - "\u0000\u0000\u0000\uEFFE\u0000\u0000\u0000\u0000"+ - "\u0000\uF8B6\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uEC94\u0000\u0000\u0000\u0000"+ - "\uE2F2\uF6B9\uE7F3\u0000\u0000\uEBCB\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE86D\u0000\u0000\uE849"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF0FB"+ - "\u0000\uE0B9\u0000\u0000\uF1F9\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uEB70\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF550\u0000"+ - "\uF9BC\uEAB1\uECEF\u0000\u0000\u0000\u0000\uEB33"+ - "\uF9B9\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF341\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE1CB\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF1BE\u0000\u0000\u0000\uE5C0\uECF0\uF1FA"+ - "\u0000\u0000\u0000\u0000\u0000\uEFE4\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE5ED\uEEDD\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE598\uEDB7\u0000\u0000"+ - "\u0000\uE8E7\uEC4F\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF25B"+ - "\u0000\u0000\uE6F4\uF36D\u0000\u0000\u0000\uE23B"+ - "\u0000\u0000\uEEDE\u0000\u0000\u0000\uE666\uEBCC"+ - "\u0000\u0000\uEF43\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uEDEE\uE932"+ - "\u0000\u0000\uEB60\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE5B5\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE5A1"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF8DB\u0000"+ - "\uF7CB\u0000\u0000\u0000\uE0F3\uF535\u0000\u0000"+ - "\u0000\u0000\u0000\uF858\uE667\u0000\uEFE5\uF8DC"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF9D0"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF8F6\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE835\u0000\uE8BD\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF172\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE1F7\uF36E\u0000\u0000\u0000"+ - "\u0000\uF659\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEA91"+ - "\u0000\u0000\u0000\uE4B1\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF97E\u0000\u0000\u0000"+ - "\u0000\uEF53\u0000\uF3C8\u0000\u0000\u0000\uE293"+ - "\u0000\u0000\u0000\u0000\uF7ED\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF496\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uED46\u0000"+ - "\uF5B9\u0000\uE992\uECF1\u0000\u0000\u0000\u0000"+ - "\uEF35\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF44B\u0000\uEA34\u0000\uE85C\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE079\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uECDA\u0000\uF969"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF06A"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF7C4\u0000"+ - "\uECA4\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF8DD\u0000\uF2CA\u0000"+ - "\uEF54\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE5CC\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF0D7\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE7AD"+ - "\u0000\u0000\uF8AB\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE4D9\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE5A2\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF66E\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE898\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uEB61\u0000\u0000\uEFA8"+ - "\u0000\u0000\uF5F9\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF83F\u0000\uF0FC\u0000\u0000\uEB7A\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uECB2\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE5C5"+ - "\u0000\u0000\uF3E3\uE5EE\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE1CC\u0000\u0000\u0000\u0000\uF1D9\u0000"+ - "\u0000\u0000\u0000\uE751\u0000\u0000\u0000\u0000"+ - "\uF87C\u0000\u0000\u0000\u0000\u0000\uF3EB\u0000"+ - "\u0000\u0000\u0000\u0000\uF84C\uEE72\u0000\u0000"+ - "\u0000\u0000\uF875\uEC9C\u0000\u0000\u0000\uE046"+ - "\u0000\uED47\u0000\uF06B\u0000\uF5FA\u0000\u0000"+ - "\u0000\uF8AC\uE2C3\uF0FD\u0000\u0000\u0000\u0000"+ - "\uF79C\u0000\u0000\uEAB9\u0000\u0000\u0000\u0000"+ - "\uEBF1\u0000\uE434\u0000\u0000\u0000\u0000\uF5FB"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE36A\uE36B"+ - "\u0000\uF04E\uE7B1\u0000\u0000\u0000\u0000\u0000"+ - "\uE047\u0000\u0000\uE4E7\u0000\uF775\u0000\u0000"+ - "\u0000\u0000\uE4B2\u0000\u0000\u0000\uEC50\uF46F"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE1E5\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF7AC\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE1CD\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF23E\uE63E\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE6EA"+ - "\u0000\u0000\u0000\u0000\uEEE0\uF0AE\u0000\u0000"+ - "\u0000\uE2D9\u0000\u0000\uE95D\uF1FB\u0000\uEA92"+ - "\u0000\uE6EB\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEA35\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uEAD7\uE8D0\uE8D1\u0000\u0000"+ - "\uE5A3\u0000\u0000\u0000\u0000\uF342\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE96C"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE078\u0000\uF776\uE95E\u0000\u0000\u0000\u0000"+ - "\uF06C\uE8D2\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEFB3\u0000\u0000"+ - "\u0000\u0000\uF6DB\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uECA8\u0000"+ - "\uE6AE\u0000\u0000\uEB71\u0000\u0000\u0000\u0000"+ - "\u0000\uE0BA\u0000\u0000\uEDD1\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE36C"+ - "\u0000\u0000\u0000\u0000\uE5C1\u0000\u0000\u0000"+ - "\u0000\u0000\uE75A\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uECA9\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEB34"+ - "\u0000\uEFA9\u0000\uE4C7\u0000\u0000\uE96D\uF73E"+ - "\u0000\u0000\u0000\uE148\u0000\u0000\u0000\uE33E"+ - "\u0000\u0000\u0000\uE794\u0000\u0000\uECCA\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE13F\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE53D\uF661\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE35C\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE056\u0000\u0000\uE5C2\u0000\u0000"+ - "\uE24A\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE057\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF840\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uEAD8\u0000\u0000\u0000"+ - "\uF5BA\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEDEB\u0000\uF2F4\uE9B5\u0000\u0000\u0000\u0000"+ - "\uE1AA\u0000\uECF2\u0000\uF8F7\u0000\uF6D0\u0000"+ - "\u0000\u0000\u0000\uF9BA\u0000\u0000\uF9E1\uF6A0"+ - "\uE3C0\u0000\u0000\uEF55\u0000\uED48\u0000\uEBE8"+ - "\u0000\u0000\u0000\uE151\u0000\uE47D\u0000\u0000"+ - "\u0000\u0000\uE8BE\u0000\u0000\uEB72\u0000\u0000"+ - "\u0000\uF859\u0000\u0000\uEBCD\u0000\uE048\u0000"+ - "\u0000\u0000\uF470\uF3C9\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEA93\u0000\u0000\u0000\uF36F\uF754\u0000\u0000"+ - "\u0000\u0000\u0000\uF25C\u0000\u0000\uEA94\u0000"+ - "\uEEC9\u0000\uEC95\uEEE1\u0000\u0000\uECCB\u0000"+ - "\u0000\uECCC\u0000\u0000\u0000\uE2F8\uF2AC\u0000"+ - "\uF9FE\uF935\uF841\uEAD9\u0000\uEB62\u0000\u0000"+ - "\u0000\uF56A\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF3CA\u0000\uE233"+ - "\u0000\u0000\u0000\u0000\uF44C\uF173\u0000\u0000"+ - "\u0000\u0000\u0000\uEB35\u0000\uF6AB\u0000\u0000"+ - "\uF0AF\u0000\u0000\u0000\u0000\u0000\uEDDE\u0000"+ - "\uEBA4\uE1AB\u0000\uE7F4\uEF36\uE1CE\uEBE9\u0000"+ - "\uF991\u0000\uEB73\u0000\u0000\u0000\u0000\u0000"+ - "\uEC51\u0000\uE234\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uEA36\u0000\u0000\uF0FE\u0000\uF0DD\uF370"+ - "\u0000\u0000\uF56B\u0000\uEC96\u0000\u0000\uE4C8"+ - "\u0000\u0000\u0000\uF57B\u0000\uF245\u0000\uF5D8"+ - "\u0000\u0000\uE5DF\u0000\u0000\u0000\uE675\u0000"+ - "\u0000\u0000\u0000\uF0B0\uF573\u0000\u0000\u0000"+ - "\u0000\uECCD\u0000\u0000\u0000\u0000\uF596\uF842"+ - "\u0000\u0000\uF2F5\uE06F\u0000\uF0B1\uF1BF\u0000"+ - "\u0000\uF9C9\u0000\u0000\u0000\u0000\uED36\uF7A4"+ - "\uF343\u0000\uEDEC\u0000\u0000\u0000\uE3E7\u0000"+ - "\uE7C7\uED67\uF06D\u0000\uE599\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE84A\u0000"+ - "\uE85D\u0000\u0000\u0000\uF7CC\u0000\uEBDA\uE8BF"+ - "\u0000\uE155\uF160\uE0BB\u0000\uEA95\u0000\u0000"+ - "\uEFAA\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE7C8\u0000\u0000\uF273\uE6BD\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE2C4\u0000\u0000\u0000\u0000"+ - "\u0000\uE35D\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF936\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF3FB\u0000\u0000\u0000\u0000\uF9D2\uE3C1"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uECDB\u0000\uE4C9\u0000\uE95F\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE17D\u0000"+ - "\u0000\u0000\u0000\u0000\uEA37\u0000\u0000\uEE4B"+ - "\uF131\u0000\u0000\u0000\uE149\u0000\u0000\uF8DE"+ - "\u0000\u0000\u0000\u0000\u0000\uEEE2\u0000\u0000"+ - "\uE551\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE938\u0000\u0000\u0000\u0000\u0000"+ - "\uEC52\u0000\uF4D8\uEDD3\u0000\u0000\uF4D9\u0000"+ - "\u0000\u0000\uF4C6\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE1DB"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE1AC"+ - "\u0000\uF953\u0000\u0000\u0000\u0000\uE577\u0000"+ - "\uE3C2\u0000\uF7A5\u0000\uEF65\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uECCE\u0000\u0000"+ - "\u0000\u0000\uE55A\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uEADA\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF8DF\uEEE3\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF79D\uECCF\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF5B0\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE777\u0000\uE7C9\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF73F\uF2F6\u0000"+ - "\uE9B6\uF23F\uE1F8\u0000\u0000\u0000\u0000\uEA48"+ - "\uF937\uF6FC\uF6B1\uE24B\uF531\u0000\u0000\uF25D"+ - "\uEBAE\u0000\u0000\uF153\uE2FE\u0000\uF74F\uE772"+ - "\uE4E8\u0000\u0000\uEA38\uF574\uF152\u0000\uE7F5"+ - "\uF7C5\uE9D3\uE693\uF19E\uF992\u0000\u0000\uF1C0"+ - "\uE049\u0000\uF274\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF471\u0000\uEA49\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE694\u0000\uEA96\u0000\uEADB\u0000"+ - "\uE8D3\u0000\uF877\uE773\uF551\u0000\uE9B7\u0000"+ - "\u0000\u0000\uF497\u0000\u0000\uE53E\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE695\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE9B8\uE2C5\uEADF\u0000\u0000"; - - private final static String innerIndex5= - "\u0000\u0000\u0000\u0000\uF44E\uF631\u0000\uF0CB"+ - "\uF3FC\u0000\uF4C7\u0000\u0000\uEB7B\u0000\u0000"+ - "\u0000\u0000\u0000\uF1FC\u0000\u0000\uEBDB\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF275\u0000\uEA97\u0000"+ - "\u0000\u0000\u0000\uF863\u0000\u0000\u0000\u0000"+ - "\uF3CB\u0000\u0000\uE33F\uE9B9\u0000\u0000\uE3C3"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF5B1\u0000\u0000"+ - "\u0000\u0000\uF056\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF371\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF63C\u0000\u0000\u0000\u0000"+ - "\uF5D9\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF37B\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE9BA\u0000\u0000\u0000\uF44F\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF6C5\u0000"+ - "\u0000\u0000\u0000\uE8A2\uF498\u0000\u0000\uE04A"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF6F5\u0000\uE0E5\u0000\u0000"+ - "\u0000\uF276\u0000\uEB63\u0000\u0000\u0000\u0000"+ - "\uE235\u0000\u0000\u0000\u0000\u0000\u0000\uE668"+ - "\u0000\u0000\u0000\uE53F\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEFC9\u0000\u0000\u0000\u0000\uE4CE"+ - "\uF552\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE0E6\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF3A1\u0000\u0000\u0000\u0000\u0000"+ - "\uF0B2\u0000\u0000\u0000\u0000\uF3A2\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF0B3\u0000\uF344\u0000\u0000\uE0F4"+ - "\uE540\uF4B2\uF8B7\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF5EC\u0000\u0000\u0000\u0000\u0000\uF277"+ - "\uF542\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF5ED\u0000\uE2F3\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF372\u0000\u0000\u0000\u0000\u0000\uF25E"+ - "\u0000\u0000\uF3CC\u0000\u0000\uEDB8\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE6F5\uECF3\uE2E5\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE2C6\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF4B3\uED68\uE2F9\uE2DA\u0000\u0000"+ - "\u0000\u0000\uF85D\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEE73"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF472\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF5EE\u0000\u0000\uE04B\u0000\u0000\uECDC\u0000"+ - "\u0000\u0000\u0000\uE294\u0000\uE669\u0000\u0000"+ - "\u0000\uF240\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF575\uE752\uE960\uE17E\u0000\u0000"+ - "\u0000\u0000\u0000\uE5E0\uF65A\uF9CA\uE766\uF55F"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE636\uE94E"+ - "\u0000\uE8D4\uE6C7\u0000\u0000\u0000\u0000\uF4A0"+ - "\u0000\u0000\u0000\uF3CD\u0000\u0000\u0000\u0000"+ - "\uEC53\uE96E\u0000\uE96F\u0000\u0000\uF2AD\uEE3B"+ - "\u0000\u0000\u0000\u0000\uF7DD\uF04F\u0000\u0000"+ - "\u0000\uF2AE\u0000\u0000\u0000\uF560\uE295\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEE3C\u0000\uE26E"+ - "\u0000\u0000\uE5F9\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uECF4\uE1D0\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE5B8\u0000\u0000\uF6FD\u0000"+ - "\uE939\u0000\u0000\u0000\u0000\uEA98\u0000\uE93A"+ - "\uF473\uEFB4\uE46C\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEFE6\u0000\u0000\uECF6\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uEECA\u0000"+ - "\u0000\uE35E\u0000\u0000\uE899\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE04C\u0000"+ - "\u0000\u0000\uF278\uE86E\u0000\uF499\u0000\u0000"+ - "\uEC9D\u0000\uE136\u0000\u0000\u0000\u0000\uE84B"+ - "\u0000\uF279\u0000\u0000\u0000\uF5DA\u0000\u0000"+ - "\uF6DC\uEBEA\uE251\uE541\u0000\uF9B1\uEE4D\u0000"+ - "\uF8AD\u0000\u0000\uF777\u0000\uEBCE\u0000\uF6E2"+ - "\uF5EF\uE2C7\u0000\u0000\uE542\uE191\u0000\uE578"+ - "\u0000\uF25F\uF6D7\u0000\u0000\uEB36\uE651\uEBDC"+ - "\uF373\uF3E4\uE993\uE637\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF597\u0000"+ - "\u0000\uF3CE\uF474\u0000\u0000\uE340\u0000\u0000"+ - "\uF191\u0000\u0000\u0000\uF7BA\u0000\uF0B5\u0000"+ - "\u0000\uE57D\uEC54\u0000\u0000\u0000\u0000\uEFE7"+ - "\u0000\u0000\uF0B4\uF031\u0000\uF74C\uE236\u0000"+ - "\uF7C6\uF96A\u0000\uE543\uE4B9\uF06E\u0000\u0000"+ - "\u0000\uEFAB\u0000\u0000\uEBE1\uE4CF\uF598\u0000"+ - "\uF050\uEBCF\u0000\uE14A\u0000\u0000\u0000\u0000"+ - "\u0000\uF27A\u0000\u0000\u0000\uF374\uF4B4\uE57E"+ - "\u0000\u0000\uF450\u0000\u0000\uF3E5\u0000\uF553"+ - "\uEB64\u0000\uF0B6\u0000\uE6A1\uE0E8\u0000\uF7AD"+ - "\uEFAD\uE774\uF843\uEC55\uF94D\u0000\u0000\uF154"+ - "\uE741\u0000\uE93B\u0000\u0000\u0000\u0000\uE5A4"+ - "\u0000\uF0E9\u0000\u0000\u0000\uEF4B\u0000\u0000"+ - "\u0000\uE767\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF8AE\uE3E1\u0000\u0000\uE8C0\u0000"+ - "\uF5BE\u0000\uEA99\u0000\u0000\u0000\u0000\uE09D"+ - "\uF6C6\uE2C8\u0000\u0000\u0000\uEBD0\u0000\u0000"+ - "\uF260\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uEFF4\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE296\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE5CD\u0000"+ - "\u0000\uE2DB\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE9BB\u0000\u0000\u0000\u0000\uE23C\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEFE8\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE544\u0000\u0000"+ - "\u0000\u0000\uED57\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF5DB\u0000\u0000\uF851\u0000\u0000"+ - "\u0000\uEA39\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE59A"+ - "\u0000\u0000\u0000\u0000\u0000\uF2F7\u0000\u0000"+ - "\u0000\u0000\uE4B3\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF0B7\uF2F8\uF5DC\uF1CC\uE8D5\uF3CF\u0000"+ - "\u0000\u0000\uF3D0\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF5B2\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE7AE\uE5AC\u0000\uEC56\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF9A3\u0000\uF8E5"+ - "\uEAAB\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEC97"+ - "\u0000\uF63D\u0000\uF5B3\u0000\uF345\u0000\u0000"+ - "\u0000\u0000\uEBA5\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF5DD\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF132\uF1FD\u0000\uF5B4\uF8B8"+ - "\u0000\uE8A3\u0000\u0000\uE65A\uE0D9\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEDD4\u0000\u0000\u0000\u0000\u0000\u0000\uF4FA"+ - "\u0000\uF0B8\u0000\uEB47\uE6EC\uF3EC\uEDAF\uE5E1"+ - "\uE6ED\uE3D1\u0000\u0000\u0000\u0000\u0000\uEBF2"+ - "\uF2F9\u0000\u0000\u0000\uE9BC\uF66C\u0000\u0000"+ - "\u0000\u0000\u0000\uF375\u0000\u0000\u0000\uF554"+ - "\u0000\u0000\uEFE9\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF4FB\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE591\u0000\u0000"+ - "\uE132\uF6FE\uEABC\u0000\u0000\u0000\u0000\uF0CD"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE347\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE652\u0000\u0000\u0000"+ - "\u0000\u0000\uEF3D\u0000\u0000\u0000\u0000\uF2AF"+ - "\uE0A5\u0000\u0000\u0000\u0000\uE0E9\u0000\u0000"+ - "\u0000\uF878\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE156"+ - "\u0000\u0000\u0000\uEE77\u0000\u0000\uF057\u0000"+ - "\u0000\u0000\uE8A4\u0000\uE2C9\uEC9E\uF2FA\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF0DE\u0000\u0000\uF5C8\u0000\uE56E\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uEB65\u0000\uF2B0\u0000\u0000\uEC57\u0000"+ - "\uE7AF\u0000\u0000\u0000\uF7E7\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uEEE5\u0000\u0000\uE2CA\uEBD1"+ - "\u0000\uEC58\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF2FB\u0000\u0000\uF89B"+ - "\u0000\u0000\uE994\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uEB37\u0000\u0000\u0000"+ - "\u0000\u0000\uF778\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE0EA\u0000\u0000\u0000\uE0BC\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE672\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF5DE\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF5DF\u0000\uF246\u0000\u0000\u0000\uEC98\uE4CA"+ - "\uF2FC\uE3C4\uF2B1\u0000\uE3C5\u0000\uE36E\u0000"+ - "\uE7E1\u0000\u0000\uEB48\u0000\u0000\uE1D1\uF4B9"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEECC\u0000\uE638\uE237\u0000\uE545\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uED58\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE4B4\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF0B9\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE0F5\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF66D\u0000\uF3A3\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE157\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uEFCA\u0000\uEBF0\u0000"+ - "\u0000\u0000\uF5E0\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF8AF\u0000\u0000\u0000\uE0D1"+ - "\u0000\u0000\u0000\u0000\uF8E0\uF475\u0000\u0000"+ - "\uF192\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF37C\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF27B\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uEFCB\u0000"+ - "\u0000\uE192\u0000\u0000\uE6AF\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF4A1\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF997\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF3A4\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEB66\u0000\u0000"+ - "\u0000\u0000\u0000\uF2B2\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF561\u0000\u0000"+ - "\uF6A1\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF3D1\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE09E\uE09F\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE25E\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF4C8\u0000\uF4BA"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF1FE"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE836\u0000\u0000\uEB7C\u0000\u0000\u0000\u0000"+ - "\u0000\uF75D\u0000\uE0D2\u0000\u0000\u0000\uF0CE"+ - "\u0000\uF7D8\uF7D9\uE070\uE85A\u0000\u0000\u0000"+ - "\uE0A6\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE058\uF7EE\uE8EC\u0000\u0000"+ - "\uE341\u0000\u0000\u0000\u0000\uE5EF\u0000\u0000"+ - "\u0000\uEE95\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uEEA2\uED69\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uED71"+ - "\u0000\u0000\uF954\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF7EF\uE2F4\uF6E6\u0000"+ - "\u0000\u0000\u0000\u0000\uE24C\u0000\u0000\u0000"+ - "\u0000\uF555\uE933\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE9BD\u0000\u0000\u0000"+ - "\u0000\uF556\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF731\u0000\u0000\u0000\uEF66\u0000"+ - "\u0000\u0000\uE8C1\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF376\u0000\u0000\u0000\uED49"+ - "\uF67D\u0000\uF7AE\u0000\uE9BE\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE6B0\uE778\uE0BD\u0000\u0000"+ - "\uF7DA\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF75E\uF7F0\uEB7D\uECB3\uF543"+ - "\u0000\u0000\uF052\uF476\uF346\u0000\u0000\u0000"+ - "\u0000\u0000\uE8D6\u0000\u0000\u0000\u0000\u0000"+ - "\uF0E4\u0000\u0000\uF477\u0000\uE6D5\uE546\uF7E8"+ - "\uE6C1\u0000\u0000\u0000\u0000\uEDD5\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEFEA\uE6CC\u0000"+ - "\u0000\u0000\uE4E9\uEC59\u0000\uF96B\uE1AD\u0000"+ - "\u0000\u0000\u0000\u0000\uE140\uF032\u0000\u0000"+ - "\uED98\uE350\u0000\uF347\uF231\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE6F6\u0000\u0000\u0000\uEC5A"+ - "\uEC5B\u0000\uF85F\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF0DF\u0000\u0000\u0000\u0000\u0000\uE65B"+ - "\u0000\u0000\u0000\uF544\u0000\u0000\u0000\u0000"+ - "\uF1CD\uED62\u0000\u0000\uF039\uED4A\uF4A2\uE1D2"+ - "\u0000\uF65B\u0000\uF3E6\uF1C1\uEF4C\uF261\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF377\uEC5C\u0000"+ - "\u0000\uED3A\u0000\uF5E1\uF1DA\u0000\u0000\u0000"+ - "\u0000\u0000\uE6EE\uE3F1\u0000\u0000\u0000\u0000"+ - "\uEFEB\uEFEC\uEB74\u0000\u0000\u0000\u0000\uE837"+ - "\uE9D4\u0000\uF033\u0000\u0000\u0000\uE653\uE696"+ - "\u0000\uE86F\u0000\uF2B3\u0000\u0000\u0000\u0000"+ - "\uEC5D\u0000\u0000\u0000\u0000\u0000\uF2FD\uF478"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF2C5\u0000\uEEE7\u0000\u0000\uE6FD\u0000"+ - "\u0000\uEECE\u0000\u0000\uEADC\u0000\uF7C7\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE7F6"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEAAC\u0000\uE66A\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE934\u0000\u0000\u0000\uF348\u0000\u0000"+ - "\u0000\u0000\uE5FA\u0000\uED99\u0000\u0000\u0000"+ - "\uE654\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF57C\u0000\u0000\u0000\u0000\uF2FE\u0000"+ - "\u0000\u0000\u0000\u0000\uF331\u0000\uEA3A\u0000"+ - "\u0000\uE84C\uE79E\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF864\u0000\u0000\u0000\uF175\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF938\u0000\u0000\uF176"+ - "\u0000\u0000\uE75B\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF8B9\u0000\uED63\u0000\uE1F9"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE2D3\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE07A\u0000\u0000\uE2D4\u0000\uF74D\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF557\u0000"+ - "\u0000\u0000\u0000\uF06F\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF7DB\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE547\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF0E5\u0000\u0000\uEBD2\u0000"+ - "\u0000\u0000\u0000\uF034\u0000\u0000\u0000\uF852"+ - "\uF8E1\uF87D\uF332\uE193\u0000\uF833\uEC99\u0000"+ - "\uEC5E\u0000\uEFF5\u0000\uEBEB\u0000\u0000\u0000"+ - "\uEEE8\uEF67\uE89A\uE55B\u0000\u0000\u0000\uF6F6"+ - "\uE655\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE579\u0000\u0000"+ - "\uF89C\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE194\uF6DD\u0000\uEA4A\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE238\u0000"+ - "\u0000\u0000\u0000\u0000\uF349\uEDA0\uED59\u0000"+ - "\u0000\u0000\u0000\u0000\uED64\u0000\u0000\u0000"+ - "\uF053\u0000\uF2B4\u0000\u0000\u0000\uE6BE\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF8E2\u0000\uE1D3"+ - "\u0000\u0000\u0000\uF2B5\u0000\u0000\u0000\uF879"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF7A6\u0000\u0000\u0000\u0000\u0000\u0000\uEABD"+ - "\u0000\uF6C7\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF79F\u0000\u0000\uF79E"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uEA3B\uE8E8\u0000\u0000\uECDD"+ - "\u0000\uEBE2\uE3C6\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF660\uF0E6\uE89B"+ - "\u0000\u0000\u0000\u0000\uF157\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uEA9A\uF779\uECDE\u0000"+ - "\u0000\u0000\u0000\uE297\u0000\u0000\u0000\u0000"+ - "\u0000\uF853\uEDD7\u0000\uF158\u0000\u0000\u0000"+ - "\uF4C9\u0000\u0000\uED4B\u0000\u0000\u0000\u0000"+ - "\uEE3E\u0000\u0000\u0000\u0000\u0000\uF2B6\u0000"+ - "\uE94F\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE24D\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE753\u0000\u0000"+ - "\u0000\uE35F\u0000\uE2FA\uF4CA\uEB67\u0000\u0000"+ - "\u0000\uE3C7\uEFAE\u0000\uEF4D\u0000\u0000\uF854"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uEC5F\u0000"+ - "\u0000\uF855\u0000\u0000\u0000\uF7B8\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE970\u0000\u0000"+ - "\uF8B0\u0000\u0000\u0000\uE739\uEDDF\uF7A7\u0000"+ - "\u0000\uF67E\u0000\uF65C\uEC9A\u0000\u0000\u0000"+ - "\u0000\uF193\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE870\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF3D2\uE45C\uE2CB\u0000\u0000\uE04D\u0000\u0000"+ - "\u0000\uE9BF\u0000\u0000\u0000\uF691\u0000\uEA9B"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF844\u0000\u0000"+ - "\u0000\uE5AD\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF3E7"+ - "\u0000\uEA4E\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE950\u0000\u0000\u0000\u0000\u0000\uE3C8\uE3C9"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF74E\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE0F6\u0000\u0000\u0000\u0000"+ - "\uE59B\u0000\u0000\u0000\u0000\u0000\uF5E2\uEBD3"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE779\u0000\u0000\uF7A0\u0000\uE2CC\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF9A4\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE298\u0000\uF860"+ - "\u0000\u0000\uE195\uEE4E\u0000\u0000\u0000\uF63E"+ - "\u0000\u0000\uE5F0\u0000\u0000\uE3CA\u0000\u0000"+ - "\u0000\uF94E\uE5F1\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE1E9\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF845\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uEC60\uF599\u0000\u0000\u0000"+ - "\uE1D4\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEEA3\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE8A5\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEC61\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE6A2"+ - "\u0000\u0000\uF6E3\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF036\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE331\u0000\u0000\u0000"+ - "\u0000\uE26A\uF8EB\uE8A6\uE8DE\uE775\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF070"+ - "\u0000\u0000\u0000\u0000\uE73A\u0000\u0000\u0000"+ - "\u0000\u0000\uEDE0\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE66B"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF2C6\u0000"+ - "\u0000\uF77A\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uED65"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE299\u0000\u0000\uEB68\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE6EF\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF57D\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE1E6\u0000\u0000\u0000"+ - "\uE196\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF5E3\u0000\u0000"+ - "\uED5A\u0000\uE971\u0000\u0000\uF7C8\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF94F\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEF37\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE754\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE0BE"+ - "\u0000\uE93E\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE6F7"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF378\u0000\uE9C0"+ - "\u0000\uE2CD\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE995\uE7B0\u0000\uEE79\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"; - - private final static String innerIndex6= - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uED4C\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF054\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uED7C\u0000"+ - "\uED75\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF8F8\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE14B\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uED4D\u0000\u0000"+ - "\uE1DC\uE7F7\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE9DF\u0000\u0000\u0000"+ - "\u0000\u0000\uF1CE\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE7D0\u0000\u0000\u0000\u0000\u0000\uEDA3"+ - "\u0000\u0000\u0000\u0000\uF7CD\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE1AE\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE2CE"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF63F\u0000\u0000\u0000\u0000\u0000"+ - "\uF9D3\uF0ED\uE66C\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEDA4\u0000\u0000\u0000\uE5B6\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE66D\u0000\u0000"+ - "\u0000\uF7E9\u0000\u0000\u0000\uEEA4\u0000\uE673"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE3CB\uE674\u0000\u0000\u0000\uE5F2"+ - "\u0000\u0000\u0000\u0000\u0000\uEA9C\u0000\uE6F8"+ - "\u0000\u0000\u0000\u0000\u0000\uE77A\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE2D5\uE79F\u0000\u0000"+ - "\u0000\u0000\u0000\uE73B\u0000\u0000\uF9CB\u0000"+ - "\u0000\u0000\u0000\uF96C\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEB38\uE5F3\u0000"+ - "\u0000\uF9D9\u0000\u0000\uE133\u0000\u0000\u0000"+ - "\uE7F9\u0000\u0000\uE4EA\uF5F5\u0000\uF2C7\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE4DA\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE84D\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEF38"+ - "\uE93F\u0000\u0000\u0000\u0000\u0000\uF333\u0000"+ - "\u0000\u0000\u0000\uE1D5\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEB39\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uEA3C\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF34A\uF241\u0000\u0000\uF242\u0000"+ - "\u0000\u0000\uF65D\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF262"+ - "\u0000\uE656\u0000\u0000\u0000\u0000\u0000\uEB75"+ - "\u0000\u0000\uF4BB\u0000\uEDE1\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uED5B"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE6A3\u0000\u0000"+ - "\uE8C2\u0000\u0000\u0000\u0000\uE0A0\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE2CF\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u8861\u8862\u8863\u8864\u8865\u8866\u8867\u8868"+ - "\u8869\u886A\u886B\u886C\u886D\u886E\u886F\u8870"+ - "\u8871\u8873\u8874\u8875\u8876\u8877\u8878\u8879"+ - "\u887A\u887B\u887C\u887D\u8881\u8882\u8883\u8884"+ - "\u8885\u8886\u8887\u8888\u8889\u888A\u888B\u888C"+ - "\u888D\u888E\u888F\u8890\u8891\u8893\u8894\u8895"+ - "\u8896\u8897\u8898\u8899\u889A\u889B\u889C\u889D"+ - "\u88A1\u88A2\u88A3\u88A4\u88A5\u88A6\u88A7\u88A8"+ - "\u88A9\u88AA\u88AB\u88AC\u88AD\u88AE\u88AF\u88B0"+ - "\u88B1\u88B3\u88B4\u88B5\u88B6\u88B7\u88B8\u88B9"+ - "\u88BA\u88BB\u88BC\u88BD\u88C1\u88C2\u88C3\u88C4"+ - "\u88C5\u88C6\u88C7\u88C8\u88C9\u88CA\u88CB\u88CC"+ - "\u88CD\u88CE\u88CF\u88D0\u88D1\u88D3\u88D4\u88D5"+ - "\u88D6\u88D7\u88D8\u88D9\u88DA\u88DB\u88DC\u88DD"+ - "\u88E1\u88E2\u88E3\u88E4\u88E5\u88E6\u88E7\u88E8"+ - "\u88E9\u88EA\u88EB\u88EC\u88ED\u88EE\u88EF\u88F0"+ - "\u88F1\u88F3\u88F4\u88F5\u88F6\u88F7\u88F8\u88F9"+ - "\u88FA\u88FB\u88FC\u88FD\u8941\u8942\u8943\u8944"+ - "\u8945\u8946\u8947\u8948\u8949\u894A\u894B\u894C"+ - "\u894D\u894E\u894F\u8950\u8951\u8953\u8954\u8955"+ - "\u8956\u8957\u8958\u8959\u895A\u895B\u895C\u895D"+ - "\u8961\u8962\u8963\u8964\u8965\u8966\u8967\u8968"+ - "\u8969\u896A\u896B\u896C\u896D\u896E\u896F\u8970"+ - "\u8971\u8973\u8974\u8975\u8976\u8977\u8978\u8979"+ - "\u897A\u897B\u897C\u897D\u8981\u8982\u8983\u8984"+ - "\u8985\u8986\u8987\u8988\u8989\u898A\u898B\u898C"+ - "\u898D\u898E\u898F\u8990\u8991\u8993\u8994\u8995"+ - "\u8996\u8997\u8998\u8999\u899A\u899B\u899C\u899D"+ - "\u89A1\u89A2\u89A3\u89A4\u89A5\u89A6\u89A7\u89A8"+ - "\u89A9\u89AA\u89AB\u89AC\u89AD\u89AE\u89AF\u89B0"+ - "\u89B1\u89B3\u89B4\u89B5\u89B6\u89B7\u89B8\u89B9"+ - "\u89BA\u89BB\u89BC\u89BD\u89C1\u89C2\u89C3\u89C4"+ - "\u89C5\u89C6\u89C7\u89C8\u89C9\u89CA\u89CB\u89CC"+ - "\u89CD\u89CE\u89CF\u89D0\u89D1\u89D3\u89D4\u89D5"+ - "\u89D6\u89D7\u89D8\u89D9\u89DA\u89DB\u89DC\u89DD"+ - "\u89E1\u89E2\u89E3\u89E4\u89E5\u89E6\u89E7\u89E8"+ - "\u89E9\u89EA\u89EB\u89EC\u89ED\u89EE\u89EF\u89F0"+ - "\u89F1\u89F3\u89F4\u89F5\u89F6\u89F7\u89F8\u89F9"+ - "\u89FA\u89FB\u89FC\u89FD\u8A41\u8A42\u8A43\u8A44"+ - "\u8A45\u8A46\u8A47\u8A48\u8A49\u8A4A\u8A4B\u8A4C"+ - "\u8A4D\u8A4E\u8A4F\u8A50\u8A51\u8A53\u8A54\u8A55"+ - "\u8A56\u8A57\u8A58\u8A59\u8A5A\u8A5B\u8A5C\u8A5D"+ - "\u8A61\u8A62\u8A63\u8A64\u8A65\u8A66\u8A67\u8A68"+ - "\u8A69\u8A6A\u8A6B\u8A6C\u8A6D\u8A6E\u8A6F\u8A70"+ - "\u8A71\u8A73\u8A74\u8A75\u8A76\u8A77\u8A78\u8A79"+ - "\u8A7A\u8A7B\u8A7C\u8A7D\u8A81\u8A82\u8A83\u8A84"+ - "\u8A85\u8A86\u8A87\u8A88\u8A89\u8A8A\u8A8B\u8A8C"+ - "\u8A8D\u8A8E\u8A8F\u8A90\u8A91\u8A93\u8A94\u8A95"+ - "\u8A96\u8A97\u8A98\u8A99\u8A9A\u8A9B\u8A9C\u8A9D"+ - "\u8AA1\u8AA2\u8AA3\u8AA4\u8AA5\u8AA6\u8AA7\u8AA8"+ - "\u8AA9\u8AAA\u8AAB\u8AAC\u8AAD\u8AAE\u8AAF\u8AB0"+ - "\u8AB1\u8AB3\u8AB4\u8AB5\u8AB6\u8AB7\u8AB8\u8AB9"+ - "\u8ABA\u8ABB\u8ABC\u8ABD\u8AC1\u8AC2\u8AC3\u8AC4"+ - "\u8AC5\u8AC6\u8AC7\u8AC8\u8AC9\u8ACA\u8ACB\u8ACC"+ - "\u8ACD\u8ACE\u8ACF\u8AD0\u8AD1\u8AD3\u8AD4\u8AD5"+ - "\u8AD6\u8AD7\u8AD8\u8AD9\u8ADA\u8ADB\u8ADC\u8ADD"+ - "\u8AE1\u8AE2\u8AE3\u8AE4\u8AE5\u8AE6\u8AE7\u8AE8"+ - "\u8AE9\u8AEA\u8AEB\u8AEC\u8AED\u8AEE\u8AEF\u8AF0"+ - "\u8AF1\u8AF3\u8AF4\u8AF5\u8AF6\u8AF7\u8AF8\u8AF9"+ - "\u8AFA\u8AFB\u8AFC\u8AFD\u8B41\u8B42\u8B43\u8B44"+ - "\u8B45\u8B46\u8B47\u8B48\u8B49\u8B4A\u8B4B\u8B4C"+ - "\u8B4D\u8B4E\u8B4F\u8B50\u8B51\u8B53\u8B54\u8B55"+ - "\u8B56\u8B57\u8B58\u8B59\u8B5A\u8B5B\u8B5C\u8B5D"+ - "\u8B61\u8B62\u8B63\u8B64\u8B65\u8B66\u8B67\u8B68"+ - "\u8B69\u8B6A\u8B6B\u8B6C\u8B6D\u8B6E\u8B6F\u8B70"+ - "\u8B71\u8B73\u8B74\u8B75\u8B76\u8B77\u8B78\u8B79"+ - "\u8B7A\u8B7B\u8B7C\u8B7D\u8B81\u8B82\u8B83\u8B84"+ - "\u8B85\u8B86\u8B87\u8B88\u8B89\u8B8A\u8B8B\u8B8C"+ - "\u8B8D\u8B8E\u8B8F\u8B90\u8B91\u8B93\u8B94\u8B95"+ - "\u8B96\u8B97\u8B98\u8B99\u8B9A\u8B9B\u8B9C\u8B9D"+ - "\u8BA1\u8BA2\u8BA3\u8BA4\u8BA5\u8BA6\u8BA7\u8BA8"+ - "\u8BA9\u8BAA\u8BAB\u8BAC\u8BAD\u8BAE\u8BAF\u8BB0"+ - "\u8BB1\u8BB3\u8BB4\u8BB5\u8BB6\u8BB7\u8BB8\u8BB9"+ - "\u8BBA\u8BBB\u8BBC\u8BBD\u8C61\u8C62\u8C63\u8C64"+ - "\u8C65\u8C66\u8C67\u8C68\u8C69\u8C6A\u8C6B\u8C6C"+ - "\u8C6D\u8C6E\u8C6F\u8C70\u8C71\u8C73\u8C74\u8C75"+ - "\u8C76\u8C77\u8C78\u8C79\u8C7A\u8C7B\u8C7C\u8C7D"+ - "\u8C81\u8C82\u8C83\u8C84\u8C85\u8C86\u8C87\u8C88"+ - "\u8C89\u8C8A\u8C8B\u8C8C\u8C8D\u8C8E\u8C8F\u8C90"+ - "\u8C91\u8C93\u8C94\u8C95\u8C96\u8C97\u8C98\u8C99"+ - "\u8C9A\u8C9B\u8C9C\u8C9D\u8CA1\u8CA2\u8CA3\u8CA4"+ - "\u8CA5\u8CA6\u8CA7\u8CA8\u8CA9\u8CAA\u8CAB\u8CAC"+ - "\u8CAD\u8CAE\u8CAF\u8CB0\u8CB1\u8CB3\u8CB4\u8CB5"+ - "\u8CB6\u8CB7\u8CB8\u8CB9\u8CBA\u8CBB\u8CBC\u8CBD"+ - "\u8CC1\u8CC2\u8CC3\u8CC4\u8CC5\u8CC6\u8CC7\u8CC8"+ - "\u8CC9\u8CCA\u8CCB\u8CCC\u8CCD\u8CCE\u8CCF\u8CD0"+ - "\u8CD1\u8CD3\u8CD4\u8CD5\u8CD6\u8CD7\u8CD8\u8CD9"+ - "\u8CDA\u8CDB\u8CDC\u8CDD\u8CE1\u8CE2\u8CE3\u8CE4"+ - "\u8CE5\u8CE6\u8CE7\u8CE8\u8CE9\u8CEA\u8CEB\u8CEC"+ - "\u8CED\u8CEE\u8CEF\u8CF0\u8CF1\u8CF3\u8CF4\u8CF5"+ - "\u8CF6\u8CF7\u8CF8\u8CF9\u8CFA\u8CFB\u8CFC\u8CFD"+ - "\u8D41\u8D42\u8D43\u8D44\u8D45\u8D46\u8D47\u8D48"+ - "\u8D49\u8D4A\u8D4B\u8D4C\u8D4D\u8D4E\u8D4F\u8D50"+ - "\u8D51\u8D53\u8D54\u8D55\u8D56\u8D57\u8D58\u8D59"+ - "\u8D5A\u8D5B\u8D5C\u8D5D\u8D61\u8D62\u8D63\u8D64"+ - "\u8D65\u8D66\u8D67\u8D68\u8D69\u8D6A\u8D6B\u8D6C"+ - "\u8D6D\u8D6E\u8D6F\u8D70\u8D71\u8D73\u8D74\u8D75"+ - "\u8D76\u8D77\u8D78\u8D79\u8D7A\u8D7B\u8D7C\u8D7D"+ - "\u8D81\u8D82\u8D83\u8D84\u8D85\u8D86\u8D87\u8D88"+ - "\u8D89\u8D8A\u8D8B\u8D8C\u8D8D\u8D8E\u8D8F\u8D90"+ - "\u8D91\u8D93\u8D94\u8D95\u8D96\u8D97\u8D98\u8D99"+ - "\u8D9A\u8D9B\u8D9C\u8D9D\u8DA1\u8DA2\u8DA3\u8DA4"+ - "\u8DA5\u8DA6\u8DA7\u8DA8\u8DA9\u8DAA\u8DAB\u8DAC"+ - "\u8DAD\u8DAE\u8DAF\u8DB0\u8DB1\u8DB3\u8DB4\u8DB5"+ - "\u8DB6\u8DB7\u8DB8\u8DB9\u8DBA\u8DBB\u8DBC\u8DBD"+ - "\u8DC1\u8DC2\u8DC3\u8DC4\u8DC5\u8DC6\u8DC7\u8DC8"+ - "\u8DC9\u8DCA\u8DCB\u8DCC\u8DCD\u8DCE\u8DCF\u8DD0"+ - "\u8DD1\u8DD3\u8DD4\u8DD5\u8DD6\u8DD7\u8DD8\u8DD9"+ - "\u8DDA\u8DDB\u8DDC\u8DDD\u8DE1\u8DE2\u8DE3\u8DE4"+ - "\u8DE5\u8DE6\u8DE7\u8DE8\u8DE9\u8DEA\u8DEB\u8DEC"+ - "\u8DED\u8DEE\u8DEF\u8DF0\u8DF1\u8DF3\u8DF4\u8DF5"+ - "\u8DF6\u8DF7\u8DF8\u8DF9\u8DFA\u8DFB\u8DFC\u8DFD"+ - "\u8E41\u8E42\u8E43\u8E44\u8E45\u8E46\u8E47\u8E48"+ - "\u8E49\u8E4A\u8E4B\u8E4C\u8E4D\u8E4E\u8E4F\u8E50"+ - "\u8E51\u8E53\u8E54\u8E55\u8E56\u8E57\u8E58\u8E59"+ - "\u8E5A\u8E5B\u8E5C\u8E5D\u8E61\u8E62\u8E63\u8E64"+ - "\u8E65\u8E66\u8E67\u8E68\u8E69\u8E6A\u8E6B\u8E6C"+ - "\u8E6D\u8E6E\u8E6F\u8E70\u8E71\u8E73\u8E74\u8E75"+ - "\u8E76\u8E77\u8E78\u8E79\u8E7A\u8E7B\u8E7C\u8E7D"+ - "\u8E81\u8E82\u8E83\u8E84\u8E85\u8E86\u8E87\u8E88"+ - "\u8E89\u8E8A\u8E8B\u8E8C\u8E8D\u8E8E\u8E8F\u8E90"+ - "\u8E91\u8E93\u8E94\u8E95\u8E96\u8E97\u8E98\u8E99"+ - "\u8E9A\u8E9B\u8E9C\u8E9D\u8EA1\u8EA2\u8EA3\u8EA4"+ - "\u8EA5\u8EA6\u8EA7\u8EA8\u8EA9\u8EAA\u8EAB\u8EAC"+ - "\u8EAD\u8EAE\u8EAF\u8EB0\u8EB1\u8EB3\u8EB4\u8EB5"+ - "\u8EB6\u8EB7\u8EB8\u8EB9\u8EBA\u8EBB\u8EBC\u8EBD"+ - "\u8EC1\u8EC2\u8EC3\u8EC4\u8EC5\u8EC6\u8EC7\u8EC8"+ - "\u8EC9\u8ECA\u8ECB\u8ECC\u8ECD\u8ECE\u8ECF\u8ED0"+ - "\u8ED1\u8ED3\u8ED4\u8ED5\u8ED6\u8ED7\u8ED8\u8ED9"+ - "\u8EDA\u8EDB\u8EDC\u8EDD\u8EE1\u8EE2\u8EE3\u8EE4"+ - "\u8EE5\u8EE6\u8EE7\u8EE8\u8EE9\u8EEA\u8EEB\u8EEC"+ - "\u8EED\u8EEE\u8EEF\u8EF0\u8EF1\u8EF3\u8EF4\u8EF5"+ - "\u8EF6\u8EF7\u8EF8\u8EF9\u8EFA\u8EFB\u8EFC\u8EFD"+ - "\u8F41\u8F42\u8F43\u8F44\u8F45\u8F46\u8F47\u8F48"+ - "\u8F49\u8F4A\u8F4B\u8F4C\u8F4D\u8F4E\u8F4F\u8F50"+ - "\u8F51\u8F53\u8F54\u8F55\u8F56\u8F57\u8F58\u8F59"+ - "\u8F5A\u8F5B\u8F5C\u8F5D\u8F61\u8F62\u8F63\u8F64"+ - "\u8F65\u8F66\u8F67\u8F68\u8F69\u8F6A\u8F6B\u8F6C"+ - "\u8F6D\u8F6E\u8F6F\u8F70\u8F71\u8F73\u8F74\u8F75"+ - "\u8F76\u8F77\u8F78\u8F79\u8F7A\u8F7B\u8F7C\u8F7D"+ - "\u8F81\u8F82\u8F83\u8F84\u8F85\u8F86\u8F87\u8F88"+ - "\u8F89\u8F8A\u8F8B\u8F8C\u8F8D\u8F8E\u8F8F\u8F90"+ - "\u8F91\u8F93\u8F94\u8F95\u8F96\u8F97\u8F98\u8F99"+ - "\u8F9A\u8F9B\u8F9C\u8F9D\u8FA1\u8FA2\u8FA3\u8FA4"+ - "\u8FA5\u8FA6\u8FA7\u8FA8\u8FA9\u8FAA\u8FAB\u8FAC"+ - "\u8FAD\u8FAE\u8FAF\u8FB0\u8FB1\u8FB3\u8FB4\u8FB5"+ - "\u8FB6\u8FB7\u8FB8\u8FB9\u8FBA\u8FBB\u8FBC\u8FBD"+ - "\u9061\u9062\u9063\u9064\u9065\u9066\u9067\u9068"+ - "\u9069\u906A\u906B\u906C\u906D\u906E\u906F\u9070"+ - "\u9071\u9073\u9074\u9075\u9076\u9077\u9078\u9079"+ - "\u907A\u907B\u907C\u907D\u9081\u9082\u9083\u9084"+ - "\u9085\u9086\u9087\u9088\u9089\u908A\u908B\u908C"+ - "\u908D\u908E\u908F\u9090\u9091\u9093\u9094\u9095"+ - "\u9096\u9097\u9098\u9099\u909A\u909B\u909C\u909D"+ - "\u90A1\u90A2\u90A3\u90A4\u90A5\u90A6\u90A7\u90A8"+ - "\u90A9\u90AA\u90AB\u90AC\u90AD\u90AE\u90AF\u90B0"+ - "\u90B1\u90B3\u90B4\u90B5\u90B6\u90B7\u90B8\u90B9"+ - "\u90BA\u90BB\u90BC\u90BD\u90C1\u90C2\u90C3\u90C4"+ - "\u90C5\u90C6\u90C7\u90C8\u90C9\u90CA\u90CB\u90CC"+ - "\u90CD\u90CE\u90CF\u90D0\u90D1\u90D3\u90D4\u90D5"+ - "\u90D6\u90D7\u90D8\u90D9\u90DA\u90DB\u90DC\u90DD"+ - "\u90E1\u90E2\u90E3\u90E4\u90E5\u90E6\u90E7\u90E8"+ - "\u90E9\u90EA\u90EB\u90EC\u90ED\u90EE\u90EF\u90F0"+ - "\u90F1\u90F3\u90F4\u90F5\u90F6\u90F7\u90F8\u90F9"+ - "\u90FA\u90FB\u90FC\u90FD\u9141\u9142\u9143\u9144"+ - "\u9145\u9146\u9147\u9148\u9149\u914A\u914B\u914C"+ - "\u914D\u914E\u914F\u9150\u9151\u9153\u9154\u9155"+ - "\u9156\u9157\u9158\u9159\u915A\u915B\u915C\u915D"+ - "\u9161\u9162\u9163\u9164\u9165\u9166\u9167\u9168"+ - "\u9169\u916A\u916B\u916C\u916D\u916E\u916F\u9170"+ - "\u9171\u9173\u9174\u9175\u9176\u9177\u9178\u9179"+ - "\u917A\u917B\u917C\u917D\u9181\u9182\u9183\u9184"+ - "\u9185\u9186\u9187\u9188\u9189\u918A\u918B\u918C"+ - "\u918D\u918E\u918F\u9190\u9191\u9193\u9194\u9195"+ - "\u9196\u9197\u9198\u9199\u919A\u919B\u919C\u919D"+ - "\u91A1\u91A2\u91A3\u91A4\u91A5\u91A6\u91A7\u91A8"+ - "\u91A9\u91AA\u91AB\u91AC\u91AD\u91AE\u91AF\u91B0"+ - "\u91B1\u91B3\u91B4\u91B5\u91B6\u91B7\u91B8\u91B9"+ - "\u91BA\u91BB\u91BC\u91BD\u91C1\u91C2\u91C3\u91C4"+ - "\u91C5\u91C6\u91C7\u91C8\u91C9\u91CA\u91CB\u91CC"+ - "\u91CD\u91CE\u91CF\u91D0\u91D1\u91D3\u91D4\u91D5"+ - "\u91D6\u91D7\u91D8\u91D9\u91DA\u91DB\u91DC\u91DD"+ - "\u91E1\u91E2\u91E3\u91E4\u91E5\u91E6\u91E7\u91E8"+ - "\u91E9\u91EA\u91EB\u91EC\u91ED\u91EE\u91EF\u91F0"+ - "\u91F1\u91F3\u91F4\u91F5\u91F6\u91F7\u91F8\u91F9"+ - "\u91FA\u91FB\u91FC\u91FD\u9241\u9242\u9243\u9244"+ - "\u9245\u9246\u9247\u9248\u9249\u924A\u924B\u924C"+ - "\u924D\u924E\u924F\u9250\u9251\u9253\u9254\u9255"+ - "\u9256\u9257\u9258\u9259\u925A\u925B\u925C\u925D"+ - "\u9261\u9262\u9263\u9264\u9265\u9266\u9267\u9268"+ - "\u9269\u926A\u926B\u926C\u926D\u926E\u926F\u9270"+ - "\u9271\u9273\u9274\u9275\u9276\u9277\u9278\u9279"+ - "\u927A\u927B\u927C\u927D\u9281\u9282\u9283\u9284"+ - "\u9285\u9286\u9287\u9288\u9289\u928A\u928B\u928C"+ - "\u928D\u928E\u928F\u9290\u9291\u9293\u9294\u9295"+ - "\u9296\u9297\u9298\u9299\u929A\u929B\u929C\u929D"+ - "\u92A1\u92A2\u92A3\u92A4\u92A5\u92A6\u92A7\u92A8"+ - "\u92A9\u92AA\u92AB\u92AC\u92AD\u92AE\u92AF\u92B0"+ - "\u92B1\u92B3\u92B4\u92B5\u92B6\u92B7\u92B8\u92B9"+ - "\u92BA\u92BB\u92BC\u92BD\u92C1\u92C2\u92C3\u92C4"+ - "\u92C5\u92C6\u92C7\u92C8\u92C9\u92CA\u92CB\u92CC"+ - "\u92CD\u92CE\u92CF\u92D0\u92D1\u92D3\u92D4\u92D5"+ - "\u92D6\u92D7\u92D8\u92D9\u92DA\u92DB\u92DC\u92DD"+ - "\u92E1\u92E2\u92E3\u92E4\u92E5\u92E6\u92E7\u92E8"+ - "\u92E9\u92EA\u92EB\u92EC\u92ED\u92EE\u92EF\u92F0"+ - "\u92F1\u92F3\u92F4\u92F5\u92F6\u92F7\u92F8\u92F9"+ - "\u92FA\u92FB\u92FC\u92FD\u9341\u9342\u9343\u9344"+ - "\u9345\u9346\u9347\u9348\u9349\u934A\u934B\u934C"+ - "\u934D\u934E\u934F\u9350\u9351\u9353\u9354\u9355"+ - "\u9356\u9357\u9358\u9359\u935A\u935B\u935C\u935D"+ - "\u9361\u9362\u9363\u9364\u9365\u9366\u9367\u9368"+ - "\u9369\u936A\u936B\u936C\u936D\u936E\u936F\u9370"+ - "\u9371\u9373\u9374\u9375\u9376\u9377\u9378\u9379"+ - "\u937A\u937B\u937C\u937D\u9381\u9382\u9383\u9384"+ - "\u9385\u9386\u9387\u9388\u9389\u938A\u938B\u938C"+ - "\u938D\u938E\u938F\u9390\u9391\u9393\u9394\u9395"+ - "\u9396\u9397\u9398\u9399\u939A\u939B\u939C\u939D"+ - "\u93A1\u93A2\u93A3\u93A4\u93A5\u93A6\u93A7\u93A8"+ - "\u93A9\u93AA\u93AB\u93AC\u93AD\u93AE\u93AF\u93B0"+ - "\u93B1\u93B3\u93B4\u93B5\u93B6\u93B7\u93B8\u93B9"+ - "\u93BA\u93BB\u93BC\u93BD\u9461\u9462\u9463\u9464"+ - "\u9465\u9466\u9467\u9468\u9469\u946A\u946B\u946C"+ - "\u946D\u946E\u946F\u9470\u9471\u9473\u9474\u9475"+ - "\u9476\u9477\u9478\u9479\u947A\u947B\u947C\u947D"+ - "\u9481\u9482\u9483\u9484\u9485\u9486\u9487\u9488"+ - "\u9489\u948A\u948B\u948C\u948D\u948E\u948F\u9490"+ - "\u9491\u9493\u9494\u9495\u9496\u9497\u9498\u9499"+ - "\u949A\u949B\u949C\u949D\u94A1\u94A2\u94A3\u94A4"+ - "\u94A5\u94A6\u94A7\u94A8\u94A9\u94AA\u94AB\u94AC"+ - "\u94AD\u94AE\u94AF\u94B0\u94B1\u94B3\u94B4\u94B5"+ - "\u94B6\u94B7\u94B8\u94B9\u94BA\u94BB\u94BC\u94BD"+ - "\u94C1\u94C2\u94C3\u94C4\u94C5\u94C6\u94C7\u94C8"+ - "\u94C9\u94CA\u94CB\u94CC\u94CD\u94CE\u94CF\u94D0"+ - "\u94D1\u94D3\u94D4\u94D5\u94D6\u94D7\u94D8\u94D9"+ - "\u94DA\u94DB\u94DC\u94DD\u94E1\u94E2\u94E3\u94E4"+ - "\u94E5\u94E6\u94E7\u94E8\u94E9\u94EA\u94EB\u94EC"+ - "\u94ED\u94EE\u94EF\u94F0\u94F1\u94F3\u94F4\u94F5"+ - "\u94F6\u94F7\u94F8\u94F9\u94FA\u94FB\u94FC\u94FD"+ - "\u9541\u9542\u9543\u9544\u9545\u9546\u9547\u9548"+ - "\u9549\u954A\u954B\u954C\u954D\u954E\u954F\u9550"+ - "\u9551\u9553\u9554\u9555\u9556\u9557\u9558\u9559"+ - "\u955A\u955B\u955C\u955D\u9561\u9562\u9563\u9564"+ - "\u9565\u9566\u9567\u9568\u9569\u956A\u956B\u956C"+ - "\u956D\u956E\u956F\u9570\u9571\u9573\u9574\u9575"+ - "\u9576\u9577\u9578\u9579\u957A\u957B\u957C\u957D"+ - "\u9581\u9582\u9583\u9584\u9585\u9586\u9587\u9588"+ - "\u9589\u958A\u958B\u958C\u958D\u958E\u958F\u9590"+ - "\u9591\u9593\u9594\u9595\u9596\u9597\u9598\u9599"+ - "\u959A\u959B\u959C\u959D\u95A1\u95A2\u95A3\u95A4"+ - "\u95A5\u95A6\u95A7\u95A8\u95A9\u95AA\u95AB\u95AC"+ - "\u95AD\u95AE\u95AF\u95B0\u95B1\u95B3\u95B4\u95B5"+ - "\u95B6\u95B7\u95B8\u95B9\u95BA\u95BB\u95BC\u95BD"+ - "\u95C1\u95C2\u95C3\u95C4\u95C5\u95C6\u95C7\u95C8"+ - "\u95C9\u95CA\u95CB\u95CC\u95CD\u95CE\u95CF\u95D0"+ - "\u95D1\u95D3\u95D4\u95D5\u95D6\u95D7\u95D8\u95D9"+ - "\u95DA\u95DB\u95DC\u95DD\u95E1\u95E2\u95E3\u95E4"+ - "\u95E5\u95E6\u95E7\u95E8\u95E9\u95EA\u95EB\u95EC"+ - "\u95ED\u95EE\u95EF\u95F0\u95F1\u95F3\u95F4\u95F5"+ - "\u95F6\u95F7\u95F8\u95F9\u95FA\u95FB\u95FC\u95FD"+ - "\u9641\u9642\u9643\u9644\u9645\u9646\u9647\u9648"+ - "\u9649\u964A\u964B\u964C\u964D\u964E\u964F\u9650"+ - "\u9651\u9653\u9654\u9655\u9656\u9657\u9658\u9659"+ - "\u965A\u965B\u965C\u965D\u9661\u9662\u9663\u9664"+ - "\u9665\u9666\u9667\u9668\u9669\u966A\u966B\u966C"+ - "\u966D\u966E\u966F\u9670\u9671\u9673\u9674\u9675"+ - "\u9676\u9677\u9678\u9679\u967A\u967B\u967C\u967D"+ - "\u9681\u9682\u9683\u9684\u9685\u9686\u9687\u9688"+ - "\u9689\u968A\u968B\u968C\u968D\u968E\u968F\u9690"+ - "\u9691\u9693\u9694\u9695\u9696\u9697\u9698\u9699"+ - "\u969A\u969B\u969C\u969D\u96A1\u96A2\u96A3\u96A4"+ - "\u96A5\u96A6\u96A7\u96A8\u96A9\u96AA\u96AB\u96AC"+ - "\u96AD\u96AE\u96AF\u96B0\u96B1\u96B3\u96B4\u96B5"+ - "\u96B6\u96B7\u96B8\u96B9\u96BA\u96BB\u96BC\u96BD"+ - "\u96C1\u96C2\u96C3\u96C4\u96C5\u96C6\u96C7\u96C8"+ - "\u96C9\u96CA\u96CB\u96CC\u96CD\u96CE\u96CF\u96D0"+ - "\u96D1\u96D3\u96D4\u96D5\u96D6\u96D7\u96D8\u96D9"+ - "\u96DA\u96DB\u96DC\u96DD\u96E1\u96E2\u96E3\u96E4"+ - "\u96E5\u96E6\u96E7\u96E8\u96E9\u96EA\u96EB\u96EC"+ - "\u96ED\u96EE\u96EF\u96F0\u96F1\u96F3\u96F4\u96F5"+ - "\u96F6\u96F7\u96F8\u96F9\u96FA\u96FB\u96FC\u96FD"+ - "\u9741\u9742\u9743\u9744\u9745\u9746\u9747\u9748"+ - "\u9749\u974A\u974B\u974C\u974D\u974E\u974F\u9750"+ - "\u9751\u9753\u9754\u9755\u9756\u9757\u9758\u9759"+ - "\u975A\u975B\u975C\u975D\u9761\u9762\u9763\u9764"+ - "\u9765\u9766\u9767\u9768\u9769\u976A\u976B\u976C"+ - "\u976D\u976E\u976F\u9770\u9771\u9773\u9774\u9775"+ - "\u9776\u9777\u9778\u9779\u977A\u977B\u977C\u977D"+ - "\u9781\u9782\u9783\u9784\u9785\u9786\u9787\u9788"+ - "\u9789\u978A\u978B\u978C\u978D\u978E\u978F\u9790"+ - "\u9791\u9793\u9794\u9795\u9796\u9797\u9798\u9799"+ - "\u979A\u979B\u979C\u979D\u97A1\u97A2\u97A3\u97A4"+ - "\u97A5\u97A6\u97A7\u97A8\u97A9\u97AA\u97AB\u97AC"+ - "\u97AD\u97AE\u97AF\u97B0\u97B1\u97B3\u97B4\u97B5"+ - "\u97B6\u97B7\u97B8\u97B9\u97BA\u97BB\u97BC\u97BD"+ - "\u9861\u9862\u9863\u9864\u9865\u9866\u9867\u9868"+ - "\u9869\u986A\u986B\u986C\u986D\u986E\u986F\u9870"+ - "\u9871\u9873\u9874\u9875\u9876\u9877\u9878\u9879"+ - "\u987A\u987B\u987C\u987D\u9881\u9882\u9883\u9884"+ - "\u9885\u9886\u9887\u9888\u9889\u988A\u988B\u988C"+ - "\u988D\u988E\u988F\u9890\u9891\u9893\u9894\u9895"+ - "\u9896\u9897\u9898\u9899\u989A\u989B\u989C\u989D"+ - "\u98A1\u98A2\u98A3\u98A4\u98A5\u98A6\u98A7\u98A8"+ - "\u98A9\u98AA\u98AB\u98AC\u98AD\u98AE\u98AF\u98B0"+ - "\u98B1\u98B3\u98B4\u98B5\u98B6\u98B7\u98B8\u98B9"+ - "\u98BA\u98BB\u98BC\u98BD\u98C1\u98C2\u98C3\u98C4"+ - "\u98C5\u98C6\u98C7\u98C8\u98C9\u98CA\u98CB\u98CC"+ - "\u98CD\u98CE\u98CF\u98D0\u98D1\u98D3\u98D4\u98D5"+ - "\u98D6\u98D7\u98D8\u98D9\u98DA\u98DB\u98DC\u98DD"+ - "\u98E1\u98E2\u98E3\u98E4\u98E5\u98E6\u98E7\u98E8"+ - "\u98E9\u98EA\u98EB\u98EC\u98ED\u98EE\u98EF\u98F0"+ - "\u98F1\u98F3\u98F4\u98F5\u98F6\u98F7\u98F8\u98F9"+ - "\u98FA\u98FB\u98FC\u98FD\u9941\u9942\u9943\u9944"+ - "\u9945\u9946\u9947\u9948\u9949\u994A\u994B\u994C"+ - "\u994D\u994E\u994F\u9950\u9951\u9953\u9954\u9955"+ - "\u9956\u9957\u9958\u9959\u995A\u995B\u995C\u995D"+ - "\u9961\u9962\u9963\u9964\u9965\u9966\u9967\u9968"+ - "\u9969\u996A\u996B\u996C\u996D\u996E\u996F\u9970"+ - "\u9971\u9973\u9974\u9975\u9976\u9977\u9978\u9979"+ - "\u997A\u997B\u997C\u997D\u9981\u9982\u9983\u9984"+ - "\u9985\u9986\u9987\u9988\u9989\u998A\u998B\u998C"+ - "\u998D\u998E\u998F\u9990\u9991\u9993\u9994\u9995"+ - "\u9996\u9997\u9998\u9999\u999A\u999B\u999C\u999D"+ - "\u99A1\u99A2\u99A3\u99A4\u99A5\u99A6\u99A7\u99A8"+ - "\u99A9\u99AA\u99AB\u99AC\u99AD\u99AE\u99AF\u99B0"+ - "\u99B1\u99B3\u99B4\u99B5\u99B6\u99B7\u99B8\u99B9"+ - "\u99BA\u99BB\u99BC\u99BD\u99C1\u99C2\u99C3\u99C4"+ - "\u99C5\u99C6\u99C7\u99C8\u99C9\u99CA\u99CB\u99CC"+ - "\u99CD\u99CE\u99CF\u99D0\u99D1\u99D3\u99D4\u99D5"+ - "\u99D6\u99D7\u99D8\u99D9\u99DA\u99DB\u99DC\u99DD"+ - "\u99E1\u99E2\u99E3\u99E4\u99E5\u99E6\u99E7\u99E8"+ - "\u99E9\u99EA\u99EB\u99EC\u99ED\u99EE\u99EF\u99F0"+ - "\u99F1\u99F3\u99F4\u99F5\u99F6\u99F7\u99F8\u99F9"+ - "\u99FA\u99FB\u99FC\u99FD\u9A41\u9A42\u9A43\u9A44"+ - "\u9A45\u9A46\u9A47\u9A48\u9A49\u9A4A\u9A4B\u9A4C"+ - "\u9A4D\u9A4E\u9A4F\u9A50\u9A51\u9A53\u9A54\u9A55"+ - "\u9A56\u9A57\u9A58\u9A59\u9A5A\u9A5B\u9A5C\u9A5D"+ - "\u9A61\u9A62\u9A63\u9A64\u9A65\u9A66\u9A67\u9A68"+ - "\u9A69\u9A6A\u9A6B\u9A6C\u9A6D\u9A6E\u9A6F\u9A70"+ - "\u9A71\u9A73\u9A74\u9A75\u9A76\u9A77\u9A78\u9A79"+ - "\u9A7A\u9A7B\u9A7C\u9A7D\u9A81\u9A82\u9A83\u9A84"+ - "\u9A85\u9A86\u9A87\u9A88\u9A89\u9A8A\u9A8B\u9A8C"+ - "\u9A8D\u9A8E\u9A8F\u9A90\u9A91\u9A93\u9A94\u9A95"+ - "\u9A96\u9A97\u9A98\u9A99\u9A9A\u9A9B\u9A9C\u9A9D"+ - "\u9AA1\u9AA2\u9AA3\u9AA4\u9AA5\u9AA6\u9AA7\u9AA8"+ - "\u9AA9\u9AAA\u9AAB\u9AAC\u9AAD\u9AAE\u9AAF\u9AB0"+ - "\u9AB1\u9AB3\u9AB4\u9AB5\u9AB6\u9AB7\u9AB8\u9AB9"+ - "\u9ABA\u9ABB\u9ABC\u9ABD\u9AC1\u9AC2\u9AC3\u9AC4"+ - "\u9AC5\u9AC6\u9AC7\u9AC8\u9AC9\u9ACA\u9ACB\u9ACC"+ - "\u9ACD\u9ACE\u9ACF\u9AD0\u9AD1\u9AD3\u9AD4\u9AD5"+ - "\u9AD6\u9AD7\u9AD8\u9AD9\u9ADA\u9ADB\u9ADC\u9ADD"+ - "\u9AE1\u9AE2\u9AE3\u9AE4\u9AE5\u9AE6\u9AE7\u9AE8"+ - "\u9AE9\u9AEA\u9AEB\u9AEC\u9AED\u9AEE\u9AEF\u9AF0"+ - "\u9AF1\u9AF3\u9AF4\u9AF5\u9AF6\u9AF7\u9AF8\u9AF9"+ - "\u9AFA\u9AFB\u9AFC\u9AFD\u9B41\u9B42\u9B43\u9B44"+ - "\u9B45\u9B46\u9B47\u9B48\u9B49\u9B4A\u9B4B\u9B4C"+ - "\u9B4D\u9B4E\u9B4F\u9B50\u9B51\u9B53\u9B54\u9B55"+ - "\u9B56\u9B57\u9B58\u9B59\u9B5A\u9B5B\u9B5C\u9B5D"+ - "\u9B61\u9B62\u9B63\u9B64\u9B65\u9B66\u9B67\u9B68"+ - "\u9B69\u9B6A\u9B6B\u9B6C\u9B6D\u9B6E\u9B6F\u9B70"+ - "\u9B71\u9B73\u9B74\u9B75\u9B76\u9B77\u9B78\u9B79"+ - "\u9B7A\u9B7B\u9B7C\u9B7D\u9B81\u9B82\u9B83\u9B84"+ - "\u9B85\u9B86\u9B87\u9B88\u9B89\u9B8A\u9B8B\u9B8C"+ - "\u9B8D\u9B8E\u9B8F\u9B90\u9B91\u9B93\u9B94\u9B95"+ - "\u9B96\u9B97\u9B98\u9B99\u9B9A\u9B9B\u9B9C\u9B9D"+ - "\u9BA1\u9BA2\u9BA3\u9BA4\u9BA5\u9BA6\u9BA7\u9BA8"+ - "\u9BA9\u9BAA\u9BAB\u9BAC\u9BAD\u9BAE\u9BAF\u9BB0"+ - "\u9BB1\u9BB3\u9BB4\u9BB5\u9BB6\u9BB7\u9BB8\u9BB9"+ - "\u9BBA\u9BBB\u9BBC\u9BBD\u9C61\u9C62\u9C63\u9C64"+ - "\u9C65\u9C66\u9C67\u9C68\u9C69\u9C6A\u9C6B\u9C6C"+ - "\u9C6D\u9C6E\u9C6F\u9C70\u9C71\u9C73\u9C74\u9C75"+ - "\u9C76\u9C77\u9C78\u9C79\u9C7A\u9C7B\u9C7C\u9C7D"+ - "\u9C81\u9C82\u9C83\u9C84\u9C85\u9C86\u9C87\u9C88"+ - "\u9C89\u9C8A\u9C8B\u9C8C\u9C8D\u9C8E\u9C8F\u9C90"+ - "\u9C91\u9C93\u9C94\u9C95\u9C96\u9C97\u9C98\u9C99"+ - "\u9C9A\u9C9B\u9C9C\u9C9D\u9CA1\u9CA2\u9CA3\u9CA4"+ - "\u9CA5\u9CA6\u9CA7\u9CA8\u9CA9\u9CAA\u9CAB\u9CAC"+ - "\u9CAD\u9CAE\u9CAF\u9CB0\u9CB1\u9CB3\u9CB4\u9CB5"+ - "\u9CB6\u9CB7\u9CB8\u9CB9\u9CBA\u9CBB\u9CBC\u9CBD"+ - "\u9CC1\u9CC2\u9CC3\u9CC4\u9CC5\u9CC6\u9CC7\u9CC8"+ - "\u9CC9\u9CCA\u9CCB\u9CCC\u9CCD\u9CCE\u9CCF\u9CD0"+ - "\u9CD1\u9CD3\u9CD4\u9CD5\u9CD6\u9CD7\u9CD8\u9CD9"+ - "\u9CDA\u9CDB\u9CDC\u9CDD\u9CE1\u9CE2\u9CE3\u9CE4"+ - "\u9CE5\u9CE6\u9CE7\u9CE8\u9CE9\u9CEA\u9CEB\u9CEC"+ - "\u9CED\u9CEE\u9CEF\u9CF0\u9CF1\u9CF3\u9CF4\u9CF5"+ - "\u9CF6\u9CF7\u9CF8\u9CF9\u9CFA\u9CFB\u9CFC\u9CFD"+ - "\u9D41\u9D42\u9D43\u9D44\u9D45\u9D46\u9D47\u9D48"+ - "\u9D49\u9D4A\u9D4B\u9D4C\u9D4D\u9D4E\u9D4F\u9D50"+ - "\u9D51\u9D53\u9D54\u9D55\u9D56\u9D57\u9D58\u9D59"+ - "\u9D5A\u9D5B\u9D5C\u9D5D\u9D61\u9D62\u9D63\u9D64"+ - "\u9D65\u9D66\u9D67\u9D68\u9D69\u9D6A\u9D6B\u9D6C"+ - "\u9D6D\u9D6E\u9D6F\u9D70\u9D71\u9D73\u9D74\u9D75"+ - "\u9D76\u9D77\u9D78\u9D79\u9D7A\u9D7B\u9D7C\u9D7D"+ - "\u9D81\u9D82\u9D83\u9D84\u9D85\u9D86\u9D87\u9D88"+ - "\u9D89\u9D8A\u9D8B\u9D8C\u9D8D\u9D8E\u9D8F\u9D90"+ - "\u9D91\u9D93\u9D94\u9D95\u9D96\u9D97\u9D98\u9D99"+ - "\u9D9A\u9D9B\u9D9C\u9D9D\u9DA1\u9DA2\u9DA3\u9DA4"+ - "\u9DA5\u9DA6\u9DA7\u9DA8\u9DA9\u9DAA\u9DAB\u9DAC"+ - "\u9DAD\u9DAE\u9DAF\u9DB0\u9DB1\u9DB3\u9DB4\u9DB5"+ - "\u9DB6\u9DB7\u9DB8\u9DB9\u9DBA\u9DBB\u9DBC\u9DBD"+ - "\u9DC1\u9DC2\u9DC3\u9DC4\u9DC5\u9DC6\u9DC7\u9DC8"+ - "\u9DC9\u9DCA\u9DCB\u9DCC\u9DCD\u9DCE\u9DCF\u9DD0"+ - "\u9DD1\u9DD3\u9DD4\u9DD5\u9DD6\u9DD7\u9DD8\u9DD9"+ - "\u9DDA\u9DDB\u9DDC\u9DDD\u9DE1\u9DE2\u9DE3\u9DE4"+ - "\u9DE5\u9DE6\u9DE7\u9DE8\u9DE9\u9DEA\u9DEB\u9DEC"+ - "\u9DED\u9DEE\u9DEF\u9DF0\u9DF1\u9DF3\u9DF4\u9DF5"+ - "\u9DF6\u9DF7\u9DF8\u9DF9\u9DFA\u9DFB\u9DFC\u9DFD"+ - "\u9E41\u9E42\u9E43\u9E44\u9E45\u9E46\u9E47\u9E48"+ - "\u9E49\u9E4A\u9E4B\u9E4C\u9E4D\u9E4E\u9E4F\u9E50"+ - "\u9E51\u9E53\u9E54\u9E55\u9E56\u9E57\u9E58\u9E59"+ - "\u9E5A\u9E5B\u9E5C\u9E5D\u9E61\u9E62\u9E63\u9E64"+ - "\u9E65\u9E66\u9E67\u9E68\u9E69\u9E6A\u9E6B\u9E6C"+ - "\u9E6D\u9E6E\u9E6F\u9E70\u9E71\u9E73\u9E74\u9E75"+ - "\u9E76\u9E77\u9E78\u9E79\u9E7A\u9E7B\u9E7C\u9E7D"+ - "\u9E81\u9E82\u9E83\u9E84\u9E85\u9E86\u9E87\u9E88"+ - "\u9E89\u9E8A\u9E8B\u9E8C\u9E8D\u9E8E\u9E8F\u9E90"+ - "\u9E91\u9E93\u9E94\u9E95\u9E96\u9E97\u9E98\u9E99"; - - private final static String innerIndex7= - "\u9E9A\u9E9B\u9E9C\u9E9D\u9EA1\u9EA2\u9EA3\u9EA4"+ - "\u9EA5\u9EA6\u9EA7\u9EA8\u9EA9\u9EAA\u9EAB\u9EAC"+ - "\u9EAD\u9EAE\u9EAF\u9EB0\u9EB1\u9EB3\u9EB4\u9EB5"+ - "\u9EB6\u9EB7\u9EB8\u9EB9\u9EBA\u9EBB\u9EBC\u9EBD"+ - "\u9EC1\u9EC2\u9EC3\u9EC4\u9EC5\u9EC6\u9EC7\u9EC8"+ - "\u9EC9\u9ECA\u9ECB\u9ECC\u9ECD\u9ECE\u9ECF\u9ED0"+ - "\u9ED1\u9ED3\u9ED4\u9ED5\u9ED6\u9ED7\u9ED8\u9ED9"+ - "\u9EDA\u9EDB\u9EDC\u9EDD\u9EE1\u9EE2\u9EE3\u9EE4"+ - "\u9EE5\u9EE6\u9EE7\u9EE8\u9EE9\u9EEA\u9EEB\u9EEC"+ - "\u9EED\u9EEE\u9EEF\u9EF0\u9EF1\u9EF3\u9EF4\u9EF5"+ - "\u9EF6\u9EF7\u9EF8\u9EF9\u9EFA\u9EFB\u9EFC\u9EFD"+ - "\u9F41\u9F42\u9F43\u9F44\u9F45\u9F46\u9F47\u9F48"+ - "\u9F49\u9F4A\u9F4B\u9F4C\u9F4D\u9F4E\u9F4F\u9F50"+ - "\u9F51\u9F53\u9F54\u9F55\u9F56\u9F57\u9F58\u9F59"+ - "\u9F5A\u9F5B\u9F5C\u9F5D\u9F61\u9F62\u9F63\u9F64"+ - "\u9F65\u9F66\u9F67\u9F68\u9F69\u9F6A\u9F6B\u9F6C"+ - "\u9F6D\u9F6E\u9F6F\u9F70\u9F71\u9F73\u9F74\u9F75"+ - "\u9F76\u9F77\u9F78\u9F79\u9F7A\u9F7B\u9F7C\u9F7D"+ - "\u9F81\u9F82\u9F83\u9F84\u9F85\u9F86\u9F87\u9F88"+ - "\u9F89\u9F8A\u9F8B\u9F8C\u9F8D\u9F8E\u9F8F\u9F90"+ - "\u9F91\u9F93\u9F94\u9F95\u9F96\u9F97\u9F98\u9F99"+ - "\u9F9A\u9F9B\u9F9C\u9F9D\u9FA1\u9FA2\u9FA3\u9FA4"+ - "\u9FA5\u9FA6\u9FA7\u9FA8\u9FA9\u9FAA\u9FAB\u9FAC"+ - "\u9FAD\u9FAE\u9FAF\u9FB0\u9FB1\u9FB3\u9FB4\u9FB5"+ - "\u9FB6\u9FB7\u9FB8\u9FB9\u9FBA\u9FBB\u9FBC\u9FBD"+ - "\uA061\uA062\uA063\uA064\uA065\uA066\uA067\uA068"+ - "\uA069\uA06A\uA06B\uA06C\uA06D\uA06E\uA06F\uA070"+ - "\uA071\uA073\uA074\uA075\uA076\uA077\uA078\uA079"+ - "\uA07A\uA07B\uA07C\uA07D\uA081\uA082\uA083\uA084"+ - "\uA085\uA086\uA087\uA088\uA089\uA08A\uA08B\uA08C"+ - "\uA08D\uA08E\uA08F\uA090\uA091\uA093\uA094\uA095"+ - "\uA096\uA097\uA098\uA099\uA09A\uA09B\uA09C\uA09D"+ - "\uA0A1\uA0A2\uA0A3\uA0A4\uA0A5\uA0A6\uA0A7\uA0A8"+ - "\uA0A9\uA0AA\uA0AB\uA0AC\uA0AD\uA0AE\uA0AF\uA0B0"+ - "\uA0B1\uA0B3\uA0B4\uA0B5\uA0B6\uA0B7\uA0B8\uA0B9"+ - "\uA0BA\uA0BB\uA0BC\uA0BD\uA0C1\uA0C2\uA0C3\uA0C4"+ - "\uA0C5\uA0C6\uA0C7\uA0C8\uA0C9\uA0CA\uA0CB\uA0CC"+ - "\uA0CD\uA0CE\uA0CF\uA0D0\uA0D1\uA0D3\uA0D4\uA0D5"+ - "\uA0D6\uA0D7\uA0D8\uA0D9\uA0DA\uA0DB\uA0DC\uA0DD"+ - "\uA0E1\uA0E2\uA0E3\uA0E4\uA0E5\uA0E6\uA0E7\uA0E8"+ - "\uA0E9\uA0EA\uA0EB\uA0EC\uA0ED\uA0EE\uA0EF\uA0F0"+ - "\uA0F1\uA0F3\uA0F4\uA0F5\uA0F6\uA0F7\uA0F8\uA0F9"+ - "\uA0FA\uA0FB\uA0FC\uA0FD\uA141\uA142\uA143\uA144"+ - "\uA145\uA146\uA147\uA148\uA149\uA14A\uA14B\uA14C"+ - "\uA14D\uA14E\uA14F\uA150\uA151\uA153\uA154\uA155"+ - "\uA156\uA157\uA158\uA159\uA15A\uA15B\uA15C\uA15D"+ - "\uA161\uA162\uA163\uA164\uA165\uA166\uA167\uA168"+ - "\uA169\uA16A\uA16B\uA16C\uA16D\uA16E\uA16F\uA170"+ - "\uA171\uA173\uA174\uA175\uA176\uA177\uA178\uA179"+ - "\uA17A\uA17B\uA17C\uA17D\uA181\uA182\uA183\uA184"+ - "\uA185\uA186\uA187\uA188\uA189\uA18A\uA18B\uA18C"+ - "\uA18D\uA18E\uA18F\uA190\uA191\uA193\uA194\uA195"+ - "\uA196\uA197\uA198\uA199\uA19A\uA19B\uA19C\uA19D"+ - "\uA1A1\uA1A2\uA1A3\uA1A4\uA1A5\uA1A6\uA1A7\uA1A8"+ - "\uA1A9\uA1AA\uA1AB\uA1AC\uA1AD\uA1AE\uA1AF\uA1B0"+ - "\uA1B1\uA1B3\uA1B4\uA1B5\uA1B6\uA1B7\uA1B8\uA1B9"+ - "\uA1BA\uA1BB\uA1BC\uA1BD\uA1C1\uA1C2\uA1C3\uA1C4"+ - "\uA1C5\uA1C6\uA1C7\uA1C8\uA1C9\uA1CA\uA1CB\uA1CC"+ - "\uA1CD\uA1CE\uA1CF\uA1D0\uA1D1\uA1D3\uA1D4\uA1D5"+ - "\uA1D6\uA1D7\uA1D8\uA1D9\uA1DA\uA1DB\uA1DC\uA1DD"+ - "\uA1E1\uA1E2\uA1E3\uA1E4\uA1E5\uA1E6\uA1E7\uA1E8"+ - "\uA1E9\uA1EA\uA1EB\uA1EC\uA1ED\uA1EE\uA1EF\uA1F0"+ - "\uA1F1\uA1F3\uA1F4\uA1F5\uA1F6\uA1F7\uA1F8\uA1F9"+ - "\uA1FA\uA1FB\uA1FC\uA1FD\uA241\uA242\uA243\uA244"+ - "\uA245\uA246\uA247\uA248\uA249\uA24A\uA24B\uA24C"+ - "\uA24D\uA24E\uA24F\uA250\uA251\uA253\uA254\uA255"+ - "\uA256\uA257\uA258\uA259\uA25A\uA25B\uA25C\uA25D"+ - "\uA261\uA262\uA263\uA264\uA265\uA266\uA267\uA268"+ - "\uA269\uA26A\uA26B\uA26C\uA26D\uA26E\uA26F\uA270"+ - "\uA271\uA273\uA274\uA275\uA276\uA277\uA278\uA279"+ - "\uA27A\uA27B\uA27C\uA27D\uA281\uA282\uA283\uA284"+ - "\uA285\uA286\uA287\uA288\uA289\uA28A\uA28B\uA28C"+ - "\uA28D\uA28E\uA28F\uA290\uA291\uA293\uA294\uA295"+ - "\uA296\uA297\uA298\uA299\uA29A\uA29B\uA29C\uA29D"+ - "\uA2A1\uA2A2\uA2A3\uA2A4\uA2A5\uA2A6\uA2A7\uA2A8"+ - "\uA2A9\uA2AA\uA2AB\uA2AC\uA2AD\uA2AE\uA2AF\uA2B0"+ - "\uA2B1\uA2B3\uA2B4\uA2B5\uA2B6\uA2B7\uA2B8\uA2B9"+ - "\uA2BA\uA2BB\uA2BC\uA2BD\uA2C1\uA2C2\uA2C3\uA2C4"+ - "\uA2C5\uA2C6\uA2C7\uA2C8\uA2C9\uA2CA\uA2CB\uA2CC"+ - "\uA2CD\uA2CE\uA2CF\uA2D0\uA2D1\uA2D3\uA2D4\uA2D5"+ - "\uA2D6\uA2D7\uA2D8\uA2D9\uA2DA\uA2DB\uA2DC\uA2DD"+ - "\uA2E1\uA2E2\uA2E3\uA2E4\uA2E5\uA2E6\uA2E7\uA2E8"+ - "\uA2E9\uA2EA\uA2EB\uA2EC\uA2ED\uA2EE\uA2EF\uA2F0"+ - "\uA2F1\uA2F3\uA2F4\uA2F5\uA2F6\uA2F7\uA2F8\uA2F9"+ - "\uA2FA\uA2FB\uA2FC\uA2FD\uA341\uA342\uA343\uA344"+ - "\uA345\uA346\uA347\uA348\uA349\uA34A\uA34B\uA34C"+ - "\uA34D\uA34E\uA34F\uA350\uA351\uA353\uA354\uA355"+ - "\uA356\uA357\uA358\uA359\uA35A\uA35B\uA35C\uA35D"+ - "\uA361\uA362\uA363\uA364\uA365\uA366\uA367\uA368"+ - "\uA369\uA36A\uA36B\uA36C\uA36D\uA36E\uA36F\uA370"+ - "\uA371\uA373\uA374\uA375\uA376\uA377\uA378\uA379"+ - "\uA37A\uA37B\uA37C\uA37D\uA381\uA382\uA383\uA384"+ - "\uA385\uA386\uA387\uA388\uA389\uA38A\uA38B\uA38C"+ - "\uA38D\uA38E\uA38F\uA390\uA391\uA393\uA394\uA395"+ - "\uA396\uA397\uA398\uA399\uA39A\uA39B\uA39C\uA39D"+ - "\uA3A1\uA3A2\uA3A3\uA3A4\uA3A5\uA3A6\uA3A7\uA3A8"+ - "\uA3A9\uA3AA\uA3AB\uA3AC\uA3AD\uA3AE\uA3AF\uA3B0"+ - "\uA3B1\uA3B3\uA3B4\uA3B5\uA3B6\uA3B7\uA3B8\uA3B9"+ - "\uA3BA\uA3BB\uA3BC\uA3BD\uA461\uA462\uA463\uA464"+ - "\uA465\uA466\uA467\uA468\uA469\uA46A\uA46B\uA46C"+ - "\uA46D\uA46E\uA46F\uA470\uA471\uA473\uA474\uA475"+ - "\uA476\uA477\uA478\uA479\uA47A\uA47B\uA47C\uA47D"+ - "\uA481\uA482\uA483\uA484\uA485\uA486\uA487\uA488"+ - "\uA489\uA48A\uA48B\uA48C\uA48D\uA48E\uA48F\uA490"+ - "\uA491\uA493\uA494\uA495\uA496\uA497\uA498\uA499"+ - "\uA49A\uA49B\uA49C\uA49D\uA4A1\uA4A2\uA4A3\uA4A4"+ - "\uA4A5\uA4A6\uA4A7\uA4A8\uA4A9\uA4AA\uA4AB\uA4AC"+ - "\uA4AD\uA4AE\uA4AF\uA4B0\uA4B1\uA4B3\uA4B4\uA4B5"+ - "\uA4B6\uA4B7\uA4B8\uA4B9\uA4BA\uA4BB\uA4BC\uA4BD"+ - "\uA4C1\uA4C2\uA4C3\uA4C4\uA4C5\uA4C6\uA4C7\uA4C8"+ - "\uA4C9\uA4CA\uA4CB\uA4CC\uA4CD\uA4CE\uA4CF\uA4D0"+ - "\uA4D1\uA4D3\uA4D4\uA4D5\uA4D6\uA4D7\uA4D8\uA4D9"+ - "\uA4DA\uA4DB\uA4DC\uA4DD\uA4E1\uA4E2\uA4E3\uA4E4"+ - "\uA4E5\uA4E6\uA4E7\uA4E8\uA4E9\uA4EA\uA4EB\uA4EC"+ - "\uA4ED\uA4EE\uA4EF\uA4F0\uA4F1\uA4F3\uA4F4\uA4F5"+ - "\uA4F6\uA4F7\uA4F8\uA4F9\uA4FA\uA4FB\uA4FC\uA4FD"+ - "\uA541\uA542\uA543\uA544\uA545\uA546\uA547\uA548"+ - "\uA549\uA54A\uA54B\uA54C\uA54D\uA54E\uA54F\uA550"+ - "\uA551\uA553\uA554\uA555\uA556\uA557\uA558\uA559"+ - "\uA55A\uA55B\uA55C\uA55D\uA561\uA562\uA563\uA564"+ - "\uA565\uA566\uA567\uA568\uA569\uA56A\uA56B\uA56C"+ - "\uA56D\uA56E\uA56F\uA570\uA571\uA573\uA574\uA575"+ - "\uA576\uA577\uA578\uA579\uA57A\uA57B\uA57C\uA57D"+ - "\uA581\uA582\uA583\uA584\uA585\uA586\uA587\uA588"+ - "\uA589\uA58A\uA58B\uA58C\uA58D\uA58E\uA58F\uA590"+ - "\uA591\uA593\uA594\uA595\uA596\uA597\uA598\uA599"+ - "\uA59A\uA59B\uA59C\uA59D\uA5A1\uA5A2\uA5A3\uA5A4"+ - "\uA5A5\uA5A6\uA5A7\uA5A8\uA5A9\uA5AA\uA5AB\uA5AC"+ - "\uA5AD\uA5AE\uA5AF\uA5B0\uA5B1\uA5B3\uA5B4\uA5B5"+ - "\uA5B6\uA5B7\uA5B8\uA5B9\uA5BA\uA5BB\uA5BC\uA5BD"+ - "\uA5C1\uA5C2\uA5C3\uA5C4\uA5C5\uA5C6\uA5C7\uA5C8"+ - "\uA5C9\uA5CA\uA5CB\uA5CC\uA5CD\uA5CE\uA5CF\uA5D0"+ - "\uA5D1\uA5D3\uA5D4\uA5D5\uA5D6\uA5D7\uA5D8\uA5D9"+ - "\uA5DA\uA5DB\uA5DC\uA5DD\uA5E1\uA5E2\uA5E3\uA5E4"+ - "\uA5E5\uA5E6\uA5E7\uA5E8\uA5E9\uA5EA\uA5EB\uA5EC"+ - "\uA5ED\uA5EE\uA5EF\uA5F0\uA5F1\uA5F3\uA5F4\uA5F5"+ - "\uA5F6\uA5F7\uA5F8\uA5F9\uA5FA\uA5FB\uA5FC\uA5FD"+ - "\uA641\uA642\uA643\uA644\uA645\uA646\uA647\uA648"+ - "\uA649\uA64A\uA64B\uA64C\uA64D\uA64E\uA64F\uA650"+ - "\uA651\uA653\uA654\uA655\uA656\uA657\uA658\uA659"+ - "\uA65A\uA65B\uA65C\uA65D\uA661\uA662\uA663\uA664"+ - "\uA665\uA666\uA667\uA668\uA669\uA66A\uA66B\uA66C"+ - "\uA66D\uA66E\uA66F\uA670\uA671\uA673\uA674\uA675"+ - "\uA676\uA677\uA678\uA679\uA67A\uA67B\uA67C\uA67D"+ - "\uA681\uA682\uA683\uA684\uA685\uA686\uA687\uA688"+ - "\uA689\uA68A\uA68B\uA68C\uA68D\uA68E\uA68F\uA690"+ - "\uA691\uA693\uA694\uA695\uA696\uA697\uA698\uA699"+ - "\uA69A\uA69B\uA69C\uA69D\uA6A1\uA6A2\uA6A3\uA6A4"+ - "\uA6A5\uA6A6\uA6A7\uA6A8\uA6A9\uA6AA\uA6AB\uA6AC"+ - "\uA6AD\uA6AE\uA6AF\uA6B0\uA6B1\uA6B3\uA6B4\uA6B5"+ - "\uA6B6\uA6B7\uA6B8\uA6B9\uA6BA\uA6BB\uA6BC\uA6BD"+ - "\uA6C1\uA6C2\uA6C3\uA6C4\uA6C5\uA6C6\uA6C7\uA6C8"+ - "\uA6C9\uA6CA\uA6CB\uA6CC\uA6CD\uA6CE\uA6CF\uA6D0"+ - "\uA6D1\uA6D3\uA6D4\uA6D5\uA6D6\uA6D7\uA6D8\uA6D9"+ - "\uA6DA\uA6DB\uA6DC\uA6DD\uA6E1\uA6E2\uA6E3\uA6E4"+ - "\uA6E5\uA6E6\uA6E7\uA6E8\uA6E9\uA6EA\uA6EB\uA6EC"+ - "\uA6ED\uA6EE\uA6EF\uA6F0\uA6F1\uA6F3\uA6F4\uA6F5"+ - "\uA6F6\uA6F7\uA6F8\uA6F9\uA6FA\uA6FB\uA6FC\uA6FD"+ - "\uA741\uA742\uA743\uA744\uA745\uA746\uA747\uA748"+ - "\uA749\uA74A\uA74B\uA74C\uA74D\uA74E\uA74F\uA750"+ - "\uA751\uA753\uA754\uA755\uA756\uA757\uA758\uA759"+ - "\uA75A\uA75B\uA75C\uA75D\uA761\uA762\uA763\uA764"+ - "\uA765\uA766\uA767\uA768\uA769\uA76A\uA76B\uA76C"+ - "\uA76D\uA76E\uA76F\uA770\uA771\uA773\uA774\uA775"+ - "\uA776\uA777\uA778\uA779\uA77A\uA77B\uA77C\uA77D"+ - "\uA781\uA782\uA783\uA784\uA785\uA786\uA787\uA788"+ - "\uA789\uA78A\uA78B\uA78C\uA78D\uA78E\uA78F\uA790"+ - "\uA791\uA793\uA794\uA795\uA796\uA797\uA798\uA799"+ - "\uA79A\uA79B\uA79C\uA79D\uA7A1\uA7A2\uA7A3\uA7A4"+ - "\uA7A5\uA7A6\uA7A7\uA7A8\uA7A9\uA7AA\uA7AB\uA7AC"+ - "\uA7AD\uA7AE\uA7AF\uA7B0\uA7B1\uA7B3\uA7B4\uA7B5"+ - "\uA7B6\uA7B7\uA7B8\uA7B9\uA7BA\uA7BB\uA7BC\uA7BD"+ - "\uA861\uA862\uA863\uA864\uA865\uA866\uA867\uA868"+ - "\uA869\uA86A\uA86B\uA86C\uA86D\uA86E\uA86F\uA870"+ - "\uA871\uA873\uA874\uA875\uA876\uA877\uA878\uA879"+ - "\uA87A\uA87B\uA87C\uA87D\uA881\uA882\uA883\uA884"+ - "\uA885\uA886\uA887\uA888\uA889\uA88A\uA88B\uA88C"+ - "\uA88D\uA88E\uA88F\uA890\uA891\uA893\uA894\uA895"+ - "\uA896\uA897\uA898\uA899\uA89A\uA89B\uA89C\uA89D"+ - "\uA8A1\uA8A2\uA8A3\uA8A4\uA8A5\uA8A6\uA8A7\uA8A8"+ - "\uA8A9\uA8AA\uA8AB\uA8AC\uA8AD\uA8AE\uA8AF\uA8B0"+ - "\uA8B1\uA8B3\uA8B4\uA8B5\uA8B6\uA8B7\uA8B8\uA8B9"+ - "\uA8BA\uA8BB\uA8BC\uA8BD\uA8C1\uA8C2\uA8C3\uA8C4"+ - "\uA8C5\uA8C6\uA8C7\uA8C8\uA8C9\uA8CA\uA8CB\uA8CC"+ - "\uA8CD\uA8CE\uA8CF\uA8D0\uA8D1\uA8D3\uA8D4\uA8D5"+ - "\uA8D6\uA8D7\uA8D8\uA8D9\uA8DA\uA8DB\uA8DC\uA8DD"+ - "\uA8E1\uA8E2\uA8E3\uA8E4\uA8E5\uA8E6\uA8E7\uA8E8"+ - "\uA8E9\uA8EA\uA8EB\uA8EC\uA8ED\uA8EE\uA8EF\uA8F0"+ - "\uA8F1\uA8F3\uA8F4\uA8F5\uA8F6\uA8F7\uA8F8\uA8F9"+ - "\uA8FA\uA8FB\uA8FC\uA8FD\uA941\uA942\uA943\uA944"+ - "\uA945\uA946\uA947\uA948\uA949\uA94A\uA94B\uA94C"+ - "\uA94D\uA94E\uA94F\uA950\uA951\uA953\uA954\uA955"+ - "\uA956\uA957\uA958\uA959\uA95A\uA95B\uA95C\uA95D"+ - "\uA961\uA962\uA963\uA964\uA965\uA966\uA967\uA968"+ - "\uA969\uA96A\uA96B\uA96C\uA96D\uA96E\uA96F\uA970"+ - "\uA971\uA973\uA974\uA975\uA976\uA977\uA978\uA979"+ - "\uA97A\uA97B\uA97C\uA97D\uA981\uA982\uA983\uA984"+ - "\uA985\uA986\uA987\uA988\uA989\uA98A\uA98B\uA98C"+ - "\uA98D\uA98E\uA98F\uA990\uA991\uA993\uA994\uA995"+ - "\uA996\uA997\uA998\uA999\uA99A\uA99B\uA99C\uA99D"+ - "\uA9A1\uA9A2\uA9A3\uA9A4\uA9A5\uA9A6\uA9A7\uA9A8"+ - "\uA9A9\uA9AA\uA9AB\uA9AC\uA9AD\uA9AE\uA9AF\uA9B0"+ - "\uA9B1\uA9B3\uA9B4\uA9B5\uA9B6\uA9B7\uA9B8\uA9B9"+ - "\uA9BA\uA9BB\uA9BC\uA9BD\uA9C1\uA9C2\uA9C3\uA9C4"+ - "\uA9C5\uA9C6\uA9C7\uA9C8\uA9C9\uA9CA\uA9CB\uA9CC"+ - "\uA9CD\uA9CE\uA9CF\uA9D0\uA9D1\uA9D3\uA9D4\uA9D5"+ - "\uA9D6\uA9D7\uA9D8\uA9D9\uA9DA\uA9DB\uA9DC\uA9DD"+ - "\uA9E1\uA9E2\uA9E3\uA9E4\uA9E5\uA9E6\uA9E7\uA9E8"+ - "\uA9E9\uA9EA\uA9EB\uA9EC\uA9ED\uA9EE\uA9EF\uA9F0"+ - "\uA9F1\uA9F3\uA9F4\uA9F5\uA9F6\uA9F7\uA9F8\uA9F9"+ - "\uA9FA\uA9FB\uA9FC\uA9FD\uAA41\uAA42\uAA43\uAA44"+ - "\uAA45\uAA46\uAA47\uAA48\uAA49\uAA4A\uAA4B\uAA4C"+ - "\uAA4D\uAA4E\uAA4F\uAA50\uAA51\uAA53\uAA54\uAA55"+ - "\uAA56\uAA57\uAA58\uAA59\uAA5A\uAA5B\uAA5C\uAA5D"+ - "\uAA61\uAA62\uAA63\uAA64\uAA65\uAA66\uAA67\uAA68"+ - "\uAA69\uAA6A\uAA6B\uAA6C\uAA6D\uAA6E\uAA6F\uAA70"+ - "\uAA71\uAA73\uAA74\uAA75\uAA76\uAA77\uAA78\uAA79"+ - "\uAA7A\uAA7B\uAA7C\uAA7D\uAA81\uAA82\uAA83\uAA84"+ - "\uAA85\uAA86\uAA87\uAA88\uAA89\uAA8A\uAA8B\uAA8C"+ - "\uAA8D\uAA8E\uAA8F\uAA90\uAA91\uAA93\uAA94\uAA95"+ - "\uAA96\uAA97\uAA98\uAA99\uAA9A\uAA9B\uAA9C\uAA9D"+ - "\uAAA1\uAAA2\uAAA3\uAAA4\uAAA5\uAAA6\uAAA7\uAAA8"+ - "\uAAA9\uAAAA\uAAAB\uAAAC\uAAAD\uAAAE\uAAAF\uAAB0"+ - "\uAAB1\uAAB3\uAAB4\uAAB5\uAAB6\uAAB7\uAAB8\uAAB9"+ - "\uAABA\uAABB\uAABC\uAABD\uAAC1\uAAC2\uAAC3\uAAC4"+ - "\uAAC5\uAAC6\uAAC7\uAAC8\uAAC9\uAACA\uAACB\uAACC"+ - "\uAACD\uAACE\uAACF\uAAD0\uAAD1\uAAD3\uAAD4\uAAD5"+ - "\uAAD6\uAAD7\uAAD8\uAAD9\uAADA\uAADB\uAADC\uAADD"+ - "\uAAE1\uAAE2\uAAE3\uAAE4\uAAE5\uAAE6\uAAE7\uAAE8"+ - "\uAAE9\uAAEA\uAAEB\uAAEC\uAAED\uAAEE\uAAEF\uAAF0"+ - "\uAAF1\uAAF3\uAAF4\uAAF5\uAAF6\uAAF7\uAAF8\uAAF9"+ - "\uAAFA\uAAFB\uAAFC\uAAFD\uAB41\uAB42\uAB43\uAB44"+ - "\uAB45\uAB46\uAB47\uAB48\uAB49\uAB4A\uAB4B\uAB4C"+ - "\uAB4D\uAB4E\uAB4F\uAB50\uAB51\uAB53\uAB54\uAB55"+ - "\uAB56\uAB57\uAB58\uAB59\uAB5A\uAB5B\uAB5C\uAB5D"+ - "\uAB61\uAB62\uAB63\uAB64\uAB65\uAB66\uAB67\uAB68"+ - "\uAB69\uAB6A\uAB6B\uAB6C\uAB6D\uAB6E\uAB6F\uAB70"+ - "\uAB71\uAB73\uAB74\uAB75\uAB76\uAB77\uAB78\uAB79"+ - "\uAB7A\uAB7B\uAB7C\uAB7D\uAB81\uAB82\uAB83\uAB84"+ - "\uAB85\uAB86\uAB87\uAB88\uAB89\uAB8A\uAB8B\uAB8C"+ - "\uAB8D\uAB8E\uAB8F\uAB90\uAB91\uAB93\uAB94\uAB95"+ - "\uAB96\uAB97\uAB98\uAB99\uAB9A\uAB9B\uAB9C\uAB9D"+ - "\uABA1\uABA2\uABA3\uABA4\uABA5\uABA6\uABA7\uABA8"+ - "\uABA9\uABAA\uABAB\uABAC\uABAD\uABAE\uABAF\uABB0"+ - "\uABB1\uABB3\uABB4\uABB5\uABB6\uABB7\uABB8\uABB9"+ - "\uABBA\uABBB\uABBC\uABBD\uAC61\uAC62\uAC63\uAC64"+ - "\uAC65\uAC66\uAC67\uAC68\uAC69\uAC6A\uAC6B\uAC6C"+ - "\uAC6D\uAC6E\uAC6F\uAC70\uAC71\uAC73\uAC74\uAC75"+ - "\uAC76\uAC77\uAC78\uAC79\uAC7A\uAC7B\uAC7C\uAC7D"+ - "\uAC81\uAC82\uAC83\uAC84\uAC85\uAC86\uAC87\uAC88"+ - "\uAC89\uAC8A\uAC8B\uAC8C\uAC8D\uAC8E\uAC8F\uAC90"+ - "\uAC91\uAC93\uAC94\uAC95\uAC96\uAC97\uAC98\uAC99"+ - "\uAC9A\uAC9B\uAC9C\uAC9D\uACA1\uACA2\uACA3\uACA4"+ - "\uACA5\uACA6\uACA7\uACA8\uACA9\uACAA\uACAB\uACAC"+ - "\uACAD\uACAE\uACAF\uACB0\uACB1\uACB3\uACB4\uACB5"+ - "\uACB6\uACB7\uACB8\uACB9\uACBA\uACBB\uACBC\uACBD"+ - "\uACC1\uACC2\uACC3\uACC4\uACC5\uACC6\uACC7\uACC8"+ - "\uACC9\uACCA\uACCB\uACCC\uACCD\uACCE\uACCF\uACD0"+ - "\uACD1\uACD3\uACD4\uACD5\uACD6\uACD7\uACD8\uACD9"+ - "\uACDA\uACDB\uACDC\uACDD\uACE1\uACE2\uACE3\uACE4"+ - "\uACE5\uACE6\uACE7\uACE8\uACE9\uACEA\uACEB\uACEC"+ - "\uACED\uACEE\uACEF\uACF0\uACF1\uACF3\uACF4\uACF5"+ - "\uACF6\uACF7\uACF8\uACF9\uACFA\uACFB\uACFC\uACFD"+ - "\uAD41\uAD42\uAD43\uAD44\uAD45\uAD46\uAD47\uAD48"+ - "\uAD49\uAD4A\uAD4B\uAD4C\uAD4D\uAD4E\uAD4F\uAD50"+ - "\uAD51\uAD53\uAD54\uAD55\uAD56\uAD57\uAD58\uAD59"+ - "\uAD5A\uAD5B\uAD5C\uAD5D\uAD61\uAD62\uAD63\uAD64"+ - "\uAD65\uAD66\uAD67\uAD68\uAD69\uAD6A\uAD6B\uAD6C"+ - "\uAD6D\uAD6E\uAD6F\uAD70\uAD71\uAD73\uAD74\uAD75"+ - "\uAD76\uAD77\uAD78\uAD79\uAD7A\uAD7B\uAD7C\uAD7D"+ - "\uAD81\uAD82\uAD83\uAD84\uAD85\uAD86\uAD87\uAD88"+ - "\uAD89\uAD8A\uAD8B\uAD8C\uAD8D\uAD8E\uAD8F\uAD90"+ - "\uAD91\uAD93\uAD94\uAD95\uAD96\uAD97\uAD98\uAD99"+ - "\uAD9A\uAD9B\uAD9C\uAD9D\uADA1\uADA2\uADA3\uADA4"+ - "\uADA5\uADA6\uADA7\uADA8\uADA9\uADAA\uADAB\uADAC"+ - "\uADAD\uADAE\uADAF\uADB0\uADB1\uADB3\uADB4\uADB5"+ - "\uADB6\uADB7\uADB8\uADB9\uADBA\uADBB\uADBC\uADBD"+ - "\uADC1\uADC2\uADC3\uADC4\uADC5\uADC6\uADC7\uADC8"+ - "\uADC9\uADCA\uADCB\uADCC\uADCD\uADCE\uADCF\uADD0"+ - "\uADD1\uADD3\uADD4\uADD5\uADD6\uADD7\uADD8\uADD9"+ - "\uADDA\uADDB\uADDC\uADDD\uADE1\uADE2\uADE3\uADE4"+ - "\uADE5\uADE6\uADE7\uADE8\uADE9\uADEA\uADEB\uADEC"+ - "\uADED\uADEE\uADEF\uADF0\uADF1\uADF3\uADF4\uADF5"+ - "\uADF6\uADF7\uADF8\uADF9\uADFA\uADFB\uADFC\uADFD"+ - "\uAE41\uAE42\uAE43\uAE44\uAE45\uAE46\uAE47\uAE48"+ - "\uAE49\uAE4A\uAE4B\uAE4C\uAE4D\uAE4E\uAE4F\uAE50"+ - "\uAE51\uAE53\uAE54\uAE55\uAE56\uAE57\uAE58\uAE59"+ - "\uAE5A\uAE5B\uAE5C\uAE5D\uAE61\uAE62\uAE63\uAE64"+ - "\uAE65\uAE66\uAE67\uAE68\uAE69\uAE6A\uAE6B\uAE6C"+ - "\uAE6D\uAE6E\uAE6F\uAE70\uAE71\uAE73\uAE74\uAE75"+ - "\uAE76\uAE77\uAE78\uAE79\uAE7A\uAE7B\uAE7C\uAE7D"+ - "\uAE81\uAE82\uAE83\uAE84\uAE85\uAE86\uAE87\uAE88"+ - "\uAE89\uAE8A\uAE8B\uAE8C\uAE8D\uAE8E\uAE8F\uAE90"+ - "\uAE91\uAE93\uAE94\uAE95\uAE96\uAE97\uAE98\uAE99"+ - "\uAE9A\uAE9B\uAE9C\uAE9D\uAEA1\uAEA2\uAEA3\uAEA4"+ - "\uAEA5\uAEA6\uAEA7\uAEA8\uAEA9\uAEAA\uAEAB\uAEAC"+ - "\uAEAD\uAEAE\uAEAF\uAEB0\uAEB1\uAEB3\uAEB4\uAEB5"+ - "\uAEB6\uAEB7\uAEB8\uAEB9\uAEBA\uAEBB\uAEBC\uAEBD"+ - "\uAEC1\uAEC2\uAEC3\uAEC4\uAEC5\uAEC6\uAEC7\uAEC8"+ - "\uAEC9\uAECA\uAECB\uAECC\uAECD\uAECE\uAECF\uAED0"+ - "\uAED1\uAED3\uAED4\uAED5\uAED6\uAED7\uAED8\uAED9"+ - "\uAEDA\uAEDB\uAEDC\uAEDD\uAEE1\uAEE2\uAEE3\uAEE4"+ - "\uAEE5\uAEE6\uAEE7\uAEE8\uAEE9\uAEEA\uAEEB\uAEEC"+ - "\uAEED\uAEEE\uAEEF\uAEF0\uAEF1\uAEF3\uAEF4\uAEF5"+ - "\uAEF6\uAEF7\uAEF8\uAEF9\uAEFA\uAEFB\uAEFC\uAEFD"+ - "\uAF41\uAF42\uAF43\uAF44\uAF45\uAF46\uAF47\uAF48"+ - "\uAF49\uAF4A\uAF4B\uAF4C\uAF4D\uAF4E\uAF4F\uAF50"+ - "\uAF51\uAF53\uAF54\uAF55\uAF56\uAF57\uAF58\uAF59"+ - "\uAF5A\uAF5B\uAF5C\uAF5D\uAF61\uAF62\uAF63\uAF64"+ - "\uAF65\uAF66\uAF67\uAF68\uAF69\uAF6A\uAF6B\uAF6C"+ - "\uAF6D\uAF6E\uAF6F\uAF70\uAF71\uAF73\uAF74\uAF75"+ - "\uAF76\uAF77\uAF78\uAF79\uAF7A\uAF7B\uAF7C\uAF7D"+ - "\uAF81\uAF82\uAF83\uAF84\uAF85\uAF86\uAF87\uAF88"+ - "\uAF89\uAF8A\uAF8B\uAF8C\uAF8D\uAF8E\uAF8F\uAF90"+ - "\uAF91\uAF93\uAF94\uAF95\uAF96\uAF97\uAF98\uAF99"+ - "\uAF9A\uAF9B\uAF9C\uAF9D\uAFA1\uAFA2\uAFA3\uAFA4"+ - "\uAFA5\uAFA6\uAFA7\uAFA8\uAFA9\uAFAA\uAFAB\uAFAC"+ - "\uAFAD\uAFAE\uAFAF\uAFB0\uAFB1\uAFB3\uAFB4\uAFB5"+ - "\uAFB6\uAFB7\uAFB8\uAFB9\uAFBA\uAFBB\uAFBC\uAFBD"+ - "\uB061\uB062\uB063\uB064\uB065\uB066\uB067\uB068"+ - "\uB069\uB06A\uB06B\uB06C\uB06D\uB06E\uB06F\uB070"+ - "\uB071\uB073\uB074\uB075\uB076\uB077\uB078\uB079"+ - "\uB07A\uB07B\uB07C\uB07D\uB081\uB082\uB083\uB084"+ - "\uB085\uB086\uB087\uB088\uB089\uB08A\uB08B\uB08C"+ - "\uB08D\uB08E\uB08F\uB090\uB091\uB093\uB094\uB095"+ - "\uB096\uB097\uB098\uB099\uB09A\uB09B\uB09C\uB09D"+ - "\uB0A1\uB0A2\uB0A3\uB0A4\uB0A5\uB0A6\uB0A7\uB0A8"+ - "\uB0A9\uB0AA\uB0AB\uB0AC\uB0AD\uB0AE\uB0AF\uB0B0"+ - "\uB0B1\uB0B3\uB0B4\uB0B5\uB0B6\uB0B7\uB0B8\uB0B9"+ - "\uB0BA\uB0BB\uB0BC\uB0BD\uB0C1\uB0C2\uB0C3\uB0C4"+ - "\uB0C5\uB0C6\uB0C7\uB0C8\uB0C9\uB0CA\uB0CB\uB0CC"+ - "\uB0CD\uB0CE\uB0CF\uB0D0\uB0D1\uB0D3\uB0D4\uB0D5"+ - "\uB0D6\uB0D7\uB0D8\uB0D9\uB0DA\uB0DB\uB0DC\uB0DD"+ - "\uB0E1\uB0E2\uB0E3\uB0E4\uB0E5\uB0E6\uB0E7\uB0E8"+ - "\uB0E9\uB0EA\uB0EB\uB0EC\uB0ED\uB0EE\uB0EF\uB0F0"+ - "\uB0F1\uB0F3\uB0F4\uB0F5\uB0F6\uB0F7\uB0F8\uB0F9"+ - "\uB0FA\uB0FB\uB0FC\uB0FD\uB141\uB142\uB143\uB144"+ - "\uB145\uB146\uB147\uB148\uB149\uB14A\uB14B\uB14C"+ - "\uB14D\uB14E\uB14F\uB150\uB151\uB153\uB154\uB155"+ - "\uB156\uB157\uB158\uB159\uB15A\uB15B\uB15C\uB15D"+ - "\uB161\uB162\uB163\uB164\uB165\uB166\uB167\uB168"+ - "\uB169\uB16A\uB16B\uB16C\uB16D\uB16E\uB16F\uB170"+ - "\uB171\uB173\uB174\uB175\uB176\uB177\uB178\uB179"+ - "\uB17A\uB17B\uB17C\uB17D\uB181\uB182\uB183\uB184"+ - "\uB185\uB186\uB187\uB188\uB189\uB18A\uB18B\uB18C"+ - "\uB18D\uB18E\uB18F\uB190\uB191\uB193\uB194\uB195"+ - "\uB196\uB197\uB198\uB199\uB19A\uB19B\uB19C\uB19D"+ - "\uB1A1\uB1A2\uB1A3\uB1A4\uB1A5\uB1A6\uB1A7\uB1A8"+ - "\uB1A9\uB1AA\uB1AB\uB1AC\uB1AD\uB1AE\uB1AF\uB1B0"+ - "\uB1B1\uB1B3\uB1B4\uB1B5\uB1B6\uB1B7\uB1B8\uB1B9"+ - "\uB1BA\uB1BB\uB1BC\uB1BD\uB1C1\uB1C2\uB1C3\uB1C4"+ - "\uB1C5\uB1C6\uB1C7\uB1C8\uB1C9\uB1CA\uB1CB\uB1CC"+ - "\uB1CD\uB1CE\uB1CF\uB1D0\uB1D1\uB1D3\uB1D4\uB1D5"+ - "\uB1D6\uB1D7\uB1D8\uB1D9\uB1DA\uB1DB\uB1DC\uB1DD"+ - "\uB1E1\uB1E2\uB1E3\uB1E4\uB1E5\uB1E6\uB1E7\uB1E8"+ - "\uB1E9\uB1EA\uB1EB\uB1EC\uB1ED\uB1EE\uB1EF\uB1F0"+ - "\uB1F1\uB1F3\uB1F4\uB1F5\uB1F6\uB1F7\uB1F8\uB1F9"+ - "\uB1FA\uB1FB\uB1FC\uB1FD\uB241\uB242\uB243\uB244"+ - "\uB245\uB246\uB247\uB248\uB249\uB24A\uB24B\uB24C"+ - "\uB24D\uB24E\uB24F\uB250\uB251\uB253\uB254\uB255"+ - "\uB256\uB257\uB258\uB259\uB25A\uB25B\uB25C\uB25D"+ - "\uB261\uB262\uB263\uB264\uB265\uB266\uB267\uB268"+ - "\uB269\uB26A\uB26B\uB26C\uB26D\uB26E\uB26F\uB270"+ - "\uB271\uB273\uB274\uB275\uB276\uB277\uB278\uB279"+ - "\uB27A\uB27B\uB27C\uB27D\uB281\uB282\uB283\uB284"+ - "\uB285\uB286\uB287\uB288\uB289\uB28A\uB28B\uB28C"+ - "\uB28D\uB28E\uB28F\uB290\uB291\uB293\uB294\uB295"+ - "\uB296\uB297\uB298\uB299\uB29A\uB29B\uB29C\uB29D"+ - "\uB2A1\uB2A2\uB2A3\uB2A4\uB2A5\uB2A6\uB2A7\uB2A8"+ - "\uB2A9\uB2AA\uB2AB\uB2AC\uB2AD\uB2AE\uB2AF\uB2B0"+ - "\uB2B1\uB2B3\uB2B4\uB2B5\uB2B6\uB2B7\uB2B8\uB2B9"+ - "\uB2BA\uB2BB\uB2BC\uB2BD\uB2C1\uB2C2\uB2C3\uB2C4"+ - "\uB2C5\uB2C6\uB2C7\uB2C8\uB2C9\uB2CA\uB2CB\uB2CC"+ - "\uB2CD\uB2CE\uB2CF\uB2D0\uB2D1\uB2D3\uB2D4\uB2D5"+ - "\uB2D6\uB2D7\uB2D8\uB2D9\uB2DA\uB2DB\uB2DC\uB2DD"+ - "\uB2E1\uB2E2\uB2E3\uB2E4\uB2E5\uB2E6\uB2E7\uB2E8"+ - "\uB2E9\uB2EA\uB2EB\uB2EC\uB2ED\uB2EE\uB2EF\uB2F0"+ - "\uB2F1\uB2F3\uB2F4\uB2F5\uB2F6\uB2F7\uB2F8\uB2F9"+ - "\uB2FA\uB2FB\uB2FC\uB2FD\uB341\uB342\uB343\uB344"+ - "\uB345\uB346\uB347\uB348\uB349\uB34A\uB34B\uB34C"+ - "\uB34D\uB34E\uB34F\uB350\uB351\uB353\uB354\uB355"+ - "\uB356\uB357\uB358\uB359\uB35A\uB35B\uB35C\uB35D"+ - "\uB361\uB362\uB363\uB364\uB365\uB366\uB367\uB368"+ - "\uB369\uB36A\uB36B\uB36C\uB36D\uB36E\uB36F\uB370"+ - "\uB371\uB373\uB374\uB375\uB376\uB377\uB378\uB379"+ - "\uB37A\uB37B\uB37C\uB37D\uB381\uB382\uB383\uB384"+ - "\uB385\uB386\uB387\uB388\uB389\uB38A\uB38B\uB38C"+ - "\uB38D\uB38E\uB38F\uB390\uB391\uB393\uB394\uB395"+ - "\uB396\uB397\uB398\uB399\uB39A\uB39B\uB39C\uB39D"+ - "\uB3A1\uB3A2\uB3A3\uB3A4\uB3A5\uB3A6\uB3A7\uB3A8"+ - "\uB3A9\uB3AA\uB3AB\uB3AC\uB3AD\uB3AE\uB3AF\uB3B0"+ - "\uB3B1\uB3B3\uB3B4\uB3B5\uB3B6\uB3B7\uB3B8\uB3B9"+ - "\uB3BA\uB3BB\uB3BC\uB3BD\uB461\uB462\uB463\uB464"+ - "\uB465\uB466\uB467\uB468\uB469\uB46A\uB46B\uB46C"+ - "\uB46D\uB46E\uB46F\uB470\uB471\uB473\uB474\uB475"+ - "\uB476\uB477\uB478\uB479\uB47A\uB47B\uB47C\uB47D"+ - "\uB481\uB482\uB483\uB484\uB485\uB486\uB487\uB488"+ - "\uB489\uB48A\uB48B\uB48C\uB48D\uB48E\uB48F\uB490"+ - "\uB491\uB493\uB494\uB495\uB496\uB497\uB498\uB499"+ - "\uB49A\uB49B\uB49C\uB49D\uB4A1\uB4A2\uB4A3\uB4A4"+ - "\uB4A5\uB4A6\uB4A7\uB4A8\uB4A9\uB4AA\uB4AB\uB4AC"+ - "\uB4AD\uB4AE\uB4AF\uB4B0\uB4B1\uB4B3\uB4B4\uB4B5"+ - "\uB4B6\uB4B7\uB4B8\uB4B9\uB4BA\uB4BB\uB4BC\uB4BD"+ - "\uB4C1\uB4C2\uB4C3\uB4C4\uB4C5\uB4C6\uB4C7\uB4C8"+ - "\uB4C9\uB4CA\uB4CB\uB4CC\uB4CD\uB4CE\uB4CF\uB4D0"+ - "\uB4D1\uB4D3\uB4D4\uB4D5\uB4D6\uB4D7\uB4D8\uB4D9"+ - "\uB4DA\uB4DB\uB4DC\uB4DD\uB4E1\uB4E2\uB4E3\uB4E4"+ - "\uB4E5\uB4E6\uB4E7\uB4E8\uB4E9\uB4EA\uB4EB\uB4EC"+ - "\uB4ED\uB4EE\uB4EF\uB4F0\uB4F1\uB4F3\uB4F4\uB4F5"+ - "\uB4F6\uB4F7\uB4F8\uB4F9\uB4FA\uB4FB\uB4FC\uB4FD"+ - "\uB541\uB542\uB543\uB544\uB545\uB546\uB547\uB548"+ - "\uB549\uB54A\uB54B\uB54C\uB54D\uB54E\uB54F\uB550"+ - "\uB551\uB553\uB554\uB555\uB556\uB557\uB558\uB559"+ - "\uB55A\uB55B\uB55C\uB55D\uB561\uB562\uB563\uB564"+ - "\uB565\uB566\uB567\uB568\uB569\uB56A\uB56B\uB56C"+ - "\uB56D\uB56E\uB56F\uB570\uB571\uB573\uB574\uB575"+ - "\uB576\uB577\uB578\uB579\uB57A\uB57B\uB57C\uB57D"+ - "\uB581\uB582\uB583\uB584\uB585\uB586\uB587\uB588"+ - "\uB589\uB58A\uB58B\uB58C\uB58D\uB58E\uB58F\uB590"+ - "\uB591\uB593\uB594\uB595\uB596\uB597\uB598\uB599"+ - "\uB59A\uB59B\uB59C\uB59D\uB5A1\uB5A2\uB5A3\uB5A4"+ - "\uB5A5\uB5A6\uB5A7\uB5A8\uB5A9\uB5AA\uB5AB\uB5AC"+ - "\uB5AD\uB5AE\uB5AF\uB5B0\uB5B1\uB5B3\uB5B4\uB5B5"+ - "\uB5B6\uB5B7\uB5B8\uB5B9\uB5BA\uB5BB\uB5BC\uB5BD"+ - "\uB5C1\uB5C2\uB5C3\uB5C4\uB5C5\uB5C6\uB5C7\uB5C8"+ - "\uB5C9\uB5CA\uB5CB\uB5CC\uB5CD\uB5CE\uB5CF\uB5D0"+ - "\uB5D1\uB5D3\uB5D4\uB5D5\uB5D6\uB5D7\uB5D8\uB5D9"+ - "\uB5DA\uB5DB\uB5DC\uB5DD\uB5E1\uB5E2\uB5E3\uB5E4"+ - "\uB5E5\uB5E6\uB5E7\uB5E8\uB5E9\uB5EA\uB5EB\uB5EC"+ - "\uB5ED\uB5EE\uB5EF\uB5F0\uB5F1\uB5F3\uB5F4\uB5F5"+ - "\uB5F6\uB5F7\uB5F8\uB5F9\uB5FA\uB5FB\uB5FC\uB5FD"+ - "\uB641\uB642\uB643\uB644\uB645\uB646\uB647\uB648"+ - "\uB649\uB64A\uB64B\uB64C\uB64D\uB64E\uB64F\uB650"+ - "\uB651\uB653\uB654\uB655\uB656\uB657\uB658\uB659"+ - "\uB65A\uB65B\uB65C\uB65D\uB661\uB662\uB663\uB664"+ - "\uB665\uB666\uB667\uB668\uB669\uB66A\uB66B\uB66C"+ - "\uB66D\uB66E\uB66F\uB670\uB671\uB673\uB674\uB675"+ - "\uB676\uB677\uB678\uB679\uB67A\uB67B\uB67C\uB67D"+ - "\uB681\uB682\uB683\uB684\uB685\uB686\uB687\uB688"+ - "\uB689\uB68A\uB68B\uB68C\uB68D\uB68E\uB68F\uB690"+ - "\uB691\uB693\uB694\uB695\uB696\uB697\uB698\uB699"+ - "\uB69A\uB69B\uB69C\uB69D\uB6A1\uB6A2\uB6A3\uB6A4"+ - "\uB6A5\uB6A6\uB6A7\uB6A8\uB6A9\uB6AA\uB6AB\uB6AC"+ - "\uB6AD\uB6AE\uB6AF\uB6B0\uB6B1\uB6B3\uB6B4\uB6B5"+ - "\uB6B6\uB6B7\uB6B8\uB6B9\uB6BA\uB6BB\uB6BC\uB6BD"+ - "\uB6C1\uB6C2\uB6C3\uB6C4\uB6C5\uB6C6\uB6C7\uB6C8"+ - "\uB6C9\uB6CA\uB6CB\uB6CC\uB6CD\uB6CE\uB6CF\uB6D0"+ - "\uB6D1\uB6D3\uB6D4\uB6D5\uB6D6\uB6D7\uB6D8\uB6D9"+ - "\uB6DA\uB6DB\uB6DC\uB6DD\uB6E1\uB6E2\uB6E3\uB6E4"+ - "\uB6E5\uB6E6\uB6E7\uB6E8\uB6E9\uB6EA\uB6EB\uB6EC"+ - "\uB6ED\uB6EE\uB6EF\uB6F0\uB6F1\uB6F3\uB6F4\uB6F5"+ - "\uB6F6\uB6F7\uB6F8\uB6F9\uB6FA\uB6FB\uB6FC\uB6FD"+ - "\uB741\uB742\uB743\uB744\uB745\uB746\uB747\uB748"+ - "\uB749\uB74A\uB74B\uB74C\uB74D\uB74E\uB74F\uB750"+ - "\uB751\uB753\uB754\uB755\uB756\uB757\uB758\uB759"+ - "\uB75A\uB75B\uB75C\uB75D\uB761\uB762\uB763\uB764"+ - "\uB765\uB766\uB767\uB768\uB769\uB76A\uB76B\uB76C"+ - "\uB76D\uB76E\uB76F\uB770\uB771\uB773\uB774\uB775"+ - "\uB776\uB777\uB778\uB779\uB77A\uB77B\uB77C\uB77D"+ - "\uB781\uB782\uB783\uB784\uB785\uB786\uB787\uB788"+ - "\uB789\uB78A\uB78B\uB78C\uB78D\uB78E\uB78F\uB790"+ - "\uB791\uB793\uB794\uB795\uB796\uB797\uB798\uB799"+ - "\uB79A\uB79B\uB79C\uB79D\uB7A1\uB7A2\uB7A3\uB7A4"+ - "\uB7A5\uB7A6\uB7A7\uB7A8\uB7A9\uB7AA\uB7AB\uB7AC"+ - "\uB7AD\uB7AE\uB7AF\uB7B0\uB7B1\uB7B3\uB7B4\uB7B5"+ - "\uB7B6\uB7B7\uB7B8\uB7B9\uB7BA\uB7BB\uB7BC\uB7BD"+ - "\uB861\uB862\uB863\uB864\uB865\uB866\uB867\uB868"+ - "\uB869\uB86A\uB86B\uB86C\uB86D\uB86E\uB86F\uB870"+ - "\uB871\uB873\uB874\uB875\uB876\uB877\uB878\uB879"+ - "\uB87A\uB87B\uB87C\uB87D\uB881\uB882\uB883\uB884"+ - "\uB885\uB886\uB887\uB888\uB889\uB88A\uB88B\uB88C"+ - "\uB88D\uB88E\uB88F\uB890\uB891\uB893\uB894\uB895"+ - "\uB896\uB897\uB898\uB899\uB89A\uB89B\uB89C\uB89D"+ - "\uB8A1\uB8A2\uB8A3\uB8A4\uB8A5\uB8A6\uB8A7\uB8A8"+ - "\uB8A9\uB8AA\uB8AB\uB8AC\uB8AD\uB8AE\uB8AF\uB8B0"+ - "\uB8B1\uB8B3\uB8B4\uB8B5\uB8B6\uB8B7\uB8B8\uB8B9"+ - "\uB8BA\uB8BB\uB8BC\uB8BD\uB8C1\uB8C2\uB8C3\uB8C4"+ - "\uB8C5\uB8C6\uB8C7\uB8C8\uB8C9\uB8CA\uB8CB\uB8CC"+ - "\uB8CD\uB8CE\uB8CF\uB8D0\uB8D1\uB8D3\uB8D4\uB8D5"+ - "\uB8D6\uB8D7\uB8D8\uB8D9\uB8DA\uB8DB\uB8DC\uB8DD"+ - "\uB8E1\uB8E2\uB8E3\uB8E4\uB8E5\uB8E6\uB8E7\uB8E8"+ - "\uB8E9\uB8EA\uB8EB\uB8EC\uB8ED\uB8EE\uB8EF\uB8F0"+ - "\uB8F1\uB8F3\uB8F4\uB8F5\uB8F6\uB8F7\uB8F8\uB8F9"+ - "\uB8FA\uB8FB\uB8FC\uB8FD\uB941\uB942\uB943\uB944"+ - "\uB945\uB946\uB947\uB948\uB949\uB94A\uB94B\uB94C"+ - "\uB94D\uB94E\uB94F\uB950\uB951\uB953\uB954\uB955"+ - "\uB956\uB957\uB958\uB959\uB95A\uB95B\uB95C\uB95D"+ - "\uB961\uB962\uB963\uB964\uB965\uB966\uB967\uB968"+ - "\uB969\uB96A\uB96B\uB96C\uB96D\uB96E\uB96F\uB970"+ - "\uB971\uB973\uB974\uB975\uB976\uB977\uB978\uB979"+ - "\uB97A\uB97B\uB97C\uB97D\uB981\uB982\uB983\uB984"+ - "\uB985\uB986\uB987\uB988\uB989\uB98A\uB98B\uB98C"+ - "\uB98D\uB98E\uB98F\uB990\uB991\uB993\uB994\uB995"+ - "\uB996\uB997\uB998\uB999\uB99A\uB99B\uB99C\uB99D"+ - "\uB9A1\uB9A2\uB9A3\uB9A4\uB9A5\uB9A6\uB9A7\uB9A8"+ - "\uB9A9\uB9AA\uB9AB\uB9AC\uB9AD\uB9AE\uB9AF\uB9B0"+ - "\uB9B1\uB9B3\uB9B4\uB9B5\uB9B6\uB9B7\uB9B8\uB9B9"+ - "\uB9BA\uB9BB\uB9BC\uB9BD\uB9C1\uB9C2\uB9C3\uB9C4"+ - "\uB9C5\uB9C6\uB9C7\uB9C8\uB9C9\uB9CA\uB9CB\uB9CC"+ - "\uB9CD\uB9CE\uB9CF\uB9D0\uB9D1\uB9D3\uB9D4\uB9D5"+ - "\uB9D6\uB9D7\uB9D8\uB9D9\uB9DA\uB9DB\uB9DC\uB9DD"+ - "\uB9E1\uB9E2\uB9E3\uB9E4\uB9E5\uB9E6\uB9E7\uB9E8"+ - "\uB9E9\uB9EA\uB9EB\uB9EC\uB9ED\uB9EE\uB9EF\uB9F0"+ - "\uB9F1\uB9F3\uB9F4\uB9F5\uB9F6\uB9F7\uB9F8\uB9F9"+ - "\uB9FA\uB9FB\uB9FC\uB9FD\uBA41\uBA42\uBA43\uBA44"+ - "\uBA45\uBA46\uBA47\uBA48\uBA49\uBA4A\uBA4B\uBA4C"+ - "\uBA4D\uBA4E\uBA4F\uBA50\uBA51\uBA53\uBA54\uBA55"+ - "\uBA56\uBA57\uBA58\uBA59\uBA5A\uBA5B\uBA5C\uBA5D"+ - "\uBA61\uBA62\uBA63\uBA64\uBA65\uBA66\uBA67\uBA68"+ - "\uBA69\uBA6A\uBA6B\uBA6C\uBA6D\uBA6E\uBA6F\uBA70"+ - "\uBA71\uBA73\uBA74\uBA75\uBA76\uBA77\uBA78\uBA79"+ - "\uBA7A\uBA7B\uBA7C\uBA7D\uBA81\uBA82\uBA83\uBA84"; - - private final static String innerIndex8= - "\uBA85\uBA86\uBA87\uBA88\uBA89\uBA8A\uBA8B\uBA8C"+ - "\uBA8D\uBA8E\uBA8F\uBA90\uBA91\uBA93\uBA94\uBA95"+ - "\uBA96\uBA97\uBA98\uBA99\uBA9A\uBA9B\uBA9C\uBA9D"+ - "\uBAA1\uBAA2\uBAA3\uBAA4\uBAA5\uBAA6\uBAA7\uBAA8"+ - "\uBAA9\uBAAA\uBAAB\uBAAC\uBAAD\uBAAE\uBAAF\uBAB0"+ - "\uBAB1\uBAB3\uBAB4\uBAB5\uBAB6\uBAB7\uBAB8\uBAB9"+ - "\uBABA\uBABB\uBABC\uBABD\uBAC1\uBAC2\uBAC3\uBAC4"+ - "\uBAC5\uBAC6\uBAC7\uBAC8\uBAC9\uBACA\uBACB\uBACC"+ - "\uBACD\uBACE\uBACF\uBAD0\uBAD1\uBAD3\uBAD4\uBAD5"+ - "\uBAD6\uBAD7\uBAD8\uBAD9\uBADA\uBADB\uBADC\uBADD"+ - "\uBAE1\uBAE2\uBAE3\uBAE4\uBAE5\uBAE6\uBAE7\uBAE8"+ - "\uBAE9\uBAEA\uBAEB\uBAEC\uBAED\uBAEE\uBAEF\uBAF0"+ - "\uBAF1\uBAF3\uBAF4\uBAF5\uBAF6\uBAF7\uBAF8\uBAF9"+ - "\uBAFA\uBAFB\uBAFC\uBAFD\uBB41\uBB42\uBB43\uBB44"+ - "\uBB45\uBB46\uBB47\uBB48\uBB49\uBB4A\uBB4B\uBB4C"+ - "\uBB4D\uBB4E\uBB4F\uBB50\uBB51\uBB53\uBB54\uBB55"+ - "\uBB56\uBB57\uBB58\uBB59\uBB5A\uBB5B\uBB5C\uBB5D"+ - "\uBB61\uBB62\uBB63\uBB64\uBB65\uBB66\uBB67\uBB68"+ - "\uBB69\uBB6A\uBB6B\uBB6C\uBB6D\uBB6E\uBB6F\uBB70"+ - "\uBB71\uBB73\uBB74\uBB75\uBB76\uBB77\uBB78\uBB79"+ - "\uBB7A\uBB7B\uBB7C\uBB7D\uBB81\uBB82\uBB83\uBB84"+ - "\uBB85\uBB86\uBB87\uBB88\uBB89\uBB8A\uBB8B\uBB8C"+ - "\uBB8D\uBB8E\uBB8F\uBB90\uBB91\uBB93\uBB94\uBB95"+ - "\uBB96\uBB97\uBB98\uBB99\uBB9A\uBB9B\uBB9C\uBB9D"+ - "\uBBA1\uBBA2\uBBA3\uBBA4\uBBA5\uBBA6\uBBA7\uBBA8"+ - "\uBBA9\uBBAA\uBBAB\uBBAC\uBBAD\uBBAE\uBBAF\uBBB0"+ - "\uBBB1\uBBB3\uBBB4\uBBB5\uBBB6\uBBB7\uBBB8\uBBB9"+ - "\uBBBA\uBBBB\uBBBC\uBBBD\uBC61\uBC62\uBC63\uBC64"+ - "\uBC65\uBC66\uBC67\uBC68\uBC69\uBC6A\uBC6B\uBC6C"+ - "\uBC6D\uBC6E\uBC6F\uBC70\uBC71\uBC73\uBC74\uBC75"+ - "\uBC76\uBC77\uBC78\uBC79\uBC7A\uBC7B\uBC7C\uBC7D"+ - "\uBC81\uBC82\uBC83\uBC84\uBC85\uBC86\uBC87\uBC88"+ - "\uBC89\uBC8A\uBC8B\uBC8C\uBC8D\uBC8E\uBC8F\uBC90"+ - "\uBC91\uBC93\uBC94\uBC95\uBC96\uBC97\uBC98\uBC99"+ - "\uBC9A\uBC9B\uBC9C\uBC9D\uBCA1\uBCA2\uBCA3\uBCA4"+ - "\uBCA5\uBCA6\uBCA7\uBCA8\uBCA9\uBCAA\uBCAB\uBCAC"+ - "\uBCAD\uBCAE\uBCAF\uBCB0\uBCB1\uBCB3\uBCB4\uBCB5"+ - "\uBCB6\uBCB7\uBCB8\uBCB9\uBCBA\uBCBB\uBCBC\uBCBD"+ - "\uBCC1\uBCC2\uBCC3\uBCC4\uBCC5\uBCC6\uBCC7\uBCC8"+ - "\uBCC9\uBCCA\uBCCB\uBCCC\uBCCD\uBCCE\uBCCF\uBCD0"+ - "\uBCD1\uBCD3\uBCD4\uBCD5\uBCD6\uBCD7\uBCD8\uBCD9"+ - "\uBCDA\uBCDB\uBCDC\uBCDD\uBCE1\uBCE2\uBCE3\uBCE4"+ - "\uBCE5\uBCE6\uBCE7\uBCE8\uBCE9\uBCEA\uBCEB\uBCEC"+ - "\uBCED\uBCEE\uBCEF\uBCF0\uBCF1\uBCF3\uBCF4\uBCF5"+ - "\uBCF6\uBCF7\uBCF8\uBCF9\uBCFA\uBCFB\uBCFC\uBCFD"+ - "\uBD41\uBD42\uBD43\uBD44\uBD45\uBD46\uBD47\uBD48"+ - "\uBD49\uBD4A\uBD4B\uBD4C\uBD4D\uBD4E\uBD4F\uBD50"+ - "\uBD51\uBD53\uBD54\uBD55\uBD56\uBD57\uBD58\uBD59"+ - "\uBD5A\uBD5B\uBD5C\uBD5D\uBD61\uBD62\uBD63\uBD64"+ - "\uBD65\uBD66\uBD67\uBD68\uBD69\uBD6A\uBD6B\uBD6C"+ - "\uBD6D\uBD6E\uBD6F\uBD70\uBD71\uBD73\uBD74\uBD75"+ - "\uBD76\uBD77\uBD78\uBD79\uBD7A\uBD7B\uBD7C\uBD7D"+ - "\uBD81\uBD82\uBD83\uBD84\uBD85\uBD86\uBD87\uBD88"+ - "\uBD89\uBD8A\uBD8B\uBD8C\uBD8D\uBD8E\uBD8F\uBD90"+ - "\uBD91\uBD93\uBD94\uBD95\uBD96\uBD97\uBD98\uBD99"+ - "\uBD9A\uBD9B\uBD9C\uBD9D\uBDA1\uBDA2\uBDA3\uBDA4"+ - "\uBDA5\uBDA6\uBDA7\uBDA8\uBDA9\uBDAA\uBDAB\uBDAC"+ - "\uBDAD\uBDAE\uBDAF\uBDB0\uBDB1\uBDB3\uBDB4\uBDB5"+ - "\uBDB6\uBDB7\uBDB8\uBDB9\uBDBA\uBDBB\uBDBC\uBDBD"+ - "\uBDC1\uBDC2\uBDC3\uBDC4\uBDC5\uBDC6\uBDC7\uBDC8"+ - "\uBDC9\uBDCA\uBDCB\uBDCC\uBDCD\uBDCE\uBDCF\uBDD0"+ - "\uBDD1\uBDD3\uBDD4\uBDD5\uBDD6\uBDD7\uBDD8\uBDD9"+ - "\uBDDA\uBDDB\uBDDC\uBDDD\uBDE1\uBDE2\uBDE3\uBDE4"+ - "\uBDE5\uBDE6\uBDE7\uBDE8\uBDE9\uBDEA\uBDEB\uBDEC"+ - "\uBDED\uBDEE\uBDEF\uBDF0\uBDF1\uBDF3\uBDF4\uBDF5"+ - "\uBDF6\uBDF7\uBDF8\uBDF9\uBDFA\uBDFB\uBDFC\uBDFD"+ - "\uBE41\uBE42\uBE43\uBE44\uBE45\uBE46\uBE47\uBE48"+ - "\uBE49\uBE4A\uBE4B\uBE4C\uBE4D\uBE4E\uBE4F\uBE50"+ - "\uBE51\uBE53\uBE54\uBE55\uBE56\uBE57\uBE58\uBE59"+ - "\uBE5A\uBE5B\uBE5C\uBE5D\uBE61\uBE62\uBE63\uBE64"+ - "\uBE65\uBE66\uBE67\uBE68\uBE69\uBE6A\uBE6B\uBE6C"+ - "\uBE6D\uBE6E\uBE6F\uBE70\uBE71\uBE73\uBE74\uBE75"+ - "\uBE76\uBE77\uBE78\uBE79\uBE7A\uBE7B\uBE7C\uBE7D"+ - "\uBE81\uBE82\uBE83\uBE84\uBE85\uBE86\uBE87\uBE88"+ - "\uBE89\uBE8A\uBE8B\uBE8C\uBE8D\uBE8E\uBE8F\uBE90"+ - "\uBE91\uBE93\uBE94\uBE95\uBE96\uBE97\uBE98\uBE99"+ - "\uBE9A\uBE9B\uBE9C\uBE9D\uBEA1\uBEA2\uBEA3\uBEA4"+ - "\uBEA5\uBEA6\uBEA7\uBEA8\uBEA9\uBEAA\uBEAB\uBEAC"+ - "\uBEAD\uBEAE\uBEAF\uBEB0\uBEB1\uBEB3\uBEB4\uBEB5"+ - "\uBEB6\uBEB7\uBEB8\uBEB9\uBEBA\uBEBB\uBEBC\uBEBD"+ - "\uBEC1\uBEC2\uBEC3\uBEC4\uBEC5\uBEC6\uBEC7\uBEC8"+ - "\uBEC9\uBECA\uBECB\uBECC\uBECD\uBECE\uBECF\uBED0"+ - "\uBED1\uBED3\uBED4\uBED5\uBED6\uBED7\uBED8\uBED9"+ - "\uBEDA\uBEDB\uBEDC\uBEDD\uBEE1\uBEE2\uBEE3\uBEE4"+ - "\uBEE5\uBEE6\uBEE7\uBEE8\uBEE9\uBEEA\uBEEB\uBEEC"+ - "\uBEED\uBEEE\uBEEF\uBEF0\uBEF1\uBEF3\uBEF4\uBEF5"+ - "\uBEF6\uBEF7\uBEF8\uBEF9\uBEFA\uBEFB\uBEFC\uBEFD"+ - "\uBF41\uBF42\uBF43\uBF44\uBF45\uBF46\uBF47\uBF48"+ - "\uBF49\uBF4A\uBF4B\uBF4C\uBF4D\uBF4E\uBF4F\uBF50"+ - "\uBF51\uBF53\uBF54\uBF55\uBF56\uBF57\uBF58\uBF59"+ - "\uBF5A\uBF5B\uBF5C\uBF5D\uBF61\uBF62\uBF63\uBF64"+ - "\uBF65\uBF66\uBF67\uBF68\uBF69\uBF6A\uBF6B\uBF6C"+ - "\uBF6D\uBF6E\uBF6F\uBF70\uBF71\uBF73\uBF74\uBF75"+ - "\uBF76\uBF77\uBF78\uBF79\uBF7A\uBF7B\uBF7C\uBF7D"+ - "\uBF81\uBF82\uBF83\uBF84\uBF85\uBF86\uBF87\uBF88"+ - "\uBF89\uBF8A\uBF8B\uBF8C\uBF8D\uBF8E\uBF8F\uBF90"+ - "\uBF91\uBF93\uBF94\uBF95\uBF96\uBF97\uBF98\uBF99"+ - "\uBF9A\uBF9B\uBF9C\uBF9D\uBFA1\uBFA2\uBFA3\uBFA4"+ - "\uBFA5\uBFA6\uBFA7\uBFA8\uBFA9\uBFAA\uBFAB\uBFAC"+ - "\uBFAD\uBFAE\uBFAF\uBFB0\uBFB1\uBFB3\uBFB4\uBFB5"+ - "\uBFB6\uBFB7\uBFB8\uBFB9\uBFBA\uBFBB\uBFBC\uBFBD"+ - "\uC061\uC062\uC063\uC064\uC065\uC066\uC067\uC068"+ - "\uC069\uC06A\uC06B\uC06C\uC06D\uC06E\uC06F\uC070"+ - "\uC071\uC073\uC074\uC075\uC076\uC077\uC078\uC079"+ - "\uC07A\uC07B\uC07C\uC07D\uC081\uC082\uC083\uC084"+ - "\uC085\uC086\uC087\uC088\uC089\uC08A\uC08B\uC08C"+ - "\uC08D\uC08E\uC08F\uC090\uC091\uC093\uC094\uC095"+ - "\uC096\uC097\uC098\uC099\uC09A\uC09B\uC09C\uC09D"+ - "\uC0A1\uC0A2\uC0A3\uC0A4\uC0A5\uC0A6\uC0A7\uC0A8"+ - "\uC0A9\uC0AA\uC0AB\uC0AC\uC0AD\uC0AE\uC0AF\uC0B0"+ - "\uC0B1\uC0B3\uC0B4\uC0B5\uC0B6\uC0B7\uC0B8\uC0B9"+ - "\uC0BA\uC0BB\uC0BC\uC0BD\uC0C1\uC0C2\uC0C3\uC0C4"+ - "\uC0C5\uC0C6\uC0C7\uC0C8\uC0C9\uC0CA\uC0CB\uC0CC"+ - "\uC0CD\uC0CE\uC0CF\uC0D0\uC0D1\uC0D3\uC0D4\uC0D5"+ - "\uC0D6\uC0D7\uC0D8\uC0D9\uC0DA\uC0DB\uC0DC\uC0DD"+ - "\uC0E1\uC0E2\uC0E3\uC0E4\uC0E5\uC0E6\uC0E7\uC0E8"+ - "\uC0E9\uC0EA\uC0EB\uC0EC\uC0ED\uC0EE\uC0EF\uC0F0"+ - "\uC0F1\uC0F3\uC0F4\uC0F5\uC0F6\uC0F7\uC0F8\uC0F9"+ - "\uC0FA\uC0FB\uC0FC\uC0FD\uC141\uC142\uC143\uC144"+ - "\uC145\uC146\uC147\uC148\uC149\uC14A\uC14B\uC14C"+ - "\uC14D\uC14E\uC14F\uC150\uC151\uC153\uC154\uC155"+ - "\uC156\uC157\uC158\uC159\uC15A\uC15B\uC15C\uC15D"+ - "\uC161\uC162\uC163\uC164\uC165\uC166\uC167\uC168"+ - "\uC169\uC16A\uC16B\uC16C\uC16D\uC16E\uC16F\uC170"+ - "\uC171\uC173\uC174\uC175\uC176\uC177\uC178\uC179"+ - "\uC17A\uC17B\uC17C\uC17D\uC181\uC182\uC183\uC184"+ - "\uC185\uC186\uC187\uC188\uC189\uC18A\uC18B\uC18C"+ - "\uC18D\uC18E\uC18F\uC190\uC191\uC193\uC194\uC195"+ - "\uC196\uC197\uC198\uC199\uC19A\uC19B\uC19C\uC19D"+ - "\uC1A1\uC1A2\uC1A3\uC1A4\uC1A5\uC1A6\uC1A7\uC1A8"+ - "\uC1A9\uC1AA\uC1AB\uC1AC\uC1AD\uC1AE\uC1AF\uC1B0"+ - "\uC1B1\uC1B3\uC1B4\uC1B5\uC1B6\uC1B7\uC1B8\uC1B9"+ - "\uC1BA\uC1BB\uC1BC\uC1BD\uC1C1\uC1C2\uC1C3\uC1C4"+ - "\uC1C5\uC1C6\uC1C7\uC1C8\uC1C9\uC1CA\uC1CB\uC1CC"+ - "\uC1CD\uC1CE\uC1CF\uC1D0\uC1D1\uC1D3\uC1D4\uC1D5"+ - "\uC1D6\uC1D7\uC1D8\uC1D9\uC1DA\uC1DB\uC1DC\uC1DD"+ - "\uC1E1\uC1E2\uC1E3\uC1E4\uC1E5\uC1E6\uC1E7\uC1E8"+ - "\uC1E9\uC1EA\uC1EB\uC1EC\uC1ED\uC1EE\uC1EF\uC1F0"+ - "\uC1F1\uC1F3\uC1F4\uC1F5\uC1F6\uC1F7\uC1F8\uC1F9"+ - "\uC1FA\uC1FB\uC1FC\uC1FD\uC241\uC242\uC243\uC244"+ - "\uC245\uC246\uC247\uC248\uC249\uC24A\uC24B\uC24C"+ - "\uC24D\uC24E\uC24F\uC250\uC251\uC253\uC254\uC255"+ - "\uC256\uC257\uC258\uC259\uC25A\uC25B\uC25C\uC25D"+ - "\uC261\uC262\uC263\uC264\uC265\uC266\uC267\uC268"+ - "\uC269\uC26A\uC26B\uC26C\uC26D\uC26E\uC26F\uC270"+ - "\uC271\uC273\uC274\uC275\uC276\uC277\uC278\uC279"+ - "\uC27A\uC27B\uC27C\uC27D\uC281\uC282\uC283\uC284"+ - "\uC285\uC286\uC287\uC288\uC289\uC28A\uC28B\uC28C"+ - "\uC28D\uC28E\uC28F\uC290\uC291\uC293\uC294\uC295"+ - "\uC296\uC297\uC298\uC299\uC29A\uC29B\uC29C\uC29D"+ - "\uC2A1\uC2A2\uC2A3\uC2A4\uC2A5\uC2A6\uC2A7\uC2A8"+ - "\uC2A9\uC2AA\uC2AB\uC2AC\uC2AD\uC2AE\uC2AF\uC2B0"+ - "\uC2B1\uC2B3\uC2B4\uC2B5\uC2B6\uC2B7\uC2B8\uC2B9"+ - "\uC2BA\uC2BB\uC2BC\uC2BD\uC2C1\uC2C2\uC2C3\uC2C4"+ - "\uC2C5\uC2C6\uC2C7\uC2C8\uC2C9\uC2CA\uC2CB\uC2CC"+ - "\uC2CD\uC2CE\uC2CF\uC2D0\uC2D1\uC2D3\uC2D4\uC2D5"+ - "\uC2D6\uC2D7\uC2D8\uC2D9\uC2DA\uC2DB\uC2DC\uC2DD"+ - "\uC2E1\uC2E2\uC2E3\uC2E4\uC2E5\uC2E6\uC2E7\uC2E8"+ - "\uC2E9\uC2EA\uC2EB\uC2EC\uC2ED\uC2EE\uC2EF\uC2F0"+ - "\uC2F1\uC2F3\uC2F4\uC2F5\uC2F6\uC2F7\uC2F8\uC2F9"+ - "\uC2FA\uC2FB\uC2FC\uC2FD\uC341\uC342\uC343\uC344"+ - "\uC345\uC346\uC347\uC348\uC349\uC34A\uC34B\uC34C"+ - "\uC34D\uC34E\uC34F\uC350\uC351\uC353\uC354\uC355"+ - "\uC356\uC357\uC358\uC359\uC35A\uC35B\uC35C\uC35D"+ - "\uC361\uC362\uC363\uC364\uC365\uC366\uC367\uC368"+ - "\uC369\uC36A\uC36B\uC36C\uC36D\uC36E\uC36F\uC370"+ - "\uC371\uC373\uC374\uC375\uC376\uC377\uC378\uC379"+ - "\uC37A\uC37B\uC37C\uC37D\uC381\uC382\uC383\uC384"+ - "\uC385\uC386\uC387\uC388\uC389\uC38A\uC38B\uC38C"+ - "\uC38D\uC38E\uC38F\uC390\uC391\uC393\uC394\uC395"+ - "\uC396\uC397\uC398\uC399\uC39A\uC39B\uC39C\uC39D"+ - "\uC3A1\uC3A2\uC3A3\uC3A4\uC3A5\uC3A6\uC3A7\uC3A8"+ - "\uC3A9\uC3AA\uC3AB\uC3AC\uC3AD\uC3AE\uC3AF\uC3B0"+ - "\uC3B1\uC3B3\uC3B4\uC3B5\uC3B6\uC3B7\uC3B8\uC3B9"+ - "\uC3BA\uC3BB\uC3BC\uC3BD\uC461\uC462\uC463\uC464"+ - "\uC465\uC466\uC467\uC468\uC469\uC46A\uC46B\uC46C"+ - "\uC46D\uC46E\uC46F\uC470\uC471\uC473\uC474\uC475"+ - "\uC476\uC477\uC478\uC479\uC47A\uC47B\uC47C\uC47D"+ - "\uC481\uC482\uC483\uC484\uC485\uC486\uC487\uC488"+ - "\uC489\uC48A\uC48B\uC48C\uC48D\uC48E\uC48F\uC490"+ - "\uC491\uC493\uC494\uC495\uC496\uC497\uC498\uC499"+ - "\uC49A\uC49B\uC49C\uC49D\uC4A1\uC4A2\uC4A3\uC4A4"+ - "\uC4A5\uC4A6\uC4A7\uC4A8\uC4A9\uC4AA\uC4AB\uC4AC"+ - "\uC4AD\uC4AE\uC4AF\uC4B0\uC4B1\uC4B3\uC4B4\uC4B5"+ - "\uC4B6\uC4B7\uC4B8\uC4B9\uC4BA\uC4BB\uC4BC\uC4BD"+ - "\uC4C1\uC4C2\uC4C3\uC4C4\uC4C5\uC4C6\uC4C7\uC4C8"+ - "\uC4C9\uC4CA\uC4CB\uC4CC\uC4CD\uC4CE\uC4CF\uC4D0"+ - "\uC4D1\uC4D3\uC4D4\uC4D5\uC4D6\uC4D7\uC4D8\uC4D9"+ - "\uC4DA\uC4DB\uC4DC\uC4DD\uC4E1\uC4E2\uC4E3\uC4E4"+ - "\uC4E5\uC4E6\uC4E7\uC4E8\uC4E9\uC4EA\uC4EB\uC4EC"+ - "\uC4ED\uC4EE\uC4EF\uC4F0\uC4F1\uC4F3\uC4F4\uC4F5"+ - "\uC4F6\uC4F7\uC4F8\uC4F9\uC4FA\uC4FB\uC4FC\uC4FD"+ - "\uC541\uC542\uC543\uC544\uC545\uC546\uC547\uC548"+ - "\uC549\uC54A\uC54B\uC54C\uC54D\uC54E\uC54F\uC550"+ - "\uC551\uC553\uC554\uC555\uC556\uC557\uC558\uC559"+ - "\uC55A\uC55B\uC55C\uC55D\uC561\uC562\uC563\uC564"+ - "\uC565\uC566\uC567\uC568\uC569\uC56A\uC56B\uC56C"+ - "\uC56D\uC56E\uC56F\uC570\uC571\uC573\uC574\uC575"+ - "\uC576\uC577\uC578\uC579\uC57A\uC57B\uC57C\uC57D"+ - "\uC581\uC582\uC583\uC584\uC585\uC586\uC587\uC588"+ - "\uC589\uC58A\uC58B\uC58C\uC58D\uC58E\uC58F\uC590"+ - "\uC591\uC593\uC594\uC595\uC596\uC597\uC598\uC599"+ - "\uC59A\uC59B\uC59C\uC59D\uC5A1\uC5A2\uC5A3\uC5A4"+ - "\uC5A5\uC5A6\uC5A7\uC5A8\uC5A9\uC5AA\uC5AB\uC5AC"+ - "\uC5AD\uC5AE\uC5AF\uC5B0\uC5B1\uC5B3\uC5B4\uC5B5"+ - "\uC5B6\uC5B7\uC5B8\uC5B9\uC5BA\uC5BB\uC5BC\uC5BD"+ - "\uC5C1\uC5C2\uC5C3\uC5C4\uC5C5\uC5C6\uC5C7\uC5C8"+ - "\uC5C9\uC5CA\uC5CB\uC5CC\uC5CD\uC5CE\uC5CF\uC5D0"+ - "\uC5D1\uC5D3\uC5D4\uC5D5\uC5D6\uC5D7\uC5D8\uC5D9"+ - "\uC5DA\uC5DB\uC5DC\uC5DD\uC5E1\uC5E2\uC5E3\uC5E4"+ - "\uC5E5\uC5E6\uC5E7\uC5E8\uC5E9\uC5EA\uC5EB\uC5EC"+ - "\uC5ED\uC5EE\uC5EF\uC5F0\uC5F1\uC5F3\uC5F4\uC5F5"+ - "\uC5F6\uC5F7\uC5F8\uC5F9\uC5FA\uC5FB\uC5FC\uC5FD"+ - "\uC641\uC642\uC643\uC644\uC645\uC646\uC647\uC648"+ - "\uC649\uC64A\uC64B\uC64C\uC64D\uC64E\uC64F\uC650"+ - "\uC651\uC653\uC654\uC655\uC656\uC657\uC658\uC659"+ - "\uC65A\uC65B\uC65C\uC65D\uC661\uC662\uC663\uC664"+ - "\uC665\uC666\uC667\uC668\uC669\uC66A\uC66B\uC66C"+ - "\uC66D\uC66E\uC66F\uC670\uC671\uC673\uC674\uC675"+ - "\uC676\uC677\uC678\uC679\uC67A\uC67B\uC67C\uC67D"+ - "\uC681\uC682\uC683\uC684\uC685\uC686\uC687\uC688"+ - "\uC689\uC68A\uC68B\uC68C\uC68D\uC68E\uC68F\uC690"+ - "\uC691\uC693\uC694\uC695\uC696\uC697\uC698\uC699"+ - "\uC69A\uC69B\uC69C\uC69D\uC6A1\uC6A2\uC6A3\uC6A4"+ - "\uC6A5\uC6A6\uC6A7\uC6A8\uC6A9\uC6AA\uC6AB\uC6AC"+ - "\uC6AD\uC6AE\uC6AF\uC6B0\uC6B1\uC6B3\uC6B4\uC6B5"+ - "\uC6B6\uC6B7\uC6B8\uC6B9\uC6BA\uC6BB\uC6BC\uC6BD"+ - "\uC6C1\uC6C2\uC6C3\uC6C4\uC6C5\uC6C6\uC6C7\uC6C8"+ - "\uC6C9\uC6CA\uC6CB\uC6CC\uC6CD\uC6CE\uC6CF\uC6D0"+ - "\uC6D1\uC6D3\uC6D4\uC6D5\uC6D6\uC6D7\uC6D8\uC6D9"+ - "\uC6DA\uC6DB\uC6DC\uC6DD\uC6E1\uC6E2\uC6E3\uC6E4"+ - "\uC6E5\uC6E6\uC6E7\uC6E8\uC6E9\uC6EA\uC6EB\uC6EC"+ - "\uC6ED\uC6EE\uC6EF\uC6F0\uC6F1\uC6F3\uC6F4\uC6F5"+ - "\uC6F6\uC6F7\uC6F8\uC6F9\uC6FA\uC6FB\uC6FC\uC6FD"+ - "\uC741\uC742\uC743\uC744\uC745\uC746\uC747\uC748"+ - "\uC749\uC74A\uC74B\uC74C\uC74D\uC74E\uC74F\uC750"+ - "\uC751\uC753\uC754\uC755\uC756\uC757\uC758\uC759"+ - "\uC75A\uC75B\uC75C\uC75D\uC761\uC762\uC763\uC764"+ - "\uC765\uC766\uC767\uC768\uC769\uC76A\uC76B\uC76C"+ - "\uC76D\uC76E\uC76F\uC770\uC771\uC773\uC774\uC775"+ - "\uC776\uC777\uC778\uC779\uC77A\uC77B\uC77C\uC77D"+ - "\uC781\uC782\uC783\uC784\uC785\uC786\uC787\uC788"+ - "\uC789\uC78A\uC78B\uC78C\uC78D\uC78E\uC78F\uC790"+ - "\uC791\uC793\uC794\uC795\uC796\uC797\uC798\uC799"+ - "\uC79A\uC79B\uC79C\uC79D\uC7A1\uC7A2\uC7A3\uC7A4"+ - "\uC7A5\uC7A6\uC7A7\uC7A8\uC7A9\uC7AA\uC7AB\uC7AC"+ - "\uC7AD\uC7AE\uC7AF\uC7B0\uC7B1\uC7B3\uC7B4\uC7B5"+ - "\uC7B6\uC7B7\uC7B8\uC7B9\uC7BA\uC7BB\uC7BC\uC7BD"+ - "\uC861\uC862\uC863\uC864\uC865\uC866\uC867\uC868"+ - "\uC869\uC86A\uC86B\uC86C\uC86D\uC86E\uC86F\uC870"+ - "\uC871\uC873\uC874\uC875\uC876\uC877\uC878\uC879"+ - "\uC87A\uC87B\uC87C\uC87D\uC881\uC882\uC883\uC884"+ - "\uC885\uC886\uC887\uC888\uC889\uC88A\uC88B\uC88C"+ - "\uC88D\uC88E\uC88F\uC890\uC891\uC893\uC894\uC895"+ - "\uC896\uC897\uC898\uC899\uC89A\uC89B\uC89C\uC89D"+ - "\uC8A1\uC8A2\uC8A3\uC8A4\uC8A5\uC8A6\uC8A7\uC8A8"+ - "\uC8A9\uC8AA\uC8AB\uC8AC\uC8AD\uC8AE\uC8AF\uC8B0"+ - "\uC8B1\uC8B3\uC8B4\uC8B5\uC8B6\uC8B7\uC8B8\uC8B9"+ - "\uC8BA\uC8BB\uC8BC\uC8BD\uC8C1\uC8C2\uC8C3\uC8C4"+ - "\uC8C5\uC8C6\uC8C7\uC8C8\uC8C9\uC8CA\uC8CB\uC8CC"+ - "\uC8CD\uC8CE\uC8CF\uC8D0\uC8D1\uC8D3\uC8D4\uC8D5"+ - "\uC8D6\uC8D7\uC8D8\uC8D9\uC8DA\uC8DB\uC8DC\uC8DD"+ - "\uC8E1\uC8E2\uC8E3\uC8E4\uC8E5\uC8E6\uC8E7\uC8E8"+ - "\uC8E9\uC8EA\uC8EB\uC8EC\uC8ED\uC8EE\uC8EF\uC8F0"+ - "\uC8F1\uC8F3\uC8F4\uC8F5\uC8F6\uC8F7\uC8F8\uC8F9"+ - "\uC8FA\uC8FB\uC8FC\uC8FD\uC941\uC942\uC943\uC944"+ - "\uC945\uC946\uC947\uC948\uC949\uC94A\uC94B\uC94C"+ - "\uC94D\uC94E\uC94F\uC950\uC951\uC953\uC954\uC955"+ - "\uC956\uC957\uC958\uC959\uC95A\uC95B\uC95C\uC95D"+ - "\uC961\uC962\uC963\uC964\uC965\uC966\uC967\uC968"+ - "\uC969\uC96A\uC96B\uC96C\uC96D\uC96E\uC96F\uC970"+ - "\uC971\uC973\uC974\uC975\uC976\uC977\uC978\uC979"+ - "\uC97A\uC97B\uC97C\uC97D\uC981\uC982\uC983\uC984"+ - "\uC985\uC986\uC987\uC988\uC989\uC98A\uC98B\uC98C"+ - "\uC98D\uC98E\uC98F\uC990\uC991\uC993\uC994\uC995"+ - "\uC996\uC997\uC998\uC999\uC99A\uC99B\uC99C\uC99D"+ - "\uC9A1\uC9A2\uC9A3\uC9A4\uC9A5\uC9A6\uC9A7\uC9A8"+ - "\uC9A9\uC9AA\uC9AB\uC9AC\uC9AD\uC9AE\uC9AF\uC9B0"+ - "\uC9B1\uC9B3\uC9B4\uC9B5\uC9B6\uC9B7\uC9B8\uC9B9"+ - "\uC9BA\uC9BB\uC9BC\uC9BD\uC9C1\uC9C2\uC9C3\uC9C4"+ - "\uC9C5\uC9C6\uC9C7\uC9C8\uC9C9\uC9CA\uC9CB\uC9CC"+ - "\uC9CD\uC9CE\uC9CF\uC9D0\uC9D1\uC9D3\uC9D4\uC9D5"+ - "\uC9D6\uC9D7\uC9D8\uC9D9\uC9DA\uC9DB\uC9DC\uC9DD"+ - "\uC9E1\uC9E2\uC9E3\uC9E4\uC9E5\uC9E6\uC9E7\uC9E8"+ - "\uC9E9\uC9EA\uC9EB\uC9EC\uC9ED\uC9EE\uC9EF\uC9F0"+ - "\uC9F1\uC9F3\uC9F4\uC9F5\uC9F6\uC9F7\uC9F8\uC9F9"+ - "\uC9FA\uC9FB\uC9FC\uC9FD\uCA41\uCA42\uCA43\uCA44"+ - "\uCA45\uCA46\uCA47\uCA48\uCA49\uCA4A\uCA4B\uCA4C"+ - "\uCA4D\uCA4E\uCA4F\uCA50\uCA51\uCA53\uCA54\uCA55"+ - "\uCA56\uCA57\uCA58\uCA59\uCA5A\uCA5B\uCA5C\uCA5D"+ - "\uCA61\uCA62\uCA63\uCA64\uCA65\uCA66\uCA67\uCA68"+ - "\uCA69\uCA6A\uCA6B\uCA6C\uCA6D\uCA6E\uCA6F\uCA70"+ - "\uCA71\uCA73\uCA74\uCA75\uCA76\uCA77\uCA78\uCA79"+ - "\uCA7A\uCA7B\uCA7C\uCA7D\uCA81\uCA82\uCA83\uCA84"+ - "\uCA85\uCA86\uCA87\uCA88\uCA89\uCA8A\uCA8B\uCA8C"+ - "\uCA8D\uCA8E\uCA8F\uCA90\uCA91\uCA93\uCA94\uCA95"+ - "\uCA96\uCA97\uCA98\uCA99\uCA9A\uCA9B\uCA9C\uCA9D"+ - "\uCAA1\uCAA2\uCAA3\uCAA4\uCAA5\uCAA6\uCAA7\uCAA8"+ - "\uCAA9\uCAAA\uCAAB\uCAAC\uCAAD\uCAAE\uCAAF\uCAB0"+ - "\uCAB1\uCAB3\uCAB4\uCAB5\uCAB6\uCAB7\uCAB8\uCAB9"+ - "\uCABA\uCABB\uCABC\uCABD\uCAC1\uCAC2\uCAC3\uCAC4"+ - "\uCAC5\uCAC6\uCAC7\uCAC8\uCAC9\uCACA\uCACB\uCACC"+ - "\uCACD\uCACE\uCACF\uCAD0\uCAD1\uCAD3\uCAD4\uCAD5"+ - "\uCAD6\uCAD7\uCAD8\uCAD9\uCADA\uCADB\uCADC\uCADD"+ - "\uCAE1\uCAE2\uCAE3\uCAE4\uCAE5\uCAE6\uCAE7\uCAE8"+ - "\uCAE9\uCAEA\uCAEB\uCAEC\uCAED\uCAEE\uCAEF\uCAF0"+ - "\uCAF1\uCAF3\uCAF4\uCAF5\uCAF6\uCAF7\uCAF8\uCAF9"+ - "\uCAFA\uCAFB\uCAFC\uCAFD\uCB41\uCB42\uCB43\uCB44"+ - "\uCB45\uCB46\uCB47\uCB48\uCB49\uCB4A\uCB4B\uCB4C"+ - "\uCB4D\uCB4E\uCB4F\uCB50\uCB51\uCB53\uCB54\uCB55"+ - "\uCB56\uCB57\uCB58\uCB59\uCB5A\uCB5B\uCB5C\uCB5D"+ - "\uCB61\uCB62\uCB63\uCB64\uCB65\uCB66\uCB67\uCB68"+ - "\uCB69\uCB6A\uCB6B\uCB6C\uCB6D\uCB6E\uCB6F\uCB70"+ - "\uCB71\uCB73\uCB74\uCB75\uCB76\uCB77\uCB78\uCB79"+ - "\uCB7A\uCB7B\uCB7C\uCB7D\uCB81\uCB82\uCB83\uCB84"+ - "\uCB85\uCB86\uCB87\uCB88\uCB89\uCB8A\uCB8B\uCB8C"+ - "\uCB8D\uCB8E\uCB8F\uCB90\uCB91\uCB93\uCB94\uCB95"+ - "\uCB96\uCB97\uCB98\uCB99\uCB9A\uCB9B\uCB9C\uCB9D"+ - "\uCBA1\uCBA2\uCBA3\uCBA4\uCBA5\uCBA6\uCBA7\uCBA8"+ - "\uCBA9\uCBAA\uCBAB\uCBAC\uCBAD\uCBAE\uCBAF\uCBB0"+ - "\uCBB1\uCBB3\uCBB4\uCBB5\uCBB6\uCBB7\uCBB8\uCBB9"+ - "\uCBBA\uCBBB\uCBBC\uCBBD\uCC61\uCC62\uCC63\uCC64"+ - "\uCC65\uCC66\uCC67\uCC68\uCC69\uCC6A\uCC6B\uCC6C"+ - "\uCC6D\uCC6E\uCC6F\uCC70\uCC71\uCC73\uCC74\uCC75"+ - "\uCC76\uCC77\uCC78\uCC79\uCC7A\uCC7B\uCC7C\uCC7D"+ - "\uCC81\uCC82\uCC83\uCC84\uCC85\uCC86\uCC87\uCC88"+ - "\uCC89\uCC8A\uCC8B\uCC8C\uCC8D\uCC8E\uCC8F\uCC90"+ - "\uCC91\uCC93\uCC94\uCC95\uCC96\uCC97\uCC98\uCC99"+ - "\uCC9A\uCC9B\uCC9C\uCC9D\uCCA1\uCCA2\uCCA3\uCCA4"+ - "\uCCA5\uCCA6\uCCA7\uCCA8\uCCA9\uCCAA\uCCAB\uCCAC"+ - "\uCCAD\uCCAE\uCCAF\uCCB0\uCCB1\uCCB3\uCCB4\uCCB5"+ - "\uCCB6\uCCB7\uCCB8\uCCB9\uCCBA\uCCBB\uCCBC\uCCBD"+ - "\uCCC1\uCCC2\uCCC3\uCCC4\uCCC5\uCCC6\uCCC7\uCCC8"+ - "\uCCC9\uCCCA\uCCCB\uCCCC\uCCCD\uCCCE\uCCCF\uCCD0"+ - "\uCCD1\uCCD3\uCCD4\uCCD5\uCCD6\uCCD7\uCCD8\uCCD9"+ - "\uCCDA\uCCDB\uCCDC\uCCDD\uCCE1\uCCE2\uCCE3\uCCE4"+ - "\uCCE5\uCCE6\uCCE7\uCCE8\uCCE9\uCCEA\uCCEB\uCCEC"+ - "\uCCED\uCCEE\uCCEF\uCCF0\uCCF1\uCCF3\uCCF4\uCCF5"+ - "\uCCF6\uCCF7\uCCF8\uCCF9\uCCFA\uCCFB\uCCFC\uCCFD"+ - "\uCD41\uCD42\uCD43\uCD44\uCD45\uCD46\uCD47\uCD48"+ - "\uCD49\uCD4A\uCD4B\uCD4C\uCD4D\uCD4E\uCD4F\uCD50"+ - "\uCD51\uCD53\uCD54\uCD55\uCD56\uCD57\uCD58\uCD59"+ - "\uCD5A\uCD5B\uCD5C\uCD5D\uCD61\uCD62\uCD63\uCD64"+ - "\uCD65\uCD66\uCD67\uCD68\uCD69\uCD6A\uCD6B\uCD6C"+ - "\uCD6D\uCD6E\uCD6F\uCD70\uCD71\uCD73\uCD74\uCD75"+ - "\uCD76\uCD77\uCD78\uCD79\uCD7A\uCD7B\uCD7C\uCD7D"+ - "\uCD81\uCD82\uCD83\uCD84\uCD85\uCD86\uCD87\uCD88"+ - "\uCD89\uCD8A\uCD8B\uCD8C\uCD8D\uCD8E\uCD8F\uCD90"+ - "\uCD91\uCD93\uCD94\uCD95\uCD96\uCD97\uCD98\uCD99"+ - "\uCD9A\uCD9B\uCD9C\uCD9D\uCDA1\uCDA2\uCDA3\uCDA4"+ - "\uCDA5\uCDA6\uCDA7\uCDA8\uCDA9\uCDAA\uCDAB\uCDAC"+ - "\uCDAD\uCDAE\uCDAF\uCDB0\uCDB1\uCDB3\uCDB4\uCDB5"+ - "\uCDB6\uCDB7\uCDB8\uCDB9\uCDBA\uCDBB\uCDBC\uCDBD"+ - "\uCDC1\uCDC2\uCDC3\uCDC4\uCDC5\uCDC6\uCDC7\uCDC8"+ - "\uCDC9\uCDCA\uCDCB\uCDCC\uCDCD\uCDCE\uCDCF\uCDD0"+ - "\uCDD1\uCDD3\uCDD4\uCDD5\uCDD6\uCDD7\uCDD8\uCDD9"+ - "\uCDDA\uCDDB\uCDDC\uCDDD\uCDE1\uCDE2\uCDE3\uCDE4"+ - "\uCDE5\uCDE6\uCDE7\uCDE8\uCDE9\uCDEA\uCDEB\uCDEC"+ - "\uCDED\uCDEE\uCDEF\uCDF0\uCDF1\uCDF3\uCDF4\uCDF5"+ - "\uCDF6\uCDF7\uCDF8\uCDF9\uCDFA\uCDFB\uCDFC\uCDFD"+ - "\uCE41\uCE42\uCE43\uCE44\uCE45\uCE46\uCE47\uCE48"+ - "\uCE49\uCE4A\uCE4B\uCE4C\uCE4D\uCE4E\uCE4F\uCE50"+ - "\uCE51\uCE53\uCE54\uCE55\uCE56\uCE57\uCE58\uCE59"+ - "\uCE5A\uCE5B\uCE5C\uCE5D\uCE61\uCE62\uCE63\uCE64"+ - "\uCE65\uCE66\uCE67\uCE68\uCE69\uCE6A\uCE6B\uCE6C"+ - "\uCE6D\uCE6E\uCE6F\uCE70\uCE71\uCE73\uCE74\uCE75"+ - "\uCE76\uCE77\uCE78\uCE79\uCE7A\uCE7B\uCE7C\uCE7D"+ - "\uCE81\uCE82\uCE83\uCE84\uCE85\uCE86\uCE87\uCE88"+ - "\uCE89\uCE8A\uCE8B\uCE8C\uCE8D\uCE8E\uCE8F\uCE90"+ - "\uCE91\uCE93\uCE94\uCE95\uCE96\uCE97\uCE98\uCE99"+ - "\uCE9A\uCE9B\uCE9C\uCE9D\uCEA1\uCEA2\uCEA3\uCEA4"+ - "\uCEA5\uCEA6\uCEA7\uCEA8\uCEA9\uCEAA\uCEAB\uCEAC"+ - "\uCEAD\uCEAE\uCEAF\uCEB0\uCEB1\uCEB3\uCEB4\uCEB5"+ - "\uCEB6\uCEB7\uCEB8\uCEB9\uCEBA\uCEBB\uCEBC\uCEBD"+ - "\uCEC1\uCEC2\uCEC3\uCEC4\uCEC5\uCEC6\uCEC7\uCEC8"+ - "\uCEC9\uCECA\uCECB\uCECC\uCECD\uCECE\uCECF\uCED0"+ - "\uCED1\uCED3\uCED4\uCED5\uCED6\uCED7\uCED8\uCED9"+ - "\uCEDA\uCEDB\uCEDC\uCEDD\uCEE1\uCEE2\uCEE3\uCEE4"+ - "\uCEE5\uCEE6\uCEE7\uCEE8\uCEE9\uCEEA\uCEEB\uCEEC"+ - "\uCEED\uCEEE\uCEEF\uCEF0\uCEF1\uCEF3\uCEF4\uCEF5"+ - "\uCEF6\uCEF7\uCEF8\uCEF9\uCEFA\uCEFB\uCEFC\uCEFD"+ - "\uCF41\uCF42\uCF43\uCF44\uCF45\uCF46\uCF47\uCF48"+ - "\uCF49\uCF4A\uCF4B\uCF4C\uCF4D\uCF4E\uCF4F\uCF50"+ - "\uCF51\uCF53\uCF54\uCF55\uCF56\uCF57\uCF58\uCF59"+ - "\uCF5A\uCF5B\uCF5C\uCF5D\uCF61\uCF62\uCF63\uCF64"+ - "\uCF65\uCF66\uCF67\uCF68\uCF69\uCF6A\uCF6B\uCF6C"+ - "\uCF6D\uCF6E\uCF6F\uCF70\uCF71\uCF73\uCF74\uCF75"+ - "\uCF76\uCF77\uCF78\uCF79\uCF7A\uCF7B\uCF7C\uCF7D"+ - "\uCF81\uCF82\uCF83\uCF84\uCF85\uCF86\uCF87\uCF88"+ - "\uCF89\uCF8A\uCF8B\uCF8C\uCF8D\uCF8E\uCF8F\uCF90"+ - "\uCF91\uCF93\uCF94\uCF95\uCF96\uCF97\uCF98\uCF99"+ - "\uCF9A\uCF9B\uCF9C\uCF9D\uCFA1\uCFA2\uCFA3\uCFA4"+ - "\uCFA5\uCFA6\uCFA7\uCFA8\uCFA9\uCFAA\uCFAB\uCFAC"+ - "\uCFAD\uCFAE\uCFAF\uCFB0\uCFB1\uCFB3\uCFB4\uCFB5"+ - "\uCFB6\uCFB7\uCFB8\uCFB9\uCFBA\uCFBB\uCFBC\uCFBD"+ - "\uD061\uD062\uD063\uD064\uD065\uD066\uD067\uD068"+ - "\uD069\uD06A\uD06B\uD06C\uD06D\uD06E\uD06F\uD070"+ - "\uD071\uD073\uD074\uD075\uD076\uD077\uD078\uD079"+ - "\uD07A\uD07B\uD07C\uD07D\uD081\uD082\uD083\uD084"+ - "\uD085\uD086\uD087\uD088\uD089\uD08A\uD08B\uD08C"+ - "\uD08D\uD08E\uD08F\uD090\uD091\uD093\uD094\uD095"+ - "\uD096\uD097\uD098\uD099\uD09A\uD09B\uD09C\uD09D"+ - "\uD0A1\uD0A2\uD0A3\uD0A4\uD0A5\uD0A6\uD0A7\uD0A8"+ - "\uD0A9\uD0AA\uD0AB\uD0AC\uD0AD\uD0AE\uD0AF\uD0B0"+ - "\uD0B1\uD0B3\uD0B4\uD0B5\uD0B6\uD0B7\uD0B8\uD0B9"+ - "\uD0BA\uD0BB\uD0BC\uD0BD\uD0C1\uD0C2\uD0C3\uD0C4"+ - "\uD0C5\uD0C6\uD0C7\uD0C8\uD0C9\uD0CA\uD0CB\uD0CC"+ - "\uD0CD\uD0CE\uD0CF\uD0D0\uD0D1\uD0D3\uD0D4\uD0D5"+ - "\uD0D6\uD0D7\uD0D8\uD0D9\uD0DA\uD0DB\uD0DC\uD0DD"+ - "\uD0E1\uD0E2\uD0E3\uD0E4\uD0E5\uD0E6\uD0E7\uD0E8"+ - "\uD0E9\uD0EA\uD0EB\uD0EC\uD0ED\uD0EE\uD0EF\uD0F0"+ - "\uD0F1\uD0F3\uD0F4\uD0F5\uD0F6\uD0F7\uD0F8\uD0F9"+ - "\uD0FA\uD0FB\uD0FC\uD0FD\uD141\uD142\uD143\uD144"+ - "\uD145\uD146\uD147\uD148\uD149\uD14A\uD14B\uD14C"+ - "\uD14D\uD14E\uD14F\uD150\uD151\uD153\uD154\uD155"+ - "\uD156\uD157\uD158\uD159\uD15A\uD15B\uD15C\uD15D"+ - "\uD161\uD162\uD163\uD164\uD165\uD166\uD167\uD168"+ - "\uD169\uD16A\uD16B\uD16C\uD16D\uD16E\uD16F\uD170"+ - "\uD171\uD173\uD174\uD175\uD176\uD177\uD178\uD179"+ - "\uD17A\uD17B\uD17C\uD17D\uD181\uD182\uD183\uD184"+ - "\uD185\uD186\uD187\uD188\uD189\uD18A\uD18B\uD18C"+ - "\uD18D\uD18E\uD18F\uD190\uD191\uD193\uD194\uD195"+ - "\uD196\uD197\uD198\uD199\uD19A\uD19B\uD19C\uD19D"+ - "\uD1A1\uD1A2\uD1A3\uD1A4\uD1A5\uD1A6\uD1A7\uD1A8"+ - "\uD1A9\uD1AA\uD1AB\uD1AC\uD1AD\uD1AE\uD1AF\uD1B0"+ - "\uD1B1\uD1B3\uD1B4\uD1B5\uD1B6\uD1B7\uD1B8\uD1B9"+ - "\uD1BA\uD1BB\uD1BC\uD1BD\uD1C1\uD1C2\uD1C3\uD1C4"+ - "\uD1C5\uD1C6\uD1C7\uD1C8\uD1C9\uD1CA\uD1CB\uD1CC"+ - "\uD1CD\uD1CE\uD1CF\uD1D0\uD1D1\uD1D3\uD1D4\uD1D5"+ - "\uD1D6\uD1D7\uD1D8\uD1D9\uD1DA\uD1DB\uD1DC\uD1DD"+ - "\uD1E1\uD1E2\uD1E3\uD1E4\uD1E5\uD1E6\uD1E7\uD1E8"+ - "\uD1E9\uD1EA\uD1EB\uD1EC\uD1ED\uD1EE\uD1EF\uD1F0"+ - "\uD1F1\uD1F3\uD1F4\uD1F5\uD1F6\uD1F7\uD1F8\uD1F9"+ - "\uD1FA\uD1FB\uD1FC\uD1FD\uD241\uD242\uD243\uD244"+ - "\uD245\uD246\uD247\uD248\uD249\uD24A\uD24B\uD24C"+ - "\uD24D\uD24E\uD24F\uD250\uD251\uD253\uD254\uD255"+ - "\uD256\uD257\uD258\uD259\uD25A\uD25B\uD25C\uD25D"+ - "\uD261\uD262\uD263\uD264\uD265\uD266\uD267\uD268"+ - "\uD269\uD26A\uD26B\uD26C\uD26D\uD26E\uD26F\uD270"+ - "\uD271\uD273\uD274\uD275\uD276\uD277\uD278\uD279"+ - "\uD27A\uD27B\uD27C\uD27D\uD281\uD282\uD283\uD284"+ - "\uD285\uD286\uD287\uD288\uD289\uD28A\uD28B\uD28C"+ - "\uD28D\uD28E\uD28F\uD290\uD291\uD293\uD294\uD295"+ - "\uD296\uD297\uD298\uD299\uD29A\uD29B\uD29C\uD29D"+ - "\uD2A1\uD2A2\uD2A3\uD2A4\uD2A5\uD2A6\uD2A7\uD2A8"+ - "\uD2A9\uD2AA\uD2AB\uD2AC\uD2AD\uD2AE\uD2AF\uD2B0"+ - "\uD2B1\uD2B3\uD2B4\uD2B5\uD2B6\uD2B7\uD2B8\uD2B9"+ - "\uD2BA\uD2BB\uD2BC\uD2BD\uD2C1\uD2C2\uD2C3\uD2C4"+ - "\uD2C5\uD2C6\uD2C7\uD2C8\uD2C9\uD2CA\uD2CB\uD2CC"+ - "\uD2CD\uD2CE\uD2CF\uD2D0\uD2D1\uD2D3\uD2D4\uD2D5"+ - "\uD2D6\uD2D7\uD2D8\uD2D9\uD2DA\uD2DB\uD2DC\uD2DD"+ - "\uD2E1\uD2E2\uD2E3\uD2E4\uD2E5\uD2E6\uD2E7\uD2E8"+ - "\uD2E9\uD2EA\uD2EB\uD2EC\uD2ED\uD2EE\uD2EF\uD2F0"+ - "\uD2F1\uD2F3\uD2F4\uD2F5\uD2F6\uD2F7\uD2F8\uD2F9"+ - "\uD2FA\uD2FB\uD2FC\uD2FD\uD341\uD342\uD343\uD344"+ - "\uD345\uD346\uD347\uD348\uD349\uD34A\uD34B\uD34C"+ - "\uD34D\uD34E\uD34F\uD350\uD351\uD353\uD354\uD355"+ - "\uD356\uD357\uD358\uD359\uD35A\uD35B\uD35C\uD35D"+ - "\uD361\uD362\uD363\uD364\uD365\uD366\uD367\uD368"+ - "\uD369\uD36A\uD36B\uD36C\uD36D\uD36E\uD36F\uD370"+ - "\uD371\uD373\uD374\uD375\uD376\uD377\uD378\uD379"+ - "\uD37A\uD37B\uD37C\uD37D\uD381\uD382\uD383\uD384"+ - "\uD385\uD386\uD387\uD388\uD389\uD38A\uD38B\uD38C"+ - "\uD38D\uD38E\uD38F\uD390\uD391\uD393\uD394\uD395"+ - "\uD396\uD397\uD398\uD399\uD39A\uD39B\uD39C\uD39D"+ - "\uD3A1\uD3A2\uD3A3\uD3A4\uD3A5\uD3A6\uD3A7\uD3A8"+ - "\uD3A9\uD3AA\uD3AB\uD3AC\uD3AD\uD3AE\uD3AF\uD3B0"+ - "\uD3B1\uD3B3\uD3B4\uD3B5\uD3B6\uD3B7\uD3B8\uD3B9"+ - "\uD3BA\uD3BB\uD3BC\uD3BD\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE0D0\uE0D6\uE0E7\uE1CF\uE1E8\uE23D\uE2FB\uE332"+ - "\uE348\uE360\uE36D\uE3D4\uE3D5\uE3D8\uE3DB\uE3DC"+ - "\uE3DD\uE3DE\uE3DF\uE3E0\uE3E2\uE3E3\uE3E4\uE3E5"+ - "\uE3E6\uE3E8\uE3E9\uE3EA\uE3EB\uE3ED\uE3EF\uE3F0"+ - "\uE3F2\uE3F6\uE3FA\uE3FC\uE3FD\uE3FE\uE432\uE433"+ - "\uE437\uE438\uE439\uE43A\uE43B\uE43D\uE442\uE44E"+ - "\uE452\uE453\uE454\uE456\uE457\uE458\uE459\uE45A"+ - "\uE45B\uE45D\uE45E\uE45F\uE460\uE461\uE462\uE463"+ - "\uE464\uE465\uE466\uE467\uE469\uE46A\uE46E\uE46F"+ - "\uE471\uE472\uE474\uE475\uE476\uE477\uE478\uE479"+ - "\uE47A\uE47B\uE492\uE493\uE494\uE495\uE496\uE497"+ - "\uE499\uE49A\uE576\uE59E\uE5A5\uE5AB\uE5AE\uE648"+ - "\uE65D\uE6CB\uE6E4\uE8C5\uE8E4\uE935\uE9A5\uE9D5"+ - "\uE9F4\uEA9E\uEAA0\uEAB3\uEAE1\uEAE8\uEB93\uEBAD"+ - "\uEBED\uECF5\uED31\uED39\uEDAE\uEDB1\uEDB2\uEDB9"+ - "\uEDBB\uEDBC\uEDC4\uEDCE\uEDD0\uEDD2\uEDD6\uEDFA"+ - "\uEDFB\uEDFC\uEDFE\uEE31\uEE34\uEE37\uEE3D\uEE3F"+ - "\uEE40\uEE41\uEE43\uEE47\uEE48\uEE4C\uEE54\uEE56"+ - "\uEE57\uEE5A\uEE62\uEE66\uEE69\uEE6C\uEE6F\uEE71"+ - "\uEE74\uEE75\uEE76\uEE78\uEE7A\uEE7B\uEE7C\uEE91"+ - "\uEE93\uEE94\uEE97\uEE98\uEE99\uEE9B\uEEA1\uEEA6"+ - "\uEEA9\uEEAA\uEEAC\uEEAD\uEEB0\uEEBF\uEEC1\uEEC6"+ - "\uEEC7\uEECB\uEECD\uEECF\uEED0\uEED3\uEEDF\uEEE4"+ - "\uEEE6\uEEF7\uEF77\uEF78\uEF92\uEF93\uEF99\uEF9B"+ - "\uEF9D\uEFA0\uEFA7\uEFAC\uEFCC\uEFF7\uF051\uF075"+ - "\uF096\uF099\uF09E\uF0A0\uF0A4\uF0A7\uF0A9\uF0AA"+ - "\uF0BA\uF0BB\uF0BD\uF0C1\uF0C2\uF0C6\uF0C7\uF0CC"+ - "\uF0CF\uF0D0\uF0D1\uF0D2\uF0D8\uF136\uF137\uF13A"+ - "\uF13F\uF140\uF141\uF142\uF145\uF148\uF14A\uF150"+ - "\uF151\uF155\uF156\uF159\uF15A\uF165\uF16D\uF16E"+ - "\uF171\uF174\uF177\uF178\uF199\uF19A\uF19C\uF1A1"+ - "\uF1A2\uF1A3\uF1EE\uF26B\uF44D\uF49C\uF4B1\uF537"; - - private final static String innerIndex9= - "\uF57E\uF696\uF698\uF6B8\uF6C8\uF6D3\uF76B\uF792"+ - "\uF831\uF832\uF876\uF939\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uDA31\uDA32\uDA33\uDA34\uDA35\uDA36\uDA37"+ - "\uDA38\uDA39\uDA3A\uDA3B\uDA3C\uDA3D\uDA3E\uDA3F"+ - "\uDA40\uDA41\uDA42\uDA43\uDA44\uDA45\uDA46\uDA47"+ - "\uDA48\uDA49\uDA4A\uDA4B\uDA4C\uDA4D\uDA4E\uDA4F"+ - "\uDA50\uDA51\uDA52\uDA53\uDA54\uDA55\uDA56\uDA57"+ - "\uDA58\uDA59\uDA5A\uDA5B\uDA5C\uDA5D\uDA5E\uDA5F"+ - "\uDA60\uDA61\uDA62\uDA63\uDA64\uDA65\uDA66\uDA67"+ - "\uDA68\uDA69\uDA6A\uDA6B\uD93C\uDA6D\uDA6E\uDA6F"+ - "\uDA70\uDA71\uDA72\uDA73\uDA74\uDA75\uDA76\uDA77"+ - "\uDA78\uDA79\uDA7A\uDA7B\uDA7C\uDA7D\uDA7E\uDA91"+ - "\uDA92\uDA93\uDA94\uDA95\uDA96\uDA97\uDA98\uDA99"+ - "\uDA9A\uDA9B\uDA9C\uDA9D\uDA9E\uDA9F\uD9A6\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uD95B\uD95C\uD9A0\uDAA0\u0000\uD95D\uDA6C\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"; - - private final static short index1[] = { - 1, 2, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 7, 8, 9, 10, 11, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 144, 0, 0, 0, 0, 145 - }; - - String index2[] = { - innerIndex0, - innerIndex1, - innerIndex2, - innerIndex3, - innerIndex4, - innerIndex5, - innerIndex6, - innerIndex7, - innerIndex8, - innerIndex9 - }; } From 0470f91e7fa8158f8b28f26b28e3c7327ffde074 Mon Sep 17 00:00:00 2001 From: Xueming Shen Date: Wed, 8 Apr 2009 10:40:56 -0700 Subject: [PATCH 264/292] 6827921: ByteToCharBig5.java should use nio data tables instead of its own copy To use the data tables from sun.nio.cs.ext.Big5 Reviewed-by: alanb --- .../share/classes/sun/io/ByteToCharBig5.java | 2173 +---------------- 1 file changed, 6 insertions(+), 2167 deletions(-) diff --git a/jdk/src/share/classes/sun/io/ByteToCharBig5.java b/jdk/src/share/classes/sun/io/ByteToCharBig5.java index 1857023a791..50951e46a58 100644 --- a/jdk/src/share/classes/sun/io/ByteToCharBig5.java +++ b/jdk/src/share/classes/sun/io/ByteToCharBig5.java @@ -26,6 +26,8 @@ package sun.io; +import sun.nio.cs.ext.Big5; + /** * Tables and data to convert Big5 to Unicode * @@ -34,2179 +36,16 @@ package sun.io; public class ByteToCharBig5 extends ByteToCharDoubleByte { + private final static Big5 nioCoder = new Big5(); + public String getCharacterEncoding() { return "Big5"; } public ByteToCharBig5() { - super.index1 = index1; - super.index2 = index2; + super.index1 = nioCoder.getDecoderIndex1(); + super.index2 = nioCoder.getDecoderIndex2(); start = 0x40; end = 0xFE; } - - private final static String innerIndex0= - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u3000"+ - "\uFF0C\u3001\u3002\uFF0E\u2022\uFF1B\uFF1A\uFF1F"+ - "\uFF01\uFE30\u2026\u2025\uFE50\uFF64\uFE52\u00B7"+ - "\uFE54\uFE55\uFE56\uFE57\uFF5C\u2013\uFE31\u2014"+ - "\uFE33\uFF3F\uFE34\uFE4F\uFF08\uFF09\uFE35\uFE36"+ - "\uFF5B\uFF5D\uFE37\uFE38\u3014\u3015\uFE39\uFE3A"+ - "\u3010\u3011\uFE3B\uFE3C\u300A\u300B\uFE3D\uFE3E"+ - "\u3008\u3009\uFE3F\uFE40\u300C\u300D\uFE41\uFE42"+ - "\u300E\u300F\uFE43\uFE44\uFE59\uFE5A\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFE5B\uFE5C\uFE5D\uFE5E\u2018\u2019\u201C\u201D"+ - "\u301D\u301E\u2035\u2032\uFF03\uFF06\uFF0A\u203B"+ - "\u00A7\u3003\u25CB\u25CF\u25B3\u25B2\u25CE\u2606"+ - "\u2605\u25C7\u25C6\u25A1\u25A0\u25BD\u25BC\u32A3"+ - "\u2105\u203E\uFFFD\uFF3F\uFFFD\uFE49\uFE4A\uFE4D"+ - "\uFE4E\uFE4B\uFE4C\uFE5F\uFE60\uFE61\uFF0B\uFF0D"+ - "\u00D7\u00F7\u00B1\u221A\uFF1C\uFF1E\uFF1D\u2266"+ - "\u2267\u2260\u221E\u2252\u2261\uFE62\uFE63\uFE64"+ - "\uFE65\uFE66\u223C\u2229\u222A\u22A5\u2220\u221F"+ - "\u22BF\u33D2\u33D1\u222B\u222E\u2235\u2234\u2640"+ - "\u2642\u2641\u2609\u2191\u2193\u2190\u2192\u2196"+ - "\u2197\u2199\u2198\u2225\u2223\u2571\u2572\uFF0F"+ - "\uFF3C\uFF04\u00A5\u3012\u00A2\u00A3\uFF05\uFF20"+ - "\u2103\u2109\uFE69\uFE6A\uFE6B\u33D5\u339C\u339D"+ - "\u339E\u33CE\u33A1\u338E\u338F\u33C4\u00B0\u5159"+ - "\u515B\u515E\u515D\u5161\u5163\u55E7\u74E9\u7CCE"+ - "\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588"+ - "\u258F\u258E\u258D\u258C\u258B\u258A\u2589\u253C"+ - "\u2534\u252C\u2524\u251C\u2594\u2500\u2502\u2595"+ - "\u250C\u2510\u2514\u2518\u256D\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u256E"+ - "\u2570\u256F\u2550\u255E\u256A\u2561\u25E2\u25E3"+ - "\u25E5\u25E4\u2571\u2572\u2573\uFF10\uFF11\uFF12"+ - "\uFF13\uFF14\uFF15\uFF16\uFF17\uFF18\uFF19\u2160"+ - "\u2161\u2162\u2163\u2164\u2165\u2166\u2167\u2168"+ - "\u2169\u3021\u3022\u3023\u3024\u3025\u3026\u3027"+ - "\u3028\u3029\u5341\u5344\u5345\uFF21\uFF22\uFF23"+ - "\uFF24\uFF25\uFF26\uFF27\uFF28\uFF29\uFF2A\uFF2B"+ - "\uFF2C\uFF2D\uFF2E\uFF2F\uFF30\uFF31\uFF32\uFF33"+ - "\uFF34\uFF35\uFF36\uFF37\uFF38\uFF39\uFF3A\uFF41"+ - "\uFF42\uFF43\uFF44\uFF45\uFF46\uFF47\uFF48\uFF49"+ - "\uFF4A\uFF4B\uFF4C\uFF4D\uFF4E\uFF4F\uFF50\uFF51"+ - "\uFF52\uFF53\uFF54\uFF55\uFF56\uFF57\uFF58\uFF59"+ - "\uFF5A\u0391\u0392\u0393\u0394\u0395\u0396\u0397"+ - "\u0398\u0399\u039A\u039B\u039C\u039D\u039E\u039F"+ - "\u03A0\u03A1\u03A3\u03A4\u03A5\u03A6\u03A7\u03A8"+ - "\u03A9\u03B1\u03B2\u03B3\u03B4\u03B5\u03B6\u03B7"+ - "\u03B8\u03B9\u03BA\u03BB\u03BC\u03BD\u03BE\u03BF"+ - "\u03C0\u03C1\u03C3\u03C4\u03C5\u03C6\u03C7\u03C8"+ - "\u03C9\u3105\u3106\u3107\u3108\u3109\u310A\u310B"+ - "\u310C\u310D\u310E\u310F\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u3110\u3111"+ - "\u3112\u3113\u3114\u3115\u3116\u3117\u3118\u3119"+ - "\u311A\u311B\u311C\u311D\u311E\u311F\u3120\u3121"+ - "\u3122\u3123\u3124\u3125\u3126\u3127\u3128\u3129"+ - "\u02D9\u02C9\u02CA\u02C7\u02CB\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\u4E00\u4E59\u4E01\u4E03"+ - "\u4E43\u4E5D\u4E86\u4E8C\u4EBA\u513F\u5165\u516B"+ - "\u51E0\u5200\u5201\u529B\u5315\u5341\u535C\u53C8"+ - "\u4E09\u4E0B\u4E08\u4E0A\u4E2B\u4E38\u51E1\u4E45"+ - "\u4E48\u4E5F\u4E5E\u4E8E\u4EA1\u5140\u5203\u52FA"+ - "\u5343\u53C9\u53E3\u571F\u58EB\u5915\u5927\u5973"+ - "\u5B50\u5B51\u5B53\u5BF8\u5C0F\u5C22\u5C38\u5C71"+ - "\u5DDD\u5DE5\u5DF1\u5DF2\u5DF3\u5DFE\u5E72\u5EFE"+ - "\u5F0B\u5F13\u624D\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u4E11\u4E10\u4E0D"+ - "\u4E2D\u4E30\u4E39\u4E4B\u5C39\u4E88\u4E91\u4E95"+ - "\u4E92\u4E94\u4EA2\u4EC1\u4EC0\u4EC3\u4EC6\u4EC7"+ - "\u4ECD\u4ECA\u4ECB\u4EC4\u5143\u5141\u5167\u516D"+ - "\u516E\u516C\u5197\u51F6\u5206\u5207\u5208\u52FB"+ - "\u52FE\u52FF\u5316\u5339\u5348\u5347\u5345\u535E"+ - "\u5384\u53CB\u53CA\u53CD\u58EC\u5929\u592B\u592A"+ - "\u592D\u5B54\u5C11\u5C24\u5C3A\u5C6F\u5DF4\u5E7B"+ - "\u5EFF\u5F14\u5F15\u5FC3\u6208\u6236\u624B\u624E"+ - "\u652F\u6587\u6597\u65A4\u65B9\u65E5\u66F0\u6708"+ - "\u6728\u6B20\u6B62\u6B79\u6BCB\u6BD4\u6BDB\u6C0F"+ - "\u6C34\u706B\u722A\u7236\u723B\u7247\u7259\u725B"+ - "\u72AC\u738B\u4E19\u4E16\u4E15\u4E14\u4E18\u4E3B"+ - "\u4E4D\u4E4F\u4E4E\u4EE5\u4ED8\u4ED4\u4ED5\u4ED6"+ - "\u4ED7\u4EE3\u4EE4\u4ED9\u4EDE\u5145\u5144\u5189"+ - "\u518A\u51AC\u51F9\u51FA\u51F8\u520A\u52A0\u529F"+ - "\u5305\u5306\u5317\u531D\u4EDF\u534A\u5349\u5361"+ - "\u5360\u536F\u536E\u53BB\u53EF\u53E4\u53F3\u53EC"+ - "\u53EE\u53E9\u53E8\u53FC\u53F8\u53F5\u53EB\u53E6"+ - "\u53EA\u53F2\u53F1\u53F0\u53E5\u53ED\u53FB\u56DB"+ - "\u56DA\u5916\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\u592E\u5931\u5974\u5976"+ - "\u5B55\u5B83\u5C3C\u5DE8\u5DE7\u5DE6\u5E02\u5E03"+ - "\u5E73\u5E7C\u5F01\u5F18\u5F17\u5FC5\u620A\u6253"+ - "\u6254\u6252\u6251\u65A5\u65E6\u672E\u672C\u672A"+ - "\u672B\u672D\u6B63\u6BCD\u6C11\u6C10\u6C38\u6C41"+ - "\u6C40\u6C3E\u72AF\u7384\u7389\u74DC\u74E6\u7518"+ - "\u751F\u7528\u7529\u7530\u7531\u7532\u7533\u758B"+ - "\u767D\u76AE\u76BF\u76EE\u77DB\u77E2\u77F3\u793A"+ - "\u79BE\u7A74\u7ACB\u4E1E\u4E1F\u4E52\u4E53\u4E69"+ - "\u4E99\u4EA4\u4EA6\u4EA5\u4EFF\u4F09\u4F19\u4F0A"+ - "\u4F15\u4F0D\u4F10\u4F11\u4F0F\u4EF2\u4EF6\u4EFB"+ - "\u4EF0\u4EF3\u4EFD\u4F01\u4F0B\u5149\u5147\u5146"+ - "\u5148\u5168\u5171\u518D\u51B0\u5217\u5211\u5212"+ - "\u520E\u5216\u52A3\u5308\u5321\u5320\u5370\u5371"+ - "\u5409\u540F\u540C\u540A\u5410\u5401\u540B\u5404"+ - "\u5411\u540D\u5408\u5403\u540E\u5406\u5412\u56E0"+ - "\u56DE\u56DD\u5733\u5730\u5728\u572D\u572C\u572F"+ - "\u5729\u5919\u591A\u5937\u5938\u5984\u5978\u5983"+ - "\u597D\u5979\u5982\u5981\u5B57\u5B58\u5B87\u5B88"+ - "\u5B85\u5B89\u5BFA\u5C16\u5C79\u5DDE\u5E06\u5E76"+ - "\u5E74\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\u5F0F\u5F1B\u5FD9\u5FD6\u620E"+ - "\u620C\u620D\u6210\u6263\u625B\u6258\u6536\u65E9"+ - "\u65E8\u65EC\u65ED\u66F2\u66F3\u6709\u673D\u6734"+ - "\u6731\u6735\u6B21\u6B64\u6B7B\u6C16\u6C5D\u6C57"+ - "\u6C59\u6C5F\u6C60\u6C50\u6C55\u6C61\u6C5B\u6C4D"+ - "\u6C4E\u7070\u725F\u725D\u767E\u7AF9\u7C73\u7CF8"+ - "\u7F36\u7F8A\u7FBD\u8001\u8003\u800C\u8012\u8033"+ - "\u807F\u8089\u808B\u808C\u81E3\u81EA\u81F3\u81FC"+ - "\u820C\u821B\u821F\u826E\u8272\u827E\u866B\u8840"+ - "\u884C\u8863\u897F\u9621\u4E32\u4EA8\u4F4D\u4F4F"+ - "\u4F47\u4F57\u4F5E\u4F34\u4F5B\u4F55\u4F30\u4F50"+ - "\u4F51\u4F3D\u4F3A\u4F38\u4F43\u4F54\u4F3C\u4F46"+ - "\u4F63\u4F5C\u4F60\u4F2F\u4F4E\u4F36\u4F59\u4F5D"+ - "\u4F48\u4F5A\u514C\u514B\u514D\u5175\u51B6\u51B7"+ - "\u5225\u5224\u5229\u522A\u5228\u52AB\u52A9\u52AA"+ - "\u52AC\u5323\u5373\u5375\u541D\u542D\u541E\u543E"+ - "\u5426\u544E\u5427\u5446\u5443\u5433\u5448\u5442"+ - "\u541B\u5429\u544A\u5439\u543B\u5438\u542E\u5435"+ - "\u5436\u5420\u543C\u5440\u5431\u542B\u541F\u542C"+ - "\u56EA\u56F0\u56E4\u56EB\u574A\u5751\u5740\u574D"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\u5747\u574E\u573E\u5750\u574F\u573B"+ - "\u58EF\u593E\u599D\u5992\u59A8\u599E\u59A3\u5999"+ - "\u5996\u598D\u59A4\u5993\u598A\u59A5\u5B5D\u5B5C"+ - "\u5B5A\u5B5B\u5B8C\u5B8B\u5B8F\u5C2C\u5C40\u5C41"+ - "\u5C3F\u5C3E\u5C90\u5C91\u5C94\u5C8C\u5DEB\u5E0C"+ - "\u5E8F\u5E87\u5E8A\u5EF7\u5F04\u5F1F\u5F64\u5F62"+ - "\u5F77\u5F79\u5FD8\u5FCC\u5FD7\u5FCD\u5FF1\u5FEB"+ - "\u5FF8\u5FEA\u6212\u6211\u6284\u6297\u6296\u6280"+ - "\u6276\u6289\u626D\u628A\u627C\u627E\u6279\u6273"+ - "\u6292\u626F\u6298\u626E\u6295\u6293\u6291\u6286"+ - "\u6539\u653B\u6538\u65F1\u66F4\u675F\u674E\u674F"+ - "\u6750\u6751\u675C\u6756\u675E\u6749\u6746\u6760"+ - "\u6753\u6757\u6B65\u6BCF\u6C42\u6C5E\u6C99\u6C81"+ - "\u6C88\u6C89\u6C85\u6C9B\u6C6A\u6C7A\u6C90\u6C70"+ - "\u6C8C\u6C68\u6C96\u6C92\u6C7D\u6C83\u6C72\u6C7E"+ - "\u6C74\u6C86\u6C76\u6C8D\u6C94\u6C98\u6C82\u7076"+ - "\u707C\u707D\u7078\u7262\u7261\u7260\u72C4\u72C2"+ - "\u7396\u752C\u752B\u7537\u7538\u7682\u76EF\u77E3"+ - "\u79C1\u79C0\u79BF\u7A76\u7CFB\u7F55\u8096\u8093"+ - "\u809D\u8098\u809B\u809A\u80B2\u826F\u8292\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\u828B\u828D\u898B\u89D2\u8A00\u8C37\u8C46"+ - "\u8C55\u8C9D\u8D64\u8D70\u8DB3\u8EAB\u8ECA\u8F9B"+ - "\u8FB0\u8FC2\u8FC6\u8FC5\u8FC4\u5DE1\u9091\u90A2"+ - "\u90AA\u90A6\u90A3\u9149\u91C6\u91CC\u9632\u962E"+ - "\u9631\u962A\u962C\u4E26\u4E56\u4E73\u4E8B\u4E9B"+ - "\u4E9E\u4EAB\u4EAC\u4F6F\u4F9D\u4F8D\u4F73\u4F7F"+ - "\u4F6C\u4F9B\u4F8B\u4F86\u4F83\u4F70\u4F75\u4F88"+ - "\u4F69\u4F7B\u4F96\u4F7E\u4F8F\u4F91\u4F7A\u5154"+ - "\u5152\u5155\u5169\u5177\u5176\u5178\u51BD\u51FD"+ - "\u523B\u5238\u5237\u523A\u5230\u522E\u5236\u5241"+ - "\u52BE\u52BB\u5352\u5354\u5353\u5351\u5366\u5377"+ - "\u5378\u5379\u53D6\u53D4\u53D7\u5473\u5475\u5496"+ - "\u5478\u5495\u5480\u547B\u5477\u5484\u5492\u5486"+ - "\u547C\u5490\u5471\u5476\u548C\u549A\u5462\u5468"+ - "\u548B\u547D\u548E\u56FA\u5783\u5777\u576A\u5769"+ - "\u5761\u5766\u5764\u577C\u591C\u5949\u5947\u5948"+ - "\u5944\u5954\u59BE\u59BB\u59D4\u59B9\u59AE\u59D1"+ - "\u59C6\u59D0\u59CD\u59CB\u59D3\u59CA\u59AF\u59B3"+ - "\u59D2\u59C5\u5B5F\u5B64\u5B63\u5B97\u5B9A\u5B98"+ - "\u5B9C\u5B99\u5B9B\u5C1A\u5C48\u5C45\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\u5C46\u5CB7\u5CA1\u5CB8\u5CA9\u5CAB\u5CB1\u5CB3"+ - "\u5E18\u5E1A\u5E16\u5E15\u5E1B\u5E11\u5E78\u5E9A"+ - "\u5E97\u5E9C\u5E95\u5E96\u5EF6\u5F26\u5F27\u5F29"+ - "\u5F80\u5F81\u5F7F\u5F7C\u5FDD\u5FE0\u5FFD\u5FF5"+ - "\u5FFF\u600F\u6014\u602F\u6035\u6016\u602A\u6015"+ - "\u6021\u6027\u6029\u602B\u601B\u6216\u6215\u623F"+ - "\u623E\u6240\u627F\u62C9\u62CC\u62C4\u62BF\u62C2"+ - "\u62B9\u62D2\u62DB\u62AB\u62D3\u62D4\u62CB\u62C8"+ - "\u62A8\u62BD\u62BC\u62D0\u62D9\u62C7\u62CD\u62B5"+ - "\u62DA\u62B1\u62D8\u62D6\u62D7\u62C6\u62AC\u62CE"+ - "\u653E\u65A7\u65BC\u65FA\u6614\u6613\u660C\u6606"+ - "\u6602\u660E\u6600\u660F\u6615\u660A\u6607\u670D"+ - "\u670B\u676D\u678B\u6795\u6771\u679C\u6773\u6777"+ - "\u6787\u679D\u6797\u676F\u6770\u677F\u6789\u677E"+ - "\u6790\u6775\u679A\u6793\u677C\u676A\u6772\u6B23"+ - "\u6B66\u6B67\u6B7F\u6C13\u6C1B\u6CE3\u6CE8\u6CF3"+ - "\u6CB1\u6CCC\u6CE5\u6CB3\u6CBD\u6CBE\u6CBC\u6CE2"+ - "\u6CAB\u6CD5\u6CD3\u6CB8\u6CC4\u6CB9\u6CC1\u6CAE"+ - "\u6CD7\u6CC5\u6CF1\u6CBF\u6CBB\u6CE1\u6CDB\u6CCA"+ - "\u6CAC\u6CEF\u6CDC\u6CD6\u6CE0\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u7095"+ - "\u708E\u7092\u708A\u7099\u722C\u722D\u7238\u7248"+ - "\u7267\u7269\u72C0\u72CE\u72D9\u72D7\u72D0\u73A9"+ - "\u73A8\u739F\u73AB\u73A5\u753D\u759D\u7599\u759A"+ - "\u7684\u76C2\u76F2\u76F4\u77E5\u77FD\u793E\u7940"+ - "\u7941\u79C9\u79C8\u7A7A\u7A79\u7AFA\u7CFE\u7F54"+ - "\u7F8C\u7F8B\u8005\u80BA\u80A5\u80A2\u80B1\u80A1"+ - "\u80AB\u80A9\u80B4\u80AA\u80AF\u81E5\u81FE\u820D"+ - "\u82B3\u829D\u8299\u82AD\u82BD\u829F\u82B9\u82B1"+ - "\u82AC\u82A5\u82AF\u82B8\u82A3\u82B0\u82BE\u82B7"+ - "\u864E\u8671\u521D\u8868\u8ECB\u8FCE\u8FD4\u8FD1"+ - "\u90B5\u90B8\u90B1\u90B6\u91C7\u91D1\u9577\u9580"+ - "\u961C\u9640\u963F\u963B\u9644\u9642\u96B9\u96E8"+ - "\u9752\u975E\u4E9F\u4EAD\u4EAE\u4FE1\u4FB5\u4FAF"+ - "\u4FBF\u4FE0\u4FD1\u4FCF\u4FDD\u4FC3\u4FB6\u4FD8"+ - "\u4FDF\u4FCA\u4FD7\u4FAE\u4FD0\u4FC4\u4FC2\u4FDA"+ - "\u4FCE\u4FDE\u4FB7\u5157\u5192\u5191\u51A0\u524E"+ - "\u5243\u524A\u524D\u524C\u524B\u5247\u52C7\u52C9"+ - "\u52C3\u52C1\u530D\u5357\u537B\u539A\u53DB\u54AC"+ - "\u54C0\u54A8\u54CE\u54C9\u54B8\u54A6\u54B3\u54C7"+ - "\u54C2\u54BD\u54AA\u54C1\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u54C4\u54C8"+ - "\u54AF\u54AB\u54B1\u54BB\u54A9\u54A7\u54BF\u56FF"+ - "\u5782\u578B\u57A0\u57A3\u57A2\u57CE\u57AE\u5793"+ - "\u5955\u5951\u594F\u594E\u5950\u59DC\u59D8\u59FF"+ - "\u59E3\u59E8\u5A03\u59E5\u59EA\u59DA\u59E6\u5A01"+ - "\u59FB\u5B69\u5BA3\u5BA6\u5BA4\u5BA2\u5BA5\u5C01"+ - "\u5C4E\u5C4F\u5C4D\u5C4B\u5CD9\u5CD2\u5DF7\u5E1D"+ - "\u5E25\u5E1F\u5E7D\u5EA0\u5EA6\u5EFA\u5F08\u5F2D"+ - "\u5F65\u5F88\u5F85\u5F8A\u5F8B\u5F87\u5F8C\u5F89"+ - "\u6012\u601D\u6020\u6025\u600E\u6028\u604D\u6070"+ - "\u6068\u6062\u6046\u6043\u606C\u606B\u606A\u6064"+ - "\u6241\u62DC\u6316\u6309\u62FC\u62ED\u6301\u62EE"+ - "\u62FD\u6307\u62F1\u62F7\u62EF\u62EC\u62FE\u62F4"+ - "\u6311\u6302\u653F\u6545\u65AB\u65BD\u65E2\u6625"+ - "\u662D\u6620\u6627\u662F\u661F\u6628\u6631\u6624"+ - "\u66F7\u67FF\u67D3\u67F1\u67D4\u67D0\u67EC\u67B6"+ - "\u67AF\u67F5\u67E9\u67EF\u67C4\u67D1\u67B4\u67DA"+ - "\u67E5\u67B8\u67CF\u67DE\u67F3\u67B0\u67D9\u67E2"+ - "\u67DD\u67D2\u6B6A\u6B83\u6B86\u6BB5\u6BD2\u6BD7"+ - "\u6C1F\u6CC9\u6D0B\u6D32\u6D2A\u6D41\u6D25\u6D0C"+ - "\u6D31\u6D1E\u6D17\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u6D3B\u6D3D\u6D3E"+ - "\u6D36\u6D1B\u6CF5\u6D39\u6D27\u6D38\u6D29\u6D2E"+ - "\u6D35\u6D0E\u6D2B\u70AB\u70BA\u70B3\u70AC\u70AF"+ - "\u70AD\u70B8\u70AE\u70A4\u7230\u7272\u726F\u7274"+ - "\u72E9\u72E0\u72E1\u73B7\u73CA\u73BB\u73B2\u73CD"+ - "\u73C0\u73B3\u751A\u752D\u754F\u754C\u754E\u754B"+ - "\u75AB\u75A4\u75A5\u75A2\u75A3\u7678\u7686\u7687"+ - "\u7688\u76C8\u76C6\u76C3\u76C5\u7701\u76F9\u76F8"+ - "\u7709\u770B\u76FE\u76FC\u7707\u77DC\u7802\u7814"+ - "\u780C\u780D\u7946\u7949\u7948\u7947\u79B9\u79BA"+ - "\u79D1\u79D2\u79CB\u7A7F\u7A81\u7AFF\u7AFD\u7C7D"+ - "\u7D02\u7D05\u7D00\u7D09\u7D07\u7D04\u7D06\u7F38"+ - "\u7F8E\u7FBF\u8004\u8010\u800D\u8011\u8036\u80D6"+ - "\u80E5\u80DA\u80C3\u80C4\u80CC\u80E1\u80DB\u80CE"+ - "\u80DE\u80E4\u80DD\u81F4\u8222\u82E7\u8303\u8305"+ - "\u82E3\u82DB\u82E6\u8304\u82E5\u8302\u8309\u82D2"+ - "\u82D7\u82F1\u8301\u82DC\u82D4\u82D1\u82DE\u82D3"+ - "\u82DF\u82EF\u8306\u8650\u8679\u867B\u867A\u884D"+ - "\u886B\u8981\u89D4\u8A08\u8A02\u8A03\u8C9E\u8CA0"+ - "\u8D74\u8D73\u8DB4\u8ECD\u8ECC\u8FF0\u8FE6\u8FE2"+ - "\u8FEA\u8FE5\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\u8FED\u8FEB\u8FE4\u8FE8"+ - "\u90CA\u90CE\u90C1\u90C3\u914B\u914A\u91CD\u9582"+ - "\u9650\u964B\u964C\u964D\u9762\u9769\u97CB\u97ED"+ - "\u97F3\u9801\u98A8\u98DB\u98DF\u9996\u9999\u4E58"+ - "\u4EB3\u500C\u500D\u5023\u4FEF\u5026\u5025\u4FF8"+ - "\u5029\u5016\u5006\u503C\u501F\u501A\u5012\u5011"+ - "\u4FFA\u5000\u5014\u5028\u4FF1\u5021\u500B\u5019"+ - "\u5018\u4FF3\u4FEE\u502D\u502A\u4FFE\u502B\u5009"+ - "\u517C\u51A4\u51A5\u51A2\u51CD\u51CC\u51C6\u51CB"+ - "\u5256\u525C\u5254\u525B\u525D\u532A\u537F\u539F"+ - "\u539D\u53DF\u54E8\u5510\u5501\u5537\u54FC\u54E5"+ - "\u54F2\u5506\u54FA\u5514\u54E9\u54ED\u54E1\u5509"+ - "\u54EE\u54EA\u54E6\u5527\u5507\u54FD\u550F\u5703"+ - "\u5704\u57C2\u57D4\u57CB\u57C3\u5809\u590F\u5957"+ - "\u5958\u595A\u5A11\u5A18\u5A1C\u5A1F\u5A1B\u5A13"+ - "\u59EC\u5A20\u5A23\u5A29\u5A25\u5A0C\u5A09\u5B6B"+ - "\u5C58\u5BB0\u5BB3\u5BB6\u5BB4\u5BAE\u5BB5\u5BB9"+ - "\u5BB8\u5C04\u5C51\u5C55\u5C50\u5CED\u5CFD\u5CFB"+ - "\u5CEA\u5CE8\u5CF0\u5CF6\u5D01\u5CF4\u5DEE\u5E2D"+ - "\u5E2B\u5EAB\u5EAD\u5EA7\u5F31\u5F92\u5F91\u5F90"+ - "\u6059\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\u6063\u6065\u6050\u6055\u606D"+ - "\u6069\u606F\u6084\u609F\u609A\u608D\u6094\u608C"+ - "\u6085\u6096\u6247\u62F3\u6308\u62FF\u634E\u633E"+ - "\u632F\u6355\u6342\u6346\u634F\u6349\u633A\u6350"+ - "\u633D\u632A\u632B\u6328\u634D\u634C\u6548\u6549"+ - "\u6599\u65C1\u65C5\u6642\u6649\u664F\u6643\u6652"+ - "\u664C\u6645\u6641\u66F8\u6714\u6715\u6717\u6821"+ - "\u6838\u6848\u6846\u6853\u6839\u6842\u6854\u6829"+ - "\u68B3\u6817\u684C\u6851\u683D\u67F4\u6850\u6840"+ - "\u683C\u6843\u682A\u6845\u6813\u6818\u6841\u6B8A"+ - "\u6B89\u6BB7\u6C23\u6C27\u6C28\u6C26\u6C24\u6CF0"+ - "\u6D6A\u6D95\u6D88\u6D87\u6D66\u6D78\u6D77\u6D59"+ - "\u6D93\u6D6C\u6D89\u6D6E\u6D5A\u6D74\u6D69\u6D8C"+ - "\u6D8A\u6D79\u6D85\u6D65\u6D94\u70CA\u70D8\u70E4"+ - "\u70D9\u70C8\u70CF\u7239\u7279\u72FC\u72F9\u72FD"+ - "\u72F8\u72F7\u7386\u73ED\u7409\u73EE\u73E0\u73EA"+ - "\u73DE\u7554\u755D\u755C\u755A\u7559\u75BE\u75C5"+ - "\u75C7\u75B2\u75B3\u75BD\u75BC\u75B9\u75C2\u75B8"+ - "\u768B\u76B0\u76CA\u76CD\u76CE\u7729\u771F\u7720"+ - "\u7728\u77E9\u7830\u7827\u7838\u781D\u7834\u7837"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\u7825\u782D\u7820\u781F\u7832\u7955"+ - "\u7950\u7960\u795F\u7956\u795E\u795D\u7957\u795A"+ - "\u79E4\u79E3\u79E7\u79DF\u79E6\u79E9\u79D8\u7A84"+ - "\u7A88\u7AD9\u7B06\u7B11\u7C89\u7D21\u7D17\u7D0B"+ - "\u7D0A\u7D20\u7D22\u7D14\u7D10\u7D15\u7D1A\u7D1C"+ - "\u7D0D\u7D19\u7D1B\u7F3A\u7F5F\u7F94\u7FC5\u7FC1"+ - "\u8006\u8018\u8015\u8019\u8017\u803D\u803F\u80F1"+ - "\u8102\u80F0\u8105\u80ED\u80F4\u8106\u80F8\u80F3"+ - "\u8108\u80FD\u810A\u80FC\u80EF\u81ED\u81EC\u8200"+ - "\u8210\u822A\u822B\u8228\u822C\u82BB\u832B\u8352"+ - "\u8354\u834A\u8338\u8350\u8349\u8335\u8334\u834F"+ - "\u8332\u8339\u8336\u8317\u8340\u8331\u8328\u8343"; - - private final static String innerIndex1= - "\u8654\u868A\u86AA\u8693\u86A4\u86A9\u868C\u86A3"+ - "\u869C\u8870\u8877\u8881\u8882\u887D\u8879\u8A18"+ - "\u8A10\u8A0E\u8A0C\u8A15\u8A0A\u8A17\u8A13\u8A16"+ - "\u8A0F\u8A11\u8C48\u8C7A\u8C79\u8CA1\u8CA2\u8D77"+ - "\u8EAC\u8ED2\u8ED4\u8ECF\u8FB1\u9001\u9006\u8FF7"+ - "\u9000\u8FFA\u8FF4\u9003\u8FFD\u9005\u8FF8\u9095"+ - "\u90E1\u90DD\u90E2\u9152\u914D\u914C\u91D8\u91DD"+ - "\u91D7\u91DC\u91D9\u9583\u9662\u9663\u9661\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\u965B\u965D\u9664\u9658\u965E\u96BB\u98E2"+ - "\u99AC\u9AA8\u9AD8\u9B25\u9B32\u9B3C\u4E7E\u507A"+ - "\u507D\u505C\u5047\u5043\u504C\u505A\u5049\u5065"+ - "\u5076\u504E\u5055\u5075\u5074\u5077\u504F\u500F"+ - "\u506F\u506D\u515C\u5195\u51F0\u526A\u526F\u52D2"+ - "\u52D9\u52D8\u52D5\u5310\u530F\u5319\u533F\u5340"+ - "\u533E\u53C3\u66FC\u5546\u556A\u5566\u5544\u555E"+ - "\u5561\u5543\u554A\u5531\u5556\u554F\u5555\u552F"+ - "\u5564\u5538\u552E\u555C\u552C\u5563\u5533\u5541"+ - "\u5557\u5708\u570B\u5709\u57DF\u5805\u580A\u5806"+ - "\u57E0\u57E4\u57FA\u5802\u5835\u57F7\u57F9\u5920"+ - "\u5962\u5A36\u5A41\u5A49\u5A66\u5A6A\u5A40\u5A3C"+ - "\u5A62\u5A5A\u5A46\u5A4A\u5B70\u5BC7\u5BC5\u5BC4"+ - "\u5BC2\u5BBF\u5BC6\u5C09\u5C08\u5C07\u5C60\u5C5C"+ - "\u5C5D\u5D07\u5D06\u5D0E\u5D1B\u5D16\u5D22\u5D11"+ - "\u5D29\u5D14\u5D19\u5D24\u5D27\u5D17\u5DE2\u5E38"+ - "\u5E36\u5E33\u5E37\u5EB7\u5EB8\u5EB6\u5EB5\u5EBE"+ - "\u5F35\u5F37\u5F57\u5F6C\u5F69\u5F6B\u5F97\u5F99"+ - "\u5F9E\u5F98\u5FA1\u5FA0\u5F9C\u607F\u60A3\u6089"+ - "\u60A0\u60A8\u60CB\u60B4\u60E6\u60BD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\u60C5\u60BB\u60B5\u60DC\u60BC\u60D8\u60D5\u60C6"+ - "\u60DF\u60B8\u60DA\u60C7\u621A\u621B\u6248\u63A0"+ - "\u63A7\u6372\u6396\u63A2\u63A5\u6377\u6367\u6398"+ - "\u63AA\u6371\u63A9\u6389\u6383\u639B\u636B\u63A8"+ - "\u6384\u6388\u6399\u63A1\u63AC\u6392\u638F\u6380"+ - "\u637B\u6369\u6368\u637A\u655D\u6556\u6551\u6559"+ - "\u6557\u555F\u654F\u6558\u6555\u6554\u659C\u659B"+ - "\u65AC\u65CF\u65CB\u65CC\u65CE\u665D\u665A\u6664"+ - "\u6668\u6666\u665E\u66F9\u52D7\u671B\u6881\u68AF"+ - "\u68A2\u6893\u68B5\u687F\u6876\u68B1\u68A7\u6897"+ - "\u68B0\u6883\u68C4\u68AD\u6886\u6885\u6894\u689D"+ - "\u68A8\u689F\u68A1\u6882\u6B32\u6BBA\u6BEB\u6BEC"+ - "\u6C2B\u6D8E\u6DBC\u6DF3\u6DD9\u6DB2\u6DE1\u6DCC"+ - "\u6DE4\u6DFB\u6DFA\u6E05\u6DC7\u6DCB\u6DAF\u6DD1"+ - "\u6DAE\u6DDE\u6DF9\u6DB8\u6DF7\u6DF5\u6DC5\u6DD2"+ - "\u6E1A\u6DB5\u6DDA\u6DEB\u6DD8\u6DEA\u6DF1\u6DEE"+ - "\u6DE8\u6DC6\u6DC4\u6DAA\u6DEC\u6DBF\u6DE6\u70F9"+ - "\u7109\u710A\u70FD\u70EF\u723D\u727D\u7281\u731C"+ - "\u731B\u7316\u7313\u7319\u7387\u7405\u740A\u7403"+ - "\u7406\u73FE\u740D\u74E0\u74F6\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u74F7"+ - "\u751C\u7522\u7565\u7566\u7562\u7570\u758F\u75D4"+ - "\u75D5\u75B5\u75CA\u75CD\u768E\u76D4\u76D2\u76DB"+ - "\u7737\u773E\u773C\u7736\u7738\u773A\u786B\u7843"+ - "\u784E\u7965\u7968\u796D\u79FB\u7A92\u7A95\u7B20"+ - "\u7B28\u7B1B\u7B2C\u7B26\u7B19\u7B1E\u7B2E\u7C92"+ - "\u7C97\u7C95\u7D46\u7D43\u7D71\u7D2E\u7D39\u7D3C"+ - "\u7D40\u7D30\u7D33\u7D44\u7D2F\u7D42\u7D32\u7D31"+ - "\u7F3D\u7F9E\u7F9A\u7FCC\u7FCE\u7FD2\u801C\u804A"+ - "\u8046\u812F\u8116\u8123\u812B\u8129\u8130\u8124"+ - "\u8202\u8235\u8237\u8236\u8239\u838E\u839E\u8398"+ - "\u8378\u83A2\u8396\u83BD\u83AB\u8392\u838A\u8393"+ - "\u8389\u83A0\u8377\u837B\u837C\u8386\u83A7\u8655"+ - "\u5F6A\u86C7\u86C0\u86B6\u86C4\u86B5\u86C6\u86CB"+ - "\u86B1\u86AF\u86C9\u8853\u889E\u8888\u88AB\u8892"+ - "\u8896\u888D\u888B\u8993\u898F\u8A2A\u8A1D\u8A23"+ - "\u8A25\u8A31\u8A2D\u8A1F\u8A1B\u8A22\u8C49\u8C5A"+ - "\u8CA9\u8CAC\u8CAB\u8CA8\u8CAA\u8CA7\u8D67\u8D66"+ - "\u8DBE\u8DBA\u8EDB\u8EDF\u9019\u900D\u901A\u9017"+ - "\u9023\u901F\u901D\u9010\u9015\u901E\u9020\u900F"+ - "\u9022\u9016\u901B\u9014\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u90E8\u90ED"+ - "\u90FD\u9157\u91CE\u91F5\u91E6\u91E3\u91E7\u91ED"+ - "\u91E9\u9589\u966A\u9675\u9673\u9678\u9670\u9674"+ - "\u9676\u9677\u966C\u96C0\u96EA\u96E9\u7AE0\u7ADF"+ - "\u9802\u9803\u9B5A\u9CE5\u9E75\u9E7F\u9EA5\u9EBB"+ - "\u50A2\u508D\u5085\u5099\u5091\u5080\u5096\u5098"+ - "\u509A\u6700\u51F1\u5272\u5274\u5275\u5269\u52DE"+ - "\u52DD\u52DB\u535A\u53A5\u557B\u5580\u55A7\u557C"+ - "\u558A\u559D\u5598\u5582\u559C\u55AA\u5594\u5587"+ - "\u558B\u5583\u55B3\u55AE\u559F\u553E\u55B2\u559A"+ - "\u55BB\u55AC\u55B1\u557E\u5589\u55AB\u5599\u570D"+ - "\u582F\u582A\u5834\u5824\u5830\u5831\u5821\u581D"+ - "\u5820\u58F9\u58FA\u5960\u5A77\u5A9A\u5A7F\u5A92"+ - "\u5A9B\u5AA7\u5B73\u5B71\u5BD2\u5BCC\u5BD3\u5BD0"+ - "\u5C0A\u5C0B\u5C31\u5D4C\u5D50\u5D34\u5D47\u5DFD"+ - "\u5E45\u5E3D\u5E40\u5E43\u5E7E\u5ECA\u5EC1\u5EC2"+ - "\u5EC4\u5F3C\u5F6D\u5FA9\u5FAA\u5FA8\u60D1\u60E1"+ - "\u60B2\u60B6\u60E0\u611C\u6123\u60FA\u6115\u60F0"+ - "\u60FB\u60F4\u6168\u60F1\u610E\u60F6\u6109\u6100"+ - "\u6112\u621F\u6249\u63A3\u638C\u63CF\u63C0\u63E9"+ - "\u63C9\u63C6\u63CD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u63D2\u63E3\u63D0"+ - "\u63E1\u63D6\u63ED\u63EE\u6376\u63F4\u63EA\u63DB"+ - "\u6452\u63DA\u63F9\u655E\u6566\u6562\u6563\u6591"+ - "\u6590\u65AF\u666E\u6670\u6674\u6676\u666F\u6691"+ - "\u667A\u667E\u6677\u66FE\u66FF\u671F\u671D\u68FA"+ - "\u68D5\u68E0\u68D8\u68D7\u6905\u68DF\u68F5\u68EE"+ - "\u68E7\u68F9\u68D2\u68F2\u68E3\u68CB\u68CD\u690D"+ - "\u6912\u690E\u68C9\u68DA\u696E\u68FB\u6B3E\u6B3A"+ - "\u6B3D\u6B98\u6B96\u6BBC\u6BEF\u6C2E\u6C2F\u6C2C"+ - "\u6E2F\u6E38\u6E54\u6E21\u6E32\u6E67\u6E4A\u6E20"+ - "\u6E25\u6E23\u6E1B\u6E5B\u6E58\u6E24\u6E56\u6E6E"+ - "\u6E2D\u6E26\u6E6F\u6E34\u6E4D\u6E3A\u6E2C\u6E43"+ - "\u6E1D\u6E3E\u6ECB\u6E89\u6E19\u6E4E\u6E63\u6E44"+ - "\u6E72\u6E69\u6E5F\u7119\u711A\u7126\u7130\u7121"+ - "\u7136\u716E\u711C\u724C\u7284\u7280\u7336\u7325"+ - "\u7334\u7329\u743A\u742A\u7433\u7422\u7425\u7435"+ - "\u7436\u7434\u742F\u741B\u7426\u7428\u7525\u7526"+ - "\u756B\u756A\u75E2\u75DB\u75E3\u75D9\u75D8\u75DE"+ - "\u75E0\u767B\u767C\u7696\u7693\u76B4\u76DC\u774F"+ - "\u77ED\u785D\u786C\u786F\u7A0D\u7A08\u7A0B\u7A05"+ - "\u7A00\u7A98\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\u7A97\u7A96\u7AE5\u7AE3"+ - "\u7B49\u7B56\u7B46\u7B50\u7B52\u7B54\u7B4D\u7B4B"+ - "\u7B4F\u7B51\u7C9F\u7CA5\u7D5E\u7D50\u7D68\u7D55"+ - "\u7D2B\u7D6E\u7D72\u7D61\u7D66\u7D62\u7D70\u7D73"+ - "\u5584\u7FD4\u7FD5\u800B\u8052\u8085\u8155\u8154"+ - "\u814B\u8151\u814E\u8139\u8146\u813E\u814C\u8153"+ - "\u8174\u8212\u821C\u83E9\u8403\u83F8\u840D\u83E0"+ - "\u83C5\u840B\u83C1\u83EF\u83F1\u83F4\u8457\u840A"+ - "\u83F0\u840C\u83CC\u83FD\u83F2\u83CA\u8438\u840E"+ - "\u8404\u83DC\u8407\u83D4\u83DF\u865B\u86DF\u86D9"+ - "\u86ED\u86D4\u86DB\u86E4\u86D0\u86DE\u8857\u88C1"+ - "\u88C2\u88B1\u8983\u8996\u8A3B\u8A60\u8A55\u8A5E"+ - "\u8A3C\u8A41\u8A54\u8A5B\u8A50\u8A46\u8A34\u8A3A"+ - "\u8A36\u8A56\u8C61\u8C82\u8CAF\u8CBC\u8CB3\u8CBD"+ - "\u8CC1\u8CBB\u8CC0\u8CB4\u8CB7\u8CB6\u8CBF\u8CB8"+ - "\u8D8A\u8D85\u8D81\u8DCE\u8DDD\u8DCB\u8DDA\u8DD1"+ - "\u8DCC\u8DDB\u8DC6\u8EFB\u8EF8\u8EFC\u8F9C\u902E"+ - "\u9035\u9031\u9038\u9032\u9036\u9102\u90F5\u9109"+ - "\u90FE\u9163\u9165\u91CF\u9214\u9215\u9223\u9209"+ - "\u921E\u920D\u9210\u9207\u9211\u9594\u958F\u958B"+ - "\u9591\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\u9593\u9592\u958E\u968A\u968E"+ - "\u968B\u967D\u9685\u9686\u968D\u9672\u9684\u96C1"+ - "\u96C5\u96C4\u96C6\u96C7\u96EF\u96F2\u97CC\u9805"+ - "\u9806\u9808\u98E7\u98EA\u98EF\u98E9\u98F2\u98ED"+ - "\u99AE\u99AD\u9EC3\u9ECD\u9ED1\u4E82\u50AD\u50B5"+ - "\u50B2\u50B3\u50C5\u50BE\u50AC\u50B7\u50BB\u50AF"+ - "\u50C7\u527F\u5277\u527D\u52DF\u52E6\u52E4\u52E2"+ - "\u52E3\u532F\u55DF\u55E8\u55D3\u55E6\u55CE\u55DC"+ - "\u55C7\u55D1\u55E3\u55E4\u55EF\u55DA\u55E1\u55C5"+ - "\u55C6\u55E5\u55C9\u5712\u5713\u585E\u5851\u5858"+ - "\u5857\u585A\u5854\u586B\u584C\u586D\u584A\u5862"+ - "\u5852\u584B\u5967\u5AC1\u5AC9\u5ACC\u5ABE\u5ABD"+ - "\u5ABC\u5AB3\u5AC2\u5AB2\u5D69\u5D6F\u5E4C\u5E79"+ - "\u5EC9\u5EC8\u5F12\u5F59\u5FAC\u5FAE\u611A\u610F"+ - "\u6148\u611F\u60F3\u611B\u60F9\u6101\u6108\u614E"+ - "\u614C\u6144\u614D\u613E\u6134\u6127\u610D\u6106"+ - "\u6137\u6221\u6222\u6413\u643E\u641E\u642A\u642D"+ - "\u643D\u642C\u640F\u641C\u6414\u640D\u6436\u6416"+ - "\u6417\u6406\u656C\u659F\u65B0\u6697\u6689\u6687"+ - "\u6688\u6696\u6684\u6698\u668D\u6703\u6994\u696D"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\u695A\u6977\u6960\u6954\u6975\u6930"+ - "\u6982\u694A\u6968\u696B\u695E\u6953\u6979\u6986"+ - "\u695D\u6963\u695B\u6B47\u6B72\u6BC0\u6BBF\u6BD3"+ - "\u6BFD\u6EA2\u6EAF\u6ED3\u6EB6\u6EC2\u6E90\u6E9D"+ - "\u6EC7\u6EC5\u6EA5\u6E98\u6EBC\u6EBA\u6EAB\u6ED1"+ - "\u6E96\u6E9C\u6EC4\u6ED4\u6EAA\u6EA7\u6EB4\u714E"+ - "\u7159\u7169\u7164\u7149\u7167\u715C\u716C\u7166"+ - "\u714C\u7165\u715E\u7146\u7168\u7156\u723A\u7252"+ - "\u7337\u7345\u733F\u733E\u746F\u745A\u7455\u745F"+ - "\u745E\u7441\u743F\u7459\u745B\u745C\u7576\u7578"+ - "\u7600\u75F0\u7601\u75F2\u75F1\u75FA\u75FF\u75F4"+ - "\u75F3\u76DE\u76DF\u775B\u776B\u7766\u775E\u7763"+ - "\u7779\u776A\u776C\u775C\u7765\u7768\u7762\u77EE"+ - "\u788E\u78B0\u7897\u7898\u788C\u7889\u787C\u7891"+ - "\u7893\u787F\u797A\u797F\u7981\u842C\u79BD\u7A1C"+ - "\u7A1A\u7A20\u7A14\u7A1F\u7A1E\u7A9F\u7AA0\u7B77"+ - "\u7BC0\u7B60\u7B6E\u7B67\u7CB1\u7CB3\u7CB5\u7D93"+ - "\u7D79\u7D91\u7D81\u7D8F\u7D5B\u7F6E\u7F69\u7F6A"+ - "\u7F72\u7FA9\u7FA8\u7FA4\u8056\u8058\u8086\u8084"+ - "\u8171\u8170\u8178\u8165\u816E\u8173\u816B\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\u8179\u817A\u8166\u8205\u8247\u8482\u8477"+ - "\u843D\u8431\u8475\u8466\u846B\u8449\u846C\u845B"+ - "\u843C\u8435\u8461\u8463\u8469\u846D\u8446\u865E"+ - "\u865C\u865F\u86F9\u8713\u8708\u8707\u8700\u86FE"+ - "\u86FB\u8702\u8703\u8706\u870A\u8859\u88DF\u88D4"+ - "\u88D9\u88DC\u88D8\u88DD\u88E1\u88CA\u88D5\u88D2"+ - "\u899C\u89E3\u8A6B\u8A72\u8A73\u8A66\u8A69\u8A70"+ - "\u8A87\u8A7C\u8A63\u8AA0\u8A71\u8A85\u8A6D\u8A62"+ - "\u8A6E\u8A6C\u8A79\u8A7B\u8A3E\u8A68\u8C62\u8C8A"+ - "\u8C89\u8CCA\u8CC7\u8CC8\u8CC4\u8CB2\u8CC3\u8CC2"+ - "\u8CC5\u8DE1\u8DDF\u8DE8\u8DEF\u8DF3\u8DFA\u8DEA"+ - "\u8DE4\u8DE6\u8EB2\u8F03\u8F09\u8EFE\u8F0A\u8F9F"+ - "\u8FB2\u904B\u904A\u9053\u9042\u9054\u903C\u9055"+ - "\u9050\u9047\u904F\u904E\u904D\u9051\u903E\u9041"+ - "\u9112\u9117\u916C\u916A\u9169\u91C9\u9237\u9257"+ - "\u9238\u923D\u9240\u923E\u925B\u924B\u9264\u9251"+ - "\u9234\u9249\u924D\u9245\u9239\u923F\u925A\u9598"+ - "\u9698\u9694\u9695\u96CD\u96CB\u96C9\u96CA\u96F7"+ - "\u96FB\u96F9\u96F6\u9756\u9774\u9776\u9810\u9811"+ - "\u9813\u980A\u9812\u980C\u98FC\u98F4\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\u98FD\u98FE\u99B3\u99B1\u99B4\u9AE1\u9CE9\u9E82"+ - "\u9F0E\u9F13\u9F20\u50E7\u50EE\u50E5\u50D6\u50ED"+ - "\u50DA\u50D5\u50CF\u50D1\u50F1\u50CE\u50E9\u5162"+ - "\u51F3\u5283\u5282\u5331\u53AD\u55FE\u5600\u561B"+ - "\u5617\u55FD\u5614\u5606\u5609\u560D\u560E\u55F7"+ - "\u5616\u561F\u5608\u5610\u55F6\u5718\u5716\u5875"+ - "\u587E\u5883\u5893\u588A\u5879\u5885\u587D\u58FD"+ - "\u5925\u5922\u5924\u596A\u5969\u5AE1\u5AE6\u5AE9"+ - "\u5AD7\u5AD6\u5AD8\u5AE3\u5B75\u5BDE\u5BE7\u5BE1"+ - "\u5BE5\u5BE6\u5BE8\u5BE2\u5BE4\u5BDF\u5C0D\u5C62"+ - "\u5D84\u5D87\u5E5B\u5E63\u5E55\u5E57\u5E54\u5ED3"+ - "\u5ED6\u5F0A\u5F46\u5F70\u5FB9\u6147\u613F\u614B"+ - "\u6177\u6162\u6163\u615F\u615A\u6158\u6175\u622A"+ - "\u6487\u6458\u6454\u64A4\u6478\u645F\u647A\u6451"+ - "\u6467\u6434\u646D\u647B\u6572\u65A1\u65D7\u65D6"+ - "\u66A2\u66A8\u669D\u699C\u69A8\u6995\u69C1\u69AE"+ - "\u69D3\u69CB\u699B\u69B7\u69BB\u69AB\u69B4\u69D0"+ - "\u69CD\u69AD\u69CC\u69A6\u69C3\u69A3\u6B49\u6B4C"+ - "\u6C33\u6F33\u6F14\u6EFE\u6F13\u6EF4\u6F29\u6F3E"+ - "\u6F20\u6F2C\u6F0F\u6F02\u6F22\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u6EFF"+ - "\u6EEF\u6F06\u6F31\u6F38\u6F32\u6F23\u6F15\u6F2B"+ - "\u6F2F\u6F88\u6F2A\u6EEC\u6F01\u6EF2\u6ECC\u6EF7"+ - "\u7194\u7199\u717D\u718A\u7184\u7192\u723E\u7292"+ - "\u7296\u7344\u7350\u7464\u7463\u746A\u7470\u746D"+ - "\u7504\u7591\u7627\u760D\u760B\u7609\u7613\u76E1"+ - "\u76E3\u7784\u777D\u777F\u7761\u78C1\u789F\u78A7"+ - "\u78B3\u78A9\u78A3\u798E\u798F\u798D\u7A2E\u7A31"+ - "\u7AAA\u7AA9\u7AED\u7AEF\u7BA1\u7B95\u7B8B\u7B75"+ - "\u7B97\u7B9D\u7B94\u7B8F\u7BB8\u7B87\u7B84\u7CB9"+ - "\u7CBD\u7CBE\u7DBB\u7DB0\u7D9C\u7DBD\u7DBE\u7DA0"+ - "\u7DCA\u7DB4\u7DB2\u7DB1\u7DBA\u7DA2\u7DBF\u7DB5"+ - "\u7DB8\u7DAD\u7DD2\u7DC7\u7DAC\u7F70\u7FE0\u7FE1"+ - "\u7FDF\u805E\u805A\u8087\u8150\u8180\u818F\u8188"+ - "\u818A\u817F\u8182\u81E7\u81FA\u8207\u8214\u821E"+ - "\u824B\u84C9\u84BF\u84C6\u84C4\u8499\u849E\u84B2"+ - "\u849C\u84CB\u84B8\u84C0\u84D3\u8490\u84BC\u84D1"+ - "\u84CA\u873F\u871C\u873B\u8722\u8725\u8734\u8718"+ - "\u8755\u8737\u8729\u88F3\u8902\u88F4\u88F9\u88F8"+ - "\u88FD\u88E8\u891A\u88EF\u8AA6\u8A8C\u8A9E\u8AA3"+ - "\u8A8D\u8AA1\u8A93\u8AA4\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u8AAA\u8AA5"+ - "\u8AA8\u8A98\u8A91\u8A9A\u8AA7\u8C6A\u8C8D\u8C8C"+ - "\u8CD3\u8CD1\u8CD2\u8D6B\u8D99\u8D95\u8DFC\u8F14"+ - "\u8F12\u8F15\u8F13\u8FA3\u9060\u9058\u905C\u9063"+ - "\u9059\u905E\u9062\u905D\u905B\u9119\u9118\u911E"+ - "\u9175\u9178\u9177\u9174\u9278\u9280\u9285\u9298"+ - "\u9296\u927B\u9293\u929C\u92A8\u927C\u9291\u95A1"+ - "\u95A8\u95A9\u95A3\u95A5\u95A4\u9699\u969C\u969B"+ - "\u96CC\u96D2\u9700\u977C\u9785\u97F6\u9817\u9818"+ - "\u98AF\u98B1\u9903\u9905\u990C\u9909\u99C1\u9AAF"+ - "\u9AB0\u9AE6\u9B41\u9B42\u9CF4\u9CF6\u9CF3\u9EBC"+ - "\u9F3B\u9F4A\u5104\u5100\u50FB\u50F5\u50F9\u5102"+ - "\u5108\u5109\u5105\u51DC\u5287\u5288\u5289\u528D"+ - "\u528A\u52F0\u53B2\u562E\u563B\u5639\u5632\u563F"+ - "\u5634\u5629\u5653\u564E\u5657\u5674\u5636\u562F"+ - "\u5630\u5880\u589F\u589E\u58B3\u589C\u58AE\u58A9"+ - "\u58A6\u596D\u5B09\u5AFB\u5B0B\u5AF5\u5B0C\u5B08"+ - "\u5BEE\u5BEC\u5BE9\u5BEB\u5C64\u5C65\u5D9D\u5D94"+ - "\u5E62\u5E5F\u5E61\u5EE2\u5EDA\u5EDF\u5EDD\u5EE3"+ - "\u5EE0\u5F48\u5F71\u5FB7\u5FB5\u6176\u6167\u616E"+ - "\u615D\u6155\u6182\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u617C\u6170\u616B"+ - "\u617E\u61A7\u6190\u61AB\u618E\u61AC\u619A\u61A4"+ - "\u6194\u61AE\u622E\u6469\u646F\u6479\u649E\u64B2"+ - "\u6488\u6490\u64B0\u64A5\u6493\u6495\u64A9\u6492"+ - "\u64AE\u64AD\u64AB\u649A\u64AC\u6499\u64A2\u64B3"+ - "\u6575\u6577\u6578\u66AE\u66AB\u66B4\u66B1\u6A23"+ - "\u6A1F\u69E8\u6A01\u6A1E\u6A19\u69FD\u6A21\u6A13"+ - "\u6A0A\u69F3\u6A02\u6A05\u69ED\u6A11\u6B50\u6B4E"+ - "\u6BA4\u6BC5\u6BC6\u6F3F\u6F7C\u6F84\u6F51\u6F66"+ - "\u6F54\u6F86\u6F6D\u6F5B\u6F78\u6F6E\u6F8E\u6F7A"+ - "\u6F70\u6F64\u6F97\u6F58\u6ED5\u6F6F\u6F60\u6F5F"+ - "\u719F\u71AC\u71B1\u71A8\u7256\u729B\u734E\u7357"+ - "\u7469\u748B\u7483\u747E\u7480\u757F\u7620\u7629"+ - "\u761F\u7624\u7626\u7621\u7622\u769A\u76BA\u76E4"+ - "\u778E\u7787\u778C\u7791\u778B\u78CB\u78C5\u78BA"+ - "\u78CA\u78BE\u78D5\u78BC\u78D0\u7A3F\u7A3C\u7A40"+ - "\u7A3D\u7A37\u7A3B\u7AAF\u7AAE\u7BAD\u7BB1\u7BC4"+ - "\u7BB4\u7BC6\u7BC7\u7BC1\u7BA0\u7BCC\u7CCA\u7DE0"+ - "\u7DF4\u7DEF\u7DFB\u7DD8\u7DEC\u7DDD\u7DE8\u7DE3"+ - "\u7DDA\u7DDE\u7DE9\u7D9E\u7DD9\u7DF2\u7DF9\u7F75"+ - "\u7F77\u7FAF\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\u7FE9\u8026\u819B\u819C"+ - "\u819D\u81A0\u819A\u8198\u8517\u853D\u851A\u84EE"+ - "\u852C\u852D\u8513\u8511\u8523\u8521\u8514\u84EC"+ - "\u8525\u84FF\u8506\u8782\u8774\u8776\u8760\u8766"+ - "\u8778\u8768\u8759\u8757\u874C\u8753\u885B\u885D"+ - "\u8910\u8907\u8912\u8913\u8915\u890A\u8ABC\u8AD2"+ - "\u8AC7\u8AC4\u8A95\u8ACB\u8AF8\u8AB2\u8AC9\u8AC2"+ - "\u8ABF\u8AB0\u8AD6\u8ACD\u8AB6\u8AB9\u8ADB\u8C4C"+ - "\u8C4E\u8C6C\u8CE0\u8CDE\u8CE6\u8CE4\u8CEC\u8CED"+ - "\u8CE2\u8CE3\u8CDC\u8CEA\u8CE1\u8D6D\u8D9F\u8DA3"+ - "\u8E2B\u8E10\u8E1D\u8E22\u8E0F\u8E29\u8E1F\u8E21"+ - "\u8E1E\u8EBA\u8F1D\u8F1B\u8F1F\u8F29\u8F26\u8F2A"+ - "\u8F1C\u8F1E\u8F25\u9069\u906E\u9068\u906D\u9077"+ - "\u9130\u912D\u9127\u9131\u9187\u9189\u918B\u9183"+ - "\u92C5\u92BB\u92B7\u92EA\u92AC\u92E4\u92C1\u92B3"+ - "\u92BC\u92D2\u92C7\u92F0\u92B2\u95AD\u95B1\u9704"+ - "\u9706\u9707\u9709\u9760\u978D\u978B\u978F\u9821"+ - "\u982B\u981C\u98B3\u990A\u9913\u9912\u9918\u99DD"+ - "\u99D0\u99DF\u99DB\u99D1\u99D5\u99D2\u99D9\u9AB7"+ - "\u9AEE\u9AEF\u9B27\u9B45\u9B44\u9B77\u9B6F\u9D06"+ - "\u9D09\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\u9D03\u9EA9\u9EBE\u9ECE\u58A8"+ - "\u9F52\u5112\u5118\u5114\u5110\u5115\u5180\u51AA"+ - "\u51DD\u5291\u5293\u52F3\u5659\u566B\u5679\u5669"+ - "\u5664\u5678\u566A\u5668\u5665\u5671\u566F\u566C"+ - "\u5662\u5676\u58C1\u58BE\u58C7\u58C5\u596E\u5B1D"+ - "\u5B34\u5B78\u5BF0\u5C0E\u5F4A\u61B2\u6191\u61A9"+ - "\u618A\u61CD\u61B6\u61BE\u61CA\u61C8\u6230\u64C5"+ - "\u64C1\u64CB\u64BB\u64BC\u64DA\u64C4\u64C7\u64C2"+ - "\u64CD\u64BF\u64D2\u64D4\u64BE\u6574\u66C6\u66C9"+ - "\u66B9\u66C4\u66C7\u66B8\u6A3D\u6A38\u6A3A\u6A59"+ - "\u6A6B\u6A58\u6A39\u6A44\u6A62\u6A61\u6A4B\u6A47"+ - "\u6A35\u6A5F\u6A48\u6B59\u6B77\u6C05\u6FC2\u6FB1"+ - "\u6FA1\u6FC3\u6FA4\u6FC1\u6FA7\u6FB3\u6FC0\u6FB9"+ - "\u6FB6\u6FA6\u6FA0\u6FB4\u71BE\u71C9\u71D0\u71D2"+ - "\u71C8\u71D5\u71B9\u71CE\u71D9\u71DC\u71C3\u71C4"+ - "\u7368\u749C\u74A3\u7498\u749F\u749E\u74E2\u750C"+ - "\u750D\u7634\u7638\u763A\u76E7\u76E5\u77A0\u779E"+ - "\u779F\u77A5\u78E8\u78DA\u78EC\u78E7\u79A6\u7A4D"+ - "\u7A4E\u7A46\u7A4C\u7A4B\u7ABA\u7BD9\u7C11\u7BC9"+ - "\u7BE4\u7BDB\u7BE1\u7BE9\u7BE6\u7CD5\u7CD6\u7E0A"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\u7E11\u7E08\u7E1B\u7E23\u7E1E\u7E1D"+ - "\u7E09\u7E10\u7F79\u7FB2\u7FF0\u7FF1\u7FEE\u8028"+ - "\u81B3\u81A9\u81A8\u81FB\u8208\u8258\u8259\u854A"+ - "\u8559\u8548\u8568\u8569\u8543\u8549\u856D\u856A"+ - "\u855E\u8783\u879F\u879E\u87A2\u878D\u8861\u892A"+ - "\u8932\u8925\u892B\u8921\u89AA\u89A6\u8AE6\u8AFA"+ - "\u8AEB\u8AF1\u8B00\u8ADC\u8AE7\u8AEE\u8AFE\u8B01"+ - "\u8B02\u8AF7\u8AED\u8AF3\u8AF6\u8AFC\u8C6B\u8C6D"+ - "\u8C93\u8CF4\u8E44\u8E31\u8E34\u8E42\u8E39\u8E35"+ - "\u8F3B\u8F2F\u8F38\u8F33\u8FA8\u8FA6\u9075\u9074"+ - "\u9078\u9072\u907C\u907A\u9134\u9192\u9320\u9336"+ - "\u92F8\u9333\u932F\u9322\u92FC\u932B\u9304\u931A"; - - private final static String innerIndex2= - "\u9310\u9326\u9321\u9315\u932E\u9319\u95BB\u96A7"+ - "\u96A8\u96AA\u96D5\u970E\u9711\u9716\u970D\u9713"+ - "\u970F\u975B\u975C\u9766\u9798\u9830\u9838\u983B"+ - "\u9837\u982D\u9839\u9824\u9910\u9928\u991E\u991B"+ - "\u9921\u991A\u99ED\u99E2\u99F1\u9AB8\u9ABC\u9AFB"+ - "\u9AED\u9B28\u9B91\u9D15\u9D23\u9D26\u9D28\u9D12"+ - "\u9D1B\u9ED8\u9ED4\u9F8D\u9F9C\u512A\u511F\u5121"+ - "\u5132\u52F5\u568E\u5680\u5690\u5685\u5687\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\u568F\u58D5\u58D3\u58D1\u58CE\u5B30\u5B2A"+ - "\u5B24\u5B7A\u5C37\u5C68\u5DBC\u5DBA\u5DBD\u5DB8"+ - "\u5E6B\u5F4C\u5FBD\u61C9\u61C2\u61C7\u61E6\u61CB"+ - "\u6232\u6234\u64CE\u64CA\u64D8\u64E0\u64F0\u64E6"+ - "\u64EC\u64F1\u64E2\u64ED\u6582\u6583\u66D9\u66D6"+ - "\u6A80\u6A94\u6A84\u6AA2\u6A9C\u6ADB\u6AA3\u6A7E"+ - "\u6A97\u6A90\u6AA0\u6B5C\u6BAE\u6BDA\u6C08\u6FD8"+ - "\u6FF1\u6FDF\u6FE0\u6FDB\u6FE4\u6FEB\u6FEF\u6F80"+ - "\u6FEC\u6FE1\u6FE9\u6FD5\u6FEE\u6FF0\u71E7\u71DF"+ - "\u71EE\u71E6\u71E5\u71ED\u71EC\u71F4\u71E0\u7235"+ - "\u7246\u7370\u7372\u74A9\u74B0\u74A6\u74A8\u7646"+ - "\u7642\u764C\u76EA\u77B3\u77AA\u77B0\u77AC\u77A7"+ - "\u77AD\u77EF\u78F7\u78FA\u78F4\u78EF\u7901\u79A7"+ - "\u79AA\u7A57\u7ABF\u7C07\u7C0D\u7BFE\u7BF7\u7C0C"+ - "\u7BE0\u7CE0\u7CDC\u7CDE\u7CE2\u7CDF\u7CD9\u7CDD"+ - "\u7E2E\u7E3E\u7E46\u7E37\u7E32\u7E43\u7E2B\u7E3D"+ - "\u7E31\u7E45\u7E41\u7E34\u7E39\u7E48\u7E35\u7E3F"+ - "\u7E2F\u7F44\u7FF3\u7FFC\u8071\u8072\u8070\u806F"+ - "\u8073\u81C6\u81C3\u81BA\u81C2\u81C0\u81BF\u81BD"+ - "\u81C9\u81BE\u81E8\u8209\u8271\u85AA\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\u8584\u857E\u859C\u8591\u8594\u85AF\u859B\u8587"+ - "\u85A8\u858A\u8667\u87C0\u87D1\u87B3\u87D2\u87C6"+ - "\u87AB\u87BB\u87BA\u87C8\u87CB\u893B\u8936\u8944"+ - "\u8938\u893D\u89AC\u8B0E\u8B17\u8B19\u8B1B\u8B0A"+ - "\u8B20\u8B1D\u8B04\u8B10\u8C41\u8C3F\u8C73\u8CFA"+ - "\u8CFD\u8CFC\u8CF8\u8CFB\u8DA8\u8E49\u8E4B\u8E48"+ - "\u8E4A\u8F44\u8F3E\u8F42\u8F45\u8F3F\u907F\u907D"+ - "\u9084\u9081\u9082\u9080\u9139\u91A3\u919E\u919C"+ - "\u934D\u9382\u9328\u9375\u934A\u9365\u934B\u9318"+ - "\u937E\u936C\u935B\u9370\u935A\u9354\u95CA\u95CB"+ - "\u95CC\u95C8\u95C6\u96B1\u96B8\u96D6\u971C\u971E"+ - "\u97A0\u97D3\u9846\u98B6\u9935\u9A01\u99FF\u9BAE"+ - "\u9BAB\u9BAA\u9BAD\u9D3B\u9D3F\u9E8B\u9ECF\u9EDE"+ - "\u9EDC\u9EDD\u9EDB\u9F3E\u9F4B\u53E2\u5695\u56AE"+ - "\u58D9\u58D8\u5B38\u5F5D\u61E3\u6233\u64F4\u64F2"+ - "\u64FE\u6506\u64FA\u64FB\u64F7\u65B7\u66DC\u6726"+ - "\u6AB3\u6AAC\u6AC3\u6ABB\u6AB8\u6AC2\u6AAE\u6AAF"+ - "\u6B5F\u6B78\u6BAF\u7009\u700B\u6FFE\u7006\u6FFA"+ - "\u7011\u700F\u71FB\u71FC\u71FE\u71F8\u7377\u7375"+ - "\u74A7\u74BF\u7515\u7656\u7658\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u7652"+ - "\u77BD\u77BF\u77BB\u77BC\u790E\u79AE\u7A61\u7A62"+ - "\u7A60\u7AC4\u7AC5\u7C2B\u7C27\u7C2A\u7C1E\u7C23"+ - "\u7C21\u7CE7\u7E54\u7E55\u7E5E\u7E5A\u7E61\u7E52"+ - "\u7E59\u7F48\u7FF9\u7FFB\u8077\u8076\u81CD\u81CF"+ - "\u820A\u85CF\u85A9\u85CD\u85D0\u85C9\u85B0\u85BA"+ - "\u85B9\u85A6\u87EF\u87EC\u87F2\u87E0\u8986\u89B2"+ - "\u89F4\u8B28\u8B39\u8B2C\u8B2B\u8C50\u8D05\u8E59"+ - "\u8E63\u8E66\u8E64\u8E5F\u8E55\u8EC0\u8F49\u8F4D"+ - "\u9087\u9083\u9088\u91AB\u91AC\u91D0\u9394\u938A"+ - "\u9396\u93A2\u93B3\u93AE\u93AC\u93B0\u9398\u939A"+ - "\u9397\u95D4\u95D6\u95D0\u95D5\u96E2\u96DC\u96D9"+ - "\u96DB\u96DE\u9724\u97A3\u97A6\u97AD\u97F9\u984D"+ - "\u984F\u984C\u984E\u9853\u98BA\u993E\u993F\u993D"+ - "\u992E\u99A5\u9A0E\u9AC1\u9B03\u9B06\u9B4F\u9B4E"+ - "\u9B4D\u9BCA\u9BC9\u9BFD\u9BC8\u9BC0\u9D51\u9D5D"+ - "\u9D60\u9EE0\u9F15\u9F2C\u5133\u56A5\u58DE\u58DF"+ - "\u58E2\u5BF5\u9F90\u5EEC\u61F2\u61F7\u61F6\u61F5"+ - "\u6500\u650F\u66E0\u66DD\u6AE5\u6ADD\u6ADA\u6AD3"+ - "\u701B\u701F\u7028\u701A\u701D\u7015\u7018\u7206"+ - "\u720D\u7258\u72A2\u7378\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u737A\u74BD"+ - "\u74CA\u74E3\u7587\u7586\u765F\u7661\u77C7\u7919"+ - "\u79B1\u7A6B\u7A69\u7C3E\u7C3F\u7C38\u7C3D\u7C37"+ - "\u7C40\u7E6B\u7E6D\u7E79\u7E69\u7E6A\u7F85\u7E73"+ - "\u7FB6\u7FB9\u7FB8\u81D8\u85E9\u85DD\u85EA\u85D5"+ - "\u85E4\u85E5\u85F7\u87FB\u8805\u880D\u87F9\u87FE"+ - "\u8960\u895F\u8956\u895E\u8B41\u8B5C\u8B58\u8B49"+ - "\u8B5A\u8B4E\u8B4F\u8B46\u8B59\u8D08\u8D0A\u8E7C"+ - "\u8E72\u8E87\u8E76\u8E6C\u8E7A\u8E74\u8F54\u8F4E"+ - "\u8FAD\u908A\u908B\u91B1\u91AE\u93E1\u93D1\u93DF"+ - "\u93C3\u93C8\u93DC\u93DD\u93D6\u93E2\u93CD\u93D8"+ - "\u93E4\u93D7\u93E8\u95DC\u96B4\u96E3\u972A\u9727"+ - "\u9761\u97DC\u97FB\u985E\u9858\u985B\u98BC\u9945"+ - "\u9949\u9A16\u9A19\u9B0D\u9BE8\u9BE7\u9BD6\u9BDB"+ - "\u9D89\u9D61\u9D72\u9D6A\u9D6C\u9E92\u9E97\u9E93"+ - "\u9EB4\u52F8\u56A8\u56B7\u56B6\u56B4\u56BC\u58E4"+ - "\u5B40\u5B43\u5B7D\u5BF6\u5DC9\u61F8\u61FA\u6518"+ - "\u6514\u6519\u66E6\u6727\u6AEC\u703E\u7030\u7032"+ - "\u7210\u737B\u74CF\u7662\u7665\u7926\u792A\u792C"+ - "\u792B\u7AC7\u7AF6\u7C4C\u7C43\u7C4D\u7CEF\u7CF0"+ - "\u8FAE\u7E7D\u7E7C\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u7E82\u7F4C\u8000"+ - "\u81DA\u8266\u85FB\u85F9\u8611\u85FA\u8606\u860B"+ - "\u8607\u860A\u8814\u8815\u8964\u89BA\u89F8\u8B70"+ - "\u8B6C\u8B66\u8B6F\u8B5F\u8B6B\u8D0F\u8D0D\u8E89"+ - "\u8E81\u8E85\u8E82\u91B4\u91CB\u9418\u9403\u93FD"+ - "\u95E1\u9730\u98C4\u9952\u9951\u99A8\u9A2B\u9A30"+ - "\u9A37\u9A35\u9C13\u9C0D\u9E79\u9EB5\u9EE8\u9F2F"+ - "\u9F5F\u9F63\u9F61\u5137\u5138\u56C1\u56C0\u56C2"+ - "\u5914\u5C6C\u5DCD\u61FC\u61FE\u651D\u651C\u6595"+ - "\u66E9\u6AFB\u6B04\u6AFA\u6BB2\u704C\u721B\u72A7"+ - "\u74D6\u74D4\u7669\u77D3\u7C50\u7E8F\u7E8C\u7FBC"+ - "\u8617\u862D\u861A\u8823\u8822\u8821\u881F\u896A"+ - "\u896C\u89BD\u8B74\u8B77\u8B7D\u8D13\u8E8A\u8E8D"+ - "\u8E8B\u8F5F\u8FAF\u91BA\u942E\u9433\u9435\u943A"+ - "\u9438\u9432\u942B\u95E2\u9738\u9739\u9732\u97FF"+ - "\u9867\u9865\u9957\u9A45\u9A43\u9A40\u9A3E\u9ACF"+ - "\u9B54\u9B51\u9C2D\u9C25\u9DAF\u9DB4\u9DC2\u9DB8"+ - "\u9E9D\u9EEF\u9F19\u9F5C\u9F66\u9F67\u513C\u513B"+ - "\u56C8\u56CA\u56C9\u5B7F\u5DD4\u5DD2\u5F4E\u61FF"+ - "\u6524\u6B0A\u6B61\u7051\u7058\u7380\u74E4\u758A"+ - "\u766E\u766C\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\u79B3\u7C60\u7C5F\u807E"+ - "\u807D\u81DF\u8972\u896F\u89FC\u8B80\u8D16\u8D17"+ - "\u8E91\u8E93\u8F61\u9148\u9444\u9451\u9452\u973D"+ - "\u973E\u97C3\u97C1\u986B\u9955\u9A55\u9A4D\u9AD2"+ - "\u9B1A\u9C49\u9C31\u9C3E\u9C3B\u9DD3\u9DD7\u9F34"+ - "\u9F6C\u9F6A\u9F94\u56CC\u5DD6\u6200\u6523\u652B"+ - "\u652A\u66EC\u6B10\u74DA\u7ACA\u7C64\u7C63\u7C65"+ - "\u7E93\u7E96\u7E94\u81E2\u8638\u863F\u8831\u8B8A"+ - "\u9090\u908F\u9463\u9460\u9464\u9768\u986F\u995C"+ - "\u9A5A\u9A5B\u9A57\u9AD3\u9AD4\u9AD1\u9C54\u9C57"+ - "\u9C56\u9DE5\u9E9F\u9EF4\u56D1\u58E9\u652C\u705E"+ - "\u7671\u7672\u77D7\u7F50\u7F88\u8836\u8839\u8862"+ - "\u8B93\u8B92\u8B96\u8277\u8D1B\u91C0\u946A\u9742"+ - "\u9748\u9744\u97C6\u9870\u9A5F\u9B22\u9B58\u9C5F"+ - "\u9DF9\u9DFA\u9E7C\u9E7D\u9F07\u9F77\u9F72\u5EF3"+ - "\u6B16\u7063\u7C6C\u7C6E\u883B\u89C0\u8EA1\u91C1"+ - "\u9472\u9470\u9871\u995E\u9AD6\u9B23\u9ECC\u7064"+ - "\u77DA\u8B9A\u9477\u97C9\u9A62\u9A65\u7E9C\u8B9C"+ - "\u8EAA\u91C5\u947D\u947E\u947C\u9C77\u9C78\u9EF7"+ - "\u8C54\u947F\u9E1A\u7228\u9A6A\u9B31\u9E1B\u9E1E"+ - "\u7C72\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\u30FE\u309D\u309E\u3005\u3041"+ - "\u3042\u3043\u3044\u3045\u3046\u3047\u3048\u3049"+ - "\u304A\u304B\u304C\u304D\u304E\u304F\u3050\u3051"+ - "\u3052\u3053\u3054\u3055\u3056\u3057\u3058\u3059"+ - "\u305A\u305B\u305C\u305D\u305E\u305F\u3060\u3061"+ - "\u3062\u3063\u3064\u3065\u3066\u3067\u3068\u3069"+ - "\u306A\u306B\u306C\u306D\u306E\u306F\u3070\u3071"+ - "\u3072\u3073\u3074\u3075\u3076\u3077\u3078\u3079"+ - "\u307A\u307B\u307C\u307D\u307E\u307F\u3080\u3081"+ - "\u3082\u3083\u3084\u3085\u3086\u3087\u3088\u3089"+ - "\u308A\u308B\u308C\u308D\u308E\u308F\u3090\u3091"+ - "\u3092\u3093\u30A1\u30A2\u30A3\u30A4\u30A5\u30A6"+ - "\u30A7\u30A8\u30A9\u30AA\u30AB\u30AC\u30AD\u30AE"+ - "\u30AF\u30B0\u30B1\u30B2\u30B3\u30B4\u30B5\u30B6"+ - "\u30B7\u30B8\u30B9\u30BA\u30BB\u30BC\u30BD\u30BE"+ - "\u30BF\u30C0\u30C1\u30C2\u30C3\u30C4\u30C5\u30C6"+ - "\u30C7\u30C8\u30C9\u30CA\u30CB\u30CC\u30CD\u30CE"+ - "\u30CF\u30D0\u30D1\u30D2\u30D3\u30D4\u30D5\u30D6"+ - "\u30D7\u30D8\u30D9\u30DA\u30DB\u30DC\u30DD\u30DE"+ - "\u30DF\u30E0\u30E1\u30E2\u30E3\u30E4\u30E5\u30E6"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\u30E7\u30E8\u30E9\u30EA\u30EB\u30EC"+ - "\u30ED\u30EE\u30EF\u30F0\u30F1\u30F2\u30F3\u30F4"+ - "\u30F5\u30F6\u0414\u0415\u0401\u0416\u0417\u0418"+ - "\u0419\u041A\u041B\u041C\u0423\u0424\u0425\u0426"+ - "\u0427\u0428\u0429\u042A\u042B\u042C\u042D\u042E"+ - "\u042F\u0430\u0431\u0432\u0433\u0434\u0435\u0451"+ - "\u0436\u0437\u0438\u0439\u043A\u043B\u043C\u043D"+ - "\u043E\u043F\u0440\u0441\u0442\u0443\u0444\u0445"+ - "\u0446\u0447\u0448\u0449\u044A\u044B\u044C\u044D"+ - "\u044E\u044F\u2460\u2461\u2462\u2463\u2464\u2465"+ - "\u2466\u2467\u2468\u2469\u2474\u2475\u2476\u2477"+ - "\u2478\u2479\u247A\u247B\u247C\u247D\uFFFD\uFFFD"+ - "\u4E42\u4E5C\u51F5\u531A\u5382\u4E07\u4E0C\u4E47"+ - "\u4E8D\u56D7\uFA0C\u5C6E\u5F73\u4E0F\u5187\u4E0E"+ - "\u4E2E\u4E93\u4EC2\u4EC9\u4EC8\u5198\u52FC\u536C"+ - "\u53B9\u5720\u5903\u592C\u5C10\u5DFF\u65E1\u6BB3"+ - "\u6BCC\u6C14\u723F\u4E31\u4E3C\u4EE8\u4EDC\u4EE9"+ - "\u4EE1\u4EDD\u4EDA\u520C\u531C\u534C\u5722\u5723"+ - "\u5917\u592F\u5B81\u5B84\u5C12\u5C3B\u5C74\u5C73"+ - "\u5E04\u5E80\u5E82\u5FC9\u6209\u6250\u6C15\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\u6C36\u6C43\u6C3F\u6C3B\u72AE\u72B0\u738A"+ - "\u79B8\u808A\u961E\u4F0E\u4F18\u4F2C\u4EF5\u4F14"+ - "\u4EF1\u4F00\u4EF7\u4F08\u4F1D\u4F02\u4F05\u4F22"+ - "\u4F13\u4F04\u4EF4\u4F12\u51B1\u5213\u5209\u5210"+ - "\u52A6\u5322\u531F\u534D\u538A\u5407\u56E1\u56DF"+ - "\u572E\u572A\u5734\u593C\u5980\u597C\u5985\u597B"+ - "\u597E\u5977\u597F\u5B56\u5C15\u5C25\u5C7C\u5C7A"+ - "\u5C7B\u5C7E\u5DDF\u5E75\u5E84\u5F02\u5F1A\u5F74"+ - "\u5FD5\u5FD4\u5FCF\u625C\u625E\u6264\u6261\u6266"+ - "\u6262\u6259\u6260\u625A\u6265\u65EF\u65EE\u673E"+ - "\u6739\u6738\u673B\u673A\u673F\u673C\u6733\u6C18"+ - "\u6C46\u6C52\u6C5C\u6C4F\u6C4A\u6C54\u6C4B\u6C4C"+ - "\u7071\u725E\u72B4\u72B5\u738E\u752A\u767F\u7A75"+ - "\u7F51\u8278\u827C\u8280\u827D\u827F\u864D\u897E"+ - "\u9099\u9097\u9098\u909B\u9094\u9622\u9624\u9620"+ - "\u9623\u4F56\u4F3B\u4F62\u4F49\u4F53\u4F64\u4F3E"+ - "\u4F67\u4F52\u4F5F\u4F41\u4F58\u4F2D\u4F33\u4F3F"+ - "\u4F61\u518F\u51B9\u521C\u521E\u5221\u52AD\u52AE"+ - "\u5309\u5363\u5372\u538E\u538F\u5430\u5437\u542A"+ - "\u5454\u5445\u5419\u541C\u5425\u5418\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\u543D\u544F\u5441\u5428\u5424\u5447\u56EE\u56E7"+ - "\u56E5\u5741\u5745\u574C\u5749\u574B\u5752\u5906"+ - "\u5940\u59A6\u5998\u59A0\u5997\u598E\u59A2\u5990"+ - "\u598F\u59A7\u59A1\u5B8E\u5B92\u5C28\u5C2A\u5C8D"+ - "\u5C8F\u5C88\u5C8B\u5C89\u5C92\u5C8A\u5C86\u5C93"+ - "\u5C95\u5DE0\u5E0A\u5E0E\u5E8B\u5E89\u5E8C\u5E88"+ - "\u5E8D\u5F05\u5F1D\u5F78\u5F76\u5FD2\u5FD1\u5FD0"+ - "\u5FED\u5FE8\u5FEE\u5FF3\u5FE1\u5FE4\u5FE3\u5FFA"+ - "\u5FEF\u5FF7\u5FFB\u6000\u5FF4\u623A\u6283\u628C"+ - "\u628E\u628F\u6294\u6287\u6271\u627B\u627A\u6270"+ - "\u6281\u6288\u6277\u627D\u6272\u6274\u6537\u65F0"+ - "\u65F4\u65F3\u65F2\u65F5\u6745\u6747\u6759\u6755"+ - "\u674C\u6748\u675D\u674D\u675A\u674B\u6BD0\u6C19"+ - "\u6C1A\u6C78\u6C67\u6C6B\u6C84\u6C8B\u6C8F\u6C71"+ - "\u6C6F\u6C69\u6C9A\u6C6D\u6C87\u6C95\u6C9C\u6C66"+ - "\u6C73\u6C65\u6C7B\u6C8E\u7074\u707A\u7263\u72BF"+ - "\u72BD\u72C3\u72C6\u72C1\u72BA\u72C5\u7395\u7397"+ - "\u7393\u7394\u7392\u753A\u7539\u7594\u7595\u7681"+ - "\u793D\u8034\u8095\u8099\u8090\u8092\u809C\u8290"+ - "\u828F\u8285\u828E\u8291\u8293\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u828A"+ - "\u8283\u8284\u8C78\u8FC9\u8FBF\u909F\u90A1\u90A5"+ - "\u909E\u90A7\u90A0\u9630\u9628\u962F\u962D\u4E33"+ - "\u4F98\u4F7C\u4F85\u4F7D\u4F80\u4F87\u4F76\u4F74"+ - "\u4F89\u4F84\u4F77\u4F4C\u4F97\u4F6A\u4F9A\u4F79"+ - "\u4F81\u4F78\u4F90\u4F9C\u4F94\u4F9E\u4F92\u4F82"+ - "\u4F95\u4F6B\u4F6E\u519E\u51BC\u51BE\u5235\u5232"+ - "\u5233\u5246\u5231\u52BC\u530A\u530B\u533C\u5392"+ - "\u5394\u5487\u547F\u5481\u5491\u5482\u5488\u546B"+ - "\u547A\u547E\u5465\u546C\u5474\u5466\u548D\u546F"+ - "\u5461\u5460\u5498\u5463\u5467\u5464\u56F7\u56F9"+ - "\u576F\u5772\u576D\u576B\u5771\u5770\u5776\u5780"+ - "\u5775\u577B\u5773\u5774\u5762\u5768\u577D\u590C"+ - "\u5945\u59B5\u59BA\u59CF\u59CE\u59B2\u59CC\u59C1"+ - "\u59B6\u59BC\u59C3\u59D6\u59B1\u59BD\u59C0\u59C8"+ - "\u59B4\u59C7\u5B62\u5B65\u5B93\u5B95\u5C44\u5C47"+ - "\u5CAE\u5CA4\u5CA0\u5CB5\u5CAF\u5CA8\u5CAC\u5C9F"+ - "\u5CA3\u5CAD\u5CA2\u5CAA\u5CA7\u5C9D\u5CA5\u5CB6"+ - "\u5CB0\u5CA6\u5E17\u5E14\u5E19\u5F28\u5F22\u5F23"+ - "\u5F24\u5F54\u5F82\u5F7E\u5F7D\u5FDE\u5FE5\u602D"+ - "\u6026\u6019\u6032\u600B\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u6034\u600A"+ - "\u6017\u6033\u601A\u601E\u602C\u6022\u600D\u6010"+ - "\u602E\u6013\u6011\u600C\u6009\u601C\u6214\u623D"+ - "\u62AD\u62B4\u62D1\u62BE\u62AA\u62B6\u62CA\u62AE"+ - "\u62B3\u62AF\u62BB\u62A9\u62B0\u62B8\u653D\u65A8"+ - "\u65BB\u6609\u65FC\u6604\u6612\u6608\u65FB\u6603"+ - "\u660B\u660D\u6605\u65FD\u6611\u6610\u66F6\u670A"+ - "\u6785\u676C\u678E\u6792\u6776\u677B\u6798\u6786"+ - "\u6784\u6774\u678D\u678C\u677A\u679F\u6791\u6799"+ - "\u6783\u677D\u6781\u6778\u6779\u6794\u6B25\u6B80"+ - "\u6B7E\u6BDE\u6C1D\u6C93\u6CEC\u6CEB\u6CEE\u6CD9"+ - "\u6CB6\u6CD4\u6CAD\u6CE7\u6CB7\u6CD0\u6CC2\u6CBA"+ - "\u6CC3\u6CC6\u6CED\u6CF2\u6CD2\u6CDD\u6CB4\u6C8A"+ - "\u6C9D\u6C80\u6CDE\u6CC0\u6D30\u6CCD\u6CC7\u6CB0"+ - "\u6CF9\u6CCF\u6CE9\u6CD1\u7094\u7098\u7085\u7093"+ - "\u7086\u7084\u7091\u7096\u7082\u709A\u7083\u726A"+ - "\u72D6\u72CB\u72D8\u72C9\u72DC\u72D2\u72D4\u72DA"+ - "\u72CC\u72D1\u73A4\u73A1\u73AD\u73A6\u73A2\u73A0"+ - "\u73AC\u739D\u74DD\u74E8\u753F\u7540\u753E\u758C"+ - "\u7598\u76AF\u76F3\u76F1\u76F0\u76F5\u77F8\u77FC"+ - "\u77F9\u77FB\u77FA\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u77F7\u7942\u793F"+ - "\u79C5\u7A78\u7A7B\u7AFB\u7C75\u7CFD\u8035\u808F"+ - "\u80AE\u80A3\u80B8\u80B5\u80AD\u8220\u82A0\u82C0"+ - "\u82AB\u829A\u8298\u829B\u82B5\u82A7\u82AE\u82BC"+ - "\u829E\u82BA\u82B4\u82A8\u82A1\u82A9\u82C2\u82A4"+ - "\u82C3\u82B6\u82A2\u8670\u866F\u866D\u866E\u8C56"+ - "\u8FD2\u8FCB\u8FD3\u8FCD\u8FD6\u8FD5\u8FD7\u90B2"+ - "\u90B4\u90AF\u90B3\u90B0\u9639\u963D\u963C\u963A"+ - "\u9643\u4FCD\u4FC5\u4FD3\u4FB2\u4FC9\u4FCB\u4FC1"+ - "\u4FD4\u4FDC\u4FD9\u4FBB\u4FB3\u4FDB\u4FC7\u4FD6"+ - "\u4FBA\u4FC0\u4FB9\u4FEC\u5244\u5249\u52C0\u52C2"+ - "\u533D\u537C\u5397\u5396\u5399\u5398\u54BA\u54A1"+ - "\u54AD\u54A5\u54CF\u54C3\u830D\u54B7\u54AE\u54D6"+ - "\u54B6\u54C5\u54C6\u54A0\u5470\u54BC\u54A2\u54BE"+ - "\u5472\u54DE\u54B0\u57B5\u579E\u579F\u57A4\u578C"+ - "\u5797\u579D\u579B\u5794\u5798\u578F\u5799\u57A5"+ - "\u579A\u5795\u58F4\u590D\u5953\u59E1\u59DE\u59EE"+ - "\u5A00\u59F1\u59DD\u59FA\u59FD\u59FC\u59F6\u59E4"+ - "\u59F2\u59F7\u59DB\u59E9\u59F3\u59F5\u59E0\u59FE"+ - "\u59F4\u59ED\u5BA8\u5C4C\u5CD0\u5CD8\u5CCC\u5CD7"+ - "\u5CCB\u5CDB\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\u5CDE\u5CDA\u5CC9\u5CC7"+ - "\u5CCA\u5CD6\u5CD3\u5CD4\u5CCF\u5CC8\u5CC6\u5CCE"+ - "\u5CDF\u5CF8\u5DF9\u5E21\u5E22\u5E23\u5E20\u5E24"+ - "\u5EB0\u5EA4\u5EA2\u5E9B\u5EA3\u5EA5\u5F07\u5F2E"+ - "\u5F56\u5F86\u6037\u6039\u6054\u6072\u605E\u6045"+ - "\u6053\u6047\u6049\u605B\u604C\u6040\u6042\u605F"+ - "\u6024\u6044\u6058\u6066\u606E\u6242\u6243\u62CF"+ - "\u630D\u630B\u62F5\u630E\u6303\u62EB\u62F9\u630F"+ - "\u630C\u62F8\u62F6\u6300\u6313\u6314\u62FA\u6315"+ - "\u62FB\u62F0\u6541\u6543\u65AA\u65BF\u6636\u6621"+ - "\u6632\u6635\u661C\u6626\u6622\u6633\u662B\u663A"+ - "\u661D\u6634\u6639\u662E\u670F\u6710\u67C1\u67F2"+ - "\u67C8\u67BA\u67DC\u67BB\u67F8\u67D8\u67C0\u67B7"+ - "\u67C5\u67EB\u67E4\u67DF\u67B5\u67CD\u67B3\u67F7"+ - "\u67F6\u67EE\u67E3\u67C2\u67B9\u67CE\u67E7\u67F0"+ - "\u67B2\u67FC\u67C6\u67ED\u67CC\u67AE\u67E6\u67DB"+ - "\u67FA\u67C9\u67CA\u67C3\u67EA\u67CB\u6B28\u6B82"+ - "\u6B84\u6BB6\u6BD6\u6BD8\u6BE0\u6C20\u6C21\u6D28"+ - "\u6D34\u6D2D\u6D1F\u6D3C\u6D3F\u6D12\u6D0A\u6CDA"+ - "\u6D33\u6D04\u6D19\u6D3A\u6D1A\u6D11\u6D00\u6D1D"+ - "\u6D42\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\u6D01\u6D18\u6D37\u6D03\u6D0F"+ - "\u6D40\u6D07\u6D20\u6D2C\u6D08\u6D22\u6D09\u6D10"+ - "\u70B7\u709F\u70BE\u70B1\u70B0\u70A1\u70B4\u70B5"+ - "\u70A9\u7241\u7249\u724A\u726C\u7270\u7273\u726E"+ - "\u72CA\u72E4\u72E8\u72EB\u72DF\u72EA\u72E6\u72E3"+ - "\u7385\u73CC\u73C2\u73C8\u73C5\u73B9\u73B6\u73B5"+ - "\u73B4\u73EB\u73BF\u73C7\u73BE\u73C3\u73C6\u73B8"+ - "\u73CB\u74EC\u74EE\u752E\u7547\u7548\u75A7\u75AA"+ - "\u7679\u76C4\u7708\u7703\u7704\u7705\u770A\u76F7"+ - "\u76FB\u76FA\u77E7\u77E8\u7806\u7811\u7812\u7805"+ - "\u7810\u780F\u780E\u7809\u7803\u7813\u794A\u794C"+ - "\u794B\u7945\u7944\u79D5\u79CD\u79CF\u79D6\u79CE"+ - "\u7A80\u7A7E\u7AD1\u7B00\u7B01\u7C7A\u7C78\u7C79"+ - "\u7C7F\u7C80\u7C81\u7D03\u7D08\u7D01\u7F58\u7F91"+ - "\u7F8D\u7FBE\u8007\u800E\u800F\u8014\u8037\u80D8"+ - "\u80C7\u80E0\u80D1\u80C8\u80C2\u80D0\u80C5\u80E3"+ - "\u80D9\u80DC\u80CA\u80D5\u80C9\u80CF\u80D7\u80E6"+ - "\u80CD\u81FF\u8221\u8294\u82D9\u82FE\u82F9\u8307"+ - "\u82E8\u8300\u82D5\u833A\u82EB\u82D6\u82F4\u82EC"+ - "\u82E1\u82F2\u82F5\u830C\u82FB\u82F6\u82F0\u82EA"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\u82E4\u82E0\u82FA\u82F3\u82ED\u8677"+ - "\u8674\u867C\u8673\u8841\u884E\u8867\u886A\u8869"+ - "\u89D3\u8A04\u8A07\u8D72\u8FE3\u8FE1\u8FEE\u8FE0"+ - "\u90F1\u90BD\u90BF\u90D5\u90C5\u90BE\u90C7\u90CB"+ - "\u90C8\u91D4\u91D3\u9654\u964F\u9651\u9653\u964A"+ - "\u964E\u501E\u5005\u5007\u5013\u5022\u5030\u501B"+ - "\u4FF5\u4FF4\u5033\u5037\u502C\u4FF6\u4FF7\u5017"+ - "\u501C\u5020\u5027\u5035\u502F\u5031\u500E\u515A"+ - "\u5194\u5193\u51CA\u51C4\u51C5\u51C8\u51CE\u5261"+ - "\u525A\u5252\u525E\u525F\u5255\u5262\u52CD\u530E"+ - "\u539E\u5526\u54E2\u5517\u5512\u54E7\u54F3\u54E4"+ - "\u551A\u54FF\u5504\u5508\u54EB\u5511\u5505\u54F1"; - - private final static String innerIndex3= - "\u550A\u54FB\u54F7\u54F8\u54E0\u550E\u5503\u550B"+ - "\u5701\u5702\u57CC\u5832\u57D5\u57D2\u57BA\u57C6"+ - "\u57BD\u57BC\u57B8\u57B6\u57BF\u57C7\u57D0\u57B9"+ - "\u57C1\u590E\u594A\u5A19\u5A16\u5A2D\u5A2E\u5A15"+ - "\u5A0F\u5A17\u5A0A\u5A1E\u5A33\u5B6C\u5BA7\u5BAD"+ - "\u5BAC\u5C03\u5C56\u5C54\u5CEC\u5CFF\u5CEE\u5CF1"+ - "\u5CF7\u5D00\u5CF9\u5E29\u5E28\u5EA8\u5EAE\u5EAA"+ - "\u5EAC\u5F33\u5F30\u5F67\u605D\u605A\u6067\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\u6041\u60A2\u6088\u6080\u6092\u6081\u609D"+ - "\u6083\u6095\u609B\u6097\u6087\u609C\u608E\u6219"+ - "\u6246\u62F2\u6310\u6356\u632C\u6344\u6345\u6336"+ - "\u6343\u63E4\u6339\u634B\u634A\u633C\u6329\u6341"+ - "\u6334\u6358\u6354\u6359\u632D\u6347\u6333\u635A"+ - "\u6351\u6338\u6357\u6340\u6348\u654A\u6546\u65C6"+ - "\u65C3\u65C4\u65C2\u664A\u665F\u6647\u6651\u6712"+ - "\u6713\u681F\u681A\u6849\u6832\u6833\u683B\u684B"+ - "\u684F\u6816\u6831\u681C\u6835\u682B\u682D\u682F"+ - "\u684E\u6844\u6834\u681D\u6812\u6814\u6826\u6828"+ - "\u682E\u684D\u683A\u6825\u6820\u6B2C\u6B2F\u6B2D"+ - "\u6B31\u6B34\u6B6D\u8082\u6B88\u6BE6\u6BE4\u6BE8"+ - "\u6BE3\u6BE2\u6BE7\u6C25\u6D7A\u6D63\u6D64\u6D76"+ - "\u6D0D\u6D61\u6D92\u6D58\u6D62\u6D6D\u6D6F\u6D91"+ - "\u6D8D\u6DEF\u6D7F\u6D86\u6D5E\u6D67\u6D60\u6D97"+ - "\u6D70\u6D7C\u6D5F\u6D82\u6D98\u6D2F\u6D68\u6D8B"+ - "\u6D7E\u6D80\u6D84\u6D16\u6D83\u6D7B\u6D7D\u6D75"+ - "\u6D90\u70DC\u70D3\u70D1\u70DD\u70CB\u7F39\u70E2"+ - "\u70D7\u70D2\u70DE\u70E0\u70D4\u70CD\u70C5\u70C6"+ - "\u70C7\u70DA\u70CE\u70E1\u7242\u7278\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\u7277\u7276\u7300\u72FA\u72F4\u72FE\u72F6\u72F3"+ - "\u72FB\u7301\u73D3\u73D9\u73E5\u73D6\u73BC\u73E7"+ - "\u73E3\u73E9\u73DC\u73D2\u73DB\u73D4\u73DD\u73DA"+ - "\u73D7\u73D8\u73E8\u74DE\u74DF\u74F4\u74F5\u7521"+ - "\u755B\u755F\u75B0\u75C1\u75BB\u75C4\u75C0\u75BF"+ - "\u75B6\u75BA\u768A\u76C9\u771D\u771B\u7710\u7713"+ - "\u7712\u7723\u7711\u7715\u7719\u771A\u7722\u7727"+ - "\u7823\u782C\u7822\u7835\u782F\u7828\u782E\u782B"+ - "\u7821\u7829\u7833\u782A\u7831\u7954\u795B\u794F"+ - "\u795C\u7953\u7952\u7951\u79EB\u79EC\u79E0\u79EE"+ - "\u79ED\u79EA\u79DC\u79DE\u79DD\u7A86\u7A89\u7A85"+ - "\u7A8B\u7A8C\u7A8A\u7A87\u7AD8\u7B10\u7B04\u7B13"+ - "\u7B05\u7B0F\u7B08\u7B0A\u7B0E\u7B09\u7B12\u7C84"+ - "\u7C91\u7C8A\u7C8C\u7C88\u7C8D\u7C85\u7D1E\u7D1D"+ - "\u7D11\u7D0E\u7D18\u7D16\u7D13\u7D1F\u7D12\u7D0F"+ - "\u7D0C\u7F5C\u7F61\u7F5E\u7F60\u7F5D\u7F5B\u7F96"+ - "\u7F92\u7FC3\u7FC2\u7FC0\u8016\u803E\u8039\u80FA"+ - "\u80F2\u80F9\u80F5\u8101\u80FB\u8100\u8201\u822F"+ - "\u8225\u8333\u832D\u8344\u8319\u8351\u8325\u8356"+ - "\u833F\u8341\u8326\u831C\u8322\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u8342"+ - "\u834E\u831B\u832A\u8308\u833C\u834D\u8316\u8324"+ - "\u8320\u8337\u832F\u8329\u8347\u8345\u834C\u8353"+ - "\u831E\u832C\u834B\u8327\u8348\u8653\u8652\u86A2"+ - "\u86A8\u8696\u868D\u8691\u869E\u8687\u8697\u8686"+ - "\u868B\u869A\u8685\u86A5\u8699\u86A1\u86A7\u8695"+ - "\u8698\u868E\u869D\u8690\u8694\u8843\u8844\u886D"+ - "\u8875\u8876\u8872\u8880\u8871\u887F\u886F\u8883"+ - "\u887E\u8874\u887C\u8A12\u8C47\u8C57\u8C7B\u8CA4"+ - "\u8CA3\u8D76\u8D78\u8DB5\u8DB7\u8DB6\u8ED1\u8ED3"+ - "\u8FFE\u8FF5\u9002\u8FFF\u8FFB\u9004\u8FFC\u8FF6"+ - "\u90D6\u90E0\u90D9\u90DA\u90E3\u90DF\u90E5\u90D8"+ - "\u90DB\u90D7\u90DC\u90E4\u9150\u914E\u914F\u91D5"+ - "\u91E2\u91DA\u965C\u965F\u96BC\u98E3\u9ADF\u9B2F"+ - "\u4E7F\u5070\u506A\u5061\u505E\u5060\u5053\u504B"+ - "\u505D\u5072\u5048\u504D\u5041\u505B\u504A\u5062"+ - "\u5015\u5045\u505F\u5069\u506B\u5063\u5064\u5046"+ - "\u5040\u506E\u5073\u5057\u5051\u51D0\u526B\u526D"+ - "\u526C\u526E\u52D6\u52D3\u532D\u539C\u5575\u5576"+ - "\u553C\u554D\u5550\u5534\u552A\u5551\u5562\u5536"+ - "\u5535\u5530\u5552\u5545\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u550C\u5532"+ - "\u5565\u554E\u5539\u5548\u552D\u553B\u5540\u554B"+ - "\u570A\u5707\u57FB\u5814\u57E2\u57F6\u57DC\u57F4"+ - "\u5800\u57ED\u57FD\u5808\u57F8\u580B\u57F3\u57CF"+ - "\u5807\u57EE\u57E3\u57F2\u57E5\u57EC\u57E1\u580E"+ - "\u57FC\u5810\u57E7\u5801\u580C\u57F1\u57E9\u57F0"+ - "\u580D\u5804\u595C\u5A60\u5A58\u5A55\u5A67\u5A5E"+ - "\u5A38\u5A35\u5A6D\u5A50\u5A5F\u5A65\u5A6C\u5A53"+ - "\u5A64\u5A57\u5A43\u5A5D\u5A52\u5A44\u5A5B\u5A48"+ - "\u5A8E\u5A3E\u5A4D\u5A39\u5A4C\u5A70\u5A69\u5A47"+ - "\u5A51\u5A56\u5A42\u5A5C\u5B72\u5B6E\u5BC1\u5BC0"+ - "\u5C59\u5D1E\u5D0B\u5D1D\u5D1A\u5D20\u5D0C\u5D28"+ - "\u5D0D\u5D26\u5D25\u5D0F\u5D30\u5D12\u5D23\u5D1F"+ - "\u5D2E\u5E3E\u5E34\u5EB1\u5EB4\u5EB9\u5EB2\u5EB3"+ - "\u5F36\u5F38\u5F9B\u5F96\u5F9F\u608A\u6090\u6086"+ - "\u60BE\u60B0\u60BA\u60D3\u60D4\u60CF\u60E4\u60D9"+ - "\u60DD\u60C8\u60B1\u60DB\u60B7\u60CA\u60BF\u60C3"+ - "\u60CD\u60C0\u6332\u6365\u638A\u6382\u637D\u63BD"+ - "\u639E\u63AD\u639D\u6397\u63AB\u638E\u636F\u6387"+ - "\u6390\u636E\u63AF\u6375\u639C\u636D\u63AE\u637C"+ - "\u63A4\u633B\u639F\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u6378\u6385\u6381"+ - "\u6391\u638D\u6370\u6553\u65CD\u6665\u6661\u665B"+ - "\u6659\u665C\u6662\u6718\u6879\u6887\u6890\u689C"+ - "\u686D\u686E\u68AE\u68AB\u6956\u686F\u68A3\u68AC"+ - "\u68A9\u6875\u6874\u68B2\u688F\u6877\u6892\u687C"+ - "\u686B\u6872\u68AA\u6880\u6871\u687E\u689B\u6896"+ - "\u688B\u68A0\u6889\u68A4\u6878\u687B\u6891\u688C"+ - "\u688A\u687D\u6B36\u6B33\u6B37\u6B38\u6B91\u6B8F"+ - "\u6B8D\u6B8E\u6B8C\u6C2A\u6DC0\u6DAB\u6DB4\u6DB3"+ - "\u6E74\u6DAC\u6DE9\u6DE2\u6DB7\u6DF6\u6DD4\u6E00"+ - "\u6DC8\u6DE0\u6DDF\u6DD6\u6DBE\u6DE5\u6DDC\u6DDD"+ - "\u6DDB\u6DF4\u6DCA\u6DBD\u6DED\u6DF0\u6DBA\u6DD5"+ - "\u6DC2\u6DCF\u6DC9\u6DD0\u6DF2\u6DD3\u6DFD\u6DD7"+ - "\u6DCD\u6DE3\u6DBB\u70FA\u710D\u70F7\u7117\u70F4"+ - "\u710C\u70F0\u7104\u70F3\u7110\u70FC\u70FF\u7106"+ - "\u7113\u7100\u70F8\u70F6\u710B\u7102\u710E\u727E"+ - "\u727B\u727C\u727F\u731D\u7317\u7307\u7311\u7318"+ - "\u730A\u7308\u72FF\u730F\u731E\u7388\u73F6\u73F8"+ - "\u73F5\u7404\u7401\u73FD\u7407\u7400\u73FA\u73FC"+ - "\u73FF\u740C\u740B\u73F4\u7408\u7564\u7563\u75CE"+ - "\u75D2\u75CF\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\u75CB\u75CC\u75D1\u75D0"+ - "\u768F\u7689\u76D3\u7739\u772F\u772D\u7731\u7732"+ - "\u7734\u7733\u773D\u7725\u773B\u7735\u7848\u7852"+ - "\u7849\u784D\u784A\u784C\u7826\u7845\u7850\u7964"+ - "\u7967\u7969\u796A\u7963\u796B\u7961\u79BB\u79FA"+ - "\u79F8\u79F6\u79F7\u7A8F\u7A94\u7A90\u7B35\u7B47"+ - "\u7B34\u7B25\u7B30\u7B22\u7B24\u7B33\u7B18\u7B2A"+ - "\u7B1D\u7B31\u7B2B\u7B2D\u7B2F\u7B32\u7B38\u7B1A"+ - "\u7B23\u7C94\u7C98\u7C96\u7CA3\u7D35\u7D3D\u7D38"+ - "\u7D36\u7D3A\u7D45\u7D2C\u7D29\u7D41\u7D47\u7D3E"+ - "\u7D3F\u7D4A\u7D3B\u7D28\u7F63\u7F95\u7F9C\u7F9D"+ - "\u7F9B\u7FCA\u7FCB\u7FCD\u7FD0\u7FD1\u7FC7\u7FCF"+ - "\u7FC9\u801F\u801E\u801B\u8047\u8043\u8048\u8118"+ - "\u8125\u8119\u811B\u812D\u811F\u812C\u811E\u8121"+ - "\u8115\u8127\u811D\u8122\u8211\u8238\u8233\u823A"+ - "\u8234\u8232\u8274\u8390\u83A3\u83A8\u838D\u837A"+ - "\u8373\u83A4\u8374\u838F\u8381\u8395\u8399\u8375"+ - "\u8394\u83A9\u837D\u8383\u838C\u839D\u839B\u83AA"+ - "\u838B\u837E\u83A5\u83AF\u8388\u8397\u83B0\u837F"+ - "\u83A6\u8387\u83AE\u8376\u839A\u8659\u8656\u86BF"+ - "\u86B7\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\u86C2\u86C1\u86C5\u86BA\u86B0"+ - "\u86C8\u86B9\u86B3\u86B8\u86CC\u86B4\u86BB\u86BC"+ - "\u86C3\u86BD\u86BE\u8852\u8889\u8895\u88A8\u88A2"+ - "\u88AA\u889A\u8891\u88A1\u889F\u8898\u88A7\u8899"+ - "\u889B\u8897\u88A4\u88AC\u888C\u8893\u888E\u8982"+ - "\u89D6\u89D9\u89D5\u8A30\u8A27\u8A2C\u8A1E\u8C39"+ - "\u8C3B\u8C5C\u8C5D\u8C7D\u8CA5\u8D7D\u8D7B\u8D79"+ - "\u8DBC\u8DC2\u8DB9\u8DBF\u8DC1\u8ED8\u8EDE\u8EDD"+ - "\u8EDC\u8ED7\u8EE0\u8EE1\u9024\u900B\u9011\u901C"+ - "\u900C\u9021\u90EF\u90EA\u90F0\u90F4\u90F2\u90F3"+ - "\u90D4\u90EB\u90EC\u90E9\u9156\u9158\u915A\u9153"+ - "\u9155\u91EC\u91F4\u91F1\u91F3\u91F8\u91E4\u91F9"+ - "\u91EA\u91EB\u91F7\u91E8\u91EE\u957A\u9586\u9588"+ - "\u967C\u966D\u966B\u9671\u966F\u96BF\u976A\u9804"+ - "\u98E5\u9997\u509B\u5095\u5094\u509E\u508B\u50A3"+ - "\u5083\u508C\u508E\u509D\u5068\u509C\u5092\u5082"+ - "\u5087\u515F\u51D4\u5312\u5311\u53A4\u53A7\u5591"+ - "\u55A8\u55A5\u55AD\u5577\u5645\u55A2\u5593\u5588"+ - "\u558F\u55B5\u5581\u55A3\u5592\u55A4\u557D\u558C"+ - "\u55A6\u557F\u5595\u55A1\u558E\u570C\u5829\u5837"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\u5819\u581E\u5827\u5823\u5828\u57F5"+ - "\u5848\u5825\u581C\u581B\u5833\u583F\u5836\u582E"+ - "\u5839\u5838\u582D\u582C\u583B\u5961\u5AAF\u5A94"+ - "\u5A9F\u5A7A\u5AA2\u5A9E\u5A78\u5AA6\u5A7C\u5AA5"+ - "\u5AAC\u5A95\u5AAE\u5A37\u5A84\u5A8A\u5A97\u5A83"+ - "\u5A8B\u5AA9\u5A7B\u5A7D\u5A8C\u5A9C\u5A8F\u5A93"+ - "\u5A9D\u5BEA\u5BCD\u5BCB\u5BD4\u5BD1\u5BCA\u5BCE"+ - "\u5C0C\u5C30\u5D37\u5D43\u5D6B\u5D41\u5D4B\u5D3F"+ - "\u5D35\u5D51\u5D4E\u5D55\u5D33\u5D3A\u5D52\u5D3D"+ - "\u5D31\u5D59\u5D42\u5D39\u5D49\u5D38\u5D3C\u5D32"+ - "\u5D36\u5D40\u5D45\u5E44\u5E41\u5F58\u5FA6\u5FA5"+ - "\u5FAB\u60C9\u60B9\u60CC\u60E2\u60CE\u60C4\u6114"+ - "\u60F2\u610A\u6116\u6105\u60F5\u6113\u60F8\u60FC"+ - "\u60FE\u60C1\u6103\u6118\u611D\u6110\u60FF\u6104"+ - "\u610B\u624A\u6394\u63B1\u63B0\u63CE\u63E5\u63E8"+ - "\u63EF\u63C3\u649D\u63F3\u63CA\u63E0\u63F6\u63D5"+ - "\u63F2\u63F5\u6461\u63DF\u63BE\u63DD\u63DC\u63C4"+ - "\u63D8\u63D3\u63C2\u63C7\u63CC\u63CB\u63C8\u63F0"+ - "\u63D7\u63D9\u6532\u6567\u656A\u6564\u655C\u6568"+ - "\u6565\u658C\u659D\u659E\u65AE\u65D0\u65D2\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\u667C\u666C\u667B\u6680\u6671\u6679\u666A"+ - "\u6672\u6701\u690C\u68D3\u6904\u68DC\u692A\u68EC"+ - "\u68EA\u68F1\u690F\u68D6\u68F7\u68EB\u68E4\u68F6"+ - "\u6913\u6910\u68F3\u68E1\u6907\u68CC\u6908\u6970"+ - "\u68B4\u6911\u68EF\u68C6\u6914\u68F8\u68D0\u68FD"+ - "\u68FC\u68E8\u690B\u690A\u6917\u68CE\u68C8\u68DD"+ - "\u68DE\u68E6\u68F4\u68D1\u6906\u68D4\u68E9\u6915"+ - "\u6925\u68C7\u6B39\u6B3B\u6B3F\u6B3C\u6B94\u6B97"+ - "\u6B99\u6B95\u6BBD\u6BF0\u6BF2\u6BF3\u6C30\u6DFC"+ - "\u6E46\u6E47\u6E1F\u6E49\u6E88\u6E3C\u6E3D\u6E45"+ - "\u6E62\u6E2B\u6E3F\u6E41\u6E5D\u6E73\u6E1C\u6E33"+ - "\u6E4B\u6E40\u6E51\u6E3B\u6E03\u6E2E\u6E5E\u6E68"+ - "\u6E5C\u6E61\u6E31\u6E28\u6E60\u6E71\u6E6B\u6E39"+ - "\u6E22\u6E30\u6E53\u6E65\u6E27\u6E78\u6E64\u6E77"+ - "\u6E55\u6E79\u6E52\u6E66\u6E35\u6E36\u6E5A\u7120"+ - "\u711E\u712F\u70FB\u712E\u7131\u7123\u7125\u7122"+ - "\u7132\u711F\u7128\u713A\u711B\u724B\u725A\u7288"+ - "\u7289\u7286\u7285\u728B\u7312\u730B\u7330\u7322"+ - "\u7331\u7333\u7327\u7332\u732D\u7326\u7323\u7335"+ - "\u730C\u742E\u742C\u7430\u742B\u7416\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\u741A\u7421\u742D\u7431\u7424\u7423\u741D\u7429"+ - "\u7420\u7432\u74FB\u752F\u756F\u756C\u75E7\u75DA"+ - "\u75E1\u75E6\u75DD\u75DF\u75E4\u75D7\u7695\u7692"+ - "\u76DA\u7746\u7747\u7744\u774D\u7745\u774A\u774E"+ - "\u774B\u774C\u77DE\u77EC\u7860\u7864\u7865\u785C"+ - "\u786D\u7871\u786A\u786E\u7870\u7869\u7868\u785E"+ - "\u7862\u7974\u7973\u7972\u7970\u7A02\u7A0A\u7A03"+ - "\u7A0C\u7A04\u7A99\u7AE6\u7AE4\u7B4A\u7B3B\u7B44"+ - "\u7B48\u7B4C\u7B4E\u7B40\u7B58\u7B45\u7CA2\u7C9E"+ - "\u7CA8\u7CA1\u7D58\u7D6F\u7D63\u7D53\u7D56\u7D67"+ - "\u7D6A\u7D4F\u7D6D\u7D5C\u7D6B\u7D52\u7D54\u7D69"+ - "\u7D51\u7D5F\u7D4E\u7F3E\u7F3F\u7F65\u7F66\u7FA2"+ - "\u7FA0\u7FA1\u7FD7\u8051\u804F\u8050\u80FE\u80D4"+ - "\u8143\u814A\u8152\u814F\u8147\u813D\u814D\u813A"+ - "\u81E6\u81EE\u81F7\u81F8\u81F9\u8204\u823C\u823D"+ - "\u823F\u8275\u833B\u83CF\u83F9\u8423\u83C0\u83E8"+ - "\u8412\u83E7\u83E4\u83FC\u83F6\u8410\u83C6\u83C8"+ - "\u83EB\u83E3\u83BF\u8401\u83DD\u83E5\u83D8\u83FF"+ - "\u83E1\u83CB\u83CE\u83D6\u83F5\u83C9\u8409\u840F"+ - "\u83DE\u8411\u8406\u83C2\u83F3\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u83D5"+ - "\u83FA\u83C7\u83D1\u83EA\u8413\u83C3\u83EC\u83EE"+ - "\u83C4\u83FB\u83D7\u83E2\u841B\u83DB\u83FE\u86D8"+ - "\u86E2\u86E6\u86D3\u86E3\u86DA\u86EA\u86DD\u86EB"+ - "\u86DC\u86EC\u86E9\u86D7\u86E8\u86D1\u8848\u8856"+ - "\u8855\u88BA\u88D7\u88B9\u88B8\u88C0\u88BE\u88B6"+ - "\u88BC\u88B7\u88BD\u88B2\u8901\u88C9\u8995\u8998"+ - "\u8997\u89DD\u89DA\u89DB\u8A4E\u8A4D\u8A39\u8A59"+ - "\u8A40\u8A57\u8A58\u8A44\u8A45\u8A52\u8A48\u8A51"+ - "\u8A4A\u8A4C\u8A4F\u8C5F\u8C81\u8C80\u8CBA\u8CBE"+ - "\u8CB0\u8CB9\u8CB5\u8D84\u8D80\u8D89\u8DD8\u8DD3"+ - "\u8DCD\u8DC7\u8DD6\u8DDC\u8DCF\u8DD5\u8DD9\u8DC8"+ - "\u8DD7\u8DC5\u8EEF\u8EF7\u8EFA\u8EF9\u8EE6\u8EEE"+ - "\u8EE5\u8EF5\u8EE7\u8EE8\u8EF6\u8EEB\u8EF1\u8EEC"+ - "\u8EF4\u8EE9\u902D\u9034\u902F\u9106\u912C\u9104"+ - "\u90FF\u90FC\u9108\u90F9\u90FB\u9101\u9100\u9107"+ - "\u9105\u9103\u9161\u9164\u915F\u9162\u9160\u9201"+ - "\u920A\u9225\u9203\u921A\u9226\u920F\u920C\u9200"+ - "\u9212\u91FF\u91FD\u9206\u9204\u9227\u9202\u921C"+ - "\u9224\u9219\u9217\u9205\u9216\u957B\u958D\u958C"+ - "\u9590\u9687\u967E\u9688\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u9689\u9683"+ - "\u9680\u96C2\u96C8\u96C3\u96F1\u96F0\u976C\u9770"+ - "\u976E\u9807\u98A9\u98EB\u9CE6\u9EF9\u4E83\u4E84"+ - "\u4EB6\u50BD\u50BF\u50C6\u50AE\u50C4\u50CA\u50B4"+ - "\u50C8\u50C2\u50B0\u50C1\u50BA\u50B1\u50CB\u50C9"+ - "\u50B6\u50B8\u51D7\u527A\u5278\u527B\u527C\u55C3"+ - "\u55DB\u55CC\u55D0\u55CB\u55CA\u55DD\u55C0\u55D4"+ - "\u55C4\u55E9\u55BF\u55D2\u558D\u55CF\u55D5\u55E2"+ - "\u55D6\u55C8\u55F2\u55CD\u55D9\u55C2\u5714\u5853"+ - "\u5868\u5864\u584F\u584D\u5849\u586F\u5855\u584E"+ - "\u585D\u5859\u5865\u585B\u583D\u5863\u5871\u58FC"+ - "\u5AC7\u5AC4\u5ACB\u5ABA\u5AB8\u5AB1\u5AB5\u5AB0"+ - "\u5ABF\u5AC8\u5ABB\u5AC6\u5AB7\u5AC0\u5ACA\u5AB4"+ - "\u5AB6\u5ACD\u5AB9\u5A90\u5BD6\u5BD8\u5BD9\u5C1F"+ - "\u5C33\u5D71\u5D63\u5D4A\u5D65\u5D72\u5D6C\u5D5E"+ - "\u5D68\u5D67\u5D62\u5DF0\u5E4F\u5E4E\u5E4A\u5E4D"+ - "\u5E4B\u5EC5\u5ECC\u5EC6\u5ECB\u5EC7\u5F40\u5FAF"+ - "\u5FAD\u60F7\u6149\u614A\u612B\u6145\u6136\u6132"+ - "\u612E\u6146\u612F\u614F\u6129\u6140\u6220\u9168"+ - "\u6223\u6225\u6224\u63C5\u63F1\u63EB\u6410\u6412"+ - "\u6409\u6420\u6424\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u6433\u6443\u641F"+ - "\u6415\u6418\u6439\u6437\u6422\u6423\u640C\u6426"+ - "\u6430\u6428\u6441\u6435\u642F\u640A\u641A\u6440"+ - "\u6425\u6427\u640B\u63E7\u641B\u642E\u6421\u640E"+ - "\u656F\u6592\u65D3\u6686\u668C\u6695\u6690\u668B"+ - "\u668A\u6699\u6694\u6678\u6720\u6966\u695F\u6938"+ - "\u694E\u6962\u6971\u693F\u6945\u696A\u6939\u6942"+ - "\u6957\u6959\u697A\u6948\u6949\u6935\u696C\u6933"+ - "\u693D\u6965\u68F0\u6978\u6934\u6969\u6940\u696F"+ - "\u6944\u6976\u6958\u6941\u6974\u694C\u693B\u694B"+ - "\u6937\u695C\u694F\u6951\u6932\u6952\u692F\u697B"+ - "\u693C\u6B46\u6B45\u6B43\u6B42\u6B48\u6B41\u6B9B"+ - "\uFA0D\u6BFB\u6BFC\u6BF9\u6BF7\u6BF8\u6E9B\u6ED6"+ - "\u6EC8\u6E8F\u6EC0\u6E9F\u6E93\u6E94\u6EA0\u6EB1"+ - "\u6EB9\u6EC6\u6ED2\u6EBD\u6EC1\u6E9E\u6EC9\u6EB7"+ - "\u6EB0\u6ECD\u6EA6\u6ECF\u6EB2\u6EBE\u6EC3\u6EDC"+ - "\u6ED8\u6E99\u6E92\u6E8E\u6E8D\u6EA4\u6EA1\u6EBF"+ - "\u6EB3\u6ED0\u6ECA\u6E97\u6EAE\u6EA3\u7147\u7154"+ - "\u7152\u7163\u7160\u7141\u715D\u7162\u7172\u7178"+ - "\u716A\u7161\u7142\u7158\u7143\u714B\u7170\u715F"+ - "\u7150\u7153\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\u7144\u714D\u715A\u724F"+ - "\u728D\u728C\u7291\u7290\u728E\u733C\u7342\u733B"+ - "\u733A\u7340\u734A\u7349\u7444\u744A\u744B\u7452"+ - "\u7451\u7457\u7440\u744F\u7450\u744E\u7442\u7446"+ - "\u744D\u7454\u74E1\u74FF\u74FE\u74FD\u751D\u7579"+ - "\u7577\u6983\u75EF\u760F\u7603\u75F7\u75FE\u75FC"+ - "\u75F9\u75F8\u7610\u75FB\u75F6\u75ED\u75F5\u75FD"+ - "\u7699\u76B5\u76DD\u7755\u775F\u7760\u7752\u7756"+ - "\u775A\u7769\u7767\u7754\u7759\u776D\u77E0\u7887"+ - "\u789A\u7894\u788F\u7884\u7895\u7885\u7886\u78A1"+ - "\u7883\u7879\u7899\u7880\u7896\u787B\u797C\u7982"+ - "\u797D\u7979\u7A11\u7A18\u7A19\u7A12\u7A17\u7A15"+ - "\u7A22\u7A13\u7A1B\u7A10\u7AA3\u7AA2\u7A9E\u7AEB"+ - "\u7B66\u7B64\u7B6D\u7B74\u7B69\u7B72\u7B65\u7B73"+ - "\u7B71\u7B70\u7B61\u7B78\u7B76\u7B63\u7CB2\u7CB4"+ - "\u7CAF\u7D88\u7D86\u7D80\u7D8D\u7D7F\u7D85\u7D7A"+ - "\u7D8E\u7D7B\u7D83\u7D7C\u7D8C\u7D94\u7D84\u7D7D"+ - "\u7D92\u7F6D\u7F6B\u7F67\u7F68\u7F6C\u7FA6\u7FA5"+ - "\u7FA7\u7FDB\u7FDC\u8021\u8164\u8160\u8177\u815C"+ - "\u8169\u815B\u8162\u8172\u6721\u815E\u8176\u8167"+ - "\u816F\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\u8144\u8161\u821D\u8249\u8244"+ - "\u8240\u8242\u8245\u84F1\u843F\u8456\u8476\u8479"+ - "\u848F\u848D\u8465\u8451\u8440\u8486\u8467\u8430"+ - "\u844D\u847D\u845A\u8459\u8474\u8473\u845D\u8507"+ - "\u845E\u8437\u843A\u8434\u847A\u8443\u8478\u8432"+ - "\u8445\u8429\u83D9\u844B\u842F\u8442\u842D\u845F"+ - "\u8470\u8439\u844E\u844C\u8452\u846F\u84C5\u848E"+ - "\u843B\u8447\u8436\u8433\u8468\u847E\u8444\u842B"+ - "\u8460\u8454\u846E\u8450\u870B\u8704\u86F7\u870C"+ - "\u86FA\u86D6\u86F5\u874D\u86F8\u870E\u8709\u8701"+ - "\u86F6\u870D\u8705\u88D6\u88CB\u88CD\u88CE\u88DE"+ - "\u88DB\u88DA\u88CC\u88D0\u8985\u899B\u89DF\u89E5"+ - "\u89E4\u89E1\u89E0\u89E2\u89DC\u89E6\u8A76\u8A86"+ - "\u8A7F\u8A61\u8A3F\u8A77\u8A82\u8A84\u8A75\u8A83"+ - "\u8A81\u8A74\u8A7A\u8C3C\u8C4B\u8C4A\u8C65\u8C64"+ - "\u8C66\u8C86\u8C84\u8C85\u8CCC\u8D68\u8D69\u8D91"+ - "\u8D8C\u8D8E\u8D8F\u8D8D\u8D93\u8D94\u8D90\u8D92"+ - "\u8DF0\u8DE0\u8DEC\u8DF1\u8DEE\u8DD0\u8DE9\u8DE3"+ - "\u8DE2\u8DE7\u8DF2\u8DEB\u8DF4\u8F06\u8EFF\u8F01"+ - "\u8F00\u8F05\u8F07\u8F08\u8F02\u8F0B\u9052\u903F"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\u9044\u9049\u903D\u9110\u910D\u910F"+ - "\u9111\u9116\u9114\u910B\u910E\u916E\u916F\u9248"+ - "\u9252\u9230\u923A\u9266\u9233\u9265\u925E\u9283"+ - "\u922E\u924A\u9246\u926D\u926C\u924F\u9260\u9267"+ - "\u926F\u9236\u9261\u9270\u9231\u9254\u9263\u9250"+ - "\u9272\u924E\u9253\u924C\u9256\u9232\u959F\u959C"+ - "\u959E\u959B\u9692\u9693\u9691\u9697\u96CE\u96FA"+ - "\u96FD\u96F8\u96F5\u9773\u9777\u9778\u9772\u980F"+ - "\u980D\u980E\u98AC\u98F6\u98F9\u99AF\u99B2\u99B0"+ - "\u99B5\u9AAD\u9AAB\u9B5B\u9CEA\u9CED\u9CE7\u9E80"+ - "\u9EFD\u50E6\u50D4\u50D7\u50E8\u50F3\u50DB\u50EA"+ - "\u50DD\u50E4\u50D3\u50EC\u50F0\u50EF\u50E3\u50E0"; - - private final static String innerIndex4= - "\u51D8\u5280\u5281\u52E9\u52EB\u5330\u53AC\u5627"+ - "\u5615\u560C\u5612\u55FC\u560F\u561C\u5601\u5613"+ - "\u5602\u55FA\u561D\u5604\u55FF\u55F9\u5889\u587C"+ - "\u5890\u5898\u5886\u5881\u587F\u5874\u588B\u587A"+ - "\u5887\u5891\u588E\u5876\u5882\u5888\u587B\u5894"+ - "\u588F\u58FE\u596B\u5ADC\u5AEE\u5AE5\u5AD5\u5AEA"+ - "\u5ADA\u5AED\u5AEB\u5AF3\u5AE2\u5AE0\u5ADB\u5AEC"+ - "\u5ADE\u5ADD\u5AD9\u5AE8\u5ADF\u5B77\u5BE0\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\u5BE3\u5C63\u5D82\u5D80\u5D7D\u5D86\u5D7A"+ - "\u5D81\u5D77\u5D8A\u5D89\u5D88\u5D7E\u5D7C\u5D8D"+ - "\u5D79\u5D7F\u5E58\u5E59\u5E53\u5ED8\u5ED1\u5ED7"+ - "\u5ECE\u5EDC\u5ED5\u5ED9\u5ED2\u5ED4\u5F44\u5F43"+ - "\u5F6F\u5FB6\u612C\u6128\u6141\u615E\u6171\u6173"+ - "\u6152\u6153\u6172\u616C\u6180\u6174\u6154\u617A"+ - "\u615B\u6165\u613B\u616A\u6161\u6156\u6229\u6227"+ - "\u622B\u642B\u644D\u645B\u645D\u6474\u6476\u6472"+ - "\u6473\u647D\u6475\u6466\u64A6\u644E\u6482\u645E"+ - "\u645C\u644B\u6453\u6460\u6450\u647F\u643F\u646C"+ - "\u646B\u6459\u6465\u6477\u6573\u65A0\u66A1\u66A0"+ - "\u669F\u6705\u6704\u6722\u69B1\u69B6\u69C9\u69A0"+ - "\u69CE\u6996\u69B0\u69AC\u69BC\u6991\u6999\u698E"+ - "\u69A7\u698D\u69A9\u69BE\u69AF\u69BF\u69C4\u69BD"+ - "\u69A4\u69D4\u69B9\u69CA\u699A\u69CF\u69B3\u6993"+ - "\u69AA\u69A1\u699E\u69D9\u6997\u6990\u69C2\u69B5"+ - "\u69A5\u69C6\u6B4A\u6B4D\u6B4B\u6B9E\u6B9F\u6BA0"+ - "\u6BC3\u6BC4\u6BFE\u6ECE\u6EF5\u6EF1\u6F03\u6F25"+ - "\u6EF8\u6F37\u6EFB\u6F2E\u6F09\u6F4E\u6F19\u6F1A"+ - "\u6F27\u6F18\u6F3B\u6F12\u6EED\u6F0A\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\u6F36\u6F73\u6EF9\u6EEE\u6F2D\u6F40\u6F30\u6F3C"+ - "\u6F35\u6EEB\u6F07\u6F0E\u6F43\u6F05\u6EFD\u6EF6"+ - "\u6F39\u6F1C\u6EFC\u6F3A\u6F1F\u6F0D\u6F1E\u6F08"+ - "\u6F21\u7187\u7190\u7189\u7180\u7185\u7182\u718F"+ - "\u717B\u7186\u7181\u7197\u7244\u7253\u7297\u7295"+ - "\u7293\u7343\u734D\u7351\u734C\u7462\u7473\u7471"+ - "\u7475\u7472\u7467\u746E\u7500\u7502\u7503\u757D"+ - "\u7590\u7616\u7608\u760C\u7615\u7611\u760A\u7614"+ - "\u76B8\u7781\u777C\u7785\u7782\u776E\u7780\u776F"+ - "\u777E\u7783\u78B2\u78AA\u78B4\u78AD\u78A8\u787E"+ - "\u78AB\u789E\u78A5\u78A0\u78AC\u78A2\u78A4\u7998"+ - "\u798A\u798B\u7996\u7995\u7994\u7993\u7997\u7988"+ - "\u7992\u7990\u7A2B\u7A4A\u7A30\u7A2F\u7A28\u7A26"+ - "\u7AA8\u7AAB\u7AAC\u7AEE\u7B88\u7B9C\u7B8A\u7B91"+ - "\u7B90\u7B96\u7B8D\u7B8C\u7B9B\u7B8E\u7B85\u7B98"+ - "\u5284\u7B99\u7BA4\u7B82\u7CBB\u7CBF\u7CBC\u7CBA"+ - "\u7DA7\u7DB7\u7DC2\u7DA3\u7DAA\u7DC1\u7DC0\u7DC5"+ - "\u7D9D\u7DCE\u7DC4\u7DC6\u7DCB\u7DCC\u7DAF\u7DB9"+ - "\u7D96\u7DBC\u7D9F\u7DA6\u7DAE\u7DA9\u7DA1\u7DC9"+ - "\u7F73\u7FE2\u7FE3\u7FE5\u7FDE\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u8024"+ - "\u805D\u805C\u8189\u8186\u8183\u8187\u818D\u818C"+ - "\u818B\u8215\u8497\u84A4\u84A1\u849F\u84BA\u84CE"+ - "\u84C2\u84AC\u84AE\u84AB\u84B9\u84B4\u84C1\u84CD"+ - "\u84AA\u849A\u84B1\u84D0\u849D\u84A7\u84BB\u84A2"+ - "\u8494\u84C7\u84CC\u849B\u84A9\u84AF\u84A8\u84D6"+ - "\u8498\u84B6\u84CF\u84A0\u84D7\u84D4\u84D2\u84DB"+ - "\u84B0\u8491\u8661\u8733\u8723\u8728\u876B\u8740"+ - "\u872E\u871E\u8721\u8719\u871B\u8743\u872C\u8741"+ - "\u873E\u8746\u8720\u8732\u872A\u872D\u873C\u8712"+ - "\u873A\u8731\u8735\u8742\u8726\u8727\u8738\u8724"+ - "\u871A\u8730\u8711\u88F7\u88E7\u88F1\u88F2\u88FA"+ - "\u88FE\u88EE\u88FC\u88F6\u88FB\u88F0\u88EC\u88EB"+ - "\u899D\u89A1\u899F\u899E\u89E9\u89EB\u89E8\u8AAB"+ - "\u8A99\u8A8B\u8A92\u8A8F\u8A96\u8C3D\u8C68\u8C69"+ - "\u8CD5\u8CCF\u8CD7\u8D96\u8E09\u8E02\u8DFF\u8E0D"+ - "\u8DFD\u8E0A\u8E03\u8E07\u8E06\u8E05\u8DFE\u8E00"+ - "\u8E04\u8F10\u8F11\u8F0E\u8F0D\u9123\u911C\u9120"+ - "\u9122\u911F\u911D\u911A\u9124\u9121\u911B\u917A"+ - "\u9172\u9179\u9173\u92A5\u92A4\u9276\u929B\u927A"+ - "\u92A0\u9294\u92AA\u928D\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u92A6\u929A"+ - "\u92AB\u9279\u9297\u927F\u92A3\u92EE\u928E\u9282"+ - "\u9295\u92A2\u927D\u9288\u92A1\u928A\u9286\u928C"+ - "\u9299\u92A7\u927E\u9287\u92A9\u929D\u928B\u922D"+ - "\u969E\u96A1\u96FF\u9758\u977D\u977A\u977E\u9783"+ - "\u9780\u9782\u977B\u9784\u9781\u977F\u97CE\u97CD"+ - "\u9816\u98AD\u98AE\u9902\u9900\u9907\u999D\u999C"+ - "\u99C3\u99B9\u99BB\u99BA\u99C2\u99BD\u99C7\u9AB1"+ - "\u9AE3\u9AE7\u9B3E\u9B3F\u9B60\u9B61\u9B5F\u9CF1"+ - "\u9CF2\u9CF5\u9EA7\u50FF\u5103\u5130\u50F8\u5106"+ - "\u5107\u50F6\u50FE\u510B\u510C\u50FD\u510A\u528B"+ - "\u528C\u52F1\u52EF\u5648\u5642\u564C\u5635\u5641"+ - "\u564A\u5649\u5646\u5658\u565A\u5640\u5633\u563D"+ - "\u562C\u563E\u5638\u562A\u563A\u571A\u58AB\u589D"+ - "\u58B1\u58A0\u58A3\u58AF\u58AC\u58A5\u58A1\u58FF"+ - "\u5AFF\u5AF4\u5AFD\u5AF7\u5AF6\u5B03\u5AF8\u5B02"+ - "\u5AF9\u5B01\u5B07\u5B05\u5B0F\u5C67\u5D99\u5D97"+ - "\u5D9F\u5D92\u5DA2\u5D93\u5D95\u5DA0\u5D9C\u5DA1"+ - "\u5D9A\u5D9E\u5E69\u5E5D\u5E60\u5E5C\u7DF3\u5EDB"+ - "\u5EDE\u5EE1\u5F49\u5FB2\u618B\u6183\u6179\u61B1"+ - "\u61B0\u61A2\u6189\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u619B\u6193\u61AF"+ - "\u61AD\u619F\u6192\u61AA\u61A1\u618D\u6166\u61B3"+ - "\u622D\u646E\u6470\u6496\u64A0\u6485\u6497\u649C"+ - "\u648F\u648B\u648A\u648C\u64A3\u649F\u6468\u64B1"+ - "\u6498\u6576\u657A\u6579\u657B\u65B2\u65B3\u66B5"+ - "\u66B0\u66A9\u66B2\u66B7\u66AA\u66AF\u6A00\u6A06"+ - "\u6A17\u69E5\u69F8\u6A15\u69F1\u69E4\u6A20\u69FF"+ - "\u69EC\u69E2\u6A1B\u6A1D\u69FE\u6A27\u69F2\u69EE"+ - "\u6A14\u69F7\u69E7\u6A40\u6A08\u69E6\u69FB\u6A0D"+ - "\u69FC\u69EB\u6A09\u6A04\u6A18\u6A25\u6A0F\u69F6"+ - "\u6A26\u6A07\u69F4\u6A16\u6B51\u6BA5\u6BA3\u6BA2"+ - "\u6BA6\u6C01\u6C00\u6BFF\u6C02\u6F41\u6F26\u6F7E"+ - "\u6F87\u6FC6\u6F92\u6F8D\u6F89\u6F8C\u6F62\u6F4F"+ - "\u6F85\u6F5A\u6F96\u6F76\u6F6C\u6F82\u6F55\u6F72"+ - "\u6F52\u6F50\u6F57\u6F94\u6F93\u6F5D\u6F00\u6F61"+ - "\u6F6B\u6F7D\u6F67\u6F90\u6F53\u6F8B\u6F69\u6F7F"+ - "\u6F95\u6F63\u6F77\u6F6A\u6F7B\u71B2\u71AF\u719B"+ - "\u71B0\u71A0\u719A\u71A9\u71B5\u719D\u71A5\u719E"+ - "\u71A4\u71A1\u71AA\u719C\u71A7\u71B3\u7298\u729A"+ - "\u7358\u7352\u735E\u735F\u7360\u735D\u735B\u7361"+ - "\u735A\u7359\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\u7362\u7487\u7489\u748A"+ - "\u7486\u7481\u747D\u7485\u7488\u747C\u7479\u7508"+ - "\u7507\u757E\u7625\u761E\u7619\u761D\u761C\u7623"+ - "\u761A\u7628\u761B\u769C\u769D\u769E\u769B\u778D"+ - "\u778F\u7789\u7788\u78CD\u78BB\u78CF\u78CC\u78D1"+ - "\u78CE\u78D4\u78C8\u78C3\u78C4\u78C9\u799A\u79A1"+ - "\u79A0\u799C\u79A2\u799B\u6B76\u7A39\u7AB2\u7AB4"+ - "\u7AB3\u7BB7\u7BCB\u7BBE\u7BAC\u7BCE\u7BAF\u7BB9"+ - "\u7BCA\u7BB5\u7CC5\u7CC8\u7CCC\u7CCB\u7DF7\u7DDB"+ - "\u7DEA\u7DE7\u7DD7\u7DE1\u7E03\u7DFA\u7DE6\u7DF6"+ - "\u7DF1\u7DF0\u7DEE\u7DDF\u7F76\u7FAC\u7FB0\u7FAD"+ - "\u7FED\u7FEB\u7FEA\u7FEC\u7FE6\u7FE8\u8064\u8067"+ - "\u81A3\u819F\u819E\u8195\u81A2\u8199\u8197\u8216"+ - "\u824F\u8253\u8252\u8250\u824E\u8251\u8524\u853B"+ - "\u850F\u8500\u8529\u850E\u8509\u850D\u851F\u850A"+ - "\u8527\u851C\u84FB\u852B\u84FA\u8508\u850C\u84F4"+ - "\u852A\u84F2\u8515\u84F7\u84EB\u84F3\u84FC\u8512"+ - "\u84EA\u84E9\u8516\u84FE\u8528\u851D\u852E\u8502"+ - "\u84FD\u851E\u84F6\u8531\u8526\u84E7\u84E8\u84F0"+ - "\u84EF\u84F9\u8518\u8520\u8530\u850B\u8519\u852F"+ - "\u8662\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\u8756\u8763\u8764\u8777\u87E1"+ - "\u8773\u8758\u8754\u875B\u8752\u8761\u875A\u8751"+ - "\u875E\u876D\u876A\u8750\u874E\u875F\u875D\u876F"+ - "\u876C\u877A\u876E\u875C\u8765\u874F\u877B\u8775"+ - "\u8762\u8767\u8769\u885A\u8905\u890C\u8914\u890B"+ - "\u8917\u8918\u8919\u8906\u8916\u8911\u890E\u8909"+ - "\u89A2\u89A4\u89A3\u89ED\u89F0\u89EC\u8ACF\u8AC6"+ - "\u8AB8\u8AD3\u8AD1\u8AD4\u8AD5\u8ABB\u8AD7\u8ABE"+ - "\u8AC0\u8AC5\u8AD8\u8AC3\u8ABA\u8ABD\u8AD9\u8C3E"+ - "\u8C4D\u8C8F\u8CE5\u8CDF\u8CD9\u8CE8\u8CDA\u8CDD"+ - "\u8CE7\u8DA0\u8D9C\u8DA1\u8D9B\u8E20\u8E23\u8E25"+ - "\u8E24\u8E2E\u8E15\u8E1B\u8E16\u8E11\u8E19\u8E26"+ - "\u8E27\u8E14\u8E12\u8E18\u8E13\u8E1C\u8E17\u8E1A"+ - "\u8F2C\u8F24\u8F18\u8F1A\u8F20\u8F23\u8F16\u8F17"+ - "\u9073\u9070\u906F\u9067\u906B\u912F\u912B\u9129"+ - "\u912A\u9132\u9126\u912E\u9185\u9186\u918A\u9181"+ - "\u9182\u9184\u9180\u92D0\u92C3\u92C4\u92C0\u92D9"+ - "\u92B6\u92CF\u92F1\u92DF\u92D8\u92E9\u92D7\u92DD"+ - "\u92CC\u92EF\u92C2\u92E8\u92CA\u92C8\u92CE\u92E6"+ - "\u92CD\u92D5\u92C9\u92E0\u92DE\u92E7\u92D1\u92D3"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\u92B5\u92E1\u92C6\u92B4\u957C\u95AC"+ - "\u95AB\u95AE\u95B0\u96A4\u96A2\u96D3\u9705\u9708"+ - "\u9702\u975A\u978A\u978E\u9788\u97D0\u97CF\u981E"+ - "\u981D\u9826\u9829\u9828\u9820\u981B\u9827\u98B2"+ - "\u9908\u98FA\u9911\u9914\u9916\u9917\u9915\u99DC"+ - "\u99CD\u99CF\u99D3\u99D4\u99CE\u99C9\u99D6\u99D8"+ - "\u99CB\u99D7\u99CC\u9AB3\u9AEC\u9AEB\u9AF3\u9AF2"+ - "\u9AF1\u9B46\u9B43\u9B67\u9B74\u9B71\u9B66\u9B76"+ - "\u9B75\u9B70\u9B68\u9B64\u9B6C\u9CFC\u9CFA\u9CFD"+ - "\u9CFF\u9CF7\u9D07\u9D00\u9CF9\u9CFB\u9D08\u9D05"+ - "\u9D04\u9E83\u9ED3\u9F0F\u9F10\u511C\u5113\u5117"+ - "\u511A\u5111\u51DE\u5334\u53E1\u5670\u5660\u566E"+ - "\u5673\u5666\u5663\u566D\u5672\u565E\u5677\u571C"+ - "\u571B\u58C8\u58BD\u58C9\u58BF\u58BA\u58C2\u58BC"+ - "\u58C6\u5B17\u5B19\u5B1B\u5B21\u5B14\u5B13\u5B10"+ - "\u5B16\u5B28\u5B1A\u5B20\u5B1E\u5BEF\u5DAC\u5DB1"+ - "\u5DA9\u5DA7\u5DB5\u5DB0\u5DAE\u5DAA\u5DA8\u5DB2"+ - "\u5DAD\u5DAF\u5DB4\u5E67\u5E68\u5E66\u5E6F\u5EE9"+ - "\u5EE7\u5EE6\u5EE8\u5EE5\u5F4B\u5FBC\u619D\u61A8"+ - "\u6196\u61C5\u61B4\u61C6\u61C1\u61CC\u61BA\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\u61BF\u61B8\u618C\u64D7\u64D6\u64D0\u64CF"+ - "\u64C9\u64BD\u6489\u64C3\u64DB\u64F3\u64D9\u6533"+ - "\u657F\u657C\u65A2\u66C8\u66BE\u66C0\u66CA\u66CB"+ - "\u66CF\u66BD\u66BB\u66BA\u66CC\u6723\u6A34\u6A66"+ - "\u6A49\u6A67\u6A32\u6A68\u6A3E\u6A5D\u6A6D\u6A76"+ - "\u6A5B\u6A51\u6A28\u6A5A\u6A3B\u6A3F\u6A41\u6A6A"+ - "\u6A64\u6A50\u6A4F\u6A54\u6A6F\u6A69\u6A60\u6A3C"+ - "\u6A5E\u6A56\u6A55\u6A4D\u6A4E\u6A46\u6B55\u6B54"+ - "\u6B56\u6BA7\u6BAA\u6BAB\u6BC8\u6BC7\u6C04\u6C03"+ - "\u6C06\u6FAD\u6FCB\u6FA3\u6FC7\u6FBC\u6FCE\u6FC8"+ - "\u6F5E\u6FC4\u6FBD\u6F9E\u6FCA\u6FA8\u7004\u6FA5"+ - "\u6FAE\u6FBA\u6FAC\u6FAA\u6FCF\u6FBF\u6FB8\u6FA2"+ - "\u6FC9\u6FAB\u6FCD\u6FAF\u6FB2\u6FB0\u71C5\u71C2"+ - "\u71BF\u71B8\u71D6\u71C0\u71C1\u71CB\u71D4\u71CA"+ - "\u71C7\u71CF\u71BD\u71D8\u71BC\u71C6\u71DA\u71DB"+ - "\u729D\u729E\u7369\u7366\u7367\u736C\u7365\u736B"+ - "\u736A\u747F\u749A\u74A0\u7494\u7492\u7495\u74A1"+ - "\u750B\u7580\u762F\u762D\u7631\u763D\u7633\u763C"+ - "\u7635\u7632\u7630\u76BB\u76E6\u779A\u779D\u77A1"+ - "\u779C\u779B\u77A2\u77A3\u7795\u7799\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\u7797\u78DD\u78E9\u78E5\u78EA\u78DE\u78E3\u78DB"+ - "\u78E1\u78E2\u78ED\u78DF\u78E0\u79A4\u7A44\u7A48"+ - "\u7A47\u7AB6\u7AB8\u7AB5\u7AB1\u7AB7\u7BDE\u7BE3"+ - "\u7BE7\u7BDD\u7BD5\u7BE5\u7BDA\u7BE8\u7BF9\u7BD4"+ - "\u7BEA\u7BE2\u7BDC\u7BEB\u7BD8\u7BDF\u7CD2\u7CD4"+ - "\u7CD7\u7CD0\u7CD1\u7E12\u7E21\u7E17\u7E0C\u7E1F"+ - "\u7E20\u7E13\u7E0E\u7E1C\u7E15\u7E1A\u7E22\u7E0B"+ - "\u7E0F\u7E16\u7E0D\u7E14\u7E25\u7E24\u7F43\u7F7B"+ - "\u7F7C\u7F7A\u7FB1\u7FEF\u802A\u8029\u806C\u81B1"+ - "\u81A6\u81AE\u81B9\u81B5\u81AB\u81B0\u81AC\u81B4"+ - "\u81B2\u81B7\u81A7\u81F2\u8255\u8256\u8257\u8556"+ - "\u8545\u856B\u854D\u8553\u8561\u8558\u8540\u8546"+ - "\u8564\u8541\u8562\u8544\u8551\u8547\u8563\u853E"+ - "\u855B\u8571\u854E\u856E\u8575\u8555\u8567\u8560"+ - "\u858C\u8566\u855D\u8554\u8565\u856C\u8663\u8665"+ - "\u8664\u879B\u878F\u8797\u8793\u8792\u8788\u8781"+ - "\u8796\u8798\u8779\u8787\u87A3\u8785\u8790\u8791"+ - "\u879D\u8784\u8794\u879C\u879A\u8789\u891E\u8926"+ - "\u8930\u892D\u892E\u8927\u8931\u8922\u8929\u8923"+ - "\u892F\u892C\u891F\u89F1\u8AE0\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u8AE2"+ - "\u8AF2\u8AF4\u8AF5\u8ADD\u8B14\u8AE4\u8ADF\u8AF0"+ - "\u8AC8\u8ADE\u8AE1\u8AE8\u8AFF\u8AEF\u8AFB\u8C91"+ - "\u8C92\u8C90\u8CF5\u8CEE\u8CF1\u8CF0\u8CF3\u8D6C"+ - "\u8D6E\u8DA5\u8DA7\u8E33\u8E3E\u8E38\u8E40\u8E45"+ - "\u8E36\u8E3C\u8E3D\u8E41\u8E30\u8E3F\u8EBD\u8F36"+ - "\u8F2E\u8F35\u8F32\u8F39\u8F37\u8F34\u9076\u9079"+ - "\u907B\u9086\u90FA\u9133\u9135\u9136\u9193\u9190"+ - "\u9191\u918D\u918F\u9327\u931E\u9308\u931F\u9306"+ - "\u930F\u937A\u9338\u933C\u931B\u9323\u9312\u9301"+ - "\u9346\u932D\u930E\u930D\u92CB\u931D\u92FA\u9325"+ - "\u9313\u92F9\u92F7\u9334\u9302\u9324\u92FF\u9329"+ - "\u9339\u9335\u932A\u9314\u930C\u930B\u92FE\u9309"+ - "\u9300\u92FB\u9316\u95BC\u95CD\u95BE\u95B9\u95BA"+ - "\u95B6\u95BF\u95B5\u95BD\u96A9\u96D4\u970B\u9712"+ - "\u9710\u9799\u9797\u9794\u97F0\u97F8\u9835\u982F"+ - "\u9832\u9924\u991F\u9927\u9929\u999E\u99EE\u99EC"+ - "\u99E5\u99E4\u99F0\u99E3\u99EA\u99E9\u99E7\u9AB9"+ - "\u9ABF\u9AB4\u9ABB\u9AF6\u9AFA\u9AF9\u9AF7\u9B33"+ - "\u9B80\u9B85\u9B87\u9B7C\u9B7E\u9B7B\u9B82\u9B93"+ - "\u9B92\u9B90\u9B7A\u9B95\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u9B7D\u9B88"+ - "\u9D25\u9D17\u9D20\u9D1E\u9D14\u9D29\u9D1D\u9D18"+ - "\u9D22\u9D10\u9D19\u9D1F\u9E88\u9E86\u9E87\u9EAE"+ - "\u9EAD\u9ED5\u9ED6\u9EFA\u9F12\u9F3D\u5126\u5125"+ - "\u5122\u5124\u5120\u5129\u52F4\u5693\u568C\u568D"+ - "\u5686\u5684\u5683\u567E\u5682\u567F\u5681\u58D6"+ - "\u58D4\u58CF\u58D2\u5B2D\u5B25\u5B32\u5B23\u5B2C"+ - "\u5B27\u5B26\u5B2F\u5B2E\u5B7B\u5BF1\u5BF2\u5DB7"+ - "\u5E6C\u5E6A\u5FBE\u5FBB\u61C3\u61B5\u61BC\u61E7"+ - "\u61E0\u61E5\u61E4\u61E8\u61DE\u64EF\u64E9\u64E3"+ - "\u64EB\u64E4\u64E8\u6581\u6580\u65B6\u65DA\u66D2"+ - "\u6A8D\u6A96\u6A81\u6AA5\u6A89\u6A9F\u6A9B\u6AA1"+ - "\u6A9E\u6A87\u6A93\u6A8E\u6A95\u6A83\u6AA8\u6AA4"+ - "\u6A91\u6A7F\u6AA6\u6A9A\u6A85\u6A8C\u6A92\u6B5B"+ - "\u6BAD\u6C09\u6FCC\u6FA9\u6FF4\u6FD4\u6FE3\u6FDC"+ - "\u6FED\u6FE7\u6FE6\u6FDE\u6FF2\u6FDD\u6FE2\u6FE8"+ - "\u71E1\u71F1\u71E8\u71F2\u71E4\u71F0\u71E2\u7373"+ - "\u736E\u736F\u7497\u74B2\u74AB\u7490\u74AA\u74AD"+ - "\u74B1\u74A5\u74AF\u7510\u7511\u7512\u750F\u7584"+ - "\u7643\u7648\u7649\u7647\u76A4\u76E9\u77B5\u77AB"+ - "\u77B2\u77B7\u77B6\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u77B4\u77B1\u77A8"+ - "\u77F0\u78F3\u78FD\u7902\u78FB\u78FC\u78F2\u7905"+ - "\u78F9\u78FE\u7904\u79AB\u79A8\u7A5C\u7A5B\u7A56"+ - "\u7A58\u7A54\u7A5A\u7ABE\u7AC0\u7AC1\u7C05\u7C0F"+ - "\u7BF2\u7C00\u7BFF\u7BFB\u7C0E\u7BF4\u7C0B\u7BF3"+ - "\u7C02\u7C09\u7C03\u7C01\u7BF8\u7BFD\u7C06\u7BF0"+ - "\u7BF1\u7C10\u7C0A\u7CE8\u7E2D\u7E3C\u7E42\u7E33"+ - "\u9848\u7E38\u7E2A\u7E49\u7E40\u7E47\u7E29\u7E4C"+ - "\u7E30\u7E3B\u7E36\u7E44\u7E3A\u7F45\u7F7F\u7F7E"+ - "\u7F7D\u7FF4\u7FF2\u802C\u81BB\u81C4\u81CC\u81CA"+ - "\u81C5\u81C7\u81BC\u81E9\u825B\u825A\u825C\u8583"+ - "\u8580\u858F\u85A7\u8595\u85A0\u858B\u85A3\u857B"+ - "\u85A4\u859A\u859E\u8577\u857C\u8589\u85A1\u857A"+ - "\u8578\u8557\u858E\u8596\u8586\u858D\u8599\u859D"+ - "\u8581\u85A2\u8582\u8588\u8585\u8579\u8576\u8598"+ - "\u8590\u859F\u8668\u87BE\u87AA\u87AD\u87C5\u87B0"+ - "\u87AC\u87B9\u87B5\u87BC\u87AE\u87C9\u87C3\u87C2"+ - "\u87CC\u87B7\u87AF\u87C4\u87CA\u87B4\u87B6\u87BF"+ - "\u87B8\u87BD\u87DE\u87B2\u8935\u8933\u893C\u893E"+ - "\u8941\u8952\u8937\u8942\u89AD\u89AF\u89AE\u89F2"+ - "\u89F3\u8B1E\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\u8B18\u8B16\u8B11\u8B05"+ - "\u8B0B\u8B22\u8B0F\u8B12\u8B15\u8B07\u8B0D\u8B08"+ - "\u8B06\u8B1C\u8B13\u8B1A\u8C4F\u8C70\u8C72\u8C71"+ - "\u8C6F\u8C95\u8C94\u8CF9\u8D6F\u8E4E\u8E4D\u8E53"+ - "\u8E50\u8E4C\u8E47\u8F43\u8F40\u9085\u907E\u9138"+ - "\u919A\u91A2\u919B\u9199\u919F\u91A1\u919D\u91A0"+ - "\u93A1\u9383\u93AF\u9364\u9356\u9347\u937C\u9358"+ - "\u935C\u9376\u9349\u9350\u9351\u9360\u936D\u938F"+ - "\u934C\u936A\u9379\u9357\u9355\u9352\u934F\u9371"+ - "\u9377\u937B\u9361\u935E\u9363\u9367\u9380\u934E"+ - "\u9359\u95C7\u95C0\u95C9\u95C3\u95C5\u95B7\u96AE"+ - "\u96B0\u96AC\u9720\u971F\u9718\u971D\u9719\u979A"+ - "\u97A1\u979C\u979E\u979D\u97D5\u97D4\u97F1\u9841"+ - "\u9844\u984A\u9849\u9845\u9843\u9925\u992B\u992C"+ - "\u992A\u9933\u9932\u992F\u992D\u9931\u9930\u9998"+ - "\u99A3\u99A1\u9A02\u99FA\u99F4\u99F7\u99F9\u99F8"+ - "\u99F6\u99FB\u99FD\u99FE\u99FC\u9A03\u9ABE\u9AFE"+ - "\u9AFD\u9B01\u9AFC\u9B48\u9B9A\u9BA8\u9B9E\u9B9B"+ - "\u9BA6\u9BA1\u9BA5\u9BA4\u9B86\u9BA2\u9BA0\u9BAF"+ - "\u9D33\u9D41\u9D67\u9D36\u9D2E\u9D2F\u9D31\u9D38"+ - "\u9D30\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\u9D45\u9D42\u9D43\u9D3E\u9D37"+ - "\u9D40\u9D3D\u7FF5\u9D2D\u9E8A\u9E89\u9E8D\u9EB0"+ - "\u9EC8\u9EDA\u9EFB\u9EFF\u9F24\u9F23\u9F22\u9F54"+ - "\u9FA0\u5131\u512D\u512E\u5698\u569C\u5697\u569A"+ - "\u569D\u5699\u5970\u5B3C\u5C69\u5C6A\u5DC0\u5E6D"+ - "\u5E6E\u61D8\u61DF\u61ED\u61EE\u61F1\u61EA\u61F0"+ - "\u61EB\u61D6\u61E9\u64FF\u6504\u64FD\u64F8\u6501"+ - "\u6503\u64FC\u6594\u65DB\u66DA\u66DB\u66D8\u6AC5"+ - "\u6AB9\u6ABD\u6AE1\u6AC6\u6ABA\u6AB6\u6AB7\u6AC7"+ - "\u6AB4\u6AAD\u6B5E\u6BC9\u6C0B\u7007\u700C\u700D"+ - "\u7001\u7005\u7014\u700E\u6FFF\u7000\u6FFB\u7026"+ - "\u6FFC\u6FF7\u700A\u7201\u71FF\u71F9\u7203\u71FD"+ - "\u7376\u74B8\u74C0\u74B5\u74C1\u74BE\u74B6\u74BB"+ - "\u74C2\u7514\u7513\u765C\u7664\u7659\u7650\u7653"+ - "\u7657\u765A\u76A6\u76BD\u76EC\u77C2\u77BA\u78FF"+ - "\u790C\u7913\u7914\u7909\u7910\u7912\u7911\u79AD"+ - "\u79AC\u7A5F\u7C1C\u7C29\u7C19\u7C20\u7C1F\u7C2D"+ - "\u7C1D\u7C26\u7C28\u7C22\u7C25\u7C30\u7E5C\u7E50"+ - "\u7E56\u7E63\u7E58\u7E62\u7E5F\u7E51\u7E60\u7E57"+ - "\u7E53\u7FB5\u7FB3\u7FF7\u7FF8\u8075\u81D1\u81D2"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\u81D0\u825F\u825E\u85B4\u85C6\u85C0"+ - "\u85C3\u85C2\u85B3\u85B5\u85BD\u85C7\u85C4\u85BF"+ - "\u85CB\u85CE\u85C8\u85C5\u85B1\u85B6\u85D2\u8624"+ - "\u85B8\u85B7\u85BE\u8669\u87E7\u87E6\u87E2\u87DB"+ - "\u87EB\u87EA\u87E5\u87DF\u87F3\u87E4\u87D4\u87DC"+ - "\u87D3\u87ED\u87D8\u87E3\u87A4\u87D7\u87D9\u8801"+ - "\u87F4\u87E8\u87DD\u8953\u894B\u894F\u894C\u8946"+ - "\u8950\u8951\u8949\u8B2A\u8B27\u8B23\u8B33\u8B30"+ - "\u8B35\u8B47\u8B2F\u8B3C\u8B3E\u8B31\u8B25\u8B37"+ - "\u8B26\u8B36\u8B2E\u8B24\u8B3B\u8B3D\u8B3A\u8C42"+ - "\u8C75\u8C99\u8C98\u8C97\u8CFE\u8D04\u8D02\u8D00"+ - "\u8E5C\u8E62\u8E60\u8E57\u8E56\u8E5E\u8E65\u8E67"; - - private final static String innerIndex5= - "\u8E5B\u8E5A\u8E61\u8E5D\u8E69\u8E54\u8F46\u8F47"+ - "\u8F48\u8F4B\u9128\u913A\u913B\u913E\u91A8\u91A5"+ - "\u91A7\u91AF\u91AA\u93B5\u938C\u9392\u93B7\u939B"+ - "\u939D\u9389\u93A7\u938E\u93AA\u939E\u93A6\u9395"+ - "\u9388\u9399\u939F\u938D\u93B1\u9391\u93B2\u93A4"+ - "\u93A8\u93B4\u93A3\u93A5\u95D2\u95D3\u95D1\u96B3"+ - "\u96D7\u96DA\u5DC2\u96DF\u96D8\u96DD\u9723\u9722"+ - "\u9725\u97AC\u97AE\u97A8\u97AB\u97A4\u97AA\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\u97A2\u97A5\u97D7\u97D9\u97D6\u97D8\u97FA"+ - "\u9850\u9851\u9852\u98B8\u9941\u993C\u993A\u9A0F"+ - "\u9A0B\u9A09\u9A0D\u9A04\u9A11\u9A0A\u9A05\u9A07"+ - "\u9A06\u9AC0\u9ADC\u9B08\u9B04\u9B05\u9B29\u9B35"+ - "\u9B4A\u9B4C\u9B4B\u9BC7\u9BC6\u9BC3\u9BBF\u9BC1"+ - "\u9BB5\u9BB8\u9BD3\u9BB6\u9BC4\u9BB9\u9BBD\u9D5C"+ - "\u9D53\u9D4F\u9D4A\u9D5B\u9D4B\u9D59\u9D56\u9D4C"+ - "\u9D57\u9D52\u9D54\u9D5F\u9D58\u9D5A\u9E8E\u9E8C"+ - "\u9EDF\u9F01\u9F00\u9F16\u9F25\u9F2B\u9F2A\u9F29"+ - "\u9F28\u9F4C\u9F55\u5134\u5135\u5296\u52F7\u53B4"+ - "\u56AB\u56AD\u56A6\u56A7\u56AA\u56AC\u58DA\u58DD"+ - "\u58DB\u5912\u5B3D\u5B3E\u5B3F\u5DC3\u5E70\u5FBF"+ - "\u61FB\u6507\u6510\u650D\u6509\u650C\u650E\u6584"+ - "\u65DE\u65DD\u66DE\u6AE7\u6AE0\u6ACC\u6AD1\u6AD9"+ - "\u6ACB\u6ADF\u6ADC\u6AD0\u6AEB\u6ACF\u6ACD\u6ADE"+ - "\u6B60\u6BB0\u6C0C\u7019\u7027\u7020\u7016\u702B"+ - "\u7021\u7022\u7023\u7029\u7017\u7024\u701C\u702A"+ - "\u720C\u720A\u7207\u7202\u7205\u72A5\u72A6\u72A4"+ - "\u72A3\u72A1\u74CB\u74C5\u74B7\u74C3\u7516\u7660"+ - "\u77C9\u77CA\u77C4\u77F1\u791D\u791B\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\u7921\u791C\u7917\u791E\u79B0\u7A67\u7A68\u7C33"+ - "\u7C3C\u7C39\u7C2C\u7C3B\u7CEC\u7CEA\u7E76\u7E75"+ - "\u7E78\u7E70\u7E77\u7E6F\u7E7A\u7E72\u7E74\u7E68"+ - "\u7F4B\u7F4A\u7F83\u7F86\u7FB7\u7FFD\u7FFE\u8078"+ - "\u81D7\u81D5\u8264\u8261\u8263\u85EB\u85F1\u85ED"+ - "\u85D9\u85E1\u85E8\u85DA\u85D7\u85EC\u85F2\u85F8"+ - "\u85D8\u85DF\u85E3\u85DC\u85D1\u85F0\u85E6\u85EF"+ - "\u85DE\u85E2\u8800\u87FA\u8803\u87F6\u87F7\u8809"+ - "\u880C\u880B\u8806\u87FC\u8808\u87FF\u880A\u8802"+ - "\u8962\u895A\u895B\u8957\u8961\u895C\u8958\u895D"+ - "\u8959\u8988\u89B7\u89B6\u89F6\u8B50\u8B48\u8B4A"+ - "\u8B40\u8B53\u8B56\u8B54\u8B4B\u8B55\u8B51\u8B42"+ - "\u8B52\u8B57\u8C43\u8C77\u8C76\u8C9A\u8D06\u8D07"+ - "\u8D09\u8DAC\u8DAA\u8DAD\u8DAB\u8E6D\u8E78\u8E73"+ - "\u8E6A\u8E6F\u8E7B\u8EC2\u8F52\u8F51\u8F4F\u8F50"+ - "\u8F53\u8FB4\u9140\u913F\u91B0\u91AD\u93DE\u93C7"+ - "\u93CF\u93C2\u93DA\u93D0\u93F9\u93EC\u93CC\u93D9"+ - "\u93A9\u93E6\u93CA\u93D4\u93EE\u93E3\u93D5\u93C4"+ - "\u93CE\u93C0\u93D2\u93E7\u957D\u95DA\u95DB\u96E1"+ - "\u9729\u972B\u972C\u9728\u9726\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u97B3"+ - "\u97B7\u97B6\u97DD\u97DE\u97DF\u985C\u9859\u985D"+ - "\u9857\u98BF\u98BD\u98BB\u98BE\u9948\u9947\u9943"+ - "\u99A6\u99A7\u9A1A\u9A15\u9A25\u9A1D\u9A24\u9A1B"+ - "\u9A22\u9A20\u9A27\u9A23\u9A1E\u9A1C\u9A14\u9AC2"+ - "\u9B0B\u9B0A\u9B0E\u9B0C\u9B37\u9BEA\u9BEB\u9BE0"+ - "\u9BDE\u9BE4\u9BE6\u9BE2\u9BF0\u9BD4\u9BD7\u9BEC"+ - "\u9BDC\u9BD9\u9BE5\u9BD5\u9BE1\u9BDA\u9D77\u9D81"+ - "\u9D8A\u9D84\u9D88\u9D71\u9D80\u9D78\u9D86\u9D8B"+ - "\u9D8C\u9D7D\u9D6B\u9D74\u9D75\u9D70\u9D69\u9D85"+ - "\u9D73\u9D7B\u9D82\u9D6F\u9D79\u9D7F\u9D87\u9D68"+ - "\u9E94\u9E91\u9EC0\u9EFC\u9F2D\u9F40\u9F41\u9F4D"+ - "\u9F56\u9F57\u9F58\u5337\u56B2\u56B5\u56B3\u58E3"+ - "\u5B45\u5DC6\u5DC7\u5EEE\u5EEF\u5FC0\u5FC1\u61F9"+ - "\u6517\u6516\u6515\u6513\u65DF\u66E8\u66E3\u66E4"+ - "\u6AF3\u6AF0\u6AEA\u6AE8\u6AF9\u6AF1\u6AEE\u6AEF"+ - "\u703C\u7035\u702F\u7037\u7034\u7031\u7042\u7038"+ - "\u703F\u703A\u7039\u7040\u703B\u7033\u7041\u7213"+ - "\u7214\u72A8\u737D\u737C\u74BA\u76AB\u76AA\u76BE"+ - "\u76ED\u77CC\u77CE\u77CF\u77CD\u77F2\u7925\u7923"+ - "\u7927\u7928\u7924\u7929\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u79B2\u7A6E"+ - "\u7A6C\u7A6D\u7AF7\u7C49\u7C48\u7C4A\u7C47\u7C45"+ - "\u7CEE\u7E7B\u7E7E\u7E81\u7E80\u7FBA\u7FFF\u8079"+ - "\u81DB\u81D9\u820B\u8268\u8269\u8622\u85FF\u8601"+ - "\u85FE\u861B\u8600\u85F6\u8604\u8609\u8605\u860C"+ - "\u85FD\u8819\u8810\u8811\u8817\u8813\u8816\u8963"+ - "\u8966\u89B9\u89F7\u8B60\u8B6A\u8B5D\u8B68\u8B63"+ - "\u8B65\u8B67\u8B6D\u8DAE\u8E86\u8E88\u8E84\u8F59"+ - "\u8F56\u8F57\u8F55\u8F58\u8F5A\u908D\u9143\u9141"+ - "\u91B7\u91B5\u91B2\u91B3\u940B\u9413\u93FB\u9420"+ - "\u940F\u9414\u93FE\u9415\u9410\u9428\u9419\u940D"+ - "\u93F5\u9400\u93F7\u9407\u940E\u9416\u9412\u93FA"+ - "\u9409\u93F8\u940A\u93FF\u93FC\u940C\u93F6\u9411"+ - "\u9406\u95DE\u95E0\u95DF\u972E\u972F\u97B9\u97BB"+ - "\u97FD\u97FE\u9860\u9862\u9863\u985F\u98C1\u98C2"+ - "\u9950\u994E\u9959\u994C\u994B\u9953\u9A32\u9A34"+ - "\u9A31\u9A2C\u9A2A\u9A36\u9A29\u9A2E\u9A38\u9A2D"+ - "\u9AC7\u9ACA\u9AC6\u9B10\u9B12\u9B11\u9C0B\u9C08"+ - "\u9BF7\u9C05\u9C12\u9BF8\u9C40\u9C07\u9C0E\u9C06"+ - "\u9C17\u9C14\u9C09\u9D9F\u9D99\u9DA4\u9D9D\u9D92"+ - "\u9D98\u9D90\u9D9B\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u9DA0\u9D94\u9D9C"+ - "\u9DAA\u9D97\u9DA1\u9D9A\u9DA2\u9DA8\u9D9E\u9DA3"+ - "\u9DBF\u9DA9\u9D96\u9DA6\u9DA7\u9E99\u9E9B\u9E9A"+ - "\u9EE5\u9EE4\u9EE7\u9EE6\u9F30\u9F2E\u9F5B\u9F60"+ - "\u9F5E\u9F5D\u9F59\u9F91\u513A\u5139\u5298\u5297"+ - "\u56C3\u56BD\u56BE\u5B48\u5B47\u5DCB\u5DCF\u5EF1"+ - "\u61FD\u651B\u6B02\u6AFC\u6B03\u6AF8\u6B00\u7043"+ - "\u7044\u704A\u7048\u7049\u7045\u7046\u721D\u721A"+ - "\u7219\u737E\u7517\u766A\u77D0\u792D\u7931\u792F"+ - "\u7C54\u7C53\u7CF2\u7E8A\u7E87\u7E88\u7E8B\u7E86"+ - "\u7E8D\u7F4D\u7FBB\u8030\u81DD\u8618\u862A\u8626"+ - "\u861F\u8623\u861C\u8619\u8627\u862E\u8621\u8620"+ - "\u8629\u861E\u8625\u8829\u881D\u881B\u8820\u8824"+ - "\u881C\u882B\u884A\u896D\u8969\u896E\u896B\u89FA"+ - "\u8B79\u8B78\u8B45\u8B7A\u8B7B\u8D10\u8D14\u8DAF"+ - "\u8E8E\u8E8C\u8F5E\u8F5B\u8F5D\u9146\u9144\u9145"+ - "\u91B9\u943F\u943B\u9436\u9429\u943D\u943C\u9430"+ - "\u9439\u942A\u9437\u942C\u9440\u9431\u95E5\u95E4"+ - "\u95E3\u9735\u973A\u97BF\u97E1\u9864\u98C9\u98C6"+ - "\u98C0\u9958\u9956\u9A39\u9A3D\u9A46\u9A44\u9A42"+ - "\u9A41\u9A3A\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\u9A3F\u9ACD\u9B15\u9B17"+ - "\u9B18\u9B16\u9B3A\u9B52\u9C2B\u9C1D\u9C1C\u9C2C"+ - "\u9C23\u9C28\u9C29\u9C24\u9C21\u9DB7\u9DB6\u9DBC"+ - "\u9DC1\u9DC7\u9DCA\u9DCF\u9DBE\u9DC5\u9DC3\u9DBB"+ - "\u9DB5\u9DCE\u9DB9\u9DBA\u9DAC\u9DC8\u9DB1\u9DAD"+ - "\u9DCC\u9DB3\u9DCD\u9DB2\u9E7A\u9E9C\u9EEB\u9EEE"+ - "\u9EED\u9F1B\u9F18\u9F1A\u9F31\u9F4E\u9F65\u9F64"+ - "\u9F92\u4EB9\u56C6\u56C5\u56CB\u5971\u5B4B\u5B4C"+ - "\u5DD5\u5DD1\u5EF2\u6521\u6520\u6526\u6522\u6B0B"+ - "\u6B08\u6B09\u6C0D\u7055\u7056\u7057\u7052\u721E"+ - "\u721F\u72A9\u737F\u74D8\u74D5\u74D9\u74D7\u766D"+ - "\u76AD\u7935\u79B4\u7A70\u7A71\u7C57\u7C5C\u7C59"+ - "\u7C5B\u7C5A\u7CF4\u7CF1\u7E91\u7F4F\u7F87\u81DE"+ - "\u826B\u8634\u8635\u8633\u862C\u8632\u8636\u882C"+ - "\u8828\u8826\u882A\u8825\u8971\u89BF\u89BE\u89FB"+ - "\u8B7E\u8B84\u8B82\u8B86\u8B85\u8B7F\u8D15\u8E95"+ - "\u8E94\u8E9A\u8E92\u8E90\u8E96\u8E97\u8F60\u8F62"+ - "\u9147\u944C\u9450\u944A\u944B\u944F\u9447\u9445"+ - "\u9448\u9449\u9446\u973F\u97E3\u986A\u9869\u98CB"+ - "\u9954\u995B\u9A4E\u9A53\u9A54\u9A4C\u9A4F\u9A48"+ - "\u9A4A\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\u9A49\u9A52\u9A50\u9AD0\u9B19"+ - "\u9B2B\u9B3B\u9B56\u9B55\u9C46\u9C48\u9C3F\u9C44"+ - "\u9C39\u9C33\u9C41\u9C3C\u9C37\u9C34\u9C32\u9C3D"+ - "\u9C36\u9DDB\u9DD2\u9DDE\u9DDA\u9DCB\u9DD0\u9DDC"+ - "\u9DD1\u9DDF\u9DE9\u9DD9\u9DD8\u9DD6\u9DF5\u9DD5"+ - "\u9DDD\u9EB6\u9EF0\u9F35\u9F33\u9F32\u9F42\u9F6B"+ - "\u9F95\u9FA2\u513D\u5299\u58E8\u58E7\u5972\u5B4D"+ - "\u5DD8\u882F\u5F4F\u6201\u6203\u6204\u6529\u6525"+ - "\u6596\u66EB\u6B11\u6B12\u6B0F\u6BCA\u705B\u705A"+ - "\u7222\u7382\u7381\u7383\u7670\u77D4\u7C67\u7C66"+ - "\u7E95\u826C\u863A\u8640\u8639\u863C\u8631\u863B"+ - "\u863E\u8830\u8832\u882E\u8833\u8976\u8974\u8973"+ - "\u89FE\u8B8C\u8B8E\u8B8B\u8B88\u8C45\u8D19\u8E98"+ - "\u8F64\u8F63\u91BC\u9462\u9455\u945D\u9457\u945E"+ - "\u97C4\u97C5\u9800\u9A56\u9A59\u9B1E\u9B1F\u9B20"+ - "\u9C52\u9C58\u9C50\u9C4A\u9C4D\u9C4B\u9C55\u9C59"+ - "\u9C4C\u9C4E\u9DFB\u9DF7\u9DEF\u9DE3\u9DEB\u9DF8"+ - "\u9DE4\u9DF6\u9DE1\u9DEE\u9DE6\u9DF2\u9DF0\u9DE2"+ - "\u9DEC\u9DF4\u9DF3\u9DE8\u9DED\u9EC2\u9ED0\u9EF2"+ - "\u9EF3\u9F06\u9F1C\u9F38\u9F37\u9F36\u9F43\u9F4F"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\u9F71\u9F70\u9F6E\u9F6F\u56D3\u56CD"+ - "\u5B4E\u5C6D\u652D\u66ED\u66EE\u6B13\u705F\u7061"+ - "\u705D\u7060\u7223\u74DB\u74E5\u77D5\u7938\u79B7"+ - "\u79B6\u7C6A\u7E97\u7F89\u826D\u8643\u8838\u8837"+ - "\u8835\u884B\u8B94\u8B95\u8E9E\u8E9F\u8EA0\u8E9D"+ - "\u91BE\u91BD\u91C2\u946B\u9468\u9469\u96E5\u9746"+ - "\u9743\u9747\u97C7\u97E5\u9A5E\u9AD5\u9B59\u9C63"+ - "\u9C67\u9C66\u9C62\u9C5E\u9C60\u9E02\u9DFE\u9E07"+ - "\u9E03\u9E06\u9E05\u9E00\u9E01\u9E09\u9DFF\u9DFD"+ - "\u9E04\u9EA0\u9F1E\u9F46\u9F74\u9F75\u9F76\u56D4"+ - "\u652E\u65B8\u6B18\u6B19\u6B17\u6B1A\u7062\u7226"+ - "\u72AA\u77D8\u77D9\u7939\u7C69\u7C6B\u7CF6\u7E9A"+ - "\u7E98\u7E9B\u7E99\u81E0\u81E1\u8646\u8647\u8648"+ - "\u8979\u897A\u897C\u897B\u89FF\u8B98\u8B99\u8EA5"+ - "\u8EA4\u8EA3\u946E\u946D\u946F\u9471\u9473\u9749"+ - "\u9872\u995F\u9C68\u9C6E\u9C6D\u9E0B\u9E0D\u9E10"+ - "\u9E0F\u9E12\u9E11\u9EA1\u9EF5\u9F09\u9F47\u9F78"+ - "\u9F7B\u9F7A\u9F79\u571E\u7066\u7C6F\u883C\u8DB2"+ - "\u8EA6\u91C3\u9474\u9478\u9476\u9475\u9A60\u9C74"+ - "\u9C73\u9C71\u9C75\u9E14\u9E13\u9EF6\u9F0A\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\u9FA4\u7068\u7065\u7CF7\u866A\u883E\u883D"+ - "\u883F\u8B9E\u8C9C\u8EA9\u8EC9\u974B\u9873\u9874"+ - "\u98CC\u9961\u99AB\u9A64\u9A66\u9A67\u9B24\u9E15"+ - "\u9E17\u9F48\u6207\u6B1E\u7227\u864C\u8EA8\u9482"+ - "\u9480\u9481\u9A69\u9A68\u9B2E\u9E19\u7229\u864B"+ - "\u8B9F\u9483\u9C79\u9EB7\u7675\u9A6B\u9C7A\u9E1D"+ - "\u7069\u706A\u9EA4\u9F7E\u9F49\u9F98\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"; - - private final static short index1[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 0, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 0, 0, 0, 0, 0, 0 - }; - - String index2[] = { - innerIndex0, - innerIndex1, - innerIndex2, - innerIndex3, - innerIndex4, - innerIndex5 - }; } From 2827ff39e5f4779d078017b003d08093dbef5de3 Mon Sep 17 00:00:00 2001 From: Weijun Wang Date: Thu, 9 Apr 2009 15:32:55 +0800 Subject: [PATCH 265/292] 6714845: Quotes in Kerberos configuration file are included in the values Reviewed-by: xuelei --- .../classes/sun/security/krb5/Config.java | 40 +++++++++++++++- .../security/krb5/ConfigWithQuotations.java | 47 +++++++++++++++++++ jdk/test/sun/security/krb5/edu.mit.Kerberos | 15 ++++++ 3 files changed, 100 insertions(+), 2 deletions(-) create mode 100644 jdk/test/sun/security/krb5/ConfigWithQuotations.java create mode 100644 jdk/test/sun/security/krb5/edu.mit.Kerberos diff --git a/jdk/src/share/classes/sun/security/krb5/Config.java b/jdk/src/share/classes/sun/security/krb5/Config.java index 07c78e2959a..e036776f53e 100644 --- a/jdk/src/share/classes/sun/security/krb5/Config.java +++ b/jdk/src/share/classes/sun/security/krb5/Config.java @@ -736,6 +736,14 @@ public class Config { return name; } + private static String trimmed(String s) { + s = s.trim(); + if (s.charAt(0) == '"' && s.charAt(s.length()-1) == '"' || + s.charAt(0) == '\'' && s.charAt(s.length()-1) == '\'') { + s = s.substring(1, s.length()-1).trim(); + } + return s; + } /** * Parses key-value pairs under a stanza name. */ @@ -747,7 +755,7 @@ public class Config { for (int j = 0; j < line.length(); j++) { if (line.charAt(j) == '=') { String key = (line.substring(0, j)).trim(); - String value = (line.substring(j + 1)).trim(); + String value = trimmed(line.substring(j + 1)); table.put(key, value); break; } @@ -820,7 +828,7 @@ public class Config { } else { nameVector = table.get(key); } - nameVector.addElement((line.substring(j + 1)).trim()); + nameVector.addElement(trimmed(line.substring(j + 1))); table.put(key, nameVector); break; } @@ -1263,4 +1271,32 @@ public class Config { } } + @Override + public String toString() { + StringBuffer sb = new StringBuffer(); + toStringIndented("", stanzaTable, sb); + return sb.toString(); + } + private static void toStringIndented(String prefix, Object obj, + StringBuffer sb) { + if (obj instanceof String) { + sb.append(prefix); + sb.append(obj); + sb.append('\n'); + } else if (obj instanceof Hashtable) { + Hashtable tab = (Hashtable)obj; + for (Object o: tab.keySet()) { + sb.append(prefix); + sb.append(o); + sb.append(" = {\n"); + toStringIndented(prefix + " ", tab.get(o), sb); + sb.append(prefix + "}\n"); + } + } else if (obj instanceof Vector) { + Vector v = (Vector)obj; + for (Object o: v.toArray()) { + toStringIndented(prefix + " ", o, sb); + } + } + } } diff --git a/jdk/test/sun/security/krb5/ConfigWithQuotations.java b/jdk/test/sun/security/krb5/ConfigWithQuotations.java new file mode 100644 index 00000000000..c55e3cbb8dd --- /dev/null +++ b/jdk/test/sun/security/krb5/ConfigWithQuotations.java @@ -0,0 +1,47 @@ +/* + * Copyright 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 6714845 + * @summary Quotes in Kerberos configuration file are included in the values + */ + +import sun.security.krb5.Config; + +public class ConfigWithQuotations { + public static void main(String[] args) throws Exception { + // This config file is generated using Kerberos.app on a Mac + System.setProperty("java.security.krb5.conf", + System.getProperty("test.src", ".") +"/edu.mit.Kerberos"); + Config config = Config.getInstance(); + + System.out.println(config); + + if (!config.getDefaultRealm().equals("MAC.LOCAL")) { + throw new Exception("Realm error"); + } + if (!config.getKDCList("MAC.LOCAL").equals("kdc.mac.local:88")) { + throw new Exception("KDC error"); + } + } +} diff --git a/jdk/test/sun/security/krb5/edu.mit.Kerberos b/jdk/test/sun/security/krb5/edu.mit.Kerberos new file mode 100644 index 00000000000..94d76a6e58c --- /dev/null +++ b/jdk/test/sun/security/krb5/edu.mit.Kerberos @@ -0,0 +1,15 @@ +[domain_realm] + +[libdefaults] + default_realm = "MAC.LOCAL" + dns_fallback = "no" + +[logging] + admin_server = "FILE:/var/log/krb5kdc/kadmin.log" + kdc = "FILE:/var/log/krb5kdc/kdc.log" + +[realms] + MAC.LOCAL = { + kdc = "kdc.mac.local:88" + } + From 1fb3cbf4e91c1a0004828c86a3f49889ff7d97ca Mon Sep 17 00:00:00 2001 From: Xiomara Jayasena Date: Thu, 9 Apr 2009 10:37:13 -0700 Subject: [PATCH 266/292] Added tag jdk7-b54 for changeset 9590951ad57b --- .hgtags-top-repo | 1 + 1 file changed, 1 insertion(+) diff --git a/.hgtags-top-repo b/.hgtags-top-repo index a3bb161285f..8525fbdcebc 100644 --- a/.hgtags-top-repo +++ b/.hgtags-top-repo @@ -28,3 +28,4 @@ aee93a8992d2389121eb610c00a86196f3e2b9b0 jdk7-b49 0f0189d55ce4a1f7840da7582ac7d970b3b7ab15 jdk7-b51 4264c2fe66493e57c411045a1b61377796641e45 jdk7-b52 c235f4a8559d196879c56af80159f67ee5d0e720 jdk7-b53 +2ef382b1bbd58a68e668391c6145a4b2066c5b96 jdk7-b54 From 929ed1911c1d8c8e0c48e557bd4d77d211fe0e90 Mon Sep 17 00:00:00 2001 From: Xiomara Jayasena Date: Thu, 9 Apr 2009 10:37:15 -0700 Subject: [PATCH 267/292] Added tag jdk7-b54 for changeset 8f61b973b389 --- corba/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/corba/.hgtags b/corba/.hgtags index 8ad020f432f..628b5e09783 100644 --- a/corba/.hgtags +++ b/corba/.hgtags @@ -28,3 +28,4 @@ d70978bc64bc7a04be7797ab0dcd9b7b1b3a6bff jdk7-b49 3eb8f1047a7402a9a79937d1c39560e931e91da2 jdk7-b51 bec82237d694f9802b820fa11bbb4f7fa9bf8e77 jdk7-b52 3c4d73194f6f89f040ae3b2d257335dfa8a1b2b5 jdk7-b53 +8130ac858d6789d5853d23044ba4a992afda574a jdk7-b54 From baa83308c5e141aec672cceaa412cf4af770ef66 Mon Sep 17 00:00:00 2001 From: Xiomara Jayasena Date: Thu, 9 Apr 2009 10:37:18 -0700 Subject: [PATCH 268/292] Added tag jdk7-b54 for changeset c77d20908054 --- hotspot/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/hotspot/.hgtags b/hotspot/.hgtags index 30fc9e5e179..eab9a6d2f3c 100644 --- a/hotspot/.hgtags +++ b/hotspot/.hgtags @@ -28,3 +28,4 @@ dae503d9f04c1a11e182dbf7f770509c28dc0609 jdk7-b50 2581d90c6c9b2012da930eb4742add94a03069a0 jdk7-b51 1b1e8f1a4fe8cebc01c022484f78148e17b62a0d jdk7-b52 032c6af894dae8d939b3dd31d82042549e7793e0 jdk7-b53 +fafab5d5349c7c066d677538db67a1ee0fb33bd2 jdk7-b54 From 1f7564a7d62302eb4206530c08f1b6d6a09b8a8e Mon Sep 17 00:00:00 2001 From: Xiomara Jayasena Date: Thu, 9 Apr 2009 10:37:22 -0700 Subject: [PATCH 269/292] Added tag jdk7-b54 for changeset 31bec7a68275 --- jaxp/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/jaxp/.hgtags b/jaxp/.hgtags index d1208e38760..5d76cae3784 100644 --- a/jaxp/.hgtags +++ b/jaxp/.hgtags @@ -28,3 +28,4 @@ e8514e2be76d90889ebdb90d627aca2db5c150c6 jdk7-b50 ae890d80d5dffcd4dc77a1f17d768e192d1852c7 jdk7-b51 69ad87dc25cbcaaaded4727199395ad0c78bc427 jdk7-b52 e8837366d3fd72f7c7a47ebfdbd5106c16156f12 jdk7-b53 +946a9f0c493261fa6a010dc33e61b9b535ba80c1 jdk7-b54 From 9f18b194b080aac82b5fe60308d449ade42a39c8 Mon Sep 17 00:00:00 2001 From: Xiomara Jayasena Date: Thu, 9 Apr 2009 10:37:24 -0700 Subject: [PATCH 270/292] Added tag jdk7-b54 for changeset 629fcf301ed8 --- jaxws/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/jaxws/.hgtags b/jaxws/.hgtags index 0aca2ee92b5..82117eae928 100644 --- a/jaxws/.hgtags +++ b/jaxws/.hgtags @@ -28,3 +28,4 @@ af4a3eeb7812a5d09a241c50b51b3c648a9d45c1 jdk7-b46 41a66a42791ba90bff489af72cbfea71be9b40a5 jdk7-b51 e646890d18b770f625f14ed4ad5c50554d8d3d8b jdk7-b52 b250218eb2e534384667ec73e3713e684667fd4c jdk7-b53 +50ea00dc5f143fe00025233e704903c37f8464aa jdk7-b54 From ab095606fe900d681e665aa692368a8b3cbe73d8 Mon Sep 17 00:00:00 2001 From: Xiomara Jayasena Date: Thu, 9 Apr 2009 10:37:30 -0700 Subject: [PATCH 271/292] Added tag jdk7-b54 for changeset 0e9e14e7f54a --- jdk/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/jdk/.hgtags b/jdk/.hgtags index a611fd31d77..eeef1fce75e 100644 --- a/jdk/.hgtags +++ b/jdk/.hgtags @@ -28,3 +28,4 @@ b4ac413b1f129eeef0acab3f31081c1b7dfe3b27 jdk7-b47 fea0898259ae41c73620b1815aa48f036216155c jdk7-b51 bcbeadb4a5d759b29e876ee2c83401e91ff22f60 jdk7-b52 a2033addca678f9e4c0d92ffa1e389171cc9321d jdk7-b53 +d1c43d1f5676a24ba86221ac7cad5694f3a9afda jdk7-b54 From 029e1d422b52d671757fc1ee4b5fbac7f1e937d9 Mon Sep 17 00:00:00 2001 From: Xiomara Jayasena Date: Thu, 9 Apr 2009 10:37:39 -0700 Subject: [PATCH 272/292] Added tag jdk7-b54 for changeset 892e6a06285e --- langtools/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/langtools/.hgtags b/langtools/.hgtags index 20846492199..a722b1033a1 100644 --- a/langtools/.hgtags +++ b/langtools/.hgtags @@ -28,3 +28,4 @@ d17d927ad9bdfafae32451645d182acb7bed7be6 jdk7-b49 8c55d5b0ed71ed3a749eb97e4eab79b4831649b8 jdk7-b51 29329051d483d39f66073752ba4afbf29d893cfe jdk7-b52 dbdeb4a7581b2a8699644b91cae6793cb01953f7 jdk7-b53 +197a7f881937d406a01214aa9ded49c073f7d380 jdk7-b54 From 7a543510bd78a7439b21b0072c50c85408f36da6 Mon Sep 17 00:00:00 2001 From: Yuka Kamiya Date: Fri, 10 Apr 2009 11:51:36 +0900 Subject: [PATCH 273/292] 6404304: RFE: Unicode 5.1 support Reviewed-by: okutsu, naoto --- jdk/make/java/text/FILES_java.gmk | 2 +- jdk/make/java/text/Makefile | 8 +- .../CharacterData00.java.template | 151 + .../CharacterData01.java.template | 42 + jdk/make/tools/UnicodeData/SpecialCasing.txt | 54 +- jdk/make/tools/UnicodeData/UnicodeData.txt | 5104 +++++++++++++++-- jdk/make/tools/UnicodeData/VERSION | 1 + .../share/classes/java/lang/Character.java | 802 ++- .../java/lang/ConditionalSpecialCasing.java | 6 +- jdk/src/share/classes/java/lang/String.java | 11 +- .../classes/sun/text/normalizer/CharTrie.java | 78 +- .../sun/text/normalizer/NormalizerBase.java | 7 +- .../text/normalizer/NormalizerDataReader.java | 11 +- .../sun/text/normalizer/NormalizerImpl.java | 11 +- .../classes/sun/text/normalizer/Trie.java | 117 +- .../sun/text/normalizer/TrieIterator.java | 27 +- .../sun/text/normalizer/UBiDiProps.java | 179 + .../sun/text/normalizer/UCharacter.java | 689 +-- .../text/normalizer/UCharacterProperty.java | 573 +- .../normalizer/UCharacterPropertyReader.java | 305 +- .../sun/text/normalizer/UProperty.java | 80 - .../classes/sun/text/normalizer/UTF16.java | 52 +- .../sun/text/normalizer/UnicodeSet.java | 184 +- .../text/normalizer/UnicodeSetIterator.java | 15 +- .../classes/sun/text/normalizer/Utility.java | 46 +- .../sun/text/normalizer/VersionInfo.java | 4 +- .../classes/sun/text/resources/ubidi.icu | Bin 0 -> 17248 bytes .../classes/sun/text/resources/unorm.icu | Bin 112720 -> 117632 bytes .../classes/sun/text/resources/uprops.icu | Bin 76176 -> 81008 bytes jdk/test/java/lang/String/ToLowerCase.java | 2 +- 30 files changed, 6235 insertions(+), 2326 deletions(-) create mode 100644 jdk/make/tools/UnicodeData/VERSION create mode 100644 jdk/src/share/classes/sun/text/normalizer/UBiDiProps.java delete mode 100644 jdk/src/share/classes/sun/text/normalizer/UProperty.java create mode 100644 jdk/src/share/classes/sun/text/resources/ubidi.icu diff --git a/jdk/make/java/text/FILES_java.gmk b/jdk/make/java/text/FILES_java.gmk index 67b4c19c66e..88dc12903cc 100644 --- a/jdk/make/java/text/FILES_java.gmk +++ b/jdk/make/java/text/FILES_java.gmk @@ -92,11 +92,11 @@ FILES_java = \ sun/text/normalizer/SymbolTable.java \ sun/text/normalizer/Trie.java \ sun/text/normalizer/TrieIterator.java \ + sun/text/normalizer/UBiDiProps.java \ sun/text/normalizer/UCharacter.java \ sun/text/normalizer/UCharacterIterator.java \ sun/text/normalizer/UCharacterProperty.java \ sun/text/normalizer/UCharacterPropertyReader.java \ - sun/text/normalizer/UProperty.java \ sun/text/normalizer/UTF16.java \ sun/text/normalizer/UnicodeMatcher.java \ sun/text/normalizer/UnicodeSet.java \ diff --git a/jdk/make/java/text/Makefile b/jdk/make/java/text/Makefile index 76955e22d81..4db338926f3 100644 --- a/jdk/make/java/text/Makefile +++ b/jdk/make/java/text/Makefile @@ -64,7 +64,8 @@ BIFILES = $(TEXT_CLASSDIR)/CharacterBreakIteratorData \ $(TEXT_CLASSDIR)/SentenceBreakIteratorData ICU_FILES = $(TEXT_CLASSDIR)/unorm.icu \ - $(TEXT_CLASSDIR)/uprops.icu + $(TEXT_CLASSDIR)/uprops.icu \ + $(TEXT_CLASSDIR)/ubidi.icu # builder GENERATEBREAKITERATORDATA_JARFILE = \ @@ -89,7 +90,7 @@ $(BIFILES): $(GENERATEBREAKITERATORDATA_JARFILE) \ build: $(BIFILES) $(ICU_FILES) # -# Extra rules to copy unorm.icu and uprops.icu +# Extra rules to copy unorm.icu, uprops.icu, and ubidi.icu # $(TEXT_CLASSDIR)/unorm.icu: $(TEXT_SRCDIR)/unorm.icu $(install-file) @@ -97,6 +98,9 @@ $(TEXT_CLASSDIR)/unorm.icu: $(TEXT_SRCDIR)/unorm.icu $(TEXT_CLASSDIR)/uprops.icu: $(TEXT_SRCDIR)/uprops.icu $(install-file) +$(TEXT_CLASSDIR)/ubidi.icu: $(TEXT_SRCDIR)/ubidi.icu + $(install-file) + clean clobber:: $(RM) -r $(TEXT_CLASSES) $(RM) -r $(BIFILES) diff --git a/jdk/make/tools/GenerateCharacter/CharacterData00.java.template b/jdk/make/tools/GenerateCharacter/CharacterData00.java.template index c790f374ef6..554c7cf57cb 100644 --- a/jdk/make/tools/GenerateCharacter/CharacterData00.java.template +++ b/jdk/make/tools/GenerateCharacter/CharacterData00.java.template @@ -144,6 +144,55 @@ class CharacterData00 extends CharacterData { case 0x1FBC : mapChar = 0x1FB3; break; case 0x1FCC : mapChar = 0x1FC3; break; case 0x1FFC : mapChar = 0x1FF3; break; + + case 0x023A : mapChar = 0x2C65; break; + case 0x023E : mapChar = 0x2C66; break; + case 0x10A0 : mapChar = 0x2D00; break; + case 0x10A1 : mapChar = 0x2D01; break; + case 0x10A2 : mapChar = 0x2D02; break; + case 0x10A3 : mapChar = 0x2D03; break; + case 0x10A4 : mapChar = 0x2D04; break; + case 0x10A5 : mapChar = 0x2D05; break; + case 0x10A6 : mapChar = 0x2D06; break; + case 0x10A7 : mapChar = 0x2D07; break; + case 0x10A8 : mapChar = 0x2D08; break; + case 0x10A9 : mapChar = 0x2D09; break; + case 0x10AA : mapChar = 0x2D0A; break; + case 0x10AB : mapChar = 0x2D0B; break; + case 0x10AC : mapChar = 0x2D0C; break; + case 0x10AD : mapChar = 0x2D0D; break; + case 0x10AE : mapChar = 0x2D0E; break; + case 0x10AF : mapChar = 0x2D0F; break; + case 0x10B0 : mapChar = 0x2D10; break; + case 0x10B1 : mapChar = 0x2D11; break; + case 0x10B2 : mapChar = 0x2D12; break; + case 0x10B3 : mapChar = 0x2D13; break; + case 0x10B4 : mapChar = 0x2D14; break; + case 0x10B5 : mapChar = 0x2D15; break; + case 0x10B6 : mapChar = 0x2D16; break; + case 0x10B7 : mapChar = 0x2D17; break; + case 0x10B8 : mapChar = 0x2D18; break; + case 0x10B9 : mapChar = 0x2D19; break; + case 0x10BA : mapChar = 0x2D1A; break; + case 0x10BB : mapChar = 0x2D1B; break; + case 0x10BC : mapChar = 0x2D1C; break; + case 0x10BD : mapChar = 0x2D1D; break; + case 0x10BE : mapChar = 0x2D1E; break; + case 0x10BF : mapChar = 0x2D1F; break; + case 0x10C0 : mapChar = 0x2D20; break; + case 0x10C1 : mapChar = 0x2D21; break; + case 0x10C2 : mapChar = 0x2D22; break; + case 0x10C3 : mapChar = 0x2D23; break; + case 0x10C4 : mapChar = 0x2D24; break; + case 0x10C5 : mapChar = 0x2D25; break; + case 0x1E9E : mapChar = 0x00DF; break; + case 0x2C62 : mapChar = 0x026B; break; + case 0x2C63 : mapChar = 0x1D7D; break; + case 0x2C64 : mapChar = 0x027D; break; + case 0x2C6D : mapChar = 0x0251; break; + case 0x2C6E : mapChar = 0x0271; break; + case 0x2C6F : mapChar = 0x0250; break; + case 0xA77D : mapChar = 0x1D79; break; // default mapChar is already set, so no // need to redo it here. // default : mapChar = ch; @@ -196,6 +245,54 @@ class CharacterData00 extends CharacterData { case 0x1FB3 : mapChar = 0x1FBC; break; case 0x1FC3 : mapChar = 0x1FCC; break; case 0x1FF3 : mapChar = 0x1FFC; break; + + case 0x0250 : mapChar = 0x2C6F; break; + case 0x0251 : mapChar = 0x2C6D; break; + case 0x026B : mapChar = 0x2C62; break; + case 0x0271 : mapChar = 0x2C6E; break; + case 0x027D : mapChar = 0x2C64; break; + case 0x1D79 : mapChar = 0xA77D; break; + case 0x1D7D : mapChar = 0x2C63; break; + case 0x2C65 : mapChar = 0x023A; break; + case 0x2C66 : mapChar = 0x023E; break; + case 0x2D00 : mapChar = 0x10A0; break; + case 0x2D01 : mapChar = 0x10A1; break; + case 0x2D02 : mapChar = 0x10A2; break; + case 0x2D03 : mapChar = 0x10A3; break; + case 0x2D04 : mapChar = 0x10A4; break; + case 0x2D05 : mapChar = 0x10A5; break; + case 0x2D06 : mapChar = 0x10A6; break; + case 0x2D07 : mapChar = 0x10A7; break; + case 0x2D08 : mapChar = 0x10A8; break; + case 0x2D09 : mapChar = 0x10A9; break; + case 0x2D0A : mapChar = 0x10AA; break; + case 0x2D0B : mapChar = 0x10AB; break; + case 0x2D0C : mapChar = 0x10AC; break; + case 0x2D0D : mapChar = 0x10AD; break; + case 0x2D0E : mapChar = 0x10AE; break; + case 0x2D0F : mapChar = 0x10AF; break; + case 0x2D10 : mapChar = 0x10B0; break; + case 0x2D11 : mapChar = 0x10B1; break; + case 0x2D12 : mapChar = 0x10B2; break; + case 0x2D13 : mapChar = 0x10B3; break; + case 0x2D14 : mapChar = 0x10B4; break; + case 0x2D15 : mapChar = 0x10B5; break; + case 0x2D16 : mapChar = 0x10B6; break; + case 0x2D17 : mapChar = 0x10B7; break; + case 0x2D18 : mapChar = 0x10B8; break; + case 0x2D19 : mapChar = 0x10B9; break; + case 0x2D1A : mapChar = 0x10BA; break; + case 0x2D1B : mapChar = 0x10BB; break; + case 0x2D1C : mapChar = 0x10BC; break; + case 0x2D1D : mapChar = 0x10BD; break; + case 0x2D1E : mapChar = 0x10BE; break; + case 0x2D1F : mapChar = 0x10BF; break; + case 0x2D20 : mapChar = 0x10C0; break; + case 0x2D21 : mapChar = 0x10C1; break; + case 0x2D22 : mapChar = 0x10C2; break; + case 0x2D23 : mapChar = 0x10C3; break; + case 0x2D24 : mapChar = 0x10C4; break; + case 0x2D25 : mapChar = 0x10C5; break; // ch must have a 1:M case mapping, but we // can't handle it here. Return ch. // since mapChar is already set, no need @@ -315,6 +412,12 @@ class CharacterData00 extends CharacterData { case 0x32BE: retval = 49; break; // CIRCLED NUMBER FORTY NINE case 0x32BF: retval = 50; break; // CIRCLED NUMBER FIFTY + case 0x0D71: retval = 100; break; // MALAYALAM NUMBER ONE HUNDRED + case 0x0D72: retval = 1000; break; // MALAYALAM NUMBER ONE THOUSAND + case 0x2186: retval = 50; break; // ROMAN NUMERAL FIFTY EARLY FORM + case 0x2187: retval = 50000; break; // ROMAN NUMERAL FIFTY THOUSAND + case 0x2188: retval = 100000; break; // ROMAN NUMERAL ONE HUNDRED THOUSAND + default: retval = -2; break; } break; @@ -383,6 +486,54 @@ class CharacterData00 extends CharacterData { case 0x00B5 : mapChar = 0x039C; break; case 0x017F : mapChar = 0x0053; break; case 0x1FBE : mapChar = 0x0399; break; + + case 0x0250 : mapChar = 0x2C6F; break; + case 0x0251 : mapChar = 0x2C6D; break; + case 0x026B : mapChar = 0x2C62; break; + case 0x0271 : mapChar = 0x2C6E; break; + case 0x027D : mapChar = 0x2C64; break; + case 0x1D79 : mapChar = 0xA77D; break; + case 0x1D7D : mapChar = 0x2C63; break; + case 0x2C65 : mapChar = 0x023A; break; + case 0x2C66 : mapChar = 0x023E; break; + case 0x2D00 : mapChar = 0x10A0; break; + case 0x2D01 : mapChar = 0x10A1; break; + case 0x2D02 : mapChar = 0x10A2; break; + case 0x2D03 : mapChar = 0x10A3; break; + case 0x2D04 : mapChar = 0x10A4; break; + case 0x2D05 : mapChar = 0x10A5; break; + case 0x2D06 : mapChar = 0x10A6; break; + case 0x2D07 : mapChar = 0x10A7; break; + case 0x2D08 : mapChar = 0x10A8; break; + case 0x2D09 : mapChar = 0x10A9; break; + case 0x2D0A : mapChar = 0x10AA; break; + case 0x2D0B : mapChar = 0x10AB; break; + case 0x2D0C : mapChar = 0x10AC; break; + case 0x2D0D : mapChar = 0x10AD; break; + case 0x2D0E : mapChar = 0x10AE; break; + case 0x2D0F : mapChar = 0x10AF; break; + case 0x2D10 : mapChar = 0x10B0; break; + case 0x2D11 : mapChar = 0x10B1; break; + case 0x2D12 : mapChar = 0x10B2; break; + case 0x2D13 : mapChar = 0x10B3; break; + case 0x2D14 : mapChar = 0x10B4; break; + case 0x2D15 : mapChar = 0x10B5; break; + case 0x2D16 : mapChar = 0x10B6; break; + case 0x2D17 : mapChar = 0x10B7; break; + case 0x2D18 : mapChar = 0x10B8; break; + case 0x2D19 : mapChar = 0x10B9; break; + case 0x2D1A : mapChar = 0x10BA; break; + case 0x2D1B : mapChar = 0x10BB; break; + case 0x2D1C : mapChar = 0x10BC; break; + case 0x2D1D : mapChar = 0x10BD; break; + case 0x2D1E : mapChar = 0x10BE; break; + case 0x2D1F : mapChar = 0x10BF; break; + case 0x2D20 : mapChar = 0x10C0; break; + case 0x2D21 : mapChar = 0x10C1; break; + case 0x2D22 : mapChar = 0x10C2; break; + case 0x2D23 : mapChar = 0x10C3; break; + case 0x2D24 : mapChar = 0x10C4; break; + case 0x2D25 : mapChar = 0x10C5; break; default : mapChar = Character.ERROR; break; } } diff --git a/jdk/make/tools/GenerateCharacter/CharacterData01.java.template b/jdk/make/tools/GenerateCharacter/CharacterData01.java.template index 9a228b769c1..c42f9807a18 100644 --- a/jdk/make/tools/GenerateCharacter/CharacterData01.java.template +++ b/jdk/make/tools/GenerateCharacter/CharacterData01.java.template @@ -218,6 +218,48 @@ class CharacterData01 extends CharacterData { case 0x10132: retval = 80000; break; // AEGEAN NUMBER EIGHTY THOUSAND case 0x10133: retval = 90000; break; // AEGEAN NUMBER NINETY THOUSAND case 0x10323: retval = 50; break; // OLD ITALIC NUMERAL FIFTY + + case 0x010144: retval = 50; break; // ACROPHONIC ATTIC FIFTY + case 0x010145: retval = 500; break; // ACROPHONIC ATTIC FIVE HUNDRED + case 0x010146: retval = 5000; break; // ACROPHONIC ATTIC FIVE THOUSAND + case 0x010147: retval = 50000; break; // ACROPHONIC ATTIC FIFTY THOUSAND + case 0x01014A: retval = 50; break; // ACROPHONIC ATTIC FIFTY TALENTS + case 0x01014B: retval = 100; break; // ACROPHONIC ATTIC ONE HUNDRED TALENTS + case 0x01014C: retval = 500; break; // ACROPHONIC ATTIC FIVE HUNDRED TALENTS + case 0x01014D: retval = 1000; break; // ACROPHONIC ATTIC ONE THOUSAND TALENTS + case 0x01014E: retval = 5000; break; // ACROPHONIC ATTIC FIVE THOUSAND TALENTS + case 0x010151: retval = 50; break; // ACROPHONIC ATTIC FIFTY STATERS + case 0x010152: retval = 100; break; // ACROPHONIC ATTIC ONE HUNDRED STATERS + case 0x010153: retval = 500; break; // ACROPHONIC ATTIC FIVE HUNDRED STATERS + case 0x010154: retval = 1000; break; // ACROPHONIC ATTIC ONE THOUSAND STATERS + case 0x010155: retval = 10000; break; // ACROPHONIC ATTIC TEN THOUSAND STATERS + case 0x010156: retval = 50000; break; // ACROPHONIC ATTIC FIFTY THOUSAND STATERS + case 0x010166: retval = 50; break; // ACROPHONIC TROEZENIAN FIFTY + case 0x010167: retval = 50; break; // ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM + case 0x010168: retval = 50; break; // ACROPHONIC HERMIONIAN FIFTY + case 0x010169: retval = 50; break; // ACROPHONIC THESPIAN FIFTY + case 0x01016A: retval = 100; break; // ACROPHONIC THESPIAN ONE HUNDRED + case 0x01016B: retval = 300; break; // ACROPHONIC THESPIAN THREE HUNDRED + case 0x01016C: retval = 500; break; // ACROPHONIC EPIDAUREAN FIVE HUNDRED + case 0x01016D: retval = 500; break; // ACROPHONIC TROEZENIAN FIVE HUNDRED + case 0x01016E: retval = 500; break; // ACROPHONIC THESPIAN FIVE HUNDRED + case 0x01016F: retval = 500; break; // ACROPHONIC CARYSTIAN FIVE HUNDRED + case 0x010170: retval = 500; break; // ACROPHONIC NAXIAN FIVE HUNDRED + case 0x010171: retval = 1000; break; // ACROPHONIC THESPIAN ONE THOUSAND + case 0x010172: retval = 5000; break; // ACROPHONIC THESPIAN FIVE THOUSAND + case 0x010174: retval = 50; break; // ACROPHONIC STRATIAN FIFTY MNAS + case 0x010341: retval = 90; break; // GOTHIC LETTER NINETY + case 0x01034A: retval = 900; break; // GOTHIC LETTER NINE HUNDRED + case 0x0103D5: retval = 100; break; // OLD PERSIAN NUMBER HUNDRED + case 0x010919: retval = 100; break; // PHOENICIAN NUMBER ONE HUNDRED + case 0x010A46: retval = 100; break; // KHAROSHTHI NUMBER ONE HUNDRED + case 0x010A47: retval = 1000; break; // KHAROSHTHI NUMBER ONE THOUSAND + case 0x01D36C: retval = 40; break; // COUNTING ROD TENS DIGIT FOUR + case 0x01D36D: retval = 50; break; // COUNTING ROD TENS DIGIT FIVE + case 0x01D36E: retval = 60; break; // COUNTING ROD TENS DIGIT SIX + case 0x01D36F: retval = 70; break; // COUNTING ROD TENS DIGIT SEVEN + case 0x01D370: retval = 80; break; // COUNTING ROD TENS DIGIT EIGHT + case 0x01D371: retval = 90; break; // COUNTING ROD TENS DIGIT NINE default: retval = -2; break; } diff --git a/jdk/make/tools/UnicodeData/SpecialCasing.txt b/jdk/make/tools/UnicodeData/SpecialCasing.txt index 34d1c61de37..92e70a4a3d2 100644 --- a/jdk/make/tools/UnicodeData/SpecialCasing.txt +++ b/jdk/make/tools/UnicodeData/SpecialCasing.txt @@ -1,12 +1,17 @@ -# SpecialCasing-4.0.0.txt -# Date: 2003-03-14, 20:22:04 GMT [MD] +# SpecialCasing-5.1.0.txt +# Date: 2008-03-03, 21:58:10 GMT [MD] +# +# Unicode Character Database +# Copyright (c) 1991-2008 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# For documentation, see UCD.html # # Special Casing Properties # # This file is a supplement to the UnicodeData file. # It contains additional information about the casing of Unicode characters. # (For compatibility, the UnicodeData.txt file only contains case mappings for -# characters where they are 1-1, and does not have locale-specific mappings.) +# characters where they are 1-1, and independent of context and language. # For more information, see the discussion of Case Mappings in the Unicode Standard. # # All code points not listed in this file that do not have a simple case mappings @@ -18,31 +23,31 @@ # # ; ; ; <upper> ; (<condition_list> ;)? # <comment> # -# <code>, <lower>, <title>, and <upper> provide character values in hex. If there is more than -# one character, they are separated by spaces. Other than as used to separate elements, -# spaces are to be ignored. +# <code>, <lower>, <title>, and <upper> provide character values in hex. If there is more +# than one character, they are separated by spaces. Other than as used to separate +# elements, spaces are to be ignored. # -# The <condition_list> is optional. Where present, it consists of one or more locales or contexts, -# separated by spaces. In these conditions: +# The <condition_list> is optional. Where present, it consists of one or more language IDs +# or contexts, separated by spaces. In these conditions: # - A condition list overrides the normal behavior if all of the listed conditions are true. # - The context is always the context of the characters in the original string, # NOT in the resulting string. # - Case distinctions in the condition list are not significant. # - Conditions preceded by "Not_" represent the negation of the condition. +# The condition list is not represented in the UCD as a formal property. # -# A locale is defined as: -# <locale> := <ISO_639_code> ( "_" <ISO_3166_code> ( "_" <variant> )? )? -# <ISO_3166_code> := 2-letter ISO country code, -# <ISO_639_code> := 2-letter ISO language code +# A language ID is defined by BCP 47, with '-' and '_' treated equivalently. # -# A context is one of the following, as defined in the Unicode Standard: -# Final_Sigma, After_Soft_Dotted, More_Above, Before_Dot, Not_Before_Dot, After_I +# A context for a character C is defined by Section 3.13 Default Case +# Operations, of The Unicode Standard, Version 5.0. +# (This is identical to the context defined by Unicode 4.1.0, +# as specified in http://www.unicode.org/versions/Unicode4.1.0/) # # Parsers of this file must be prepared to deal with future additions to this format: # * Additional contexts # * Additional fields # ================================================================================ - +# @missing 0000..10FFFF; <slc>; <stc>; <suc> # ================================================================================ # Unconditional mappings # ================================================================================ @@ -170,7 +175,7 @@ FB17; FB17; 0544 056D; 0544 053D; # ARMENIAN SMALL LIGATURE MEN XEH 1FF3; 1FF3; 1FFC; 03A9 0399; # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI 1FFC; 1FF3; 1FFC; 03A9 0399; # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI -# Some characters with YPOGEGRAMMENI are also have no corresponding titlecases +# Some characters with YPOGEGRAMMENI also have no corresponding titlecases 1FB2; 1FB2; 1FBA 0345; 1FBA 0399; # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI 1FB4; 1FB4; 0386 0345; 0386 0399; # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI @@ -184,7 +189,14 @@ FB17; FB17; 0544 056D; 0544 053D; # ARMENIAN SMALL LIGATURE MEN XEH 1FF7; 1FF7; 03A9 0342 0345; 03A9 0342 0399; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI # ================================================================================ -# Conditional mappings +# Conditional Mappings +# The remainder of this file provides conditional casing data used to produce +# full case mappings. +# ================================================================================ +# Language-Insensitive Mappings +# These are characters whose full case mappings do not depend on language, but do +# depend on context (which characters come before or after). For more information +# see the header of this file and the Unicode Standard. # ================================================================================ # Special case for final form of sigma @@ -203,7 +215,10 @@ FB17; FB17; 0544 056D; 0544 053D; # ARMENIAN SMALL LIGATURE MEN XEH # 03C2; 03C3; 03A3; 03A3; Not_Final_Sigma; # GREEK SMALL LETTER FINAL SIGMA # ================================================================================ -# Locale-sensitive mappings +# Language-Sensitive Mappings +# These are characters whose full case mappings depend on language and perhaps also +# context (which characters come before or after). For more information +# see the header of this file and the Unicode Standard. # ================================================================================ # Lithuanian @@ -254,3 +269,6 @@ FB17; FB17; 0544 056D; 0544 053D; # ARMENIAN SMALL LIGATURE MEN XEH # Note: the following case is already in the UnicodeData file. # 0131; 0131; 0049; 0049; tr; # LATIN SMALL LETTER DOTLESS I + +# EOF + diff --git a/jdk/make/tools/UnicodeData/UnicodeData.txt b/jdk/make/tools/UnicodeData/UnicodeData.txt index 86ea1cf9f68..77db788cf29 100644 --- a/jdk/make/tools/UnicodeData/UnicodeData.txt +++ b/jdk/make/tools/UnicodeData/UnicodeData.txt @@ -41,11 +41,11 @@ 0028;LEFT PARENTHESIS;Ps;0;ON;;;;;Y;OPENING PARENTHESIS;;;; 0029;RIGHT PARENTHESIS;Pe;0;ON;;;;;Y;CLOSING PARENTHESIS;;;; 002A;ASTERISK;Po;0;ON;;;;;N;;;;; -002B;PLUS SIGN;Sm;0;ET;;;;;N;;;;; +002B;PLUS SIGN;Sm;0;ES;;;;;N;;;;; 002C;COMMA;Po;0;CS;;;;;N;;;;; -002D;HYPHEN-MINUS;Pd;0;ET;;;;;N;;;;; +002D;HYPHEN-MINUS;Pd;0;ES;;;;;N;;;;; 002E;FULL STOP;Po;0;CS;;;;;N;PERIOD;;;; -002F;SOLIDUS;Po;0;ES;;;;;N;SLASH;;;; +002F;SOLIDUS;Po;0;CS;;;;;N;SLASH;;;; 0030;DIGIT ZERO;Nd;0;EN;;0;0;0;N;;;;; 0031;DIGIT ONE;Nd;0;EN;;1;1;1;N;;;;; 0032;DIGIT TWO;Nd;0;EN;;2;2;2;N;;;;; @@ -171,7 +171,7 @@ 00AA;FEMININE ORDINAL INDICATOR;Ll;0;L;<super> 0061;;;;N;;;;; 00AB;LEFT-POINTING DOUBLE ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING GUILLEMET;*;;; 00AC;NOT SIGN;Sm;0;ON;;;;;N;;;;; -00AD;SOFT HYPHEN;Cf;0;ON;;;;;N;;;;; +00AD;SOFT HYPHEN;Cf;0;BN;;;;;N;;;;; 00AE;REGISTERED SIGN;So;0;ON;;;;;N;REGISTERED TRADE MARK SIGN;;;; 00AF;MACRON;Sk;0;ON;<compat> 0020 0304;;;;N;SPACING MACRON;;;; 00B0;DEGREE SIGN;So;0;ET;;;;;N;;;;; @@ -382,7 +382,7 @@ 017D;LATIN CAPITAL LETTER Z WITH CARON;Lu;0;L;005A 030C;;;;N;LATIN CAPITAL LETTER Z HACEK;;;017E; 017E;LATIN SMALL LETTER Z WITH CARON;Ll;0;L;007A 030C;;;;N;LATIN SMALL LETTER Z HACEK;;017D;;017D 017F;LATIN SMALL LETTER LONG S;Ll;0;L;<compat> 0073;;;;N;;;0053;;0053 -0180;LATIN SMALL LETTER B WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER B BAR;;;; +0180;LATIN SMALL LETTER B WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER B BAR;;0243;;0243 0181;LATIN CAPITAL LETTER B WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B HOOK;;;0253; 0182;LATIN CAPITAL LETTER B WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B TOPBAR;;;0183; 0183;LATIN SMALL LETTER B WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER B TOPBAR;;0182;;0182 @@ -408,7 +408,7 @@ 0197;LATIN CAPITAL LETTER I WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED I;;;0268; 0198;LATIN CAPITAL LETTER K WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER K HOOK;;;0199; 0199;LATIN SMALL LETTER K WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER K HOOK;;0198;;0198 -019A;LATIN SMALL LETTER L WITH BAR;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED L;;;; +019A;LATIN SMALL LETTER L WITH BAR;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED L;;023D;;023D 019B;LATIN SMALL LETTER LAMBDA WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED LAMBDA;;;; 019C;LATIN CAPITAL LETTER TURNED M;Lu;0;L;;;;;N;;;;026F; 019D;LATIN CAPITAL LETTER N WITH LEFT HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER N HOOK;;;0272; @@ -565,8 +565,33 @@ 0234;LATIN SMALL LETTER L WITH CURL;Ll;0;L;;;;;N;;;;; 0235;LATIN SMALL LETTER N WITH CURL;Ll;0;L;;;;;N;;;;; 0236;LATIN SMALL LETTER T WITH CURL;Ll;0;L;;;;;N;;;;; -0250;LATIN SMALL LETTER TURNED A;Ll;0;L;;;;;N;;;;; -0251;LATIN SMALL LETTER ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT A;;;; +0237;LATIN SMALL LETTER DOTLESS J;Ll;0;L;;;;;N;;;;; +0238;LATIN SMALL LETTER DB DIGRAPH;Ll;0;L;;;;;N;;;;; +0239;LATIN SMALL LETTER QP DIGRAPH;Ll;0;L;;;;;N;;;;; +023A;LATIN CAPITAL LETTER A WITH STROKE;Lu;0;L;;;;;N;;;;2C65; +023B;LATIN CAPITAL LETTER C WITH STROKE;Lu;0;L;;;;;N;;;;023C; +023C;LATIN SMALL LETTER C WITH STROKE;Ll;0;L;;;;;N;;;023B;;023B +023D;LATIN CAPITAL LETTER L WITH BAR;Lu;0;L;;;;;N;;;;019A; +023E;LATIN CAPITAL LETTER T WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;2C66; +023F;LATIN SMALL LETTER S WITH SWASH TAIL;Ll;0;L;;;;;N;;;;; +0240;LATIN SMALL LETTER Z WITH SWASH TAIL;Ll;0;L;;;;;N;;;;; +0241;LATIN CAPITAL LETTER GLOTTAL STOP;Lu;0;L;;;;;N;;;;0242; +0242;LATIN SMALL LETTER GLOTTAL STOP;Ll;0;L;;;;;N;;;0241;;0241 +0243;LATIN CAPITAL LETTER B WITH STROKE;Lu;0;L;;;;;N;;;;0180; +0244;LATIN CAPITAL LETTER U BAR;Lu;0;L;;;;;N;;;;0289; +0245;LATIN CAPITAL LETTER TURNED V;Lu;0;L;;;;;N;;;;028C; +0246;LATIN CAPITAL LETTER E WITH STROKE;Lu;0;L;;;;;N;;;;0247; +0247;LATIN SMALL LETTER E WITH STROKE;Ll;0;L;;;;;N;;;0246;;0246 +0248;LATIN CAPITAL LETTER J WITH STROKE;Lu;0;L;;;;;N;;;;0249; +0249;LATIN SMALL LETTER J WITH STROKE;Ll;0;L;;;;;N;;;0248;;0248 +024A;LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL;Lu;0;L;;;;;N;;;;024B; +024B;LATIN SMALL LETTER Q WITH HOOK TAIL;Ll;0;L;;;;;N;;;024A;;024A +024C;LATIN CAPITAL LETTER R WITH STROKE;Lu;0;L;;;;;N;;;;024D; +024D;LATIN SMALL LETTER R WITH STROKE;Ll;0;L;;;;;N;;;024C;;024C +024E;LATIN CAPITAL LETTER Y WITH STROKE;Lu;0;L;;;;;N;;;;024F; +024F;LATIN SMALL LETTER Y WITH STROKE;Ll;0;L;;;;;N;;;024E;;024E +0250;LATIN SMALL LETTER TURNED A;Ll;0;L;;;;;N;;;2C6F;;2C6F +0251;LATIN SMALL LETTER ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT A;;2C6D;;2C6D 0252;LATIN SMALL LETTER TURNED ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED SCRIPT A;;;; 0253;LATIN SMALL LETTER B WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER B HOOK;;0181;;0181 0254;LATIN SMALL LETTER OPEN O;Ll;0;L;;;;;N;;;0186;;0186 @@ -592,13 +617,13 @@ 0268;LATIN SMALL LETTER I WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED I;;0197;;0197 0269;LATIN SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0196;;0196 026A;LATIN LETTER SMALL CAPITAL I;Ll;0;L;;;;;N;;;;; -026B;LATIN SMALL LETTER L WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +026B;LATIN SMALL LETTER L WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;2C62;;2C62 026C;LATIN SMALL LETTER L WITH BELT;Ll;0;L;;;;;N;LATIN SMALL LETTER L BELT;;;; 026D;LATIN SMALL LETTER L WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER L RETROFLEX HOOK;;;; 026E;LATIN SMALL LETTER LEZH;Ll;0;L;;;;;N;LATIN SMALL LETTER L YOGH;;;; 026F;LATIN SMALL LETTER TURNED M;Ll;0;L;;;;;N;;;019C;;019C 0270;LATIN SMALL LETTER TURNED M WITH LONG LEG;Ll;0;L;;;;;N;;;;; -0271;LATIN SMALL LETTER M WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER M HOOK;;;; +0271;LATIN SMALL LETTER M WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER M HOOK;;2C6E;;2C6E 0272;LATIN SMALL LETTER N WITH LEFT HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N HOOK;;019D;;019D 0273;LATIN SMALL LETTER N WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N RETROFLEX HOOK;;;; 0274;LATIN LETTER SMALL CAPITAL N;Ll;0;L;;;;;N;;;;; @@ -610,7 +635,7 @@ 027A;LATIN SMALL LETTER TURNED R WITH LONG LEG;Ll;0;L;;;;;N;;;;; 027B;LATIN SMALL LETTER TURNED R WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED R HOOK;;;; 027C;LATIN SMALL LETTER R WITH LONG LEG;Ll;0;L;;;;;N;;;;; -027D;LATIN SMALL LETTER R WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER R HOOK;;;; +027D;LATIN SMALL LETTER R WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER R HOOK;;2C64;;2C64 027E;LATIN SMALL LETTER R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER FISHHOOK R;;;; 027F;LATIN SMALL LETTER REVERSED R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED FISHHOOK R;;;; 0280;LATIN LETTER SMALL CAPITAL R;Ll;0;L;;;;;N;;*;01A6;;01A6 @@ -622,10 +647,10 @@ 0286;LATIN SMALL LETTER ESH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER ESH CURL;;;; 0287;LATIN SMALL LETTER TURNED T;Ll;0;L;;;;;N;;;;; 0288;LATIN SMALL LETTER T WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T RETROFLEX HOOK;;01AE;;01AE -0289;LATIN SMALL LETTER U BAR;Ll;0;L;;;;;N;;;;; +0289;LATIN SMALL LETTER U BAR;Ll;0;L;;;;;N;;;0244;;0244 028A;LATIN SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;01B1;;01B1 028B;LATIN SMALL LETTER V WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT V;;01B2;;01B2 -028C;LATIN SMALL LETTER TURNED V;Ll;0;L;;;;;N;;;;; +028C;LATIN SMALL LETTER TURNED V;Ll;0;L;;;;;N;;;0245;;0245 028D;LATIN SMALL LETTER TURNED W;Ll;0;L;;;;;N;;;;; 028E;LATIN SMALL LETTER TURNED Y;Ll;0;L;;;;;N;;;;; 028F;LATIN LETTER SMALL CAPITAL Y;Ll;0;L;;;;;N;;;;; @@ -633,7 +658,7 @@ 0291;LATIN SMALL LETTER Z WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER Z CURL;;;; 0292;LATIN SMALL LETTER EZH;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH;;01B7;;01B7 0293;LATIN SMALL LETTER EZH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH CURL;;;; -0294;LATIN LETTER GLOTTAL STOP;Ll;0;L;;;;;N;;;;; +0294;LATIN LETTER GLOTTAL STOP;Lo;0;L;;;;;N;;;;; 0295;LATIN LETTER PHARYNGEAL VOICED FRICATIVE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP;;;; 0296;LATIN LETTER INVERTED GLOTTAL STOP;Ll;0;L;;;;;N;;;;; 0297;LATIN LETTER STRETCHED C;Ll;0;L;;;;;N;;;;; @@ -659,7 +684,7 @@ 02AB;LATIN SMALL LETTER LZ DIGRAPH;Ll;0;L;;;;;N;;;;; 02AC;LATIN LETTER BILABIAL PERCUSSIVE;Ll;0;L;;;;;N;;;;; 02AD;LATIN LETTER BIDENTAL PERCUSSIVE;Ll;0;L;;;;;N;;;;; -02AE;LATIN SMALL LETTER TURNED H WITH FISHHOOK ;Ll;0;L;;;;;N;;;;; +02AE;LATIN SMALL LETTER TURNED H WITH FISHHOOK;Ll;0;L;;;;;N;;;;; 02AF;LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL;Ll;0;L;;;;;N;;;;; 02B0;MODIFIER LETTER SMALL H;Lm;0;L;<super> 0068;;;;N;;;;; 02B1;MODIFIER LETTER SMALL H WITH HOOK;Lm;0;L;<super> 0266;;;;N;MODIFIER LETTER SMALL H HOOK;;;; @@ -721,7 +746,7 @@ 02E9;MODIFIER LETTER EXTRA-LOW TONE BAR;Sk;0;ON;;;;;N;;;;; 02EA;MODIFIER LETTER YIN DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;; 02EB;MODIFIER LETTER YANG DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;; -02EC;MODIFIER LETTER VOICING;Sk;0;ON;;;;;N;;;;; +02EC;MODIFIER LETTER VOICING;Lm;0;ON;;;;;N;;;;; 02ED;MODIFIER LETTER UNASPIRATED;Sk;0;ON;;;;;N;;;;; 02EE;MODIFIER LETTER DOUBLE APOSTROPHE;Lm;0;L;;;;;N;;;;; 02EF;MODIFIER LETTER LOW DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;; @@ -829,6 +854,11 @@ 0355;COMBINING RIGHT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; 0356;COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; 0357;COMBINING RIGHT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;; +0358;COMBINING DOT ABOVE RIGHT;Mn;232;NSM;;;;;N;;;;; +0359;COMBINING ASTERISK BELOW;Mn;220;NSM;;;;;N;;;;; +035A;COMBINING DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;; +035B;COMBINING ZIGZAG ABOVE;Mn;230;NSM;;;;;N;;;;; +035C;COMBINING DOUBLE BREVE BELOW;Mn;233;NSM;;;;;N;;;;; 035D;COMBINING DOUBLE BREVE;Mn;234;NSM;;;;;N;;;;; 035E;COMBINING DOUBLE MACRON;Mn;234;NSM;;;;;N;;;;; 035F;COMBINING DOUBLE MACRON BELOW;Mn;233;NSM;;;;;N;;;;; @@ -848,9 +878,18 @@ 036D;COMBINING LATIN SMALL LETTER T;Mn;230;NSM;;;;;N;;;;; 036E;COMBINING LATIN SMALL LETTER V;Mn;230;NSM;;;;;N;;;;; 036F;COMBINING LATIN SMALL LETTER X;Mn;230;NSM;;;;;N;;;;; -0374;GREEK NUMERAL SIGN;Sk;0;ON;02B9;;;;N;GREEK UPPER NUMERAL SIGN;Dexia keraia;;; +0370;GREEK CAPITAL LETTER HETA;Lu;0;L;;;;;N;;;;0371; +0371;GREEK SMALL LETTER HETA;Ll;0;L;;;;;N;;;0370;;0370 +0372;GREEK CAPITAL LETTER ARCHAIC SAMPI;Lu;0;L;;;;;N;;;;0373; +0373;GREEK SMALL LETTER ARCHAIC SAMPI;Ll;0;L;;;;;N;;;0372;;0372 +0374;GREEK NUMERAL SIGN;Lm;0;ON;02B9;;;;N;GREEK UPPER NUMERAL SIGN;Dexia keraia;;; 0375;GREEK LOWER NUMERAL SIGN;Sk;0;ON;;;;;N;;Aristeri keraia;;; +0376;GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA;Lu;0;L;;;;;N;;;;0377; +0377;GREEK SMALL LETTER PAMPHYLIAN DIGAMMA;Ll;0;L;;;;;N;;;0376;;0376 037A;GREEK YPOGEGRAMMENI;Lm;0;L;<compat> 0020 0345;;;;N;GREEK SPACING IOTA BELOW;;;; +037B;GREEK SMALL REVERSED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FD;;03FD +037C;GREEK SMALL DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FE;;03FE +037D;GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FF;;03FF 037E;GREEK QUESTION MARK;Po;0;ON;003B;;;;N;;Erotimatiko;;; 0384;GREEK TONOS;Sk;0;ON;<compat> 0020 0301;;;;N;GREEK SPACING TONOS;;;; 0385;GREEK DIALYTIKA TONOS;Sk;0;ON;00A8 0301;;;;N;GREEK SPACING DIAERESIS TONOS;;;; @@ -924,6 +963,7 @@ 03CC;GREEK SMALL LETTER OMICRON WITH TONOS;Ll;0;L;03BF 0301;;;;N;GREEK SMALL LETTER OMICRON TONOS;;038C;;038C 03CD;GREEK SMALL LETTER UPSILON WITH TONOS;Ll;0;L;03C5 0301;;;;N;GREEK SMALL LETTER UPSILON TONOS;;038E;;038E 03CE;GREEK SMALL LETTER OMEGA WITH TONOS;Ll;0;L;03C9 0301;;;;N;GREEK SMALL LETTER OMEGA TONOS;;038F;;038F +03CF;GREEK CAPITAL KAI SYMBOL;Lu;0;L;;;;;N;;;;03D7; 03D0;GREEK BETA SYMBOL;Ll;0;L;<compat> 03B2;;;;N;GREEK SMALL LETTER CURLED BETA;;0392;;0392 03D1;GREEK THETA SYMBOL;Ll;0;L;<compat> 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398 03D2;GREEK UPSILON WITH HOOK SYMBOL;Lu;0;L;<compat> 03A5;;;;N;GREEK CAPITAL LETTER UPSILON HOOK;;;; @@ -931,7 +971,7 @@ 03D4;GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL;Lu;0;L;03D2 0308;;;;N;GREEK CAPITAL LETTER UPSILON HOOK DIAERESIS;;;; 03D5;GREEK PHI SYMBOL;Ll;0;L;<compat> 03C6;;;;N;GREEK SMALL LETTER SCRIPT PHI;;03A6;;03A6 03D6;GREEK PI SYMBOL;Ll;0;L;<compat> 03C0;;;;N;GREEK SMALL LETTER OMEGA PI;;03A0;;03A0 -03D7;GREEK KAI SYMBOL;Ll;0;L;;;;;N;;;;; +03D7;GREEK KAI SYMBOL;Ll;0;L;;;;;N;;;03CF;;03CF 03D8;GREEK LETTER ARCHAIC KOPPA;Lu;0;L;;;;;N;;*;;03D9; 03D9;GREEK SMALL LETTER ARCHAIC KOPPA;Ll;0;L;;;;;N;;*;03D8;;03D8 03DA;GREEK LETTER STIGMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER STIGMA;;;03DB; @@ -968,6 +1008,10 @@ 03F9;GREEK CAPITAL LUNATE SIGMA SYMBOL;Lu;0;L;<compat> 03A3;;;;N;;;;03F2; 03FA;GREEK CAPITAL LETTER SAN;Lu;0;L;;;;;N;;;;03FB; 03FB;GREEK SMALL LETTER SAN;Ll;0;L;;;;;N;;;03FA;;03FA +03FC;GREEK RHO WITH STROKE SYMBOL;Ll;0;L;;;;;N;;;;; +03FD;GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037B; +03FE;GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037C; +03FF;GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037D; 0400;CYRILLIC CAPITAL LETTER IE WITH GRAVE;Lu;0;L;0415 0300;;;;N;;;;0450; 0401;CYRILLIC CAPITAL LETTER IO;Lu;0;L;0415 0308;;;;N;;;;0451; 0402;CYRILLIC CAPITAL LETTER DJE;Lu;0;L;;;;;N;;Serbocroatian;;0452; @@ -1103,6 +1147,7 @@ 0484;COMBINING CYRILLIC PALATALIZATION;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PALATALIZATION;;;; 0485;COMBINING CYRILLIC DASIA PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING DASIA PNEUMATA;;;; 0486;COMBINING CYRILLIC PSILI PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PSILI PNEUMATA;;;; +0487;COMBINING CYRILLIC POKRYTIE;Mn;230;NSM;;;;;N;;;;; 0488;COMBINING CYRILLIC HUNDRED THOUSANDS SIGN;Me;0;NSM;;;;;N;;;;; 0489;COMBINING CYRILLIC MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; 048A;CYRILLIC CAPITAL LETTER SHORT I WITH TAIL;Lu;0;L;;;;;N;;;;048B; @@ -1159,7 +1204,7 @@ 04BD;CYRILLIC SMALL LETTER ABKHASIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK;;04BC;;04BC 04BE;CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK OGONEK;;;04BF; 04BF;CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK OGONEK;;04BE;;04BE -04C0;CYRILLIC LETTER PALOCHKA;Lu;0;L;;;;;N;CYRILLIC LETTER I;;;; +04C0;CYRILLIC LETTER PALOCHKA;Lu;0;L;;;;;N;CYRILLIC LETTER I;;;04CF; 04C1;CYRILLIC CAPITAL LETTER ZHE WITH BREVE;Lu;0;L;0416 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT ZHE;;;04C2; 04C2;CYRILLIC SMALL LETTER ZHE WITH BREVE;Ll;0;L;0436 0306;;;;N;CYRILLIC SMALL LETTER SHORT ZHE;;04C1;;04C1 04C3;CYRILLIC CAPITAL LETTER KA WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA HOOK;;;04C4; @@ -1174,6 +1219,7 @@ 04CC;CYRILLIC SMALL LETTER KHAKASSIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH LEFT DESCENDER;;04CB;;04CB 04CD;CYRILLIC CAPITAL LETTER EM WITH TAIL;Lu;0;L;;;;;N;;;;04CE; 04CE;CYRILLIC SMALL LETTER EM WITH TAIL;Ll;0;L;;;;;N;;;04CD;;04CD +04CF;CYRILLIC SMALL LETTER PALOCHKA;Ll;0;L;;;;;N;;;04C0;;04C0 04D0;CYRILLIC CAPITAL LETTER A WITH BREVE;Lu;0;L;0410 0306;;;;N;;;;04D1; 04D1;CYRILLIC SMALL LETTER A WITH BREVE;Ll;0;L;0430 0306;;;;N;;;04D0;;04D0 04D2;CYRILLIC CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0410 0308;;;;N;;;;04D3; @@ -1212,8 +1258,16 @@ 04F3;CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0443 030B;;;;N;;;04F2;;04F2 04F4;CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS;Lu;0;L;0427 0308;;;;N;;;;04F5; 04F5;CYRILLIC SMALL LETTER CHE WITH DIAERESIS;Ll;0;L;0447 0308;;;;N;;;04F4;;04F4 +04F6;CYRILLIC CAPITAL LETTER GHE WITH DESCENDER;Lu;0;L;;;;;N;;;;04F7; +04F7;CYRILLIC SMALL LETTER GHE WITH DESCENDER;Ll;0;L;;;;;N;;;04F6;;04F6 04F8;CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS;Lu;0;L;042B 0308;;;;N;;;;04F9; 04F9;CYRILLIC SMALL LETTER YERU WITH DIAERESIS;Ll;0;L;044B 0308;;;;N;;;04F8;;04F8 +04FA;CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK;Lu;0;L;;;;;N;;;;04FB; +04FB;CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK;Ll;0;L;;;;;N;;;04FA;;04FA +04FC;CYRILLIC CAPITAL LETTER HA WITH HOOK;Lu;0;L;;;;;N;;;;04FD; +04FD;CYRILLIC SMALL LETTER HA WITH HOOK;Ll;0;L;;;;;N;;;04FC;;04FC +04FE;CYRILLIC CAPITAL LETTER HA WITH STROKE;Lu;0;L;;;;;N;;;;04FF; +04FF;CYRILLIC SMALL LETTER HA WITH STROKE;Ll;0;L;;;;;N;;;04FE;;04FE 0500;CYRILLIC CAPITAL LETTER KOMI DE;Lu;0;L;;;;;N;;;;0501; 0501;CYRILLIC SMALL LETTER KOMI DE;Ll;0;L;;;;;N;;;0500;;0500 0502;CYRILLIC CAPITAL LETTER KOMI DJE;Lu;0;L;;;;;N;;;;0503; @@ -1230,6 +1284,26 @@ 050D;CYRILLIC SMALL LETTER KOMI SJE;Ll;0;L;;;;;N;;;050C;;050C 050E;CYRILLIC CAPITAL LETTER KOMI TJE;Lu;0;L;;;;;N;;;;050F; 050F;CYRILLIC SMALL LETTER KOMI TJE;Ll;0;L;;;;;N;;;050E;;050E +0510;CYRILLIC CAPITAL LETTER REVERSED ZE;Lu;0;L;;;;;N;;;;0511; +0511;CYRILLIC SMALL LETTER REVERSED ZE;Ll;0;L;;;;;N;;;0510;;0510 +0512;CYRILLIC CAPITAL LETTER EL WITH HOOK;Lu;0;L;;;;;N;;;;0513; +0513;CYRILLIC SMALL LETTER EL WITH HOOK;Ll;0;L;;;;;N;;;0512;;0512 +0514;CYRILLIC CAPITAL LETTER LHA;Lu;0;L;;;;;N;;;;0515; +0515;CYRILLIC SMALL LETTER LHA;Ll;0;L;;;;;N;;;0514;;0514 +0516;CYRILLIC CAPITAL LETTER RHA;Lu;0;L;;;;;N;;;;0517; +0517;CYRILLIC SMALL LETTER RHA;Ll;0;L;;;;;N;;;0516;;0516 +0518;CYRILLIC CAPITAL LETTER YAE;Lu;0;L;;;;;N;;;;0519; +0519;CYRILLIC SMALL LETTER YAE;Ll;0;L;;;;;N;;;0518;;0518 +051A;CYRILLIC CAPITAL LETTER QA;Lu;0;L;;;;;N;;;;051B; +051B;CYRILLIC SMALL LETTER QA;Ll;0;L;;;;;N;;;051A;;051A +051C;CYRILLIC CAPITAL LETTER WE;Lu;0;L;;;;;N;;;;051D; +051D;CYRILLIC SMALL LETTER WE;Ll;0;L;;;;;N;;;051C;;051C +051E;CYRILLIC CAPITAL LETTER ALEUT KA;Lu;0;L;;;;;N;;;;051F; +051F;CYRILLIC SMALL LETTER ALEUT KA;Ll;0;L;;;;;N;;;051E;;051E +0520;CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;0521; +0521;CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;0520;;0520 +0522;CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;0523; +0523;CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;0522;;0522 0531;ARMENIAN CAPITAL LETTER AYB;Lu;0;L;;;;;N;;;;0561; 0532;ARMENIAN CAPITAL LETTER BEN;Lu;0;L;;;;;N;;;;0562; 0533;ARMENIAN CAPITAL LETTER GIM;Lu;0;L;;;;;N;;;;0563; @@ -1333,6 +1407,7 @@ 059F;HEBREW ACCENT QARNEY PARA;Mn;230;NSM;;;;;N;;;;; 05A0;HEBREW ACCENT TELISHA GEDOLA;Mn;230;NSM;;;;;N;;;;; 05A1;HEBREW ACCENT PAZER;Mn;230;NSM;;;;;N;;;;; +05A2;HEBREW ACCENT ATNAH HAFUKH;Mn;220;NSM;;;;;N;;;;; 05A3;HEBREW ACCENT MUNAH;Mn;220;NSM;;;;;N;;;;; 05A4;HEBREW ACCENT MAHAPAKH;Mn;220;NSM;;;;;N;;;;; 05A5;HEBREW ACCENT MERKHA;Mn;220;NSM;;;;;N;;*;;; @@ -1356,16 +1431,20 @@ 05B7;HEBREW POINT PATAH;Mn;17;NSM;;;;;N;;;;; 05B8;HEBREW POINT QAMATS;Mn;18;NSM;;;;;N;;;;; 05B9;HEBREW POINT HOLAM;Mn;19;NSM;;;;;N;;;;; +05BA;HEBREW POINT HOLAM HASER FOR VAV;Mn;19;NSM;;;;;N;;;;; 05BB;HEBREW POINT QUBUTS;Mn;20;NSM;;;;;N;;;;; 05BC;HEBREW POINT DAGESH OR MAPIQ;Mn;21;NSM;;;;;N;HEBREW POINT DAGESH;or shuruq;;; 05BD;HEBREW POINT METEG;Mn;22;NSM;;;;;N;;*;;; -05BE;HEBREW PUNCTUATION MAQAF;Po;0;R;;;;;N;;;;; +05BE;HEBREW PUNCTUATION MAQAF;Pd;0;R;;;;;N;;;;; 05BF;HEBREW POINT RAFE;Mn;23;NSM;;;;;N;;;;; 05C0;HEBREW PUNCTUATION PASEQ;Po;0;R;;;;;N;HEBREW POINT PASEQ;*;;; 05C1;HEBREW POINT SHIN DOT;Mn;24;NSM;;;;;N;;;;; 05C2;HEBREW POINT SIN DOT;Mn;25;NSM;;;;;N;;;;; 05C3;HEBREW PUNCTUATION SOF PASUQ;Po;0;R;;;;;N;;*;;; 05C4;HEBREW MARK UPPER DOT;Mn;230;NSM;;;;;N;;;;; +05C5;HEBREW MARK LOWER DOT;Mn;220;NSM;;;;;N;;;;; +05C6;HEBREW PUNCTUATION NUN HAFUKHA;Po;0;R;;;;;N;;;;; +05C7;HEBREW POINT QAMATS QATAN;Mn;18;NSM;;;;;N;;;;; 05D0;HEBREW LETTER ALEF;Lo;0;R;;;;;N;;;;; 05D1;HEBREW LETTER BET;Lo;0;R;;;;;N;;;;; 05D2;HEBREW LETTER GIMEL;Lo;0;R;;;;;N;;;;; @@ -1398,10 +1477,16 @@ 05F2;HEBREW LIGATURE YIDDISH DOUBLE YOD;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE YOD;;;; 05F3;HEBREW PUNCTUATION GERESH;Po;0;R;;;;;N;;;;; 05F4;HEBREW PUNCTUATION GERSHAYIM;Po;0;R;;;;;N;;;;; -0600;ARABIC NUMBER SIGN;Cf;0;AL;;;;;N;;;;; -0601;ARABIC SIGN SANAH;Cf;0;AL;;;;;N;;;;; -0602;ARABIC FOOTNOTE MARKER;Cf;0;AL;;;;;N;;;;; -0603;ARABIC SIGN SAFHA;Cf;0;AL;;;;;N;;;;; +0600;ARABIC NUMBER SIGN;Cf;0;AN;;;;;N;;;;; +0601;ARABIC SIGN SANAH;Cf;0;AN;;;;;N;;;;; +0602;ARABIC FOOTNOTE MARKER;Cf;0;AN;;;;;N;;;;; +0603;ARABIC SIGN SAFHA;Cf;0;AN;;;;;N;;;;; +0606;ARABIC-INDIC CUBE ROOT;Sm;0;ON;;;;;N;;;;; +0607;ARABIC-INDIC FOURTH ROOT;Sm;0;ON;;;;;N;;;;; +0608;ARABIC RAY;Sm;0;AL;;;;;N;;;;; +0609;ARABIC-INDIC PER MILLE SIGN;Po;0;ET;;;;;N;;;;; +060A;ARABIC-INDIC PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;; +060B;AFGHANI SIGN;Sc;0;AL;;;;;N;;;;; 060C;ARABIC COMMA;Po;0;CS;;;;;N;;;;; 060D;ARABIC DATE SEPARATOR;Po;0;AL;;;;;N;;;;; 060E;ARABIC POETIC VERSE SIGN;So;0;ON;;;;;N;;;;; @@ -1411,8 +1496,14 @@ 0612;ARABIC SIGN RAHMATULLAH ALAYHE;Mn;230;NSM;;;;;N;;;;; 0613;ARABIC SIGN RADI ALLAHOU ANHU;Mn;230;NSM;;;;;N;;;;; 0614;ARABIC SIGN TAKHALLUS;Mn;230;NSM;;;;;N;;;;; -0615;ARABIC SMALL HIGH TAH ;Mn;230;NSM;;;;;N;;;;; +0615;ARABIC SMALL HIGH TAH;Mn;230;NSM;;;;;N;;;;; +0616;ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH;Mn;230;NSM;;;;;N;;;;; +0617;ARABIC SMALL HIGH ZAIN;Mn;230;NSM;;;;;N;;;;; +0618;ARABIC SMALL FATHA;Mn;30;NSM;;;;;N;;;;; +0619;ARABIC SMALL DAMMA;Mn;31;NSM;;;;;N;;;;; +061A;ARABIC SMALL KASRA;Mn;32;NSM;;;;;N;;;;; 061B;ARABIC SEMICOLON;Po;0;AL;;;;;N;;;;; +061E;ARABIC TRIPLE DOT PUNCTUATION MARK;Po;0;AL;;;;;N;;;;; 061F;ARABIC QUESTION MARK;Po;0;AL;;;;;N;;;;; 0621;ARABIC LETTER HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH;;;; 0622;ARABIC LETTER ALEF WITH MADDA ABOVE;Lo;0;AL;0627 0653;;;;N;ARABIC LETTER MADDAH ON ALEF;;;; @@ -1440,6 +1531,11 @@ 0638;ARABIC LETTER ZAH;Lo;0;AL;;;;;N;ARABIC LETTER DHAH;;;; 0639;ARABIC LETTER AIN;Lo;0;AL;;;;;N;;;;; 063A;ARABIC LETTER GHAIN;Lo;0;AL;;;;;N;;;;; +063B;ARABIC LETTER KEHEH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +063C;ARABIC LETTER KEHEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +063D;ARABIC LETTER FARSI YEH WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +063E;ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +063F;ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; 0640;ARABIC TATWEEL;Lm;0;AL;;;;;N;;;;; 0641;ARABIC LETTER FEH;Lo;0;AL;;;;;N;ARABIC LETTER FA;;;; 0642;ARABIC LETTER QAF;Lo;0;AL;;;;;N;;;;; @@ -1465,6 +1561,12 @@ 0656;ARABIC SUBSCRIPT ALEF;Mn;220;NSM;;;;;N;;;;; 0657;ARABIC INVERTED DAMMA;Mn;230;NSM;;;;;N;;;;; 0658;ARABIC MARK NOON GHUNNA;Mn;230;NSM;;;;;N;;;;; +0659;ARABIC ZWARAKAY;Mn;230;NSM;;;;;N;;;;; +065A;ARABIC VOWEL SIGN SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;; +065B;ARABIC VOWEL SIGN INVERTED SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;; +065C;ARABIC VOWEL SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;; +065D;ARABIC REVERSED DAMMA;Mn;230;NSM;;;;;N;;;;; +065E;ARABIC FATHA WITH TWO DOTS;Mn;230;NSM;;;;;N;;;;; 0660;ARABIC-INDIC DIGIT ZERO;Nd;0;AN;;0;0;0;N;;;;; 0661;ARABIC-INDIC DIGIT ONE;Nd;0;AN;;1;1;1;N;;;;; 0662;ARABIC-INDIC DIGIT TWO;Nd;0;AN;;2;2;2;N;;;;; @@ -1590,7 +1692,7 @@ 06DA;ARABIC SMALL HIGH JEEM;Mn;230;NSM;;;;;N;;;;; 06DB;ARABIC SMALL HIGH THREE DOTS;Mn;230;NSM;;;;;N;;;;; 06DC;ARABIC SMALL HIGH SEEN;Mn;230;NSM;;;;;N;;;;; -06DD;ARABIC END OF AYAH;Cf;0;AL;;;;;N;;;;; +06DD;ARABIC END OF AYAH;Cf;0;AN;;;;;N;;;;; 06DE;ARABIC START OF RUB EL HIZB;Me;0;NSM;;;;;N;;;;; 06DF;ARABIC SMALL HIGH ROUNDED ZERO;Mn;230;NSM;;;;;N;;;;; 06E0;ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO;Mn;230;NSM;;;;;N;;;;; @@ -1702,6 +1804,54 @@ 074D;SYRIAC LETTER SOGDIAN ZHAIN;Lo;0;AL;;;;;N;;;;; 074E;SYRIAC LETTER SOGDIAN KHAPH;Lo;0;AL;;;;;N;;;;; 074F;SYRIAC LETTER SOGDIAN FE;Lo;0;AL;;;;;N;;;;; +0750;ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW;Lo;0;AL;;;;;N;;;;; +0751;ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0752;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0753;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0754;ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; +0755;ARABIC LETTER BEH WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;; +0756;ARABIC LETTER BEH WITH SMALL V;Lo;0;AL;;;;;N;;;;; +0757;ARABIC LETTER HAH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0758;ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0759;ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;; +075A;ARABIC LETTER DAL WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;; +075B;ARABIC LETTER REH WITH STROKE;Lo;0;AL;;;;;N;;;;; +075C;ARABIC LETTER SEEN WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +075D;ARABIC LETTER AIN WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +075E;ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE;Lo;0;AL;;;;;N;;;;; +075F;ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;; +0760;ARABIC LETTER FEH WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +0761;ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0762;ARABIC LETTER KEHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +0763;ARABIC LETTER KEHEH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0764;ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0765;ARABIC LETTER MEEM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +0766;ARABIC LETTER MEEM WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +0767;ARABIC LETTER NOON WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +0768;ARABIC LETTER NOON WITH SMALL TAH;Lo;0;AL;;;;;N;;;;; +0769;ARABIC LETTER NOON WITH SMALL V;Lo;0;AL;;;;;N;;;;; +076A;ARABIC LETTER LAM WITH BAR;Lo;0;AL;;;;;N;;;;; +076B;ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;; +076C;ARABIC LETTER REH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;;;;; +076D;ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;; +076E;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW;Lo;0;AL;;;;;N;;;;; +076F;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;; +0770;ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;; +0771;ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;; +0772;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE;Lo;0;AL;;;;;N;;;;; +0773;ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; +0774;ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; +0775;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; +0776;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; +0777;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW;Lo;0;AL;;;;;N;;;;; +0778;ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; +0779;ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; +077A;ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; +077B;ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; +077C;ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW;Lo;0;AL;;;;;N;;;;; +077D;ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE;Lo;0;AL;;;;;N;;;;; +077E;ARABIC LETTER SEEN WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +077F;ARABIC LETTER KAF WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; 0780;THAANA LETTER HAA;Lo;0;AL;;;;;N;;;;; 0781;THAANA LETTER SHAVIYANI;Lo;0;AL;;;;;N;;;;; 0782;THAANA LETTER NOONU;Lo;0;AL;;;;;N;;;;; @@ -1752,6 +1902,65 @@ 07AF;THAANA OABOAFILI;Mn;0;NSM;;;;;N;;;;; 07B0;THAANA SUKUN;Mn;0;NSM;;;;;N;;;;; 07B1;THAANA LETTER NAA;Lo;0;AL;;;;;N;;;;; +07C0;NKO DIGIT ZERO;Nd;0;R;;0;0;0;N;;;;; +07C1;NKO DIGIT ONE;Nd;0;R;;1;1;1;N;;;;; +07C2;NKO DIGIT TWO;Nd;0;R;;2;2;2;N;;;;; +07C3;NKO DIGIT THREE;Nd;0;R;;3;3;3;N;;;;; +07C4;NKO DIGIT FOUR;Nd;0;R;;4;4;4;N;;;;; +07C5;NKO DIGIT FIVE;Nd;0;R;;5;5;5;N;;;;; +07C6;NKO DIGIT SIX;Nd;0;R;;6;6;6;N;;;;; +07C7;NKO DIGIT SEVEN;Nd;0;R;;7;7;7;N;;;;; +07C8;NKO DIGIT EIGHT;Nd;0;R;;8;8;8;N;;;;; +07C9;NKO DIGIT NINE;Nd;0;R;;9;9;9;N;;;;; +07CA;NKO LETTER A;Lo;0;R;;;;;N;;;;; +07CB;NKO LETTER EE;Lo;0;R;;;;;N;;;;; +07CC;NKO LETTER I;Lo;0;R;;;;;N;;;;; +07CD;NKO LETTER E;Lo;0;R;;;;;N;;;;; +07CE;NKO LETTER U;Lo;0;R;;;;;N;;;;; +07CF;NKO LETTER OO;Lo;0;R;;;;;N;;;;; +07D0;NKO LETTER O;Lo;0;R;;;;;N;;;;; +07D1;NKO LETTER DAGBASINNA;Lo;0;R;;;;;N;;;;; +07D2;NKO LETTER N;Lo;0;R;;;;;N;;;;; +07D3;NKO LETTER BA;Lo;0;R;;;;;N;;;;; +07D4;NKO LETTER PA;Lo;0;R;;;;;N;;;;; +07D5;NKO LETTER TA;Lo;0;R;;;;;N;;;;; +07D6;NKO LETTER JA;Lo;0;R;;;;;N;;;;; +07D7;NKO LETTER CHA;Lo;0;R;;;;;N;;;;; +07D8;NKO LETTER DA;Lo;0;R;;;;;N;;;;; +07D9;NKO LETTER RA;Lo;0;R;;;;;N;;;;; +07DA;NKO LETTER RRA;Lo;0;R;;;;;N;;;;; +07DB;NKO LETTER SA;Lo;0;R;;;;;N;;;;; +07DC;NKO LETTER GBA;Lo;0;R;;;;;N;;;;; +07DD;NKO LETTER FA;Lo;0;R;;;;;N;;;;; +07DE;NKO LETTER KA;Lo;0;R;;;;;N;;;;; +07DF;NKO LETTER LA;Lo;0;R;;;;;N;;;;; +07E0;NKO LETTER NA WOLOSO;Lo;0;R;;;;;N;;;;; +07E1;NKO LETTER MA;Lo;0;R;;;;;N;;;;; +07E2;NKO LETTER NYA;Lo;0;R;;;;;N;;;;; +07E3;NKO LETTER NA;Lo;0;R;;;;;N;;;;; +07E4;NKO LETTER HA;Lo;0;R;;;;;N;;;;; +07E5;NKO LETTER WA;Lo;0;R;;;;;N;;;;; +07E6;NKO LETTER YA;Lo;0;R;;;;;N;;;;; +07E7;NKO LETTER NYA WOLOSO;Lo;0;R;;;;;N;;;;; +07E8;NKO LETTER JONA JA;Lo;0;R;;;;;N;;;;; +07E9;NKO LETTER JONA CHA;Lo;0;R;;;;;N;;;;; +07EA;NKO LETTER JONA RA;Lo;0;R;;;;;N;;;;; +07EB;NKO COMBINING SHORT HIGH TONE;Mn;230;NSM;;;;;N;;;;; +07EC;NKO COMBINING SHORT LOW TONE;Mn;230;NSM;;;;;N;;;;; +07ED;NKO COMBINING SHORT RISING TONE;Mn;230;NSM;;;;;N;;;;; +07EE;NKO COMBINING LONG DESCENDING TONE;Mn;230;NSM;;;;;N;;;;; +07EF;NKO COMBINING LONG HIGH TONE;Mn;230;NSM;;;;;N;;;;; +07F0;NKO COMBINING LONG LOW TONE;Mn;230;NSM;;;;;N;;;;; +07F1;NKO COMBINING LONG RISING TONE;Mn;230;NSM;;;;;N;;;;; +07F2;NKO COMBINING NASALIZATION MARK;Mn;220;NSM;;;;;N;;;;; +07F3;NKO COMBINING DOUBLE DOT ABOVE;Mn;230;NSM;;;;;N;;;;; +07F4;NKO HIGH TONE APOSTROPHE;Lm;0;R;;;;;N;;;;; +07F5;NKO LOW TONE APOSTROPHE;Lm;0;R;;;;;N;;;;; +07F6;NKO SYMBOL OO DENNEN;So;0;ON;;;;;N;;;;; +07F7;NKO SYMBOL GBAKURUNEN;Po;0;ON;;;;;N;;;;; +07F8;NKO COMMA;Po;0;ON;;;;;N;;;;; +07F9;NKO EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +07FA;NKO LAJANYALAN;Lm;0;R;;;;;N;;;;; 0901;DEVANAGARI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; 0902;DEVANAGARI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; 0903;DEVANAGARI SIGN VISARGA;Mc;0;L;;;;;N;;;;; @@ -1857,6 +2066,13 @@ 096E;DEVANAGARI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 096F;DEVANAGARI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 0970;DEVANAGARI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +0971;DEVANAGARI SIGN HIGH SPACING DOT;Lm;0;L;;;;;N;;;;; +0972;DEVANAGARI LETTER CANDRA A;Lo;0;L;;;;;N;;;;; +097B;DEVANAGARI LETTER GGA;Lo;0;L;;;;;N;;;;; +097C;DEVANAGARI LETTER JJA;Lo;0;L;;;;;N;;;;; +097D;DEVANAGARI LETTER GLOTTAL STOP;Lo;0;L;;;;;N;;;;; +097E;DEVANAGARI LETTER DDDA;Lo;0;L;;;;;N;;;;; +097F;DEVANAGARI LETTER BBA;Lo;0;L;;;;;N;;;;; 0981;BENGALI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; 0982;BENGALI SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; 0983;BENGALI SIGN VISARGA;Mc;0;L;;;;;N;;;;; @@ -1918,6 +2134,7 @@ 09CB;BENGALI VOWEL SIGN O;Mc;0;L;09C7 09BE;;;;N;;;;; 09CC;BENGALI VOWEL SIGN AU;Mc;0;L;09C7 09D7;;;;N;;;;; 09CD;BENGALI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +09CE;BENGALI LETTER KHANDA TA;Lo;0;L;;;;;N;;;;; 09D7;BENGALI AU LENGTH MARK;Mc;0;L;;;;;N;;;;; 09DC;BENGALI LETTER RRA;Lo;0;L;09A1 09BC;;;;N;;;;; 09DD;BENGALI LETTER RHA;Lo;0;L;09A2 09BC;;;;N;;;;; @@ -2004,6 +2221,7 @@ 0A4B;GURMUKHI VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;; 0A4C;GURMUKHI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; 0A4D;GURMUKHI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0A51;GURMUKHI SIGN UDAAT;Mn;0;NSM;;;;;N;;;;; 0A59;GURMUKHI LETTER KHHA;Lo;0;L;0A16 0A3C;;;;N;;;;; 0A5A;GURMUKHI LETTER GHHA;Lo;0;L;0A17 0A3C;;;;N;;;;; 0A5B;GURMUKHI LETTER ZA;Lo;0;L;0A1C 0A3C;;;;N;;;;; @@ -2024,6 +2242,7 @@ 0A72;GURMUKHI IRI;Lo;0;L;;;;;N;;;;; 0A73;GURMUKHI URA;Lo;0;L;;;;;N;;;;; 0A74;GURMUKHI EK ONKAR;Lo;0;L;;;;;N;;;;; +0A75;GURMUKHI SIGN YAKASH;Mn;0;NSM;;;;;N;;;;; 0A81;GUJARATI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; 0A82;GUJARATI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; 0A83;GUJARATI SIGN VISARGA;Mc;0;L;;;;;N;;;;; @@ -2164,6 +2383,7 @@ 0B41;ORIYA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; 0B42;ORIYA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; 0B43;ORIYA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0B44;ORIYA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; 0B47;ORIYA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; 0B48;ORIYA VOWEL SIGN AI;Mc;0;L;0B47 0B56;;;;N;;;;; 0B4B;ORIYA VOWEL SIGN O;Mc;0;L;0B47 0B3E;;;;N;;;;; @@ -2176,6 +2396,8 @@ 0B5F;ORIYA LETTER YYA;Lo;0;L;;;;;N;;;;; 0B60;ORIYA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; 0B61;ORIYA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0B62;ORIYA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0B63;ORIYA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; 0B66;ORIYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 0B67;ORIYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 0B68;ORIYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; @@ -2221,6 +2443,7 @@ 0BB3;TAMIL LETTER LLA;Lo;0;L;;;;;N;;;;; 0BB4;TAMIL LETTER LLLA;Lo;0;L;;;;;N;;;;; 0BB5;TAMIL LETTER VA;Lo;0;L;;;;;N;;;;; +0BB6;TAMIL LETTER SHA;Lo;0;L;;;;;N;;;;; 0BB7;TAMIL LETTER SSA;Lo;0;L;;;;;N;;;;; 0BB8;TAMIL LETTER SA;Lo;0;L;;;;;N;;;;; 0BB9;TAMIL LETTER HA;Lo;0;L;;;;;N;;;;; @@ -2236,7 +2459,9 @@ 0BCB;TAMIL VOWEL SIGN OO;Mc;0;L;0BC7 0BBE;;;;N;;;;; 0BCC;TAMIL VOWEL SIGN AU;Mc;0;L;0BC6 0BD7;;;;N;;;;; 0BCD;TAMIL SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0BD0;TAMIL OM;Lo;0;L;;;;;N;;;;; 0BD7;TAMIL AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +0BE6;TAMIL DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 0BE7;TAMIL DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 0BE8;TAMIL DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 0BE9;TAMIL DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; @@ -2309,6 +2534,7 @@ 0C37;TELUGU LETTER SSA;Lo;0;L;;;;;N;;;;; 0C38;TELUGU LETTER SA;Lo;0;L;;;;;N;;;;; 0C39;TELUGU LETTER HA;Lo;0;L;;;;;N;;;;; +0C3D;TELUGU SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; 0C3E;TELUGU VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; 0C3F;TELUGU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; 0C40;TELUGU VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; @@ -2325,8 +2551,12 @@ 0C4D;TELUGU SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; 0C55;TELUGU LENGTH MARK;Mn;84;NSM;;;;;N;;;;; 0C56;TELUGU AI LENGTH MARK;Mn;91;NSM;;;;;N;;;;; +0C58;TELUGU LETTER TSA;Lo;0;L;;;;;N;;;;; +0C59;TELUGU LETTER DZA;Lo;0;L;;;;;N;;;;; 0C60;TELUGU LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; 0C61;TELUGU LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0C62;TELUGU VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0C63;TELUGU VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; 0C66;TELUGU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 0C67;TELUGU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 0C68;TELUGU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; @@ -2337,6 +2567,14 @@ 0C6D;TELUGU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 0C6E;TELUGU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 0C6F;TELUGU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0C78;TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR;No;0;ON;;;;0;N;;;;; +0C79;TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR;No;0;ON;;;;1;N;;;;; +0C7A;TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR;No;0;ON;;;;2;N;;;;; +0C7B;TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR;No;0;ON;;;;3;N;;;;; +0C7C;TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR;No;0;ON;;;;1;N;;;;; +0C7D;TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR;No;0;ON;;;;2;N;;;;; +0C7E;TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR;No;0;ON;;;;3;N;;;;; +0C7F;TELUGU SIGN TUUMU;So;0;L;;;;;N;;;;; 0C82;KANNADA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; 0C83;KANNADA SIGN VISARGA;Mc;0;L;;;;;N;;;;; 0C85;KANNADA LETTER A;Lo;0;L;;;;;N;;;;; @@ -2409,6 +2647,8 @@ 0CDE;KANNADA LETTER FA;Lo;0;L;;;;;N;;;;; 0CE0;KANNADA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; 0CE1;KANNADA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0CE2;KANNADA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0CE3;KANNADA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; 0CE6;KANNADA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 0CE7;KANNADA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 0CE8;KANNADA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; @@ -2419,6 +2659,8 @@ 0CED;KANNADA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 0CEE;KANNADA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 0CEF;KANNADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0CF1;KANNADA SIGN JIHVAMULIYA;So;0;ON;;;;;N;;;;; +0CF2;KANNADA SIGN UPADHMANIYA;So;0;ON;;;;;N;;;;; 0D02;MALAYALAM SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; 0D03;MALAYALAM SIGN VISARGA;Mc;0;L;;;;;N;;;;; 0D05;MALAYALAM LETTER A;Lo;0;L;;;;;N;;;;; @@ -2471,12 +2713,14 @@ 0D37;MALAYALAM LETTER SSA;Lo;0;L;;;;;N;;;;; 0D38;MALAYALAM LETTER SA;Lo;0;L;;;;;N;;;;; 0D39;MALAYALAM LETTER HA;Lo;0;L;;;;;N;;;;; +0D3D;MALAYALAM SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; 0D3E;MALAYALAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; 0D3F;MALAYALAM VOWEL SIGN I;Mc;0;L;;;;;N;;;;; 0D40;MALAYALAM VOWEL SIGN II;Mc;0;L;;;;;N;;;;; 0D41;MALAYALAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; 0D42;MALAYALAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; 0D43;MALAYALAM VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0D44;MALAYALAM VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; 0D46;MALAYALAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; 0D47;MALAYALAM VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; 0D48;MALAYALAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; @@ -2487,6 +2731,8 @@ 0D57;MALAYALAM AU LENGTH MARK;Mc;0;L;;;;;N;;;;; 0D60;MALAYALAM LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; 0D61;MALAYALAM LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0D62;MALAYALAM VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0D63;MALAYALAM VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; 0D66;MALAYALAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 0D67;MALAYALAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 0D68;MALAYALAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; @@ -2497,6 +2743,19 @@ 0D6D;MALAYALAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 0D6E;MALAYALAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 0D6F;MALAYALAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0D70;MALAYALAM NUMBER TEN;No;0;L;;;;10;N;;;;; +0D71;MALAYALAM NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; +0D72;MALAYALAM NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; +0D73;MALAYALAM FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;; +0D74;MALAYALAM FRACTION ONE HALF;No;0;L;;;;1/2;N;;;;; +0D75;MALAYALAM FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;; +0D79;MALAYALAM DATE MARK;So;0;L;;;;;N;;;;; +0D7A;MALAYALAM LETTER CHILLU NN;Lo;0;L;;;;;N;;;;; +0D7B;MALAYALAM LETTER CHILLU N;Lo;0;L;;;;;N;;;;; +0D7C;MALAYALAM LETTER CHILLU RR;Lo;0;L;;;;;N;;;;; +0D7D;MALAYALAM LETTER CHILLU L;Lo;0;L;;;;;N;;;;; +0D7E;MALAYALAM LETTER CHILLU LL;Lo;0;L;;;;;N;;;;; +0D7F;MALAYALAM LETTER CHILLU K;Lo;0;L;;;;;N;;;;; 0D82;SINHALA SIGN ANUSVARAYA;Mc;0;L;;;;;N;;;;; 0D83;SINHALA SIGN VISARGAYA;Mc;0;L;;;;;N;;;;; 0D85;SINHALA LETTER AYANNA;Lo;0;L;;;;;N;;;;; @@ -2787,10 +3046,10 @@ 0F37;TIBETAN MARK NGAS BZUNG SGOR RTAGS;Mn;220;NSM;;;;;N;TIBETAN UNDER RING;nge zung gor ta;;; 0F38;TIBETAN MARK CHE MGO;So;0;L;;;;;N;;che go;;; 0F39;TIBETAN MARK TSA -PHRU;Mn;216;NSM;;;;;N;TIBETAN LENITION MARK;tsa tru;;; -0F3A;TIBETAN MARK GUG RTAGS GYON;Ps;0;ON;;;;;N;;gug ta yun;;; -0F3B;TIBETAN MARK GUG RTAGS GYAS;Pe;0;ON;;;;;N;;gug ta ye;;; -0F3C;TIBETAN MARK ANG KHANG GYON;Ps;0;ON;;;;;N;TIBETAN LEFT BRACE;ang kang yun;;; -0F3D;TIBETAN MARK ANG KHANG GYAS;Pe;0;ON;;;;;N;TIBETAN RIGHT BRACE;ang kang ye;;; +0F3A;TIBETAN MARK GUG RTAGS GYON;Ps;0;ON;;;;;Y;;gug ta yun;;; +0F3B;TIBETAN MARK GUG RTAGS GYAS;Pe;0;ON;;;;;Y;;gug ta ye;;; +0F3C;TIBETAN MARK ANG KHANG GYON;Ps;0;ON;;;;;Y;TIBETAN LEFT BRACE;ang kang yun;;; +0F3D;TIBETAN MARK ANG KHANG GYAS;Pe;0;ON;;;;;Y;TIBETAN RIGHT BRACE;ang kang ye;;; 0F3E;TIBETAN SIGN YAR TSHES;Mc;0;L;;;;;N;;yar tse;;; 0F3F;TIBETAN SIGN MAR TSHES;Mc;0;L;;;;;N;;mar tse;;; 0F40;TIBETAN LETTER KA;Lo;0;L;;;;;N;;;;; @@ -2835,6 +3094,8 @@ 0F68;TIBETAN LETTER A;Lo;0;L;;;;;N;;;;; 0F69;TIBETAN LETTER KSSA;Lo;0;L;0F40 0FB5;;;;N;;;;; 0F6A;TIBETAN LETTER FIXED-FORM RA;Lo;0;L;;;;;N;;*;;; +0F6B;TIBETAN LETTER KKA;Lo;0;L;;;;;N;;;;; +0F6C;TIBETAN LETTER RRA;Lo;0;L;;;;;N;;;;; 0F71;TIBETAN VOWEL SIGN AA;Mn;129;NSM;;;;;N;;;;; 0F72;TIBETAN VOWEL SIGN I;Mn;130;NSM;;;;;N;;;;; 0F73;TIBETAN VOWEL SIGN II;Mn;0;NSM;0F71 0F72;;;;N;;;;; @@ -2921,7 +3182,13 @@ 0FCA;TIBETAN SYMBOL NOR BU NYIS -KHYIL;So;0;L;;;;;N;;norbu nyi khyi;;; 0FCB;TIBETAN SYMBOL NOR BU GSUM -KHYIL;So;0;L;;;;;N;;norbu sum khyi;;; 0FCC;TIBETAN SYMBOL NOR BU BZHI -KHYIL;So;0;L;;;;;N;;norbu shi khyi;;; +0FCE;TIBETAN SIGN RDEL NAG RDEL DKAR;So;0;L;;;;;N;;dena deka;;; 0FCF;TIBETAN SIGN RDEL NAG GSUM;So;0;L;;;;;N;;dena sum;;; +0FD0;TIBETAN MARK BSKA- SHOG GI MGO RGYAN;Po;0;L;;;;;N;;ka shog gi go gyen;;; +0FD1;TIBETAN MARK MNYAM YIG GI MGO RGYAN;Po;0;L;;;;;N;;nyam yig gi go gyen;;; +0FD2;TIBETAN MARK NYIS TSHEG;Po;0;L;;;;;N;;nyi tsek;;; +0FD3;TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA;Po;0;L;;;;;N;;da nying yik go dun ma;;; +0FD4;TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA;Po;0;L;;;;;N;;da nying yik go kab ma;;; 1000;MYANMAR LETTER KA;Lo;0;L;;;;;N;;;;; 1001;MYANMAR LETTER KHA;Lo;0;L;;;;;N;;;;; 1002;MYANMAR LETTER GA;Lo;0;L;;;;;N;;;;; @@ -2956,13 +3223,16 @@ 101F;MYANMAR LETTER HA;Lo;0;L;;;;;N;;;;; 1020;MYANMAR LETTER LLA;Lo;0;L;;;;;N;;;;; 1021;MYANMAR LETTER A;Lo;0;L;;;;;N;;;;; +1022;MYANMAR LETTER SHAN A;Lo;0;L;;;;;N;;;;; 1023;MYANMAR LETTER I;Lo;0;L;;;;;N;;;;; 1024;MYANMAR LETTER II;Lo;0;L;;;;;N;;;;; 1025;MYANMAR LETTER U;Lo;0;L;;;;;N;;;;; 1026;MYANMAR LETTER UU;Lo;0;L;1025 102E;;;;N;;;;; 1027;MYANMAR LETTER E;Lo;0;L;;;;;N;;;;; +1028;MYANMAR LETTER MON E;Lo;0;L;;;;;N;;;;; 1029;MYANMAR LETTER O;Lo;0;L;;;;;N;;;;; 102A;MYANMAR LETTER AU;Lo;0;L;;;;;N;;;;; +102B;MYANMAR VOWEL SIGN TALL AA;Mc;0;L;;;;;N;;;;; 102C;MYANMAR VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; 102D;MYANMAR VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; 102E;MYANMAR VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; @@ -2970,10 +3240,19 @@ 1030;MYANMAR VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; 1031;MYANMAR VOWEL SIGN E;Mc;0;L;;;;;N;;;;; 1032;MYANMAR VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +1033;MYANMAR VOWEL SIGN MON II;Mn;0;NSM;;;;;N;;;;; +1034;MYANMAR VOWEL SIGN MON O;Mn;0;NSM;;;;;N;;;;; +1035;MYANMAR VOWEL SIGN E ABOVE;Mn;0;NSM;;;;;N;;;;; 1036;MYANMAR SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; 1037;MYANMAR SIGN DOT BELOW;Mn;7;NSM;;;;;N;;;;; 1038;MYANMAR SIGN VISARGA;Mc;0;L;;;;;N;;;;; 1039;MYANMAR SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +103A;MYANMAR SIGN ASAT;Mn;9;NSM;;;;;N;;;;; +103B;MYANMAR CONSONANT SIGN MEDIAL YA;Mc;0;L;;;;;N;;;;; +103C;MYANMAR CONSONANT SIGN MEDIAL RA;Mc;0;L;;;;;N;;;;; +103D;MYANMAR CONSONANT SIGN MEDIAL WA;Mn;0;NSM;;;;;N;;;;; +103E;MYANMAR CONSONANT SIGN MEDIAL HA;Mn;0;NSM;;;;;N;;;;; +103F;MYANMAR LETTER GREAT SA;Lo;0;L;;;;;N;;;;; 1040;MYANMAR DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 1041;MYANMAR DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 1042;MYANMAR DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; @@ -3000,44 +3279,110 @@ 1057;MYANMAR VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; 1058;MYANMAR VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; 1059;MYANMAR VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; -10A0;GEORGIAN CAPITAL LETTER AN;Lu;0;L;;;;;N;;Khutsuri;;; -10A1;GEORGIAN CAPITAL LETTER BAN;Lu;0;L;;;;;N;;Khutsuri;;; -10A2;GEORGIAN CAPITAL LETTER GAN;Lu;0;L;;;;;N;;Khutsuri;;; -10A3;GEORGIAN CAPITAL LETTER DON;Lu;0;L;;;;;N;;Khutsuri;;; -10A4;GEORGIAN CAPITAL LETTER EN;Lu;0;L;;;;;N;;Khutsuri;;; -10A5;GEORGIAN CAPITAL LETTER VIN;Lu;0;L;;;;;N;;Khutsuri;;; -10A6;GEORGIAN CAPITAL LETTER ZEN;Lu;0;L;;;;;N;;Khutsuri;;; -10A7;GEORGIAN CAPITAL LETTER TAN;Lu;0;L;;;;;N;;Khutsuri;;; -10A8;GEORGIAN CAPITAL LETTER IN;Lu;0;L;;;;;N;;Khutsuri;;; -10A9;GEORGIAN CAPITAL LETTER KAN;Lu;0;L;;;;;N;;Khutsuri;;; -10AA;GEORGIAN CAPITAL LETTER LAS;Lu;0;L;;;;;N;;Khutsuri;;; -10AB;GEORGIAN CAPITAL LETTER MAN;Lu;0;L;;;;;N;;Khutsuri;;; -10AC;GEORGIAN CAPITAL LETTER NAR;Lu;0;L;;;;;N;;Khutsuri;;; -10AD;GEORGIAN CAPITAL LETTER ON;Lu;0;L;;;;;N;;Khutsuri;;; -10AE;GEORGIAN CAPITAL LETTER PAR;Lu;0;L;;;;;N;;Khutsuri;;; -10AF;GEORGIAN CAPITAL LETTER ZHAR;Lu;0;L;;;;;N;;Khutsuri;;; -10B0;GEORGIAN CAPITAL LETTER RAE;Lu;0;L;;;;;N;;Khutsuri;;; -10B1;GEORGIAN CAPITAL LETTER SAN;Lu;0;L;;;;;N;;Khutsuri;;; -10B2;GEORGIAN CAPITAL LETTER TAR;Lu;0;L;;;;;N;;Khutsuri;;; -10B3;GEORGIAN CAPITAL LETTER UN;Lu;0;L;;;;;N;;Khutsuri;;; -10B4;GEORGIAN CAPITAL LETTER PHAR;Lu;0;L;;;;;N;;Khutsuri;;; -10B5;GEORGIAN CAPITAL LETTER KHAR;Lu;0;L;;;;;N;;Khutsuri;;; -10B6;GEORGIAN CAPITAL LETTER GHAN;Lu;0;L;;;;;N;;Khutsuri;;; -10B7;GEORGIAN CAPITAL LETTER QAR;Lu;0;L;;;;;N;;Khutsuri;;; -10B8;GEORGIAN CAPITAL LETTER SHIN;Lu;0;L;;;;;N;;Khutsuri;;; -10B9;GEORGIAN CAPITAL LETTER CHIN;Lu;0;L;;;;;N;;Khutsuri;;; -10BA;GEORGIAN CAPITAL LETTER CAN;Lu;0;L;;;;;N;;Khutsuri;;; -10BB;GEORGIAN CAPITAL LETTER JIL;Lu;0;L;;;;;N;;Khutsuri;;; -10BC;GEORGIAN CAPITAL LETTER CIL;Lu;0;L;;;;;N;;Khutsuri;;; -10BD;GEORGIAN CAPITAL LETTER CHAR;Lu;0;L;;;;;N;;Khutsuri;;; -10BE;GEORGIAN CAPITAL LETTER XAN;Lu;0;L;;;;;N;;Khutsuri;;; -10BF;GEORGIAN CAPITAL LETTER JHAN;Lu;0;L;;;;;N;;Khutsuri;;; -10C0;GEORGIAN CAPITAL LETTER HAE;Lu;0;L;;;;;N;;Khutsuri;;; -10C1;GEORGIAN CAPITAL LETTER HE;Lu;0;L;;;;;N;;Khutsuri;;; -10C2;GEORGIAN CAPITAL LETTER HIE;Lu;0;L;;;;;N;;Khutsuri;;; -10C3;GEORGIAN CAPITAL LETTER WE;Lu;0;L;;;;;N;;Khutsuri;;; -10C4;GEORGIAN CAPITAL LETTER HAR;Lu;0;L;;;;;N;;Khutsuri;;; -10C5;GEORGIAN CAPITAL LETTER HOE;Lu;0;L;;;;;N;;Khutsuri;;; +105A;MYANMAR LETTER MON NGA;Lo;0;L;;;;;N;;;;; +105B;MYANMAR LETTER MON JHA;Lo;0;L;;;;;N;;;;; +105C;MYANMAR LETTER MON BBA;Lo;0;L;;;;;N;;;;; +105D;MYANMAR LETTER MON BBE;Lo;0;L;;;;;N;;;;; +105E;MYANMAR CONSONANT SIGN MON MEDIAL NA;Mn;0;NSM;;;;;N;;;;; +105F;MYANMAR CONSONANT SIGN MON MEDIAL MA;Mn;0;NSM;;;;;N;;;;; +1060;MYANMAR CONSONANT SIGN MON MEDIAL LA;Mn;0;NSM;;;;;N;;;;; +1061;MYANMAR LETTER SGAW KAREN SHA;Lo;0;L;;;;;N;;;;; +1062;MYANMAR VOWEL SIGN SGAW KAREN EU;Mc;0;L;;;;;N;;;;; +1063;MYANMAR TONE MARK SGAW KAREN HATHI;Mc;0;L;;;;;N;;;;; +1064;MYANMAR TONE MARK SGAW KAREN KE PHO;Mc;0;L;;;;;N;;;;; +1065;MYANMAR LETTER WESTERN PWO KAREN THA;Lo;0;L;;;;;N;;;;; +1066;MYANMAR LETTER WESTERN PWO KAREN PWA;Lo;0;L;;;;;N;;;;; +1067;MYANMAR VOWEL SIGN WESTERN PWO KAREN EU;Mc;0;L;;;;;N;;;;; +1068;MYANMAR VOWEL SIGN WESTERN PWO KAREN UE;Mc;0;L;;;;;N;;;;; +1069;MYANMAR SIGN WESTERN PWO KAREN TONE-1;Mc;0;L;;;;;N;;;;; +106A;MYANMAR SIGN WESTERN PWO KAREN TONE-2;Mc;0;L;;;;;N;;;;; +106B;MYANMAR SIGN WESTERN PWO KAREN TONE-3;Mc;0;L;;;;;N;;;;; +106C;MYANMAR SIGN WESTERN PWO KAREN TONE-4;Mc;0;L;;;;;N;;;;; +106D;MYANMAR SIGN WESTERN PWO KAREN TONE-5;Mc;0;L;;;;;N;;;;; +106E;MYANMAR LETTER EASTERN PWO KAREN NNA;Lo;0;L;;;;;N;;;;; +106F;MYANMAR LETTER EASTERN PWO KAREN YWA;Lo;0;L;;;;;N;;;;; +1070;MYANMAR LETTER EASTERN PWO KAREN GHWA;Lo;0;L;;;;;N;;;;; +1071;MYANMAR VOWEL SIGN GEBA KAREN I;Mn;0;NSM;;;;;N;;;;; +1072;MYANMAR VOWEL SIGN KAYAH OE;Mn;0;NSM;;;;;N;;;;; +1073;MYANMAR VOWEL SIGN KAYAH U;Mn;0;NSM;;;;;N;;;;; +1074;MYANMAR VOWEL SIGN KAYAH EE;Mn;0;NSM;;;;;N;;;;; +1075;MYANMAR LETTER SHAN KA;Lo;0;L;;;;;N;;;;; +1076;MYANMAR LETTER SHAN KHA;Lo;0;L;;;;;N;;;;; +1077;MYANMAR LETTER SHAN GA;Lo;0;L;;;;;N;;;;; +1078;MYANMAR LETTER SHAN CA;Lo;0;L;;;;;N;;;;; +1079;MYANMAR LETTER SHAN ZA;Lo;0;L;;;;;N;;;;; +107A;MYANMAR LETTER SHAN NYA;Lo;0;L;;;;;N;;;;; +107B;MYANMAR LETTER SHAN DA;Lo;0;L;;;;;N;;;;; +107C;MYANMAR LETTER SHAN NA;Lo;0;L;;;;;N;;;;; +107D;MYANMAR LETTER SHAN PHA;Lo;0;L;;;;;N;;;;; +107E;MYANMAR LETTER SHAN FA;Lo;0;L;;;;;N;;;;; +107F;MYANMAR LETTER SHAN BA;Lo;0;L;;;;;N;;;;; +1080;MYANMAR LETTER SHAN THA;Lo;0;L;;;;;N;;;;; +1081;MYANMAR LETTER SHAN HA;Lo;0;L;;;;;N;;;;; +1082;MYANMAR CONSONANT SIGN SHAN MEDIAL WA;Mn;0;NSM;;;;;N;;;;; +1083;MYANMAR VOWEL SIGN SHAN AA;Mc;0;L;;;;;N;;;;; +1084;MYANMAR VOWEL SIGN SHAN E;Mc;0;L;;;;;N;;;;; +1085;MYANMAR VOWEL SIGN SHAN E ABOVE;Mn;0;NSM;;;;;N;;;;; +1086;MYANMAR VOWEL SIGN SHAN FINAL Y;Mn;0;NSM;;;;;N;;;;; +1087;MYANMAR SIGN SHAN TONE-2;Mc;0;L;;;;;N;;;;; +1088;MYANMAR SIGN SHAN TONE-3;Mc;0;L;;;;;N;;;;; +1089;MYANMAR SIGN SHAN TONE-5;Mc;0;L;;;;;N;;;;; +108A;MYANMAR SIGN SHAN TONE-6;Mc;0;L;;;;;N;;;;; +108B;MYANMAR SIGN SHAN COUNCIL TONE-2;Mc;0;L;;;;;N;;;;; +108C;MYANMAR SIGN SHAN COUNCIL TONE-3;Mc;0;L;;;;;N;;;;; +108D;MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE;Mn;220;NSM;;;;;N;;;;; +108E;MYANMAR LETTER RUMAI PALAUNG FA;Lo;0;L;;;;;N;;;;; +108F;MYANMAR SIGN RUMAI PALAUNG TONE-5;Mc;0;L;;;;;N;;;;; +1090;MYANMAR SHAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1091;MYANMAR SHAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1092;MYANMAR SHAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1093;MYANMAR SHAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1094;MYANMAR SHAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1095;MYANMAR SHAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1096;MYANMAR SHAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1097;MYANMAR SHAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1098;MYANMAR SHAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1099;MYANMAR SHAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +109E;MYANMAR SYMBOL SHAN ONE;So;0;L;;;;;N;;;;; +109F;MYANMAR SYMBOL SHAN EXCLAMATION;So;0;L;;;;;N;;;;; +10A0;GEORGIAN CAPITAL LETTER AN;Lu;0;L;;;;;N;;Khutsuri;;2D00; +10A1;GEORGIAN CAPITAL LETTER BAN;Lu;0;L;;;;;N;;Khutsuri;;2D01; +10A2;GEORGIAN CAPITAL LETTER GAN;Lu;0;L;;;;;N;;Khutsuri;;2D02; +10A3;GEORGIAN CAPITAL LETTER DON;Lu;0;L;;;;;N;;Khutsuri;;2D03; +10A4;GEORGIAN CAPITAL LETTER EN;Lu;0;L;;;;;N;;Khutsuri;;2D04; +10A5;GEORGIAN CAPITAL LETTER VIN;Lu;0;L;;;;;N;;Khutsuri;;2D05; +10A6;GEORGIAN CAPITAL LETTER ZEN;Lu;0;L;;;;;N;;Khutsuri;;2D06; +10A7;GEORGIAN CAPITAL LETTER TAN;Lu;0;L;;;;;N;;Khutsuri;;2D07; +10A8;GEORGIAN CAPITAL LETTER IN;Lu;0;L;;;;;N;;Khutsuri;;2D08; +10A9;GEORGIAN CAPITAL LETTER KAN;Lu;0;L;;;;;N;;Khutsuri;;2D09; +10AA;GEORGIAN CAPITAL LETTER LAS;Lu;0;L;;;;;N;;Khutsuri;;2D0A; +10AB;GEORGIAN CAPITAL LETTER MAN;Lu;0;L;;;;;N;;Khutsuri;;2D0B; +10AC;GEORGIAN CAPITAL LETTER NAR;Lu;0;L;;;;;N;;Khutsuri;;2D0C; +10AD;GEORGIAN CAPITAL LETTER ON;Lu;0;L;;;;;N;;Khutsuri;;2D0D; +10AE;GEORGIAN CAPITAL LETTER PAR;Lu;0;L;;;;;N;;Khutsuri;;2D0E; +10AF;GEORGIAN CAPITAL LETTER ZHAR;Lu;0;L;;;;;N;;Khutsuri;;2D0F; +10B0;GEORGIAN CAPITAL LETTER RAE;Lu;0;L;;;;;N;;Khutsuri;;2D10; +10B1;GEORGIAN CAPITAL LETTER SAN;Lu;0;L;;;;;N;;Khutsuri;;2D11; +10B2;GEORGIAN CAPITAL LETTER TAR;Lu;0;L;;;;;N;;Khutsuri;;2D12; +10B3;GEORGIAN CAPITAL LETTER UN;Lu;0;L;;;;;N;;Khutsuri;;2D13; +10B4;GEORGIAN CAPITAL LETTER PHAR;Lu;0;L;;;;;N;;Khutsuri;;2D14; +10B5;GEORGIAN CAPITAL LETTER KHAR;Lu;0;L;;;;;N;;Khutsuri;;2D15; +10B6;GEORGIAN CAPITAL LETTER GHAN;Lu;0;L;;;;;N;;Khutsuri;;2D16; +10B7;GEORGIAN CAPITAL LETTER QAR;Lu;0;L;;;;;N;;Khutsuri;;2D17; +10B8;GEORGIAN CAPITAL LETTER SHIN;Lu;0;L;;;;;N;;Khutsuri;;2D18; +10B9;GEORGIAN CAPITAL LETTER CHIN;Lu;0;L;;;;;N;;Khutsuri;;2D19; +10BA;GEORGIAN CAPITAL LETTER CAN;Lu;0;L;;;;;N;;Khutsuri;;2D1A; +10BB;GEORGIAN CAPITAL LETTER JIL;Lu;0;L;;;;;N;;Khutsuri;;2D1B; +10BC;GEORGIAN CAPITAL LETTER CIL;Lu;0;L;;;;;N;;Khutsuri;;2D1C; +10BD;GEORGIAN CAPITAL LETTER CHAR;Lu;0;L;;;;;N;;Khutsuri;;2D1D; +10BE;GEORGIAN CAPITAL LETTER XAN;Lu;0;L;;;;;N;;Khutsuri;;2D1E; +10BF;GEORGIAN CAPITAL LETTER JHAN;Lu;0;L;;;;;N;;Khutsuri;;2D1F; +10C0;GEORGIAN CAPITAL LETTER HAE;Lu;0;L;;;;;N;;Khutsuri;;2D20; +10C1;GEORGIAN CAPITAL LETTER HE;Lu;0;L;;;;;N;;Khutsuri;;2D21; +10C2;GEORGIAN CAPITAL LETTER HIE;Lu;0;L;;;;;N;;Khutsuri;;2D22; +10C3;GEORGIAN CAPITAL LETTER WE;Lu;0;L;;;;;N;;Khutsuri;;2D23; +10C4;GEORGIAN CAPITAL LETTER HAR;Lu;0;L;;;;;N;;Khutsuri;;2D24; +10C5;GEORGIAN CAPITAL LETTER HOE;Lu;0;L;;;;;N;;Khutsuri;;2D25; 10D0;GEORGIAN LETTER AN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER AN;;;; 10D1;GEORGIAN LETTER BAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER BAN;;;; 10D2;GEORGIAN LETTER GAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GAN;;;; @@ -3079,7 +3424,10 @@ 10F6;GEORGIAN LETTER FI;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER FI;;;; 10F7;GEORGIAN LETTER YN;Lo;0;L;;;;;N;;;;; 10F8;GEORGIAN LETTER ELIFI;Lo;0;L;;;;;N;;;;; +10F9;GEORGIAN LETTER TURNED GAN;Lo;0;L;;;;;N;;;;; +10FA;GEORGIAN LETTER AIN;Lo;0;L;;;;;N;;;;; 10FB;GEORGIAN PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;; +10FC;MODIFIER LETTER GEORGIAN NAR;Lm;0;L;<super> 10DC;;;;N;;;;; 1100;HANGUL CHOSEONG KIYEOK;Lo;0;L;;;;;N;;g *;;; 1101;HANGUL CHOSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;gg *;;; 1102;HANGUL CHOSEONG NIEUN;Lo;0;L;;;;;N;;n *;;; @@ -3327,6 +3675,7 @@ 1204;ETHIOPIC SYLLABLE HEE;Lo;0;L;;;;;N;;;;; 1205;ETHIOPIC SYLLABLE HE;Lo;0;L;;;;;N;;;;; 1206;ETHIOPIC SYLLABLE HO;Lo;0;L;;;;;N;;;;; +1207;ETHIOPIC SYLLABLE HOA;Lo;0;L;;;;;N;;;;; 1208;ETHIOPIC SYLLABLE LA;Lo;0;L;;;;;N;;;;; 1209;ETHIOPIC SYLLABLE LU;Lo;0;L;;;;;N;;;;; 120A;ETHIOPIC SYLLABLE LI;Lo;0;L;;;;;N;;;;; @@ -3390,6 +3739,7 @@ 1244;ETHIOPIC SYLLABLE QEE;Lo;0;L;;;;;N;;;;; 1245;ETHIOPIC SYLLABLE QE;Lo;0;L;;;;;N;;;;; 1246;ETHIOPIC SYLLABLE QO;Lo;0;L;;;;;N;;;;; +1247;ETHIOPIC SYLLABLE QOA;Lo;0;L;;;;;N;;;;; 1248;ETHIOPIC SYLLABLE QWA;Lo;0;L;;;;;N;;;;; 124A;ETHIOPIC SYLLABLE QWI;Lo;0;L;;;;;N;;;;; 124B;ETHIOPIC SYLLABLE QWAA;Lo;0;L;;;;;N;;;;; @@ -3446,6 +3796,7 @@ 1284;ETHIOPIC SYLLABLE XEE;Lo;0;L;;;;;N;;;;; 1285;ETHIOPIC SYLLABLE XE;Lo;0;L;;;;;N;;;;; 1286;ETHIOPIC SYLLABLE XO;Lo;0;L;;;;;N;;;;; +1287;ETHIOPIC SYLLABLE XOA;Lo;0;L;;;;;N;;;;; 1288;ETHIOPIC SYLLABLE XWA;Lo;0;L;;;;;N;;;;; 128A;ETHIOPIC SYLLABLE XWI;Lo;0;L;;;;;N;;;;; 128B;ETHIOPIC SYLLABLE XWAA;Lo;0;L;;;;;N;;;;; @@ -3482,6 +3833,7 @@ 12AC;ETHIOPIC SYLLABLE KEE;Lo;0;L;;;;;N;;;;; 12AD;ETHIOPIC SYLLABLE KE;Lo;0;L;;;;;N;;;;; 12AE;ETHIOPIC SYLLABLE KO;Lo;0;L;;;;;N;;;;; +12AF;ETHIOPIC SYLLABLE KOA;Lo;0;L;;;;;N;;;;; 12B0;ETHIOPIC SYLLABLE KWA;Lo;0;L;;;;;N;;;;; 12B2;ETHIOPIC SYLLABLE KWI;Lo;0;L;;;;;N;;;;; 12B3;ETHIOPIC SYLLABLE KWAA;Lo;0;L;;;;;N;;;;; @@ -3506,6 +3858,7 @@ 12CC;ETHIOPIC SYLLABLE WEE;Lo;0;L;;;;;N;;;;; 12CD;ETHIOPIC SYLLABLE WE;Lo;0;L;;;;;N;;;;; 12CE;ETHIOPIC SYLLABLE WO;Lo;0;L;;;;;N;;;;; +12CF;ETHIOPIC SYLLABLE WOA;Lo;0;L;;;;;N;;;;; 12D0;ETHIOPIC SYLLABLE PHARYNGEAL A;Lo;0;L;;;;;N;;;;; 12D1;ETHIOPIC SYLLABLE PHARYNGEAL U;Lo;0;L;;;;;N;;;;; 12D2;ETHIOPIC SYLLABLE PHARYNGEAL I;Lo;0;L;;;;;N;;;;; @@ -3536,6 +3889,7 @@ 12EC;ETHIOPIC SYLLABLE YEE;Lo;0;L;;;;;N;;;;; 12ED;ETHIOPIC SYLLABLE YE;Lo;0;L;;;;;N;;;;; 12EE;ETHIOPIC SYLLABLE YO;Lo;0;L;;;;;N;;;;; +12EF;ETHIOPIC SYLLABLE YOA;Lo;0;L;;;;;N;;;;; 12F0;ETHIOPIC SYLLABLE DA;Lo;0;L;;;;;N;;;;; 12F1;ETHIOPIC SYLLABLE DU;Lo;0;L;;;;;N;;;;; 12F2;ETHIOPIC SYLLABLE DI;Lo;0;L;;;;;N;;;;; @@ -3567,6 +3921,7 @@ 130C;ETHIOPIC SYLLABLE GEE;Lo;0;L;;;;;N;;;;; 130D;ETHIOPIC SYLLABLE GE;Lo;0;L;;;;;N;;;;; 130E;ETHIOPIC SYLLABLE GO;Lo;0;L;;;;;N;;;;; +130F;ETHIOPIC SYLLABLE GOA;Lo;0;L;;;;;N;;;;; 1310;ETHIOPIC SYLLABLE GWA;Lo;0;L;;;;;N;;;;; 1312;ETHIOPIC SYLLABLE GWI;Lo;0;L;;;;;N;;;;; 1313;ETHIOPIC SYLLABLE GWAA;Lo;0;L;;;;;N;;;;; @@ -3579,6 +3934,7 @@ 131C;ETHIOPIC SYLLABLE GGEE;Lo;0;L;;;;;N;;;;; 131D;ETHIOPIC SYLLABLE GGE;Lo;0;L;;;;;N;;;;; 131E;ETHIOPIC SYLLABLE GGO;Lo;0;L;;;;;N;;;;; +131F;ETHIOPIC SYLLABLE GGWAA;Lo;0;L;;;;;N;;;;; 1320;ETHIOPIC SYLLABLE THA;Lo;0;L;;;;;N;;;;; 1321;ETHIOPIC SYLLABLE THU;Lo;0;L;;;;;N;;;;; 1322;ETHIOPIC SYLLABLE THI;Lo;0;L;;;;;N;;;;; @@ -3618,6 +3974,7 @@ 1344;ETHIOPIC SYLLABLE TZEE;Lo;0;L;;;;;N;;;;; 1345;ETHIOPIC SYLLABLE TZE;Lo;0;L;;;;;N;;;;; 1346;ETHIOPIC SYLLABLE TZO;Lo;0;L;;;;;N;;;;; +1347;ETHIOPIC SYLLABLE TZOA;Lo;0;L;;;;;N;;;;; 1348;ETHIOPIC SYLLABLE FA;Lo;0;L;;;;;N;;;;; 1349;ETHIOPIC SYLLABLE FU;Lo;0;L;;;;;N;;;;; 134A;ETHIOPIC SYLLABLE FI;Lo;0;L;;;;;N;;;;; @@ -3637,6 +3994,8 @@ 1358;ETHIOPIC SYLLABLE RYA;Lo;0;L;;;;;N;;;;; 1359;ETHIOPIC SYLLABLE MYA;Lo;0;L;;;;;N;;;;; 135A;ETHIOPIC SYLLABLE FYA;Lo;0;L;;;;;N;;;;; +135F;ETHIOPIC COMBINING GEMINATION MARK;Mn;230;NSM;;;;;N;;;;; +1360;ETHIOPIC SECTION MARK;So;0;L;;;;;N;;;;; 1361;ETHIOPIC WORDSPACE;Po;0;L;;;;;N;;;;; 1362;ETHIOPIC FULL STOP;Po;0;L;;;;;N;;;;; 1363;ETHIOPIC COMMA;Po;0;L;;;;;N;;;;; @@ -3645,15 +4004,15 @@ 1366;ETHIOPIC PREFACE COLON;Po;0;L;;;;;N;;;;; 1367;ETHIOPIC QUESTION MARK;Po;0;L;;;;;N;;;;; 1368;ETHIOPIC PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;; -1369;ETHIOPIC DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -136A;ETHIOPIC DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -136B;ETHIOPIC DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -136C;ETHIOPIC DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -136D;ETHIOPIC DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -136E;ETHIOPIC DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -136F;ETHIOPIC DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -1370;ETHIOPIC DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -1371;ETHIOPIC DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1369;ETHIOPIC DIGIT ONE;No;0;L;;;1;1;N;;;;; +136A;ETHIOPIC DIGIT TWO;No;0;L;;;2;2;N;;;;; +136B;ETHIOPIC DIGIT THREE;No;0;L;;;3;3;N;;;;; +136C;ETHIOPIC DIGIT FOUR;No;0;L;;;4;4;N;;;;; +136D;ETHIOPIC DIGIT FIVE;No;0;L;;;5;5;N;;;;; +136E;ETHIOPIC DIGIT SIX;No;0;L;;;6;6;N;;;;; +136F;ETHIOPIC DIGIT SEVEN;No;0;L;;;7;7;N;;;;; +1370;ETHIOPIC DIGIT EIGHT;No;0;L;;;8;8;N;;;;; +1371;ETHIOPIC DIGIT NINE;No;0;L;;;9;9;N;;;;; 1372;ETHIOPIC NUMBER TEN;No;0;L;;;;10;N;;;;; 1373;ETHIOPIC NUMBER TWENTY;No;0;L;;;;20;N;;;;; 1374;ETHIOPIC NUMBER THIRTY;No;0;L;;;;30;N;;;;; @@ -3665,6 +4024,32 @@ 137A;ETHIOPIC NUMBER NINETY;No;0;L;;;;90;N;;;;; 137B;ETHIOPIC NUMBER HUNDRED;No;0;L;;;;100;N;;;;; 137C;ETHIOPIC NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;; +1380;ETHIOPIC SYLLABLE SEBATBEIT MWA;Lo;0;L;;;;;N;;;;; +1381;ETHIOPIC SYLLABLE MWI;Lo;0;L;;;;;N;;;;; +1382;ETHIOPIC SYLLABLE MWEE;Lo;0;L;;;;;N;;;;; +1383;ETHIOPIC SYLLABLE MWE;Lo;0;L;;;;;N;;;;; +1384;ETHIOPIC SYLLABLE SEBATBEIT BWA;Lo;0;L;;;;;N;;;;; +1385;ETHIOPIC SYLLABLE BWI;Lo;0;L;;;;;N;;;;; +1386;ETHIOPIC SYLLABLE BWEE;Lo;0;L;;;;;N;;;;; +1387;ETHIOPIC SYLLABLE BWE;Lo;0;L;;;;;N;;;;; +1388;ETHIOPIC SYLLABLE SEBATBEIT FWA;Lo;0;L;;;;;N;;;;; +1389;ETHIOPIC SYLLABLE FWI;Lo;0;L;;;;;N;;;;; +138A;ETHIOPIC SYLLABLE FWEE;Lo;0;L;;;;;N;;;;; +138B;ETHIOPIC SYLLABLE FWE;Lo;0;L;;;;;N;;;;; +138C;ETHIOPIC SYLLABLE SEBATBEIT PWA;Lo;0;L;;;;;N;;;;; +138D;ETHIOPIC SYLLABLE PWI;Lo;0;L;;;;;N;;;;; +138E;ETHIOPIC SYLLABLE PWEE;Lo;0;L;;;;;N;;;;; +138F;ETHIOPIC SYLLABLE PWE;Lo;0;L;;;;;N;;;;; +1390;ETHIOPIC TONAL MARK YIZET;So;0;ON;;;;;N;;;;; +1391;ETHIOPIC TONAL MARK DERET;So;0;ON;;;;;N;;;;; +1392;ETHIOPIC TONAL MARK RIKRIK;So;0;ON;;;;;N;;;;; +1393;ETHIOPIC TONAL MARK SHORT RIKRIK;So;0;ON;;;;;N;;;;; +1394;ETHIOPIC TONAL MARK DIFAT;So;0;ON;;;;;N;;;;; +1395;ETHIOPIC TONAL MARK KENAT;So;0;ON;;;;;N;;;;; +1396;ETHIOPIC TONAL MARK CHIRET;So;0;ON;;;;;N;;;;; +1397;ETHIOPIC TONAL MARK HIDET;So;0;ON;;;;;N;;;;; +1398;ETHIOPIC TONAL MARK DERET-HIDET;So;0;ON;;;;;N;;;;; +1399;ETHIOPIC TONAL MARK KURT;So;0;ON;;;;;N;;;;; 13A0;CHEROKEE LETTER A;Lo;0;L;;;;;N;;;;; 13A1;CHEROKEE LETTER E;Lo;0;L;;;;;N;;;;; 13A2;CHEROKEE LETTER I;Lo;0;L;;;;;N;;;;; @@ -4407,8 +4792,8 @@ 1698;OGHAM LETTER IFIN;Lo;0;L;;;;;N;;;;; 1699;OGHAM LETTER EAMHANCHOLL;Lo;0;L;;;;;N;;;;; 169A;OGHAM LETTER PEITH;Lo;0;L;;;;;N;;;;; -169B;OGHAM FEATHER MARK;Ps;0;ON;;;;;N;;;;; -169C;OGHAM REVERSED FEATHER MARK;Pe;0;ON;;;;;N;;;;; +169B;OGHAM FEATHER MARK;Ps;0;ON;;;;;Y;;;;; +169C;OGHAM REVERSED FEATHER MARK;Pe;0;ON;;;;;Y;;;;; 16A0;RUNIC LETTER FEHU FEOH FE F;Lo;0;L;;;;;N;;;;; 16A1;RUNIC LETTER V;Lo;0;L;;;;;N;;;;; 16A2;RUNIC LETTER URUZ UR U;Lo;0;L;;;;;N;;;;; @@ -4840,6 +5225,7 @@ 18A7;MONGOLIAN LETTER ALI GALI HALF YA;Lo;0;L;;;;;N;;;;; 18A8;MONGOLIAN LETTER MANCHU ALI GALI BHA;Lo;0;L;;;;;N;;;;; 18A9;MONGOLIAN LETTER ALI GALI DAGALGA;Mn;228;NSM;;;;;N;;;;; +18AA;MONGOLIAN LETTER MANCHU ALI GALI LHA;Lo;0;L;;;;;N;;;;; 1900;LIMBU VOWEL-CARRIER LETTER;Lo;0;L;;;;;N;;;;; 1901;LIMBU LETTER KA;Lo;0;L;;;;;N;;;;; 1902;LIMBU LETTER KHA;Lo;0;L;;;;;N;;;;; @@ -4878,9 +5264,9 @@ 1926;LIMBU VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; 1927;LIMBU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; 1928;LIMBU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; -1929;LIMBU SUBJOINED LETTER YA;Mc;0;NSM;;;;;N;;;;; -192A;LIMBU SUBJOINED LETTER RA;Mc;0;NSM;;;;;N;;;;; -192B;LIMBU SUBJOINED LETTER WA;Mc;0;NSM;;;;;N;;;;; +1929;LIMBU SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;; +192A;LIMBU SUBJOINED LETTER RA;Mc;0;L;;;;;N;;;;; +192B;LIMBU SUBJOINED LETTER WA;Mc;0;L;;;;;N;;;;; 1930;LIMBU SMALL LETTER KA;Mc;0;L;;;;;N;;;;; 1931;LIMBU SMALL LETTER NGA;Mc;0;L;;;;;N;;;;; 1932;LIMBU SMALL LETTER ANUSVARA;Mn;0;NSM;;;;;N;;;;; @@ -4941,6 +5327,86 @@ 1972;TAI LE LETTER TONE-4;Lo;0;L;;;;;N;;;;; 1973;TAI LE LETTER TONE-5;Lo;0;L;;;;;N;;;;; 1974;TAI LE LETTER TONE-6;Lo;0;L;;;;;N;;;;; +1980;NEW TAI LUE LETTER HIGH QA;Lo;0;L;;;;;N;;;;; +1981;NEW TAI LUE LETTER LOW QA;Lo;0;L;;;;;N;;;;; +1982;NEW TAI LUE LETTER HIGH KA;Lo;0;L;;;;;N;;;;; +1983;NEW TAI LUE LETTER HIGH XA;Lo;0;L;;;;;N;;;;; +1984;NEW TAI LUE LETTER HIGH NGA;Lo;0;L;;;;;N;;;;; +1985;NEW TAI LUE LETTER LOW KA;Lo;0;L;;;;;N;;;;; +1986;NEW TAI LUE LETTER LOW XA;Lo;0;L;;;;;N;;;;; +1987;NEW TAI LUE LETTER LOW NGA;Lo;0;L;;;;;N;;;;; +1988;NEW TAI LUE LETTER HIGH TSA;Lo;0;L;;;;;N;;;;; +1989;NEW TAI LUE LETTER HIGH SA;Lo;0;L;;;;;N;;;;; +198A;NEW TAI LUE LETTER HIGH YA;Lo;0;L;;;;;N;;;;; +198B;NEW TAI LUE LETTER LOW TSA;Lo;0;L;;;;;N;;;;; +198C;NEW TAI LUE LETTER LOW SA;Lo;0;L;;;;;N;;;;; +198D;NEW TAI LUE LETTER LOW YA;Lo;0;L;;;;;N;;;;; +198E;NEW TAI LUE LETTER HIGH TA;Lo;0;L;;;;;N;;;;; +198F;NEW TAI LUE LETTER HIGH THA;Lo;0;L;;;;;N;;;;; +1990;NEW TAI LUE LETTER HIGH NA;Lo;0;L;;;;;N;;;;; +1991;NEW TAI LUE LETTER LOW TA;Lo;0;L;;;;;N;;;;; +1992;NEW TAI LUE LETTER LOW THA;Lo;0;L;;;;;N;;;;; +1993;NEW TAI LUE LETTER LOW NA;Lo;0;L;;;;;N;;;;; +1994;NEW TAI LUE LETTER HIGH PA;Lo;0;L;;;;;N;;;;; +1995;NEW TAI LUE LETTER HIGH PHA;Lo;0;L;;;;;N;;;;; +1996;NEW TAI LUE LETTER HIGH MA;Lo;0;L;;;;;N;;;;; +1997;NEW TAI LUE LETTER LOW PA;Lo;0;L;;;;;N;;;;; +1998;NEW TAI LUE LETTER LOW PHA;Lo;0;L;;;;;N;;;;; +1999;NEW TAI LUE LETTER LOW MA;Lo;0;L;;;;;N;;;;; +199A;NEW TAI LUE LETTER HIGH FA;Lo;0;L;;;;;N;;;;; +199B;NEW TAI LUE LETTER HIGH VA;Lo;0;L;;;;;N;;;;; +199C;NEW TAI LUE LETTER HIGH LA;Lo;0;L;;;;;N;;;;; +199D;NEW TAI LUE LETTER LOW FA;Lo;0;L;;;;;N;;;;; +199E;NEW TAI LUE LETTER LOW VA;Lo;0;L;;;;;N;;;;; +199F;NEW TAI LUE LETTER LOW LA;Lo;0;L;;;;;N;;;;; +19A0;NEW TAI LUE LETTER HIGH HA;Lo;0;L;;;;;N;;;;; +19A1;NEW TAI LUE LETTER HIGH DA;Lo;0;L;;;;;N;;;;; +19A2;NEW TAI LUE LETTER HIGH BA;Lo;0;L;;;;;N;;;;; +19A3;NEW TAI LUE LETTER LOW HA;Lo;0;L;;;;;N;;;;; +19A4;NEW TAI LUE LETTER LOW DA;Lo;0;L;;;;;N;;;;; +19A5;NEW TAI LUE LETTER LOW BA;Lo;0;L;;;;;N;;;;; +19A6;NEW TAI LUE LETTER HIGH KVA;Lo;0;L;;;;;N;;;;; +19A7;NEW TAI LUE LETTER HIGH XVA;Lo;0;L;;;;;N;;;;; +19A8;NEW TAI LUE LETTER LOW KVA;Lo;0;L;;;;;N;;;;; +19A9;NEW TAI LUE LETTER LOW XVA;Lo;0;L;;;;;N;;;;; +19B0;NEW TAI LUE VOWEL SIGN VOWEL SHORTENER;Mc;0;L;;;;;N;;;;; +19B1;NEW TAI LUE VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +19B2;NEW TAI LUE VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +19B3;NEW TAI LUE VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +19B4;NEW TAI LUE VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +19B5;NEW TAI LUE VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +19B6;NEW TAI LUE VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; +19B7;NEW TAI LUE VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +19B8;NEW TAI LUE VOWEL SIGN OA;Mc;0;L;;;;;N;;;;; +19B9;NEW TAI LUE VOWEL SIGN UE;Mc;0;L;;;;;N;;;;; +19BA;NEW TAI LUE VOWEL SIGN AY;Mc;0;L;;;;;N;;;;; +19BB;NEW TAI LUE VOWEL SIGN AAY;Mc;0;L;;;;;N;;;;; +19BC;NEW TAI LUE VOWEL SIGN UY;Mc;0;L;;;;;N;;;;; +19BD;NEW TAI LUE VOWEL SIGN OY;Mc;0;L;;;;;N;;;;; +19BE;NEW TAI LUE VOWEL SIGN OAY;Mc;0;L;;;;;N;;;;; +19BF;NEW TAI LUE VOWEL SIGN UEY;Mc;0;L;;;;;N;;;;; +19C0;NEW TAI LUE VOWEL SIGN IY;Mc;0;L;;;;;N;;;;; +19C1;NEW TAI LUE LETTER FINAL V;Lo;0;L;;;;;N;;;;; +19C2;NEW TAI LUE LETTER FINAL NG;Lo;0;L;;;;;N;;;;; +19C3;NEW TAI LUE LETTER FINAL N;Lo;0;L;;;;;N;;;;; +19C4;NEW TAI LUE LETTER FINAL M;Lo;0;L;;;;;N;;;;; +19C5;NEW TAI LUE LETTER FINAL K;Lo;0;L;;;;;N;;;;; +19C6;NEW TAI LUE LETTER FINAL D;Lo;0;L;;;;;N;;;;; +19C7;NEW TAI LUE LETTER FINAL B;Lo;0;L;;;;;N;;;;; +19C8;NEW TAI LUE TONE MARK-1;Mc;0;L;;;;;N;;;;; +19C9;NEW TAI LUE TONE MARK-2;Mc;0;L;;;;;N;;;;; +19D0;NEW TAI LUE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +19D1;NEW TAI LUE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +19D2;NEW TAI LUE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +19D3;NEW TAI LUE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +19D4;NEW TAI LUE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +19D5;NEW TAI LUE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +19D6;NEW TAI LUE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +19D7;NEW TAI LUE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +19D8;NEW TAI LUE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +19D9;NEW TAI LUE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +19DE;NEW TAI LUE SIGN LAE;Po;0;ON;;;;;N;;;;; +19DF;NEW TAI LUE SIGN LAEV;Po;0;ON;;;;;N;;;;; 19E0;KHMER SYMBOL PATHAMASAT;So;0;ON;;;;;N;;;;; 19E1;KHMER SYMBOL MUOY KOET;So;0;ON;;;;;N;;;;; 19E2;KHMER SYMBOL PII KOET;So;0;ON;;;;;N;;;;; @@ -4973,6 +5439,334 @@ 19FD;KHMER SYMBOL DAP-BEI ROC;So;0;ON;;;;;N;;;;; 19FE;KHMER SYMBOL DAP-BUON ROC;So;0;ON;;;;;N;;;;; 19FF;KHMER SYMBOL DAP-PRAM ROC;So;0;ON;;;;;N;;;;; +1A00;BUGINESE LETTER KA;Lo;0;L;;;;;N;;;;; +1A01;BUGINESE LETTER GA;Lo;0;L;;;;;N;;;;; +1A02;BUGINESE LETTER NGA;Lo;0;L;;;;;N;;;;; +1A03;BUGINESE LETTER NGKA;Lo;0;L;;;;;N;;;;; +1A04;BUGINESE LETTER PA;Lo;0;L;;;;;N;;;;; +1A05;BUGINESE LETTER BA;Lo;0;L;;;;;N;;;;; +1A06;BUGINESE LETTER MA;Lo;0;L;;;;;N;;;;; +1A07;BUGINESE LETTER MPA;Lo;0;L;;;;;N;;;;; +1A08;BUGINESE LETTER TA;Lo;0;L;;;;;N;;;;; +1A09;BUGINESE LETTER DA;Lo;0;L;;;;;N;;;;; +1A0A;BUGINESE LETTER NA;Lo;0;L;;;;;N;;;;; +1A0B;BUGINESE LETTER NRA;Lo;0;L;;;;;N;;;;; +1A0C;BUGINESE LETTER CA;Lo;0;L;;;;;N;;;;; +1A0D;BUGINESE LETTER JA;Lo;0;L;;;;;N;;;;; +1A0E;BUGINESE LETTER NYA;Lo;0;L;;;;;N;;;;; +1A0F;BUGINESE LETTER NYCA;Lo;0;L;;;;;N;;;;; +1A10;BUGINESE LETTER YA;Lo;0;L;;;;;N;;;;; +1A11;BUGINESE LETTER RA;Lo;0;L;;;;;N;;;;; +1A12;BUGINESE LETTER LA;Lo;0;L;;;;;N;;;;; +1A13;BUGINESE LETTER VA;Lo;0;L;;;;;N;;;;; +1A14;BUGINESE LETTER SA;Lo;0;L;;;;;N;;;;; +1A15;BUGINESE LETTER A;Lo;0;L;;;;;N;;;;; +1A16;BUGINESE LETTER HA;Lo;0;L;;;;;N;;;;; +1A17;BUGINESE VOWEL SIGN I;Mn;230;NSM;;;;;N;;;;; +1A18;BUGINESE VOWEL SIGN U;Mn;220;NSM;;;;;N;;;;; +1A19;BUGINESE VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +1A1A;BUGINESE VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +1A1B;BUGINESE VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; +1A1E;BUGINESE PALLAWA;Po;0;L;;;;;N;;;;; +1A1F;BUGINESE END OF SECTION;Po;0;L;;;;;N;;;;; +1B00;BALINESE SIGN ULU RICEM;Mn;0;NSM;;;;;N;;ardhacandra;;; +1B01;BALINESE SIGN ULU CANDRA;Mn;0;NSM;;;;;N;;candrabindu;;; +1B02;BALINESE SIGN CECEK;Mn;0;NSM;;;;;N;;anusvara;;; +1B03;BALINESE SIGN SURANG;Mn;0;NSM;;;;;N;;repha;;; +1B04;BALINESE SIGN BISAH;Mc;0;L;;;;;N;;visarga;;; +1B05;BALINESE LETTER AKARA;Lo;0;L;;;;;N;;a;;; +1B06;BALINESE LETTER AKARA TEDUNG;Lo;0;L;1B05 1B35;;;;N;;aa;;; +1B07;BALINESE LETTER IKARA;Lo;0;L;;;;;N;;i;;; +1B08;BALINESE LETTER IKARA TEDUNG;Lo;0;L;1B07 1B35;;;;N;;ii;;; +1B09;BALINESE LETTER UKARA;Lo;0;L;;;;;N;;u;;; +1B0A;BALINESE LETTER UKARA TEDUNG;Lo;0;L;1B09 1B35;;;;N;;uu;;; +1B0B;BALINESE LETTER RA REPA;Lo;0;L;;;;;N;;vocalic r;;; +1B0C;BALINESE LETTER RA REPA TEDUNG;Lo;0;L;1B0B 1B35;;;;N;;vocalic rr;;; +1B0D;BALINESE LETTER LA LENGA;Lo;0;L;;;;;N;;vocalic l;;; +1B0E;BALINESE LETTER LA LENGA TEDUNG;Lo;0;L;1B0D 1B35;;;;N;;vocalic ll;;; +1B0F;BALINESE LETTER EKARA;Lo;0;L;;;;;N;;e;;; +1B10;BALINESE LETTER AIKARA;Lo;0;L;;;;;N;;ai;;; +1B11;BALINESE LETTER OKARA;Lo;0;L;;;;;N;;o;;; +1B12;BALINESE LETTER OKARA TEDUNG;Lo;0;L;1B11 1B35;;;;N;;au;;; +1B13;BALINESE LETTER KA;Lo;0;L;;;;;N;;;;; +1B14;BALINESE LETTER KA MAHAPRANA;Lo;0;L;;;;;N;;kha;;; +1B15;BALINESE LETTER GA;Lo;0;L;;;;;N;;;;; +1B16;BALINESE LETTER GA GORA;Lo;0;L;;;;;N;;gha;;; +1B17;BALINESE LETTER NGA;Lo;0;L;;;;;N;;;;; +1B18;BALINESE LETTER CA;Lo;0;L;;;;;N;;;;; +1B19;BALINESE LETTER CA LACA;Lo;0;L;;;;;N;;cha;;; +1B1A;BALINESE LETTER JA;Lo;0;L;;;;;N;;;;; +1B1B;BALINESE LETTER JA JERA;Lo;0;L;;;;;N;;jha;;; +1B1C;BALINESE LETTER NYA;Lo;0;L;;;;;N;;;;; +1B1D;BALINESE LETTER TA LATIK;Lo;0;L;;;;;N;;tta;;; +1B1E;BALINESE LETTER TA MURDA MAHAPRANA;Lo;0;L;;;;;N;;ttha;;; +1B1F;BALINESE LETTER DA MURDA ALPAPRANA;Lo;0;L;;;;;N;;dda;;; +1B20;BALINESE LETTER DA MURDA MAHAPRANA;Lo;0;L;;;;;N;;ddha;;; +1B21;BALINESE LETTER NA RAMBAT;Lo;0;L;;;;;N;;nna;;; +1B22;BALINESE LETTER TA;Lo;0;L;;;;;N;;;;; +1B23;BALINESE LETTER TA TAWA;Lo;0;L;;;;;N;;tha;;; +1B24;BALINESE LETTER DA;Lo;0;L;;;;;N;;;;; +1B25;BALINESE LETTER DA MADU;Lo;0;L;;;;;N;;dha;;; +1B26;BALINESE LETTER NA;Lo;0;L;;;;;N;;;;; +1B27;BALINESE LETTER PA;Lo;0;L;;;;;N;;;;; +1B28;BALINESE LETTER PA KAPAL;Lo;0;L;;;;;N;;pha;;; +1B29;BALINESE LETTER BA;Lo;0;L;;;;;N;;;;; +1B2A;BALINESE LETTER BA KEMBANG;Lo;0;L;;;;;N;;bha;;; +1B2B;BALINESE LETTER MA;Lo;0;L;;;;;N;;;;; +1B2C;BALINESE LETTER YA;Lo;0;L;;;;;N;;;;; +1B2D;BALINESE LETTER RA;Lo;0;L;;;;;N;;;;; +1B2E;BALINESE LETTER LA;Lo;0;L;;;;;N;;;;; +1B2F;BALINESE LETTER WA;Lo;0;L;;;;;N;;;;; +1B30;BALINESE LETTER SA SAGA;Lo;0;L;;;;;N;;sha;;; +1B31;BALINESE LETTER SA SAPA;Lo;0;L;;;;;N;;ssa;;; +1B32;BALINESE LETTER SA;Lo;0;L;;;;;N;;;;; +1B33;BALINESE LETTER HA;Lo;0;L;;;;;N;;;;; +1B34;BALINESE SIGN REREKAN;Mn;7;NSM;;;;;N;;nukta;;; +1B35;BALINESE VOWEL SIGN TEDUNG;Mc;0;L;;;;;N;;aa;;; +1B36;BALINESE VOWEL SIGN ULU;Mn;0;NSM;;;;;N;;i;;; +1B37;BALINESE VOWEL SIGN ULU SARI;Mn;0;NSM;;;;;N;;ii;;; +1B38;BALINESE VOWEL SIGN SUKU;Mn;0;NSM;;;;;N;;u;;; +1B39;BALINESE VOWEL SIGN SUKU ILUT;Mn;0;NSM;;;;;N;;uu;;; +1B3A;BALINESE VOWEL SIGN RA REPA;Mn;0;NSM;;;;;N;;vocalic r;;; +1B3B;BALINESE VOWEL SIGN RA REPA TEDUNG;Mc;0;L;1B3A 1B35;;;;N;;vocalic rr;;; +1B3C;BALINESE VOWEL SIGN LA LENGA;Mn;0;NSM;;;;;N;;vocalic l;;; +1B3D;BALINESE VOWEL SIGN LA LENGA TEDUNG;Mc;0;L;1B3C 1B35;;;;N;;vocalic ll;;; +1B3E;BALINESE VOWEL SIGN TALING;Mc;0;L;;;;;N;;e;;; +1B3F;BALINESE VOWEL SIGN TALING REPA;Mc;0;L;;;;;N;;ai;;; +1B40;BALINESE VOWEL SIGN TALING TEDUNG;Mc;0;L;1B3E 1B35;;;;N;;o;;; +1B41;BALINESE VOWEL SIGN TALING REPA TEDUNG;Mc;0;L;1B3F 1B35;;;;N;;au;;; +1B42;BALINESE VOWEL SIGN PEPET;Mn;0;NSM;;;;;N;;ae;;; +1B43;BALINESE VOWEL SIGN PEPET TEDUNG;Mc;0;L;1B42 1B35;;;;N;;oe;;; +1B44;BALINESE ADEG ADEG;Mc;9;L;;;;;N;;virama;;; +1B45;BALINESE LETTER KAF SASAK;Lo;0;L;;;;;N;;;;; +1B46;BALINESE LETTER KHOT SASAK;Lo;0;L;;;;;N;;;;; +1B47;BALINESE LETTER TZIR SASAK;Lo;0;L;;;;;N;;;;; +1B48;BALINESE LETTER EF SASAK;Lo;0;L;;;;;N;;;;; +1B49;BALINESE LETTER VE SASAK;Lo;0;L;;;;;N;;;;; +1B4A;BALINESE LETTER ZAL SASAK;Lo;0;L;;;;;N;;;;; +1B4B;BALINESE LETTER ASYURA SASAK;Lo;0;L;;;;;N;;;;; +1B50;BALINESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1B51;BALINESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1B52;BALINESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1B53;BALINESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1B54;BALINESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1B55;BALINESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1B56;BALINESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1B57;BALINESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1B58;BALINESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1B59;BALINESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1B5A;BALINESE PANTI;Po;0;L;;;;;N;;section;;; +1B5B;BALINESE PAMADA;Po;0;L;;;;;N;;honorific section;;; +1B5C;BALINESE WINDU;Po;0;L;;;;;N;;punctuation ring;;; +1B5D;BALINESE CARIK PAMUNGKAH;Po;0;L;;;;;N;;colon;;; +1B5E;BALINESE CARIK SIKI;Po;0;L;;;;;N;;danda;;; +1B5F;BALINESE CARIK PAREREN;Po;0;L;;;;;N;;double danda;;; +1B60;BALINESE PAMENENG;Po;0;L;;;;;N;;line-breaking hyphen;;; +1B61;BALINESE MUSICAL SYMBOL DONG;So;0;L;;;;;N;;;;; +1B62;BALINESE MUSICAL SYMBOL DENG;So;0;L;;;;;N;;;;; +1B63;BALINESE MUSICAL SYMBOL DUNG;So;0;L;;;;;N;;;;; +1B64;BALINESE MUSICAL SYMBOL DANG;So;0;L;;;;;N;;;;; +1B65;BALINESE MUSICAL SYMBOL DANG SURANG;So;0;L;;;;;N;;;;; +1B66;BALINESE MUSICAL SYMBOL DING;So;0;L;;;;;N;;;;; +1B67;BALINESE MUSICAL SYMBOL DAENG;So;0;L;;;;;N;;;;; +1B68;BALINESE MUSICAL SYMBOL DEUNG;So;0;L;;;;;N;;;;; +1B69;BALINESE MUSICAL SYMBOL DAING;So;0;L;;;;;N;;;;; +1B6A;BALINESE MUSICAL SYMBOL DANG GEDE;So;0;L;;;;;N;;;;; +1B6B;BALINESE MUSICAL SYMBOL COMBINING TEGEH;Mn;230;NSM;;;;;N;;;;; +1B6C;BALINESE MUSICAL SYMBOL COMBINING ENDEP;Mn;220;NSM;;;;;N;;;;; +1B6D;BALINESE MUSICAL SYMBOL COMBINING KEMPUL;Mn;230;NSM;;;;;N;;;;; +1B6E;BALINESE MUSICAL SYMBOL COMBINING KEMPLI;Mn;230;NSM;;;;;N;;;;; +1B6F;BALINESE MUSICAL SYMBOL COMBINING JEGOGAN;Mn;230;NSM;;;;;N;;;;; +1B70;BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN;Mn;230;NSM;;;;;N;;;;; +1B71;BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN;Mn;230;NSM;;;;;N;;;;; +1B72;BALINESE MUSICAL SYMBOL COMBINING BENDE;Mn;230;NSM;;;;;N;;;;; +1B73;BALINESE MUSICAL SYMBOL COMBINING GONG;Mn;230;NSM;;;;;N;;;;; +1B74;BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG;So;0;L;;;;;N;;;;; +1B75;BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG;So;0;L;;;;;N;;;;; +1B76;BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK;So;0;L;;;;;N;;;;; +1B77;BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK;So;0;L;;;;;N;;;;; +1B78;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG;So;0;L;;;;;N;;;;; +1B79;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG;So;0;L;;;;;N;;;;; +1B7A;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK;So;0;L;;;;;N;;;;; +1B7B;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK;So;0;L;;;;;N;;;;; +1B7C;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING;So;0;L;;;;;N;;;;; +1B80;SUNDANESE SIGN PANYECEK;Mn;0;NSM;;;;;N;;;;; +1B81;SUNDANESE SIGN PANGLAYAR;Mn;0;NSM;;;;;N;;;;; +1B82;SUNDANESE SIGN PANGWISAD;Mc;0;L;;;;;N;;;;; +1B83;SUNDANESE LETTER A;Lo;0;L;;;;;N;;;;; +1B84;SUNDANESE LETTER I;Lo;0;L;;;;;N;;;;; +1B85;SUNDANESE LETTER U;Lo;0;L;;;;;N;;;;; +1B86;SUNDANESE LETTER AE;Lo;0;L;;;;;N;;;;; +1B87;SUNDANESE LETTER O;Lo;0;L;;;;;N;;;;; +1B88;SUNDANESE LETTER E;Lo;0;L;;;;;N;;;;; +1B89;SUNDANESE LETTER EU;Lo;0;L;;;;;N;;;;; +1B8A;SUNDANESE LETTER KA;Lo;0;L;;;;;N;;;;; +1B8B;SUNDANESE LETTER QA;Lo;0;L;;;;;N;;;;; +1B8C;SUNDANESE LETTER GA;Lo;0;L;;;;;N;;;;; +1B8D;SUNDANESE LETTER NGA;Lo;0;L;;;;;N;;;;; +1B8E;SUNDANESE LETTER CA;Lo;0;L;;;;;N;;;;; +1B8F;SUNDANESE LETTER JA;Lo;0;L;;;;;N;;;;; +1B90;SUNDANESE LETTER ZA;Lo;0;L;;;;;N;;;;; +1B91;SUNDANESE LETTER NYA;Lo;0;L;;;;;N;;;;; +1B92;SUNDANESE LETTER TA;Lo;0;L;;;;;N;;;;; +1B93;SUNDANESE LETTER DA;Lo;0;L;;;;;N;;;;; +1B94;SUNDANESE LETTER NA;Lo;0;L;;;;;N;;;;; +1B95;SUNDANESE LETTER PA;Lo;0;L;;;;;N;;;;; +1B96;SUNDANESE LETTER FA;Lo;0;L;;;;;N;;;;; +1B97;SUNDANESE LETTER VA;Lo;0;L;;;;;N;;;;; +1B98;SUNDANESE LETTER BA;Lo;0;L;;;;;N;;;;; +1B99;SUNDANESE LETTER MA;Lo;0;L;;;;;N;;;;; +1B9A;SUNDANESE LETTER YA;Lo;0;L;;;;;N;;;;; +1B9B;SUNDANESE LETTER RA;Lo;0;L;;;;;N;;;;; +1B9C;SUNDANESE LETTER LA;Lo;0;L;;;;;N;;;;; +1B9D;SUNDANESE LETTER WA;Lo;0;L;;;;;N;;;;; +1B9E;SUNDANESE LETTER SA;Lo;0;L;;;;;N;;;;; +1B9F;SUNDANESE LETTER XA;Lo;0;L;;;;;N;;;;; +1BA0;SUNDANESE LETTER HA;Lo;0;L;;;;;N;;;;; +1BA1;SUNDANESE CONSONANT SIGN PAMINGKAL;Mc;0;L;;;;;N;;;;; +1BA2;SUNDANESE CONSONANT SIGN PANYAKRA;Mn;0;NSM;;;;;N;;;;; +1BA3;SUNDANESE CONSONANT SIGN PANYIKU;Mn;0;NSM;;;;;N;;;;; +1BA4;SUNDANESE VOWEL SIGN PANGHULU;Mn;0;NSM;;;;;N;;;;; +1BA5;SUNDANESE VOWEL SIGN PANYUKU;Mn;0;NSM;;;;;N;;;;; +1BA6;SUNDANESE VOWEL SIGN PANAELAENG;Mc;0;L;;;;;N;;;;; +1BA7;SUNDANESE VOWEL SIGN PANOLONG;Mc;0;L;;;;;N;;;;; +1BA8;SUNDANESE VOWEL SIGN PAMEPET;Mn;0;NSM;;;;;N;;;;; +1BA9;SUNDANESE VOWEL SIGN PANEULEUNG;Mn;0;NSM;;;;;N;;;;; +1BAA;SUNDANESE SIGN PAMAAEH;Mc;9;L;;;;;N;;;;; +1BAE;SUNDANESE LETTER KHA;Lo;0;L;;;;;N;;;;; +1BAF;SUNDANESE LETTER SYA;Lo;0;L;;;;;N;;;;; +1BB0;SUNDANESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1BB1;SUNDANESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1BB2;SUNDANESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1BB3;SUNDANESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1BB4;SUNDANESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1BB5;SUNDANESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1BB6;SUNDANESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1BB7;SUNDANESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1BB8;SUNDANESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1BB9;SUNDANESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1C00;LEPCHA LETTER KA;Lo;0;L;;;;;N;;;;; +1C01;LEPCHA LETTER KLA;Lo;0;L;;;;;N;;;;; +1C02;LEPCHA LETTER KHA;Lo;0;L;;;;;N;;;;; +1C03;LEPCHA LETTER GA;Lo;0;L;;;;;N;;;;; +1C04;LEPCHA LETTER GLA;Lo;0;L;;;;;N;;;;; +1C05;LEPCHA LETTER NGA;Lo;0;L;;;;;N;;;;; +1C06;LEPCHA LETTER CA;Lo;0;L;;;;;N;;;;; +1C07;LEPCHA LETTER CHA;Lo;0;L;;;;;N;;;;; +1C08;LEPCHA LETTER JA;Lo;0;L;;;;;N;;;;; +1C09;LEPCHA LETTER NYA;Lo;0;L;;;;;N;;;;; +1C0A;LEPCHA LETTER TA;Lo;0;L;;;;;N;;;;; +1C0B;LEPCHA LETTER THA;Lo;0;L;;;;;N;;;;; +1C0C;LEPCHA LETTER DA;Lo;0;L;;;;;N;;;;; +1C0D;LEPCHA LETTER NA;Lo;0;L;;;;;N;;;;; +1C0E;LEPCHA LETTER PA;Lo;0;L;;;;;N;;;;; +1C0F;LEPCHA LETTER PLA;Lo;0;L;;;;;N;;;;; +1C10;LEPCHA LETTER PHA;Lo;0;L;;;;;N;;;;; +1C11;LEPCHA LETTER FA;Lo;0;L;;;;;N;;;;; +1C12;LEPCHA LETTER FLA;Lo;0;L;;;;;N;;;;; +1C13;LEPCHA LETTER BA;Lo;0;L;;;;;N;;;;; +1C14;LEPCHA LETTER BLA;Lo;0;L;;;;;N;;;;; +1C15;LEPCHA LETTER MA;Lo;0;L;;;;;N;;;;; +1C16;LEPCHA LETTER MLA;Lo;0;L;;;;;N;;;;; +1C17;LEPCHA LETTER TSA;Lo;0;L;;;;;N;;;;; +1C18;LEPCHA LETTER TSHA;Lo;0;L;;;;;N;;;;; +1C19;LEPCHA LETTER DZA;Lo;0;L;;;;;N;;;;; +1C1A;LEPCHA LETTER YA;Lo;0;L;;;;;N;;;;; +1C1B;LEPCHA LETTER RA;Lo;0;L;;;;;N;;;;; +1C1C;LEPCHA LETTER LA;Lo;0;L;;;;;N;;;;; +1C1D;LEPCHA LETTER HA;Lo;0;L;;;;;N;;;;; +1C1E;LEPCHA LETTER HLA;Lo;0;L;;;;;N;;;;; +1C1F;LEPCHA LETTER VA;Lo;0;L;;;;;N;;;;; +1C20;LEPCHA LETTER SA;Lo;0;L;;;;;N;;;;; +1C21;LEPCHA LETTER SHA;Lo;0;L;;;;;N;;;;; +1C22;LEPCHA LETTER WA;Lo;0;L;;;;;N;;;;; +1C23;LEPCHA LETTER A;Lo;0;L;;;;;N;;;;; +1C24;LEPCHA SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;; +1C25;LEPCHA SUBJOINED LETTER RA;Mc;0;L;;;;;N;;;;; +1C26;LEPCHA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +1C27;LEPCHA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +1C28;LEPCHA VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +1C29;LEPCHA VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +1C2A;LEPCHA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +1C2B;LEPCHA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +1C2C;LEPCHA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +1C2D;LEPCHA CONSONANT SIGN K;Mn;0;NSM;;;;;N;;;;; +1C2E;LEPCHA CONSONANT SIGN M;Mn;0;NSM;;;;;N;;;;; +1C2F;LEPCHA CONSONANT SIGN L;Mn;0;NSM;;;;;N;;;;; +1C30;LEPCHA CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;; +1C31;LEPCHA CONSONANT SIGN P;Mn;0;NSM;;;;;N;;;;; +1C32;LEPCHA CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;; +1C33;LEPCHA CONSONANT SIGN T;Mn;0;NSM;;;;;N;;;;; +1C34;LEPCHA CONSONANT SIGN NYIN-DO;Mc;0;L;;;;;N;;;;; +1C35;LEPCHA CONSONANT SIGN KANG;Mc;0;L;;;;;N;;;;; +1C36;LEPCHA SIGN RAN;Mn;0;NSM;;;;;N;;;;; +1C37;LEPCHA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +1C3B;LEPCHA PUNCTUATION TA-ROL;Po;0;L;;;;;N;;;;; +1C3C;LEPCHA PUNCTUATION NYET THYOOM TA-ROL;Po;0;L;;;;;N;;;;; +1C3D;LEPCHA PUNCTUATION CER-WA;Po;0;L;;;;;N;;;;; +1C3E;LEPCHA PUNCTUATION TSHOOK CER-WA;Po;0;L;;;;;N;;;;; +1C3F;LEPCHA PUNCTUATION TSHOOK;Po;0;L;;;;;N;;;;; +1C40;LEPCHA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1C41;LEPCHA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1C42;LEPCHA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1C43;LEPCHA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1C44;LEPCHA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1C45;LEPCHA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1C46;LEPCHA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1C47;LEPCHA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1C48;LEPCHA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1C49;LEPCHA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1C4D;LEPCHA LETTER TTA;Lo;0;L;;;;;N;;;;; +1C4E;LEPCHA LETTER TTHA;Lo;0;L;;;;;N;;;;; +1C4F;LEPCHA LETTER DDA;Lo;0;L;;;;;N;;;;; +1C50;OL CHIKI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1C51;OL CHIKI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1C52;OL CHIKI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1C53;OL CHIKI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1C54;OL CHIKI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1C55;OL CHIKI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1C56;OL CHIKI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1C57;OL CHIKI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1C58;OL CHIKI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1C59;OL CHIKI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1C5A;OL CHIKI LETTER LA;Lo;0;L;;;;;N;;;;; +1C5B;OL CHIKI LETTER AT;Lo;0;L;;;;;N;;;;; +1C5C;OL CHIKI LETTER AG;Lo;0;L;;;;;N;;;;; +1C5D;OL CHIKI LETTER ANG;Lo;0;L;;;;;N;;;;; +1C5E;OL CHIKI LETTER AL;Lo;0;L;;;;;N;;;;; +1C5F;OL CHIKI LETTER LAA;Lo;0;L;;;;;N;;;;; +1C60;OL CHIKI LETTER AAK;Lo;0;L;;;;;N;;;;; +1C61;OL CHIKI LETTER AAJ;Lo;0;L;;;;;N;;;;; +1C62;OL CHIKI LETTER AAM;Lo;0;L;;;;;N;;;;; +1C63;OL CHIKI LETTER AAW;Lo;0;L;;;;;N;;;;; +1C64;OL CHIKI LETTER LI;Lo;0;L;;;;;N;;;;; +1C65;OL CHIKI LETTER IS;Lo;0;L;;;;;N;;;;; +1C66;OL CHIKI LETTER IH;Lo;0;L;;;;;N;;;;; +1C67;OL CHIKI LETTER INY;Lo;0;L;;;;;N;;;;; +1C68;OL CHIKI LETTER IR;Lo;0;L;;;;;N;;;;; +1C69;OL CHIKI LETTER LU;Lo;0;L;;;;;N;;;;; +1C6A;OL CHIKI LETTER UC;Lo;0;L;;;;;N;;;;; +1C6B;OL CHIKI LETTER UD;Lo;0;L;;;;;N;;;;; +1C6C;OL CHIKI LETTER UNN;Lo;0;L;;;;;N;;;;; +1C6D;OL CHIKI LETTER UY;Lo;0;L;;;;;N;;;;; +1C6E;OL CHIKI LETTER LE;Lo;0;L;;;;;N;;;;; +1C6F;OL CHIKI LETTER EP;Lo;0;L;;;;;N;;;;; +1C70;OL CHIKI LETTER EDD;Lo;0;L;;;;;N;;;;; +1C71;OL CHIKI LETTER EN;Lo;0;L;;;;;N;;;;; +1C72;OL CHIKI LETTER ERR;Lo;0;L;;;;;N;;;;; +1C73;OL CHIKI LETTER LO;Lo;0;L;;;;;N;;;;; +1C74;OL CHIKI LETTER OTT;Lo;0;L;;;;;N;;;;; +1C75;OL CHIKI LETTER OB;Lo;0;L;;;;;N;;;;; +1C76;OL CHIKI LETTER OV;Lo;0;L;;;;;N;;;;; +1C77;OL CHIKI LETTER OH;Lo;0;L;;;;;N;;;;; +1C78;OL CHIKI MU TTUDDAG;Lm;0;L;;;;;N;;;;; +1C79;OL CHIKI GAAHLAA TTUDDAAG;Lm;0;L;;;;;N;;;;; +1C7A;OL CHIKI MU-GAAHLAA TTUDDAAG;Lm;0;L;;;;;N;;;;; +1C7B;OL CHIKI RELAA;Lm;0;L;;;;;N;;;;; +1C7C;OL CHIKI PHAARKAA;Lm;0;L;;;;;N;;;;; +1C7D;OL CHIKI AHAD;Lm;0;L;;;;;N;;;;; +1C7E;OL CHIKI PUNCTUATION MUCAAD;Po;0;L;;;;;N;;;;; +1C7F;OL CHIKI PUNCTUATION DOUBLE MUCAAD;Po;0;L;;;;;N;;;;; 1D00;LATIN LETTER SMALL CAPITAL A;Ll;0;L;;;;;N;;;;; 1D01;LATIN LETTER SMALL CAPITAL AE;Ll;0;L;;;;;N;;;;; 1D02;LATIN SMALL LETTER TURNED AE;Ll;0;L;;;;;N;;;;; @@ -5081,6 +5875,131 @@ 1D69;GREEK SUBSCRIPT SMALL LETTER PHI;Ll;0;L;<sub> 03C6;;;;N;;;;; 1D6A;GREEK SUBSCRIPT SMALL LETTER CHI;Ll;0;L;<sub> 03C7;;;;N;;;;; 1D6B;LATIN SMALL LETTER UE;Ll;0;L;;;;;N;;;;; +1D6C;LATIN SMALL LETTER B WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D6D;LATIN SMALL LETTER D WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D6E;LATIN SMALL LETTER F WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D6F;LATIN SMALL LETTER M WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D70;LATIN SMALL LETTER N WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D71;LATIN SMALL LETTER P WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D72;LATIN SMALL LETTER R WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D73;LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D74;LATIN SMALL LETTER S WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D75;LATIN SMALL LETTER T WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D76;LATIN SMALL LETTER Z WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D77;LATIN SMALL LETTER TURNED G;Ll;0;L;;;;;N;;;;; +1D78;MODIFIER LETTER CYRILLIC EN;Lm;0;L;<super> 043D;;;;N;;;;; +1D79;LATIN SMALL LETTER INSULAR G;Ll;0;L;;;;;N;;;A77D;;A77D +1D7A;LATIN SMALL LETTER TH WITH STRIKETHROUGH;Ll;0;L;;;;;N;;;;; +1D7B;LATIN SMALL CAPITAL LETTER I WITH STROKE;Ll;0;L;;;;;N;;;;; +1D7C;LATIN SMALL LETTER IOTA WITH STROKE;Ll;0;L;;;;;N;;;;; +1D7D;LATIN SMALL LETTER P WITH STROKE;Ll;0;L;;;;;N;;;2C63;;2C63 +1D7E;LATIN SMALL CAPITAL LETTER U WITH STROKE;Ll;0;L;;;;;N;;;;; +1D7F;LATIN SMALL LETTER UPSILON WITH STROKE;Ll;0;L;;;;;N;;;;; +1D80;LATIN SMALL LETTER B WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D81;LATIN SMALL LETTER D WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D82;LATIN SMALL LETTER F WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D83;LATIN SMALL LETTER G WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D84;LATIN SMALL LETTER K WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D85;LATIN SMALL LETTER L WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D86;LATIN SMALL LETTER M WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D87;LATIN SMALL LETTER N WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D88;LATIN SMALL LETTER P WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D89;LATIN SMALL LETTER R WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8A;LATIN SMALL LETTER S WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8B;LATIN SMALL LETTER ESH WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8C;LATIN SMALL LETTER V WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8D;LATIN SMALL LETTER X WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8E;LATIN SMALL LETTER Z WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8F;LATIN SMALL LETTER A WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D90;LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D91;LATIN SMALL LETTER D WITH HOOK AND TAIL;Ll;0;L;;;;;N;;;;; +1D92;LATIN SMALL LETTER E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D93;LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D94;LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D95;LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D96;LATIN SMALL LETTER I WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D97;LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D98;LATIN SMALL LETTER ESH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D99;LATIN SMALL LETTER U WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D9A;LATIN SMALL LETTER EZH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D9B;MODIFIER LETTER SMALL TURNED ALPHA;Lm;0;L;<super> 0252;;;;N;;;;; +1D9C;MODIFIER LETTER SMALL C;Lm;0;L;<super> 0063;;;;N;;;;; +1D9D;MODIFIER LETTER SMALL C WITH CURL;Lm;0;L;<super> 0255;;;;N;;;;; +1D9E;MODIFIER LETTER SMALL ETH;Lm;0;L;<super> 00F0;;;;N;;;;; +1D9F;MODIFIER LETTER SMALL REVERSED OPEN E;Lm;0;L;<super> 025C;;;;N;;;;; +1DA0;MODIFIER LETTER SMALL F;Lm;0;L;<super> 0066;;;;N;;;;; +1DA1;MODIFIER LETTER SMALL DOTLESS J WITH STROKE;Lm;0;L;<super> 025F;;;;N;;;;; +1DA2;MODIFIER LETTER SMALL SCRIPT G;Lm;0;L;<super> 0261;;;;N;;;;; +1DA3;MODIFIER LETTER SMALL TURNED H;Lm;0;L;<super> 0265;;;;N;;;;; +1DA4;MODIFIER LETTER SMALL I WITH STROKE;Lm;0;L;<super> 0268;;;;N;;;;; +1DA5;MODIFIER LETTER SMALL IOTA;Lm;0;L;<super> 0269;;;;N;;;;; +1DA6;MODIFIER LETTER SMALL CAPITAL I;Lm;0;L;<super> 026A;;;;N;;;;; +1DA7;MODIFIER LETTER SMALL CAPITAL I WITH STROKE;Lm;0;L;<super> 1D7B;;;;N;;;;; +1DA8;MODIFIER LETTER SMALL J WITH CROSSED-TAIL;Lm;0;L;<super> 029D;;;;N;;;;; +1DA9;MODIFIER LETTER SMALL L WITH RETROFLEX HOOK;Lm;0;L;<super> 026D;;;;N;;;;; +1DAA;MODIFIER LETTER SMALL L WITH PALATAL HOOK;Lm;0;L;<super> 1D85;;;;N;;;;; +1DAB;MODIFIER LETTER SMALL CAPITAL L;Lm;0;L;<super> 029F;;;;N;;;;; +1DAC;MODIFIER LETTER SMALL M WITH HOOK;Lm;0;L;<super> 0271;;;;N;;;;; +1DAD;MODIFIER LETTER SMALL TURNED M WITH LONG LEG;Lm;0;L;<super> 0270;;;;N;;;;; +1DAE;MODIFIER LETTER SMALL N WITH LEFT HOOK;Lm;0;L;<super> 0272;;;;N;;;;; +1DAF;MODIFIER LETTER SMALL N WITH RETROFLEX HOOK;Lm;0;L;<super> 0273;;;;N;;;;; +1DB0;MODIFIER LETTER SMALL CAPITAL N;Lm;0;L;<super> 0274;;;;N;;;;; +1DB1;MODIFIER LETTER SMALL BARRED O;Lm;0;L;<super> 0275;;;;N;;;;; +1DB2;MODIFIER LETTER SMALL PHI;Lm;0;L;<super> 0278;;;;N;;;;; +1DB3;MODIFIER LETTER SMALL S WITH HOOK;Lm;0;L;<super> 0282;;;;N;;;;; +1DB4;MODIFIER LETTER SMALL ESH;Lm;0;L;<super> 0283;;;;N;;;;; +1DB5;MODIFIER LETTER SMALL T WITH PALATAL HOOK;Lm;0;L;<super> 01AB;;;;N;;;;; +1DB6;MODIFIER LETTER SMALL U BAR;Lm;0;L;<super> 0289;;;;N;;;;; +1DB7;MODIFIER LETTER SMALL UPSILON;Lm;0;L;<super> 028A;;;;N;;;;; +1DB8;MODIFIER LETTER SMALL CAPITAL U;Lm;0;L;<super> 1D1C;;;;N;;;;; +1DB9;MODIFIER LETTER SMALL V WITH HOOK;Lm;0;L;<super> 028B;;;;N;;;;; +1DBA;MODIFIER LETTER SMALL TURNED V;Lm;0;L;<super> 028C;;;;N;;;;; +1DBB;MODIFIER LETTER SMALL Z;Lm;0;L;<super> 007A;;;;N;;;;; +1DBC;MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK;Lm;0;L;<super> 0290;;;;N;;;;; +1DBD;MODIFIER LETTER SMALL Z WITH CURL;Lm;0;L;<super> 0291;;;;N;;;;; +1DBE;MODIFIER LETTER SMALL EZH;Lm;0;L;<super> 0292;;;;N;;;;; +1DBF;MODIFIER LETTER SMALL THETA;Lm;0;L;<super> 03B8;;;;N;;;;; +1DC0;COMBINING DOTTED GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;; +1DC1;COMBINING DOTTED ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;; +1DC2;COMBINING SNAKE BELOW;Mn;220;NSM;;;;;N;;;;; +1DC3;COMBINING SUSPENSION MARK;Mn;230;NSM;;;;;N;;;;; +1DC4;COMBINING MACRON-ACUTE;Mn;230;NSM;;;;;N;;;;; +1DC5;COMBINING GRAVE-MACRON;Mn;230;NSM;;;;;N;;;;; +1DC6;COMBINING MACRON-GRAVE;Mn;230;NSM;;;;;N;;;;; +1DC7;COMBINING ACUTE-MACRON;Mn;230;NSM;;;;;N;;;;; +1DC8;COMBINING GRAVE-ACUTE-GRAVE;Mn;230;NSM;;;;;N;;;;; +1DC9;COMBINING ACUTE-GRAVE-ACUTE;Mn;230;NSM;;;;;N;;;;; +1DCA;COMBINING LATIN SMALL LETTER R BELOW;Mn;220;NSM;;;;;N;;;;; +1DCB;COMBINING BREVE-MACRON;Mn;230;NSM;;;;;N;;;;; +1DCC;COMBINING MACRON-BREVE;Mn;230;NSM;;;;;N;;;;; +1DCD;COMBINING DOUBLE CIRCUMFLEX ABOVE;Mn;234;NSM;;;;;N;;;;; +1DCE;COMBINING OGONEK ABOVE;Mn;214;NSM;;;;;N;;;;; +1DCF;COMBINING ZIGZAG BELOW;Mn;220;NSM;;;;;N;;;;; +1DD0;COMBINING IS BELOW;Mn;202;NSM;;;;;N;;;;; +1DD1;COMBINING UR ABOVE;Mn;230;NSM;;;;;N;;;;; +1DD2;COMBINING US ABOVE;Mn;230;NSM;;;;;N;;;;; +1DD3;COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE;Mn;230;NSM;;;;;N;;;;; +1DD4;COMBINING LATIN SMALL LETTER AE;Mn;230;NSM;;;;;N;;;;; +1DD5;COMBINING LATIN SMALL LETTER AO;Mn;230;NSM;;;;;N;;;;; +1DD6;COMBINING LATIN SMALL LETTER AV;Mn;230;NSM;;;;;N;;;;; +1DD7;COMBINING LATIN SMALL LETTER C CEDILLA;Mn;230;NSM;;;;;N;;;;; +1DD8;COMBINING LATIN SMALL LETTER INSULAR D;Mn;230;NSM;;;;;N;;;;; +1DD9;COMBINING LATIN SMALL LETTER ETH;Mn;230;NSM;;;;;N;;;;; +1DDA;COMBINING LATIN SMALL LETTER G;Mn;230;NSM;;;;;N;;;;; +1DDB;COMBINING LATIN LETTER SMALL CAPITAL G;Mn;230;NSM;;;;;N;;;;; +1DDC;COMBINING LATIN SMALL LETTER K;Mn;230;NSM;;;;;N;;;;; +1DDD;COMBINING LATIN SMALL LETTER L;Mn;230;NSM;;;;;N;;;;; +1DDE;COMBINING LATIN LETTER SMALL CAPITAL L;Mn;230;NSM;;;;;N;;;;; +1DDF;COMBINING LATIN LETTER SMALL CAPITAL M;Mn;230;NSM;;;;;N;;;;; +1DE0;COMBINING LATIN SMALL LETTER N;Mn;230;NSM;;;;;N;;;;; +1DE1;COMBINING LATIN LETTER SMALL CAPITAL N;Mn;230;NSM;;;;;N;;;;; +1DE2;COMBINING LATIN LETTER SMALL CAPITAL R;Mn;230;NSM;;;;;N;;;;; +1DE3;COMBINING LATIN SMALL LETTER R ROTUNDA;Mn;230;NSM;;;;;N;;;;; +1DE4;COMBINING LATIN SMALL LETTER S;Mn;230;NSM;;;;;N;;;;; +1DE5;COMBINING LATIN SMALL LETTER LONG S;Mn;230;NSM;;;;;N;;;;; +1DE6;COMBINING LATIN SMALL LETTER Z;Mn;230;NSM;;;;;N;;;;; +1DFE;COMBINING LEFT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; +1DFF;COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; 1E00;LATIN CAPITAL LETTER A WITH RING BELOW;Lu;0;L;0041 0325;;;;N;;;;1E01; 1E01;LATIN SMALL LETTER A WITH RING BELOW;Ll;0;L;0061 0325;;;;N;;;1E00;;1E00 1E02;LATIN CAPITAL LETTER B WITH DOT ABOVE;Lu;0;L;0042 0307;;;;N;;;;1E03; @@ -5237,6 +6156,10 @@ 1E99;LATIN SMALL LETTER Y WITH RING ABOVE;Ll;0;L;0079 030A;;;;N;;;;; 1E9A;LATIN SMALL LETTER A WITH RIGHT HALF RING;Ll;0;L;<compat> 0061 02BE;;;;N;;;;; 1E9B;LATIN SMALL LETTER LONG S WITH DOT ABOVE;Ll;0;L;017F 0307;;;;N;;;1E60;;1E60 +1E9C;LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;;; +1E9D;LATIN SMALL LETTER LONG S WITH HIGH STROKE;Ll;0;L;;;;;N;;;;; +1E9E;LATIN CAPITAL LETTER SHARP S;Lu;0;L;;;;;N;;;;00DF; +1E9F;LATIN SMALL LETTER DELTA;Ll;0;L;;;;;N;;;;; 1EA0;LATIN CAPITAL LETTER A WITH DOT BELOW;Lu;0;L;0041 0323;;;;N;;;;1EA1; 1EA1;LATIN SMALL LETTER A WITH DOT BELOW;Ll;0;L;0061 0323;;;;N;;;1EA0;;1EA0 1EA2;LATIN CAPITAL LETTER A WITH HOOK ABOVE;Lu;0;L;0041 0309;;;;N;;;;1EA3; @@ -5327,6 +6250,12 @@ 1EF7;LATIN SMALL LETTER Y WITH HOOK ABOVE;Ll;0;L;0079 0309;;;;N;;;1EF6;;1EF6 1EF8;LATIN CAPITAL LETTER Y WITH TILDE;Lu;0;L;0059 0303;;;;N;;;;1EF9; 1EF9;LATIN SMALL LETTER Y WITH TILDE;Ll;0;L;0079 0303;;;;N;;;1EF8;;1EF8 +1EFA;LATIN CAPITAL LETTER MIDDLE-WELSH LL;Lu;0;L;;;;;N;;;;1EFB; +1EFB;LATIN SMALL LETTER MIDDLE-WELSH LL;Ll;0;L;;;;;N;;;1EFA;;1EFA +1EFC;LATIN CAPITAL LETTER MIDDLE-WELSH V;Lu;0;L;;;;;N;;;;1EFD; +1EFD;LATIN SMALL LETTER MIDDLE-WELSH V;Ll;0;L;;;;;N;;;1EFC;;1EFC +1EFE;LATIN CAPITAL LETTER Y WITH LOOP;Lu;0;L;;;;;N;;;;1EFF; +1EFF;LATIN SMALL LETTER Y WITH LOOP;Ll;0;L;;;;;N;;;1EFE;;1EFE 1F00;GREEK SMALL LETTER ALPHA WITH PSILI;Ll;0;L;03B1 0313;;;;N;;;1F08;;1F08 1F01;GREEK SMALL LETTER ALPHA WITH DASIA;Ll;0;L;03B1 0314;;;;N;;;1F09;;1F09 1F02;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA;Ll;0;L;1F00 0300;;;;N;;;1F0A;;1F0A @@ -5571,7 +6500,7 @@ 2008;PUNCTUATION SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; 2009;THIN SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; 200A;HAIR SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; -200B;ZERO WIDTH SPACE;Zs;0;BN;;;;;N;;;;; +200B;ZERO WIDTH SPACE;Cf;0;BN;;;;;N;;;;; 200C;ZERO WIDTH NON-JOINER;Cf;0;BN;;;;;N;;;;; 200D;ZERO WIDTH JOINER;Cf;0;BN;;;;;N;;;;; 200E;LEFT-TO-RIGHT MARK;Cf;0;L;;;;;N;;;;; @@ -5607,7 +6536,7 @@ 202C;POP DIRECTIONAL FORMATTING;Cf;0;PDF;;;;;N;;;;; 202D;LEFT-TO-RIGHT OVERRIDE;Cf;0;LRO;;;;;N;;;;; 202E;RIGHT-TO-LEFT OVERRIDE;Cf;0;RLO;;;;;N;;;;; -202F;NARROW NO-BREAK SPACE;Zs;0;WS;<noBreak> 0020;;;;N;;;;; +202F;NARROW NO-BREAK SPACE;Zs;0;CS;<noBreak> 0020;;;;N;;;;; 2030;PER MILLE SIGN;Po;0;ET;;;;;N;;;;; 2031;PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;; 2032;PRIME;Po;0;ET;;;;;N;;;;; @@ -5628,7 +6557,7 @@ 2041;CARET INSERTION POINT;Po;0;ON;;;;;N;;;;; 2042;ASTERISM;Po;0;ON;;;;;N;;;;; 2043;HYPHEN BULLET;Po;0;ON;;;;;N;;;;; -2044;FRACTION SLASH;Sm;0;ON;;;;;N;;;;; +2044;FRACTION SLASH;Sm;0;CS;;;;;N;;;;; 2045;LEFT SQUARE BRACKET WITH QUILL;Ps;0;ON;;;;;Y;;;;; 2046;RIGHT SQUARE BRACKET WITH QUILL;Pe;0;ON;;;;;Y;;;;; 2047;DOUBLE QUESTION MARK;Po;0;ON;<compat> 003F 003F;;;;N;;;;; @@ -5645,12 +6574,22 @@ 2052;COMMERCIAL MINUS SIGN;Sm;0;ON;;;;;N;;;;; 2053;SWUNG DASH;Po;0;ON;;;;;N;;;;; 2054;INVERTED UNDERTIE;Pc;0;ON;;;;;N;;;;; +2055;FLOWER PUNCTUATION MARK;Po;0;ON;;;;;N;;;;; +2056;THREE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; 2057;QUADRUPLE PRIME;Po;0;ON;<compat> 2032 2032 2032 2032;;;;N;;;;; +2058;FOUR DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +2059;FIVE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +205A;TWO DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +205B;FOUR DOT MARK;Po;0;ON;;;;;N;;;;; +205C;DOTTED CROSS;Po;0;ON;;;;;N;;;;; +205D;TRICOLON;Po;0;ON;;;;;N;;;;; +205E;VERTICAL FOUR DOTS;Po;0;ON;;;;;N;;;;; 205F;MEDIUM MATHEMATICAL SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; 2060;WORD JOINER;Cf;0;BN;;;;;N;;;;; 2061;FUNCTION APPLICATION;Cf;0;BN;;;;;N;;;;; 2062;INVISIBLE TIMES;Cf;0;BN;;;;;N;;;;; 2063;INVISIBLE SEPARATOR;Cf;0;BN;;;;;N;;;;; +2064;INVISIBLE PLUS;Cf;0;BN;;;;;N;;;;; 206A;INHIBIT SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;; 206B;ACTIVATE SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;; 206C;INHIBIT ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;; @@ -5665,8 +6604,8 @@ 2077;SUPERSCRIPT SEVEN;No;0;EN;<super> 0037;;7;7;N;SUPERSCRIPT DIGIT SEVEN;;;; 2078;SUPERSCRIPT EIGHT;No;0;EN;<super> 0038;;8;8;N;SUPERSCRIPT DIGIT EIGHT;;;; 2079;SUPERSCRIPT NINE;No;0;EN;<super> 0039;;9;9;N;SUPERSCRIPT DIGIT NINE;;;; -207A;SUPERSCRIPT PLUS SIGN;Sm;0;ET;<super> 002B;;;;N;;;;; -207B;SUPERSCRIPT MINUS;Sm;0;ET;<super> 2212;;;;N;SUPERSCRIPT HYPHEN-MINUS;;;; +207A;SUPERSCRIPT PLUS SIGN;Sm;0;ES;<super> 002B;;;;N;;;;; +207B;SUPERSCRIPT MINUS;Sm;0;ES;<super> 2212;;;;N;SUPERSCRIPT HYPHEN-MINUS;;;; 207C;SUPERSCRIPT EQUALS SIGN;Sm;0;ON;<super> 003D;;;;N;;;;; 207D;SUPERSCRIPT LEFT PARENTHESIS;Ps;0;ON;<super> 0028;;;;Y;SUPERSCRIPT OPENING PARENTHESIS;;;; 207E;SUPERSCRIPT RIGHT PARENTHESIS;Pe;0;ON;<super> 0029;;;;Y;SUPERSCRIPT CLOSING PARENTHESIS;;;; @@ -5681,11 +6620,16 @@ 2087;SUBSCRIPT SEVEN;No;0;EN;<sub> 0037;;7;7;N;SUBSCRIPT DIGIT SEVEN;;;; 2088;SUBSCRIPT EIGHT;No;0;EN;<sub> 0038;;8;8;N;SUBSCRIPT DIGIT EIGHT;;;; 2089;SUBSCRIPT NINE;No;0;EN;<sub> 0039;;9;9;N;SUBSCRIPT DIGIT NINE;;;; -208A;SUBSCRIPT PLUS SIGN;Sm;0;ET;<sub> 002B;;;;N;;;;; -208B;SUBSCRIPT MINUS;Sm;0;ET;<sub> 2212;;;;N;SUBSCRIPT HYPHEN-MINUS;;;; +208A;SUBSCRIPT PLUS SIGN;Sm;0;ES;<sub> 002B;;;;N;;;;; +208B;SUBSCRIPT MINUS;Sm;0;ES;<sub> 2212;;;;N;SUBSCRIPT HYPHEN-MINUS;;;; 208C;SUBSCRIPT EQUALS SIGN;Sm;0;ON;<sub> 003D;;;;N;;;;; 208D;SUBSCRIPT LEFT PARENTHESIS;Ps;0;ON;<sub> 0028;;;;Y;SUBSCRIPT OPENING PARENTHESIS;;;; 208E;SUBSCRIPT RIGHT PARENTHESIS;Pe;0;ON;<sub> 0029;;;;Y;SUBSCRIPT CLOSING PARENTHESIS;;;; +2090;LATIN SUBSCRIPT SMALL LETTER A;Lm;0;L;<sub> 0061;;;;N;;;;; +2091;LATIN SUBSCRIPT SMALL LETTER E;Lm;0;L;<sub> 0065;;;;N;;;;; +2092;LATIN SUBSCRIPT SMALL LETTER O;Lm;0;L;<sub> 006F;;;;N;;;;; +2093;LATIN SUBSCRIPT SMALL LETTER X;Lm;0;L;<sub> 0078;;;;N;;;;; +2094;LATIN SUBSCRIPT SMALL LETTER SCHWA;Lm;0;L;<sub> 0259;;;;N;;;;; 20A0;EURO-CURRENCY SIGN;Sc;0;ET;;;;;N;;;;; 20A1;COLON SIGN;Sc;0;ET;;;;;N;;;;; 20A2;CRUZEIRO SIGN;Sc;0;ET;;;;;N;;;;; @@ -5704,6 +6648,10 @@ 20AF;DRACHMA SIGN;Sc;0;ET;;;;;N;;;;; 20B0;GERMAN PENNY SIGN;Sc;0;ET;;;;;N;;;;; 20B1;PESO SIGN;Sc;0;ET;;;;;N;;;;; +20B2;GUARANI SIGN;Sc;0;ET;;;;;N;;;;; +20B3;AUSTRAL SIGN;Sc;0;ET;;;;;N;;;;; +20B4;HRYVNIA SIGN;Sc;0;ET;;;;;N;;;;; +20B5;CEDI SIGN;Sc;0;ET;;;;;N;;;;; 20D0;COMBINING LEFT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT HARPOON ABOVE;;;; 20D1;COMBINING RIGHT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT HARPOON ABOVE;;;; 20D2;COMBINING LONG VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG VERTICAL BAR OVERLAY;;;; @@ -5731,6 +6679,12 @@ 20E8;COMBINING TRIPLE UNDERDOT;Mn;220;NSM;;;;;N;;;;; 20E9;COMBINING WIDE BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;; 20EA;COMBINING LEFTWARDS ARROW OVERLAY;Mn;1;NSM;;;;;N;;;;; +20EB;COMBINING LONG DOUBLE SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;;;;; +20EC;COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS;Mn;220;NSM;;;;;N;;;;; +20ED;COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS;Mn;220;NSM;;;;;N;;;;; +20EE;COMBINING LEFT ARROW BELOW;Mn;220;NSM;;;;;N;;;;; +20EF;COMBINING RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;; +20F0;COMBINING ASTERISK ABOVE;Mn;230;NSM;;;;;N;;;;; 2100;ACCOUNT OF;So;0;ON;<compat> 0061 002F 0063;;;;N;;;;; 2101;ADDRESSED TO THE SUBJECT;So;0;ON;<compat> 0061 002F 0073;;;;N;;;;; 2102;DOUBLE-STRUCK CAPITAL C;Lu;0;L;<font> 0043;;;;N;DOUBLE-STRUCK C;;;; @@ -5781,7 +6735,7 @@ 212F;SCRIPT SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; 2130;SCRIPT CAPITAL E;Lu;0;L;<font> 0045;;;;N;SCRIPT E;;;; 2131;SCRIPT CAPITAL F;Lu;0;L;<font> 0046;;;;N;SCRIPT F;;;; -2132;TURNED CAPITAL F;So;0;ON;;;;;N;TURNED F;;;; +2132;TURNED CAPITAL F;Lu;0;L;;;;;N;TURNED F;;;214E; 2133;SCRIPT CAPITAL M;Lu;0;L;<font> 004D;;;;N;SCRIPT M;;;; 2134;SCRIPT SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; 2135;ALEF SYMBOL;Lo;0;L;<compat> 05D0;;;;N;FIRST TRANSFINITE CARDINAL;;;; @@ -5791,6 +6745,7 @@ 2139;INFORMATION SOURCE;Ll;0;L;<font> 0069;;;;N;;;;; 213A;ROTATED CAPITAL Q;So;0;ON;;;;;N;;;;; 213B;FACSIMILE SIGN;So;0;ON;<compat> 0046 0041 0058;;;;N;;;;; +213C;DOUBLE-STRUCK SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;; 213D;DOUBLE-STRUCK SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;; 213E;DOUBLE-STRUCK CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;; 213F;DOUBLE-STRUCK CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;; @@ -5806,6 +6761,10 @@ 2149;DOUBLE-STRUCK ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; 214A;PROPERTY LINE;So;0;ON;;;;;N;;;;; 214B;TURNED AMPERSAND;Sm;0;ON;;;;;N;;;;; +214C;PER SIGN;So;0;ON;;;;;N;;;;; +214D;AKTIESELSKAB;So;0;ON;;;;;N;;;;; +214E;TURNED SMALL F;Ll;0;L;;;;;N;;;2132;;2132 +214F;SYMBOL FOR SAMARITAN SOURCE;So;0;L;;;;;N;;;;; 2153;VULGAR FRACTION ONE THIRD;No;0;ON;<fraction> 0031 2044 0033;;;1/3;N;FRACTION ONE THIRD;;;; 2154;VULGAR FRACTION TWO THIRDS;No;0;ON;<fraction> 0032 2044 0033;;;2/3;N;FRACTION TWO THIRDS;;;; 2155;VULGAR FRACTION ONE FIFTH;No;0;ON;<fraction> 0031 2044 0035;;;1/5;N;FRACTION ONE FIFTH;;;; @@ -5854,7 +6813,12 @@ 2180;ROMAN NUMERAL ONE THOUSAND C D;Nl;0;L;;;;1000;N;;;;; 2181;ROMAN NUMERAL FIVE THOUSAND;Nl;0;L;;;;5000;N;;;;; 2182;ROMAN NUMERAL TEN THOUSAND;Nl;0;L;;;;10000;N;;;;; -2183;ROMAN NUMERAL REVERSED ONE HUNDRED;Nl;0;L;;;;;N;;;;; +2183;ROMAN NUMERAL REVERSED ONE HUNDRED;Lu;0;L;;;;;N;;;;2184; +2184;LATIN SMALL LETTER REVERSED C;Ll;0;L;;;;;N;;;2183;;2183 +2185;ROMAN NUMERAL SIX LATE FORM;Nl;0;L;;;;6;N;;;;; +2186;ROMAN NUMERAL FIFTY EARLY FORM;Nl;0;L;;;;50;N;;;;; +2187;ROMAN NUMERAL FIFTY THOUSAND;Nl;0;L;;;;50000;N;;;;; +2188;ROMAN NUMERAL ONE HUNDRED THOUSAND;Nl;0;L;;;;100000;N;;;;; 2190;LEFTWARDS ARROW;Sm;0;ON;;;;;N;LEFT ARROW;;;; 2191;UPWARDS ARROW;Sm;0;ON;;;;;N;UP ARROW;;;; 2192;RIGHTWARDS ARROW;Sm;0;ON;;;;;N;RIGHT ARROW;;;; @@ -5985,7 +6949,7 @@ 220F;N-ARY PRODUCT;Sm;0;ON;;;;;N;;;;; 2210;N-ARY COPRODUCT;Sm;0;ON;;;;;N;;;;; 2211;N-ARY SUMMATION;Sm;0;ON;;;;;Y;;;;; -2212;MINUS SIGN;Sm;0;ET;;;;;N;;;;; +2212;MINUS SIGN;Sm;0;ES;;;;;N;;;;; 2213;MINUS-OR-PLUS SIGN;Sm;0;ET;;;;;N;;;;; 2214;DOT PLUS;Sm;0;ON;;;;;N;;;;; 2215;DIVISION SLASH;Sm;0;ON;;;;;Y;;;;; @@ -6403,9 +7367,9 @@ 23B1;UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION;Sm;0;ON;;;;;N;;;;; 23B2;SUMMATION TOP;Sm;0;ON;;;;;N;;;;; 23B3;SUMMATION BOTTOM;Sm;0;ON;;;;;N;;;;; -23B4;TOP SQUARE BRACKET;Ps;0;ON;;;;;N;;;;; -23B5;BOTTOM SQUARE BRACKET;Pe;0;ON;;;;;N;;;;; -23B6;BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET;Po;0;ON;;;;;N;;;;; +23B4;TOP SQUARE BRACKET;So;0;ON;;;;;N;;;;; +23B5;BOTTOM SQUARE BRACKET;So;0;ON;;;;;N;;;;; +23B6;BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET;So;0;ON;;;;;N;;;;; 23B7;RADICAL SYMBOL BOTTOM;So;0;ON;;;;;N;;;;; 23B8;LEFT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;; 23B9;RIGHT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;; @@ -6432,6 +7396,29 @@ 23CE;RETURN SYMBOL;So;0;ON;;;;;N;;;;; 23CF;EJECT SYMBOL;So;0;ON;;;;;N;;;;; 23D0;VERTICAL LINE EXTENSION;So;0;ON;;;;;N;;;;; +23D1;METRICAL BREVE;So;0;ON;;;;;N;;;;; +23D2;METRICAL LONG OVER SHORT;So;0;ON;;;;;N;;;;; +23D3;METRICAL SHORT OVER LONG;So;0;ON;;;;;N;;;;; +23D4;METRICAL LONG OVER TWO SHORTS;So;0;ON;;;;;N;;;;; +23D5;METRICAL TWO SHORTS OVER LONG;So;0;ON;;;;;N;;;;; +23D6;METRICAL TWO SHORTS JOINED;So;0;ON;;;;;N;;;;; +23D7;METRICAL TRISEME;So;0;ON;;;;;N;;;;; +23D8;METRICAL TETRASEME;So;0;ON;;;;;N;;;;; +23D9;METRICAL PENTASEME;So;0;ON;;;;;N;;;;; +23DA;EARTH GROUND;So;0;ON;;;;;N;;;;; +23DB;FUSE;So;0;ON;;;;;N;;;;; +23DC;TOP PARENTHESIS;Sm;0;ON;;;;;N;;mathematical use;;; +23DD;BOTTOM PARENTHESIS;Sm;0;ON;;;;;N;;mathematical use;;; +23DE;TOP CURLY BRACKET;Sm;0;ON;;;;;N;;mathematical use;;; +23DF;BOTTOM CURLY BRACKET;Sm;0;ON;;;;;N;;mathematical use;;; +23E0;TOP TORTOISE SHELL BRACKET;Sm;0;ON;;;;;N;;mathematical use;;; +23E1;BOTTOM TORTOISE SHELL BRACKET;Sm;0;ON;;;;;N;;mathematical use;;; +23E2;WHITE TRAPEZIUM;So;0;ON;;;;;N;;;;; +23E3;BENZENE RING WITH CIRCLE;So;0;ON;;;;;N;;;;; +23E4;STRAIGHTNESS;So;0;ON;;;;;N;;;;; +23E5;FLATNESS;So;0;ON;;;;;N;;;;; +23E6;AC CURRENT;So;0;ON;;;;;N;;;;; +23E7;ELECTRICAL INTERSECTION;So;0;ON;;;;;N;;;;; 2400;SYMBOL FOR NULL;So;0;ON;;;;;N;GRAPHIC FOR NULL;;;; 2401;SYMBOL FOR START OF HEADING;So;0;ON;;;;;N;GRAPHIC FOR START OF HEADING;;;; 2402;SYMBOL FOR START OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR START OF TEXT;;;; @@ -6482,46 +7469,46 @@ 2448;OCR DASH;So;0;ON;;;;;N;;;;; 2449;OCR CUSTOMER ACCOUNT NUMBER;So;0;ON;;;;;N;;;;; 244A;OCR DOUBLE BACKSLASH;So;0;ON;;;;;N;;;;; -2460;CIRCLED DIGIT ONE;No;0;EN;<circle> 0031;;1;1;N;;;;; -2461;CIRCLED DIGIT TWO;No;0;EN;<circle> 0032;;2;2;N;;;;; -2462;CIRCLED DIGIT THREE;No;0;EN;<circle> 0033;;3;3;N;;;;; -2463;CIRCLED DIGIT FOUR;No;0;EN;<circle> 0034;;4;4;N;;;;; -2464;CIRCLED DIGIT FIVE;No;0;EN;<circle> 0035;;5;5;N;;;;; -2465;CIRCLED DIGIT SIX;No;0;EN;<circle> 0036;;6;6;N;;;;; -2466;CIRCLED DIGIT SEVEN;No;0;EN;<circle> 0037;;7;7;N;;;;; -2467;CIRCLED DIGIT EIGHT;No;0;EN;<circle> 0038;;8;8;N;;;;; -2468;CIRCLED DIGIT NINE;No;0;EN;<circle> 0039;;9;9;N;;;;; -2469;CIRCLED NUMBER TEN;No;0;EN;<circle> 0031 0030;;;10;N;;;;; -246A;CIRCLED NUMBER ELEVEN;No;0;EN;<circle> 0031 0031;;;11;N;;;;; -246B;CIRCLED NUMBER TWELVE;No;0;EN;<circle> 0031 0032;;;12;N;;;;; -246C;CIRCLED NUMBER THIRTEEN;No;0;EN;<circle> 0031 0033;;;13;N;;;;; -246D;CIRCLED NUMBER FOURTEEN;No;0;EN;<circle> 0031 0034;;;14;N;;;;; -246E;CIRCLED NUMBER FIFTEEN;No;0;EN;<circle> 0031 0035;;;15;N;;;;; -246F;CIRCLED NUMBER SIXTEEN;No;0;EN;<circle> 0031 0036;;;16;N;;;;; -2470;CIRCLED NUMBER SEVENTEEN;No;0;EN;<circle> 0031 0037;;;17;N;;;;; -2471;CIRCLED NUMBER EIGHTEEN;No;0;EN;<circle> 0031 0038;;;18;N;;;;; -2472;CIRCLED NUMBER NINETEEN;No;0;EN;<circle> 0031 0039;;;19;N;;;;; -2473;CIRCLED NUMBER TWENTY;No;0;EN;<circle> 0032 0030;;;20;N;;;;; -2474;PARENTHESIZED DIGIT ONE;No;0;EN;<compat> 0028 0031 0029;;1;1;N;;;;; -2475;PARENTHESIZED DIGIT TWO;No;0;EN;<compat> 0028 0032 0029;;2;2;N;;;;; -2476;PARENTHESIZED DIGIT THREE;No;0;EN;<compat> 0028 0033 0029;;3;3;N;;;;; -2477;PARENTHESIZED DIGIT FOUR;No;0;EN;<compat> 0028 0034 0029;;4;4;N;;;;; -2478;PARENTHESIZED DIGIT FIVE;No;0;EN;<compat> 0028 0035 0029;;5;5;N;;;;; -2479;PARENTHESIZED DIGIT SIX;No;0;EN;<compat> 0028 0036 0029;;6;6;N;;;;; -247A;PARENTHESIZED DIGIT SEVEN;No;0;EN;<compat> 0028 0037 0029;;7;7;N;;;;; -247B;PARENTHESIZED DIGIT EIGHT;No;0;EN;<compat> 0028 0038 0029;;8;8;N;;;;; -247C;PARENTHESIZED DIGIT NINE;No;0;EN;<compat> 0028 0039 0029;;9;9;N;;;;; -247D;PARENTHESIZED NUMBER TEN;No;0;EN;<compat> 0028 0031 0030 0029;;;10;N;;;;; -247E;PARENTHESIZED NUMBER ELEVEN;No;0;EN;<compat> 0028 0031 0031 0029;;;11;N;;;;; -247F;PARENTHESIZED NUMBER TWELVE;No;0;EN;<compat> 0028 0031 0032 0029;;;12;N;;;;; -2480;PARENTHESIZED NUMBER THIRTEEN;No;0;EN;<compat> 0028 0031 0033 0029;;;13;N;;;;; -2481;PARENTHESIZED NUMBER FOURTEEN;No;0;EN;<compat> 0028 0031 0034 0029;;;14;N;;;;; -2482;PARENTHESIZED NUMBER FIFTEEN;No;0;EN;<compat> 0028 0031 0035 0029;;;15;N;;;;; -2483;PARENTHESIZED NUMBER SIXTEEN;No;0;EN;<compat> 0028 0031 0036 0029;;;16;N;;;;; -2484;PARENTHESIZED NUMBER SEVENTEEN;No;0;EN;<compat> 0028 0031 0037 0029;;;17;N;;;;; -2485;PARENTHESIZED NUMBER EIGHTEEN;No;0;EN;<compat> 0028 0031 0038 0029;;;18;N;;;;; -2486;PARENTHESIZED NUMBER NINETEEN;No;0;EN;<compat> 0028 0031 0039 0029;;;19;N;;;;; -2487;PARENTHESIZED NUMBER TWENTY;No;0;EN;<compat> 0028 0032 0030 0029;;;20;N;;;;; +2460;CIRCLED DIGIT ONE;No;0;ON;<circle> 0031;;1;1;N;;;;; +2461;CIRCLED DIGIT TWO;No;0;ON;<circle> 0032;;2;2;N;;;;; +2462;CIRCLED DIGIT THREE;No;0;ON;<circle> 0033;;3;3;N;;;;; +2463;CIRCLED DIGIT FOUR;No;0;ON;<circle> 0034;;4;4;N;;;;; +2464;CIRCLED DIGIT FIVE;No;0;ON;<circle> 0035;;5;5;N;;;;; +2465;CIRCLED DIGIT SIX;No;0;ON;<circle> 0036;;6;6;N;;;;; +2466;CIRCLED DIGIT SEVEN;No;0;ON;<circle> 0037;;7;7;N;;;;; +2467;CIRCLED DIGIT EIGHT;No;0;ON;<circle> 0038;;8;8;N;;;;; +2468;CIRCLED DIGIT NINE;No;0;ON;<circle> 0039;;9;9;N;;;;; +2469;CIRCLED NUMBER TEN;No;0;ON;<circle> 0031 0030;;;10;N;;;;; +246A;CIRCLED NUMBER ELEVEN;No;0;ON;<circle> 0031 0031;;;11;N;;;;; +246B;CIRCLED NUMBER TWELVE;No;0;ON;<circle> 0031 0032;;;12;N;;;;; +246C;CIRCLED NUMBER THIRTEEN;No;0;ON;<circle> 0031 0033;;;13;N;;;;; +246D;CIRCLED NUMBER FOURTEEN;No;0;ON;<circle> 0031 0034;;;14;N;;;;; +246E;CIRCLED NUMBER FIFTEEN;No;0;ON;<circle> 0031 0035;;;15;N;;;;; +246F;CIRCLED NUMBER SIXTEEN;No;0;ON;<circle> 0031 0036;;;16;N;;;;; +2470;CIRCLED NUMBER SEVENTEEN;No;0;ON;<circle> 0031 0037;;;17;N;;;;; +2471;CIRCLED NUMBER EIGHTEEN;No;0;ON;<circle> 0031 0038;;;18;N;;;;; +2472;CIRCLED NUMBER NINETEEN;No;0;ON;<circle> 0031 0039;;;19;N;;;;; +2473;CIRCLED NUMBER TWENTY;No;0;ON;<circle> 0032 0030;;;20;N;;;;; +2474;PARENTHESIZED DIGIT ONE;No;0;ON;<compat> 0028 0031 0029;;1;1;N;;;;; +2475;PARENTHESIZED DIGIT TWO;No;0;ON;<compat> 0028 0032 0029;;2;2;N;;;;; +2476;PARENTHESIZED DIGIT THREE;No;0;ON;<compat> 0028 0033 0029;;3;3;N;;;;; +2477;PARENTHESIZED DIGIT FOUR;No;0;ON;<compat> 0028 0034 0029;;4;4;N;;;;; +2478;PARENTHESIZED DIGIT FIVE;No;0;ON;<compat> 0028 0035 0029;;5;5;N;;;;; +2479;PARENTHESIZED DIGIT SIX;No;0;ON;<compat> 0028 0036 0029;;6;6;N;;;;; +247A;PARENTHESIZED DIGIT SEVEN;No;0;ON;<compat> 0028 0037 0029;;7;7;N;;;;; +247B;PARENTHESIZED DIGIT EIGHT;No;0;ON;<compat> 0028 0038 0029;;8;8;N;;;;; +247C;PARENTHESIZED DIGIT NINE;No;0;ON;<compat> 0028 0039 0029;;9;9;N;;;;; +247D;PARENTHESIZED NUMBER TEN;No;0;ON;<compat> 0028 0031 0030 0029;;;10;N;;;;; +247E;PARENTHESIZED NUMBER ELEVEN;No;0;ON;<compat> 0028 0031 0031 0029;;;11;N;;;;; +247F;PARENTHESIZED NUMBER TWELVE;No;0;ON;<compat> 0028 0031 0032 0029;;;12;N;;;;; +2480;PARENTHESIZED NUMBER THIRTEEN;No;0;ON;<compat> 0028 0031 0033 0029;;;13;N;;;;; +2481;PARENTHESIZED NUMBER FOURTEEN;No;0;ON;<compat> 0028 0031 0034 0029;;;14;N;;;;; +2482;PARENTHESIZED NUMBER FIFTEEN;No;0;ON;<compat> 0028 0031 0035 0029;;;15;N;;;;; +2483;PARENTHESIZED NUMBER SIXTEEN;No;0;ON;<compat> 0028 0031 0036 0029;;;16;N;;;;; +2484;PARENTHESIZED NUMBER SEVENTEEN;No;0;ON;<compat> 0028 0031 0037 0029;;;17;N;;;;; +2485;PARENTHESIZED NUMBER EIGHTEEN;No;0;ON;<compat> 0028 0031 0038 0029;;;18;N;;;;; +2486;PARENTHESIZED NUMBER NINETEEN;No;0;ON;<compat> 0028 0031 0039 0029;;;19;N;;;;; +2487;PARENTHESIZED NUMBER TWENTY;No;0;ON;<compat> 0028 0032 0030 0029;;;20;N;;;;; 2488;DIGIT ONE FULL STOP;No;0;EN;<compat> 0031 002E;;1;1;N;DIGIT ONE PERIOD;;;; 2489;DIGIT TWO FULL STOP;No;0;EN;<compat> 0032 002E;;2;2;N;DIGIT TWO PERIOD;;;; 248A;DIGIT THREE FULL STOP;No;0;EN;<compat> 0033 002E;;3;3;N;DIGIT THREE PERIOD;;;; @@ -6620,7 +7607,7 @@ 24E7;CIRCLED LATIN SMALL LETTER X;So;0;L;<circle> 0078;;;;N;;;24CD;;24CD 24E8;CIRCLED LATIN SMALL LETTER Y;So;0;L;<circle> 0079;;;;N;;;24CE;;24CE 24E9;CIRCLED LATIN SMALL LETTER Z;So;0;L;<circle> 007A;;;;N;;;24CF;;24CF -24EA;CIRCLED DIGIT ZERO;No;0;EN;<circle> 0030;;0;0;N;;;;; +24EA;CIRCLED DIGIT ZERO;No;0;ON;<circle> 0030;;0;0;N;;;;; 24EB;NEGATIVE CIRCLED NUMBER ELEVEN;No;0;ON;;;;11;N;;;;; 24EC;NEGATIVE CIRCLED NUMBER TWELVE;No;0;ON;;;;12;N;;;;; 24ED;NEGATIVE CIRCLED NUMBER THIRTEEN;No;0;ON;;;;13;N;;;;; @@ -6922,6 +7909,7 @@ 2615;HOT BEVERAGE;So;0;ON;;;;;N;;;;; 2616;WHITE SHOGI PIECE;So;0;ON;;;;;N;;;;; 2617;BLACK SHOGI PIECE;So;0;ON;;;;;N;;;;; +2618;SHAMROCK;So;0;ON;;;;;N;;;;; 2619;REVERSED ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;; 261A;BLACK LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; 261B;BLACK RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; @@ -7023,6 +8011,8 @@ 267B;BLACK UNIVERSAL RECYCLING SYMBOL;So;0;ON;;;;;N;;;;; 267C;RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;; 267D;PARTIALLY-RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;; +267E;PERMANENT PAPER SIGN;So;0;ON;;;;;N;;;;; +267F;WHEELCHAIR SYMBOL;So;0;ON;;;;;N;;;;; 2680;DIE FACE-1;So;0;ON;;;;;N;;;;; 2681;DIE FACE-2;So;0;ON;;;;;N;;;;; 2682;DIE FACE-3;So;0;ON;;;;;N;;;;; @@ -7041,8 +8031,51 @@ 268F;DIGRAM FOR GREATER YIN;So;0;ON;;;;;N;;;;; 2690;WHITE FLAG;So;0;ON;;;;;N;;;;; 2691;BLACK FLAG;So;0;ON;;;;;N;;;;; +2692;HAMMER AND PICK;So;0;ON;;;;;N;;;;; +2693;ANCHOR;So;0;ON;;;;;N;;;;; +2694;CROSSED SWORDS;So;0;ON;;;;;N;;;;; +2695;STAFF OF AESCULAPIUS;So;0;ON;;;;;N;;;;; +2696;SCALES;So;0;ON;;;;;N;;;;; +2697;ALEMBIC;So;0;ON;;;;;N;;;;; +2698;FLOWER;So;0;ON;;;;;N;;;;; +2699;GEAR;So;0;ON;;;;;N;;;;; +269A;STAFF OF HERMES;So;0;ON;;;;;N;;;;; +269B;ATOM SYMBOL;So;0;ON;;;;;N;;;;; +269C;FLEUR-DE-LIS;So;0;ON;;;;;N;;;;; +269D;OUTLINED WHITE STAR;So;0;ON;;;;;N;;;;; 26A0;WARNING SIGN;So;0;ON;;;;;N;;;;; 26A1;HIGH VOLTAGE SIGN;So;0;ON;;;;;N;;;;; +26A2;DOUBLED FEMALE SIGN;So;0;ON;;;;;N;;;;; +26A3;DOUBLED MALE SIGN;So;0;ON;;;;;N;;;;; +26A4;INTERLOCKED FEMALE AND MALE SIGN;So;0;ON;;;;;N;;;;; +26A5;MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;; +26A6;MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;; +26A7;MALE WITH STROKE AND MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;; +26A8;VERTICAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;; +26A9;HORIZONTAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;; +26AA;MEDIUM WHITE CIRCLE;So;0;ON;;;;;N;;;;; +26AB;MEDIUM BLACK CIRCLE;So;0;ON;;;;;N;;;;; +26AC;MEDIUM SMALL WHITE CIRCLE;So;0;L;;;;;N;;;;; +26AD;MARRIAGE SYMBOL;So;0;ON;;;;;N;;;;; +26AE;DIVORCE SYMBOL;So;0;ON;;;;;N;;;;; +26AF;UNMARRIED PARTNERSHIP SYMBOL;So;0;ON;;;;;N;;;;; +26B0;COFFIN;So;0;ON;;;;;N;;;;; +26B1;FUNERAL URN;So;0;ON;;;;;N;;;;; +26B2;NEUTER;So;0;ON;;;;;N;;;;; +26B3;CERES;So;0;ON;;;;;N;;;;; +26B4;PALLAS;So;0;ON;;;;;N;;;;; +26B5;JUNO;So;0;ON;;;;;N;;;;; +26B6;VESTA;So;0;ON;;;;;N;;;;; +26B7;CHIRON;So;0;ON;;;;;N;;;;; +26B8;BLACK MOON LILITH;So;0;ON;;;;;N;;;;; +26B9;SEXTILE;So;0;ON;;;;;N;;;;; +26BA;SEMISEXTILE;So;0;ON;;;;;N;;;;; +26BB;QUINCUNX;So;0;ON;;;;;N;;;;; +26BC;SESQUIQUADRATE;So;0;ON;;;;;N;;;;; +26C0;WHITE DRAUGHTS MAN;So;0;ON;;;;;N;;;;; +26C1;WHITE DRAUGHTS KING;So;0;ON;;;;;N;;;;; +26C2;BLACK DRAUGHTS MAN;So;0;ON;;;;;N;;;;; +26C3;BLACK DRAUGHTS KING;So;0;ON;;;;;N;;;;; 2701;UPPER BLADE SCISSORS;So;0;ON;;;;;N;;;;; 2702;BLACK SCISSORS;So;0;ON;;;;;N;;;;; 2703;LOWER BLADE SCISSORS;So;0;ON;;;;;N;;;;; @@ -7217,6 +8250,18 @@ 27BC;WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;WEDGE-TAILED RIGHT ARROW;;;; 27BD;HEAVY WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WEDGE-TAILED RIGHT ARROW;;;; 27BE;OPEN-OUTLINED RIGHTWARDS ARROW;So;0;ON;;;;;N;OPEN-OUTLINED RIGHT ARROW;;;; +27C0;THREE DIMENSIONAL ANGLE;Sm;0;ON;;;;;Y;;;;; +27C1;WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE;Sm;0;ON;;;;;N;;;;; +27C2;PERPENDICULAR;Sm;0;ON;;;;;N;;;;; +27C3;OPEN SUBSET;Sm;0;ON;;;;;Y;;;;; +27C4;OPEN SUPERSET;Sm;0;ON;;;;;Y;;;;; +27C5;LEFT S-SHAPED BAG DELIMITER;Ps;0;ON;;;;;Y;;;;; +27C6;RIGHT S-SHAPED BAG DELIMITER;Pe;0;ON;;;;;Y;;;;; +27C7;OR WITH DOT INSIDE;Sm;0;ON;;;;;N;;;;; +27C8;REVERSE SOLIDUS PRECEDING SUBSET;Sm;0;ON;;;;;Y;;;;; +27C9;SUPERSET PRECEDING SOLIDUS;Sm;0;ON;;;;;Y;;;;; +27CA;VERTICAL BAR WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +27CC;LONG DIVISION;Sm;0;ON;;;;;Y;;;;; 27D0;WHITE DIAMOND WITH CENTRED DOT;Sm;0;ON;;;;;N;;;;; 27D1;AND WITH DOT;Sm;0;ON;;;;;N;;;;; 27D2;ELEMENT OF OPENING UPWARDS;Sm;0;ON;;;;;N;;;;; @@ -7245,6 +8290,10 @@ 27E9;MATHEMATICAL RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;; 27EA;MATHEMATICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;; 27EB;MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;; +27EC;MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;;;;; +27ED;MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;;;;; +27EE;MATHEMATICAL LEFT FLATTENED PARENTHESIS;Ps;0;ON;;;;;Y;;;;; +27EF;MATHEMATICAL RIGHT FLATTENED PARENTHESIS;Pe;0;ON;;;;;Y;;;;; 27F0;UPWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;; 27F1;DOWNWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;; 27F2;ANTICLOCKWISE GAPPED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; @@ -7261,262 +8310,262 @@ 27FD;LONG LEFTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; 27FE;LONG RIGHTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; 27FF;LONG RIGHTWARDS SQUIGGLE ARROW;Sm;0;ON;;;;;N;;;;; -2800;BRAILLE PATTERN BLANK;So;0;ON;;;;;N;;;;; -2801;BRAILLE PATTERN DOTS-1;So;0;ON;;;;;N;;;;; -2802;BRAILLE PATTERN DOTS-2;So;0;ON;;;;;N;;;;; -2803;BRAILLE PATTERN DOTS-12;So;0;ON;;;;;N;;;;; -2804;BRAILLE PATTERN DOTS-3;So;0;ON;;;;;N;;;;; -2805;BRAILLE PATTERN DOTS-13;So;0;ON;;;;;N;;;;; -2806;BRAILLE PATTERN DOTS-23;So;0;ON;;;;;N;;;;; -2807;BRAILLE PATTERN DOTS-123;So;0;ON;;;;;N;;;;; -2808;BRAILLE PATTERN DOTS-4;So;0;ON;;;;;N;;;;; -2809;BRAILLE PATTERN DOTS-14;So;0;ON;;;;;N;;;;; -280A;BRAILLE PATTERN DOTS-24;So;0;ON;;;;;N;;;;; -280B;BRAILLE PATTERN DOTS-124;So;0;ON;;;;;N;;;;; -280C;BRAILLE PATTERN DOTS-34;So;0;ON;;;;;N;;;;; -280D;BRAILLE PATTERN DOTS-134;So;0;ON;;;;;N;;;;; -280E;BRAILLE PATTERN DOTS-234;So;0;ON;;;;;N;;;;; -280F;BRAILLE PATTERN DOTS-1234;So;0;ON;;;;;N;;;;; -2810;BRAILLE PATTERN DOTS-5;So;0;ON;;;;;N;;;;; -2811;BRAILLE PATTERN DOTS-15;So;0;ON;;;;;N;;;;; -2812;BRAILLE PATTERN DOTS-25;So;0;ON;;;;;N;;;;; -2813;BRAILLE PATTERN DOTS-125;So;0;ON;;;;;N;;;;; -2814;BRAILLE PATTERN DOTS-35;So;0;ON;;;;;N;;;;; -2815;BRAILLE PATTERN DOTS-135;So;0;ON;;;;;N;;;;; -2816;BRAILLE PATTERN DOTS-235;So;0;ON;;;;;N;;;;; -2817;BRAILLE PATTERN DOTS-1235;So;0;ON;;;;;N;;;;; -2818;BRAILLE PATTERN DOTS-45;So;0;ON;;;;;N;;;;; -2819;BRAILLE PATTERN DOTS-145;So;0;ON;;;;;N;;;;; -281A;BRAILLE PATTERN DOTS-245;So;0;ON;;;;;N;;;;; -281B;BRAILLE PATTERN DOTS-1245;So;0;ON;;;;;N;;;;; -281C;BRAILLE PATTERN DOTS-345;So;0;ON;;;;;N;;;;; -281D;BRAILLE PATTERN DOTS-1345;So;0;ON;;;;;N;;;;; -281E;BRAILLE PATTERN DOTS-2345;So;0;ON;;;;;N;;;;; -281F;BRAILLE PATTERN DOTS-12345;So;0;ON;;;;;N;;;;; -2820;BRAILLE PATTERN DOTS-6;So;0;ON;;;;;N;;;;; -2821;BRAILLE PATTERN DOTS-16;So;0;ON;;;;;N;;;;; -2822;BRAILLE PATTERN DOTS-26;So;0;ON;;;;;N;;;;; -2823;BRAILLE PATTERN DOTS-126;So;0;ON;;;;;N;;;;; -2824;BRAILLE PATTERN DOTS-36;So;0;ON;;;;;N;;;;; -2825;BRAILLE PATTERN DOTS-136;So;0;ON;;;;;N;;;;; -2826;BRAILLE PATTERN DOTS-236;So;0;ON;;;;;N;;;;; -2827;BRAILLE PATTERN DOTS-1236;So;0;ON;;;;;N;;;;; -2828;BRAILLE PATTERN DOTS-46;So;0;ON;;;;;N;;;;; -2829;BRAILLE PATTERN DOTS-146;So;0;ON;;;;;N;;;;; -282A;BRAILLE PATTERN DOTS-246;So;0;ON;;;;;N;;;;; -282B;BRAILLE PATTERN DOTS-1246;So;0;ON;;;;;N;;;;; -282C;BRAILLE PATTERN DOTS-346;So;0;ON;;;;;N;;;;; -282D;BRAILLE PATTERN DOTS-1346;So;0;ON;;;;;N;;;;; -282E;BRAILLE PATTERN DOTS-2346;So;0;ON;;;;;N;;;;; -282F;BRAILLE PATTERN DOTS-12346;So;0;ON;;;;;N;;;;; -2830;BRAILLE PATTERN DOTS-56;So;0;ON;;;;;N;;;;; -2831;BRAILLE PATTERN DOTS-156;So;0;ON;;;;;N;;;;; -2832;BRAILLE PATTERN DOTS-256;So;0;ON;;;;;N;;;;; -2833;BRAILLE PATTERN DOTS-1256;So;0;ON;;;;;N;;;;; -2834;BRAILLE PATTERN DOTS-356;So;0;ON;;;;;N;;;;; -2835;BRAILLE PATTERN DOTS-1356;So;0;ON;;;;;N;;;;; -2836;BRAILLE PATTERN DOTS-2356;So;0;ON;;;;;N;;;;; -2837;BRAILLE PATTERN DOTS-12356;So;0;ON;;;;;N;;;;; -2838;BRAILLE PATTERN DOTS-456;So;0;ON;;;;;N;;;;; -2839;BRAILLE PATTERN DOTS-1456;So;0;ON;;;;;N;;;;; -283A;BRAILLE PATTERN DOTS-2456;So;0;ON;;;;;N;;;;; -283B;BRAILLE PATTERN DOTS-12456;So;0;ON;;;;;N;;;;; -283C;BRAILLE PATTERN DOTS-3456;So;0;ON;;;;;N;;;;; -283D;BRAILLE PATTERN DOTS-13456;So;0;ON;;;;;N;;;;; -283E;BRAILLE PATTERN DOTS-23456;So;0;ON;;;;;N;;;;; -283F;BRAILLE PATTERN DOTS-123456;So;0;ON;;;;;N;;;;; -2840;BRAILLE PATTERN DOTS-7;So;0;ON;;;;;N;;;;; -2841;BRAILLE PATTERN DOTS-17;So;0;ON;;;;;N;;;;; -2842;BRAILLE PATTERN DOTS-27;So;0;ON;;;;;N;;;;; -2843;BRAILLE PATTERN DOTS-127;So;0;ON;;;;;N;;;;; -2844;BRAILLE PATTERN DOTS-37;So;0;ON;;;;;N;;;;; -2845;BRAILLE PATTERN DOTS-137;So;0;ON;;;;;N;;;;; -2846;BRAILLE PATTERN DOTS-237;So;0;ON;;;;;N;;;;; -2847;BRAILLE PATTERN DOTS-1237;So;0;ON;;;;;N;;;;; -2848;BRAILLE PATTERN DOTS-47;So;0;ON;;;;;N;;;;; -2849;BRAILLE PATTERN DOTS-147;So;0;ON;;;;;N;;;;; -284A;BRAILLE PATTERN DOTS-247;So;0;ON;;;;;N;;;;; -284B;BRAILLE PATTERN DOTS-1247;So;0;ON;;;;;N;;;;; -284C;BRAILLE PATTERN DOTS-347;So;0;ON;;;;;N;;;;; -284D;BRAILLE PATTERN DOTS-1347;So;0;ON;;;;;N;;;;; -284E;BRAILLE PATTERN DOTS-2347;So;0;ON;;;;;N;;;;; -284F;BRAILLE PATTERN DOTS-12347;So;0;ON;;;;;N;;;;; -2850;BRAILLE PATTERN DOTS-57;So;0;ON;;;;;N;;;;; -2851;BRAILLE PATTERN DOTS-157;So;0;ON;;;;;N;;;;; -2852;BRAILLE PATTERN DOTS-257;So;0;ON;;;;;N;;;;; -2853;BRAILLE PATTERN DOTS-1257;So;0;ON;;;;;N;;;;; -2854;BRAILLE PATTERN DOTS-357;So;0;ON;;;;;N;;;;; -2855;BRAILLE PATTERN DOTS-1357;So;0;ON;;;;;N;;;;; -2856;BRAILLE PATTERN DOTS-2357;So;0;ON;;;;;N;;;;; -2857;BRAILLE PATTERN DOTS-12357;So;0;ON;;;;;N;;;;; -2858;BRAILLE PATTERN DOTS-457;So;0;ON;;;;;N;;;;; -2859;BRAILLE PATTERN DOTS-1457;So;0;ON;;;;;N;;;;; -285A;BRAILLE PATTERN DOTS-2457;So;0;ON;;;;;N;;;;; -285B;BRAILLE PATTERN DOTS-12457;So;0;ON;;;;;N;;;;; -285C;BRAILLE PATTERN DOTS-3457;So;0;ON;;;;;N;;;;; -285D;BRAILLE PATTERN DOTS-13457;So;0;ON;;;;;N;;;;; -285E;BRAILLE PATTERN DOTS-23457;So;0;ON;;;;;N;;;;; -285F;BRAILLE PATTERN DOTS-123457;So;0;ON;;;;;N;;;;; -2860;BRAILLE PATTERN DOTS-67;So;0;ON;;;;;N;;;;; -2861;BRAILLE PATTERN DOTS-167;So;0;ON;;;;;N;;;;; -2862;BRAILLE PATTERN DOTS-267;So;0;ON;;;;;N;;;;; -2863;BRAILLE PATTERN DOTS-1267;So;0;ON;;;;;N;;;;; -2864;BRAILLE PATTERN DOTS-367;So;0;ON;;;;;N;;;;; -2865;BRAILLE PATTERN DOTS-1367;So;0;ON;;;;;N;;;;; -2866;BRAILLE PATTERN DOTS-2367;So;0;ON;;;;;N;;;;; -2867;BRAILLE PATTERN DOTS-12367;So;0;ON;;;;;N;;;;; -2868;BRAILLE PATTERN DOTS-467;So;0;ON;;;;;N;;;;; -2869;BRAILLE PATTERN DOTS-1467;So;0;ON;;;;;N;;;;; -286A;BRAILLE PATTERN DOTS-2467;So;0;ON;;;;;N;;;;; -286B;BRAILLE PATTERN DOTS-12467;So;0;ON;;;;;N;;;;; -286C;BRAILLE PATTERN DOTS-3467;So;0;ON;;;;;N;;;;; -286D;BRAILLE PATTERN DOTS-13467;So;0;ON;;;;;N;;;;; -286E;BRAILLE PATTERN DOTS-23467;So;0;ON;;;;;N;;;;; -286F;BRAILLE PATTERN DOTS-123467;So;0;ON;;;;;N;;;;; -2870;BRAILLE PATTERN DOTS-567;So;0;ON;;;;;N;;;;; -2871;BRAILLE PATTERN DOTS-1567;So;0;ON;;;;;N;;;;; -2872;BRAILLE PATTERN DOTS-2567;So;0;ON;;;;;N;;;;; -2873;BRAILLE PATTERN DOTS-12567;So;0;ON;;;;;N;;;;; -2874;BRAILLE PATTERN DOTS-3567;So;0;ON;;;;;N;;;;; -2875;BRAILLE PATTERN DOTS-13567;So;0;ON;;;;;N;;;;; -2876;BRAILLE PATTERN DOTS-23567;So;0;ON;;;;;N;;;;; -2877;BRAILLE PATTERN DOTS-123567;So;0;ON;;;;;N;;;;; -2878;BRAILLE PATTERN DOTS-4567;So;0;ON;;;;;N;;;;; -2879;BRAILLE PATTERN DOTS-14567;So;0;ON;;;;;N;;;;; -287A;BRAILLE PATTERN DOTS-24567;So;0;ON;;;;;N;;;;; -287B;BRAILLE PATTERN DOTS-124567;So;0;ON;;;;;N;;;;; -287C;BRAILLE PATTERN DOTS-34567;So;0;ON;;;;;N;;;;; -287D;BRAILLE PATTERN DOTS-134567;So;0;ON;;;;;N;;;;; -287E;BRAILLE PATTERN DOTS-234567;So;0;ON;;;;;N;;;;; -287F;BRAILLE PATTERN DOTS-1234567;So;0;ON;;;;;N;;;;; -2880;BRAILLE PATTERN DOTS-8;So;0;ON;;;;;N;;;;; -2881;BRAILLE PATTERN DOTS-18;So;0;ON;;;;;N;;;;; -2882;BRAILLE PATTERN DOTS-28;So;0;ON;;;;;N;;;;; -2883;BRAILLE PATTERN DOTS-128;So;0;ON;;;;;N;;;;; -2884;BRAILLE PATTERN DOTS-38;So;0;ON;;;;;N;;;;; -2885;BRAILLE PATTERN DOTS-138;So;0;ON;;;;;N;;;;; -2886;BRAILLE PATTERN DOTS-238;So;0;ON;;;;;N;;;;; -2887;BRAILLE PATTERN DOTS-1238;So;0;ON;;;;;N;;;;; -2888;BRAILLE PATTERN DOTS-48;So;0;ON;;;;;N;;;;; -2889;BRAILLE PATTERN DOTS-148;So;0;ON;;;;;N;;;;; -288A;BRAILLE PATTERN DOTS-248;So;0;ON;;;;;N;;;;; -288B;BRAILLE PATTERN DOTS-1248;So;0;ON;;;;;N;;;;; -288C;BRAILLE PATTERN DOTS-348;So;0;ON;;;;;N;;;;; -288D;BRAILLE PATTERN DOTS-1348;So;0;ON;;;;;N;;;;; -288E;BRAILLE PATTERN DOTS-2348;So;0;ON;;;;;N;;;;; -288F;BRAILLE PATTERN DOTS-12348;So;0;ON;;;;;N;;;;; -2890;BRAILLE PATTERN DOTS-58;So;0;ON;;;;;N;;;;; -2891;BRAILLE PATTERN DOTS-158;So;0;ON;;;;;N;;;;; -2892;BRAILLE PATTERN DOTS-258;So;0;ON;;;;;N;;;;; -2893;BRAILLE PATTERN DOTS-1258;So;0;ON;;;;;N;;;;; -2894;BRAILLE PATTERN DOTS-358;So;0;ON;;;;;N;;;;; -2895;BRAILLE PATTERN DOTS-1358;So;0;ON;;;;;N;;;;; -2896;BRAILLE PATTERN DOTS-2358;So;0;ON;;;;;N;;;;; -2897;BRAILLE PATTERN DOTS-12358;So;0;ON;;;;;N;;;;; -2898;BRAILLE PATTERN DOTS-458;So;0;ON;;;;;N;;;;; -2899;BRAILLE PATTERN DOTS-1458;So;0;ON;;;;;N;;;;; -289A;BRAILLE PATTERN DOTS-2458;So;0;ON;;;;;N;;;;; -289B;BRAILLE PATTERN DOTS-12458;So;0;ON;;;;;N;;;;; -289C;BRAILLE PATTERN DOTS-3458;So;0;ON;;;;;N;;;;; -289D;BRAILLE PATTERN DOTS-13458;So;0;ON;;;;;N;;;;; -289E;BRAILLE PATTERN DOTS-23458;So;0;ON;;;;;N;;;;; -289F;BRAILLE PATTERN DOTS-123458;So;0;ON;;;;;N;;;;; -28A0;BRAILLE PATTERN DOTS-68;So;0;ON;;;;;N;;;;; -28A1;BRAILLE PATTERN DOTS-168;So;0;ON;;;;;N;;;;; -28A2;BRAILLE PATTERN DOTS-268;So;0;ON;;;;;N;;;;; -28A3;BRAILLE PATTERN DOTS-1268;So;0;ON;;;;;N;;;;; -28A4;BRAILLE PATTERN DOTS-368;So;0;ON;;;;;N;;;;; -28A5;BRAILLE PATTERN DOTS-1368;So;0;ON;;;;;N;;;;; -28A6;BRAILLE PATTERN DOTS-2368;So;0;ON;;;;;N;;;;; -28A7;BRAILLE PATTERN DOTS-12368;So;0;ON;;;;;N;;;;; -28A8;BRAILLE PATTERN DOTS-468;So;0;ON;;;;;N;;;;; -28A9;BRAILLE PATTERN DOTS-1468;So;0;ON;;;;;N;;;;; -28AA;BRAILLE PATTERN DOTS-2468;So;0;ON;;;;;N;;;;; -28AB;BRAILLE PATTERN DOTS-12468;So;0;ON;;;;;N;;;;; -28AC;BRAILLE PATTERN DOTS-3468;So;0;ON;;;;;N;;;;; -28AD;BRAILLE PATTERN DOTS-13468;So;0;ON;;;;;N;;;;; -28AE;BRAILLE PATTERN DOTS-23468;So;0;ON;;;;;N;;;;; -28AF;BRAILLE PATTERN DOTS-123468;So;0;ON;;;;;N;;;;; -28B0;BRAILLE PATTERN DOTS-568;So;0;ON;;;;;N;;;;; -28B1;BRAILLE PATTERN DOTS-1568;So;0;ON;;;;;N;;;;; -28B2;BRAILLE PATTERN DOTS-2568;So;0;ON;;;;;N;;;;; -28B3;BRAILLE PATTERN DOTS-12568;So;0;ON;;;;;N;;;;; -28B4;BRAILLE PATTERN DOTS-3568;So;0;ON;;;;;N;;;;; -28B5;BRAILLE PATTERN DOTS-13568;So;0;ON;;;;;N;;;;; -28B6;BRAILLE PATTERN DOTS-23568;So;0;ON;;;;;N;;;;; -28B7;BRAILLE PATTERN DOTS-123568;So;0;ON;;;;;N;;;;; -28B8;BRAILLE PATTERN DOTS-4568;So;0;ON;;;;;N;;;;; -28B9;BRAILLE PATTERN DOTS-14568;So;0;ON;;;;;N;;;;; -28BA;BRAILLE PATTERN DOTS-24568;So;0;ON;;;;;N;;;;; -28BB;BRAILLE PATTERN DOTS-124568;So;0;ON;;;;;N;;;;; -28BC;BRAILLE PATTERN DOTS-34568;So;0;ON;;;;;N;;;;; -28BD;BRAILLE PATTERN DOTS-134568;So;0;ON;;;;;N;;;;; -28BE;BRAILLE PATTERN DOTS-234568;So;0;ON;;;;;N;;;;; -28BF;BRAILLE PATTERN DOTS-1234568;So;0;ON;;;;;N;;;;; -28C0;BRAILLE PATTERN DOTS-78;So;0;ON;;;;;N;;;;; -28C1;BRAILLE PATTERN DOTS-178;So;0;ON;;;;;N;;;;; -28C2;BRAILLE PATTERN DOTS-278;So;0;ON;;;;;N;;;;; -28C3;BRAILLE PATTERN DOTS-1278;So;0;ON;;;;;N;;;;; -28C4;BRAILLE PATTERN DOTS-378;So;0;ON;;;;;N;;;;; -28C5;BRAILLE PATTERN DOTS-1378;So;0;ON;;;;;N;;;;; -28C6;BRAILLE PATTERN DOTS-2378;So;0;ON;;;;;N;;;;; -28C7;BRAILLE PATTERN DOTS-12378;So;0;ON;;;;;N;;;;; -28C8;BRAILLE PATTERN DOTS-478;So;0;ON;;;;;N;;;;; -28C9;BRAILLE PATTERN DOTS-1478;So;0;ON;;;;;N;;;;; -28CA;BRAILLE PATTERN DOTS-2478;So;0;ON;;;;;N;;;;; -28CB;BRAILLE PATTERN DOTS-12478;So;0;ON;;;;;N;;;;; -28CC;BRAILLE PATTERN DOTS-3478;So;0;ON;;;;;N;;;;; -28CD;BRAILLE PATTERN DOTS-13478;So;0;ON;;;;;N;;;;; -28CE;BRAILLE PATTERN DOTS-23478;So;0;ON;;;;;N;;;;; -28CF;BRAILLE PATTERN DOTS-123478;So;0;ON;;;;;N;;;;; -28D0;BRAILLE PATTERN DOTS-578;So;0;ON;;;;;N;;;;; -28D1;BRAILLE PATTERN DOTS-1578;So;0;ON;;;;;N;;;;; -28D2;BRAILLE PATTERN DOTS-2578;So;0;ON;;;;;N;;;;; -28D3;BRAILLE PATTERN DOTS-12578;So;0;ON;;;;;N;;;;; -28D4;BRAILLE PATTERN DOTS-3578;So;0;ON;;;;;N;;;;; -28D5;BRAILLE PATTERN DOTS-13578;So;0;ON;;;;;N;;;;; -28D6;BRAILLE PATTERN DOTS-23578;So;0;ON;;;;;N;;;;; -28D7;BRAILLE PATTERN DOTS-123578;So;0;ON;;;;;N;;;;; -28D8;BRAILLE PATTERN DOTS-4578;So;0;ON;;;;;N;;;;; -28D9;BRAILLE PATTERN DOTS-14578;So;0;ON;;;;;N;;;;; -28DA;BRAILLE PATTERN DOTS-24578;So;0;ON;;;;;N;;;;; -28DB;BRAILLE PATTERN DOTS-124578;So;0;ON;;;;;N;;;;; -28DC;BRAILLE PATTERN DOTS-34578;So;0;ON;;;;;N;;;;; -28DD;BRAILLE PATTERN DOTS-134578;So;0;ON;;;;;N;;;;; -28DE;BRAILLE PATTERN DOTS-234578;So;0;ON;;;;;N;;;;; -28DF;BRAILLE PATTERN DOTS-1234578;So;0;ON;;;;;N;;;;; -28E0;BRAILLE PATTERN DOTS-678;So;0;ON;;;;;N;;;;; -28E1;BRAILLE PATTERN DOTS-1678;So;0;ON;;;;;N;;;;; -28E2;BRAILLE PATTERN DOTS-2678;So;0;ON;;;;;N;;;;; -28E3;BRAILLE PATTERN DOTS-12678;So;0;ON;;;;;N;;;;; -28E4;BRAILLE PATTERN DOTS-3678;So;0;ON;;;;;N;;;;; -28E5;BRAILLE PATTERN DOTS-13678;So;0;ON;;;;;N;;;;; -28E6;BRAILLE PATTERN DOTS-23678;So;0;ON;;;;;N;;;;; -28E7;BRAILLE PATTERN DOTS-123678;So;0;ON;;;;;N;;;;; -28E8;BRAILLE PATTERN DOTS-4678;So;0;ON;;;;;N;;;;; -28E9;BRAILLE PATTERN DOTS-14678;So;0;ON;;;;;N;;;;; -28EA;BRAILLE PATTERN DOTS-24678;So;0;ON;;;;;N;;;;; -28EB;BRAILLE PATTERN DOTS-124678;So;0;ON;;;;;N;;;;; -28EC;BRAILLE PATTERN DOTS-34678;So;0;ON;;;;;N;;;;; -28ED;BRAILLE PATTERN DOTS-134678;So;0;ON;;;;;N;;;;; -28EE;BRAILLE PATTERN DOTS-234678;So;0;ON;;;;;N;;;;; -28EF;BRAILLE PATTERN DOTS-1234678;So;0;ON;;;;;N;;;;; -28F0;BRAILLE PATTERN DOTS-5678;So;0;ON;;;;;N;;;;; -28F1;BRAILLE PATTERN DOTS-15678;So;0;ON;;;;;N;;;;; -28F2;BRAILLE PATTERN DOTS-25678;So;0;ON;;;;;N;;;;; -28F3;BRAILLE PATTERN DOTS-125678;So;0;ON;;;;;N;;;;; -28F4;BRAILLE PATTERN DOTS-35678;So;0;ON;;;;;N;;;;; -28F5;BRAILLE PATTERN DOTS-135678;So;0;ON;;;;;N;;;;; -28F6;BRAILLE PATTERN DOTS-235678;So;0;ON;;;;;N;;;;; -28F7;BRAILLE PATTERN DOTS-1235678;So;0;ON;;;;;N;;;;; -28F8;BRAILLE PATTERN DOTS-45678;So;0;ON;;;;;N;;;;; -28F9;BRAILLE PATTERN DOTS-145678;So;0;ON;;;;;N;;;;; -28FA;BRAILLE PATTERN DOTS-245678;So;0;ON;;;;;N;;;;; -28FB;BRAILLE PATTERN DOTS-1245678;So;0;ON;;;;;N;;;;; -28FC;BRAILLE PATTERN DOTS-345678;So;0;ON;;;;;N;;;;; -28FD;BRAILLE PATTERN DOTS-1345678;So;0;ON;;;;;N;;;;; -28FE;BRAILLE PATTERN DOTS-2345678;So;0;ON;;;;;N;;;;; -28FF;BRAILLE PATTERN DOTS-12345678;So;0;ON;;;;;N;;;;; +2800;BRAILLE PATTERN BLANK;So;0;L;;;;;N;;;;; +2801;BRAILLE PATTERN DOTS-1;So;0;L;;;;;N;;;;; +2802;BRAILLE PATTERN DOTS-2;So;0;L;;;;;N;;;;; +2803;BRAILLE PATTERN DOTS-12;So;0;L;;;;;N;;;;; +2804;BRAILLE PATTERN DOTS-3;So;0;L;;;;;N;;;;; +2805;BRAILLE PATTERN DOTS-13;So;0;L;;;;;N;;;;; +2806;BRAILLE PATTERN DOTS-23;So;0;L;;;;;N;;;;; +2807;BRAILLE PATTERN DOTS-123;So;0;L;;;;;N;;;;; +2808;BRAILLE PATTERN DOTS-4;So;0;L;;;;;N;;;;; +2809;BRAILLE PATTERN DOTS-14;So;0;L;;;;;N;;;;; +280A;BRAILLE PATTERN DOTS-24;So;0;L;;;;;N;;;;; +280B;BRAILLE PATTERN DOTS-124;So;0;L;;;;;N;;;;; +280C;BRAILLE PATTERN DOTS-34;So;0;L;;;;;N;;;;; +280D;BRAILLE PATTERN DOTS-134;So;0;L;;;;;N;;;;; +280E;BRAILLE PATTERN DOTS-234;So;0;L;;;;;N;;;;; +280F;BRAILLE PATTERN DOTS-1234;So;0;L;;;;;N;;;;; +2810;BRAILLE PATTERN DOTS-5;So;0;L;;;;;N;;;;; +2811;BRAILLE PATTERN DOTS-15;So;0;L;;;;;N;;;;; +2812;BRAILLE PATTERN DOTS-25;So;0;L;;;;;N;;;;; +2813;BRAILLE PATTERN DOTS-125;So;0;L;;;;;N;;;;; +2814;BRAILLE PATTERN DOTS-35;So;0;L;;;;;N;;;;; +2815;BRAILLE PATTERN DOTS-135;So;0;L;;;;;N;;;;; +2816;BRAILLE PATTERN DOTS-235;So;0;L;;;;;N;;;;; +2817;BRAILLE PATTERN DOTS-1235;So;0;L;;;;;N;;;;; +2818;BRAILLE PATTERN DOTS-45;So;0;L;;;;;N;;;;; +2819;BRAILLE PATTERN DOTS-145;So;0;L;;;;;N;;;;; +281A;BRAILLE PATTERN DOTS-245;So;0;L;;;;;N;;;;; +281B;BRAILLE PATTERN DOTS-1245;So;0;L;;;;;N;;;;; +281C;BRAILLE PATTERN DOTS-345;So;0;L;;;;;N;;;;; +281D;BRAILLE PATTERN DOTS-1345;So;0;L;;;;;N;;;;; +281E;BRAILLE PATTERN DOTS-2345;So;0;L;;;;;N;;;;; +281F;BRAILLE PATTERN DOTS-12345;So;0;L;;;;;N;;;;; +2820;BRAILLE PATTERN DOTS-6;So;0;L;;;;;N;;;;; +2821;BRAILLE PATTERN DOTS-16;So;0;L;;;;;N;;;;; +2822;BRAILLE PATTERN DOTS-26;So;0;L;;;;;N;;;;; +2823;BRAILLE PATTERN DOTS-126;So;0;L;;;;;N;;;;; +2824;BRAILLE PATTERN DOTS-36;So;0;L;;;;;N;;;;; +2825;BRAILLE PATTERN DOTS-136;So;0;L;;;;;N;;;;; +2826;BRAILLE PATTERN DOTS-236;So;0;L;;;;;N;;;;; +2827;BRAILLE PATTERN DOTS-1236;So;0;L;;;;;N;;;;; +2828;BRAILLE PATTERN DOTS-46;So;0;L;;;;;N;;;;; +2829;BRAILLE PATTERN DOTS-146;So;0;L;;;;;N;;;;; +282A;BRAILLE PATTERN DOTS-246;So;0;L;;;;;N;;;;; +282B;BRAILLE PATTERN DOTS-1246;So;0;L;;;;;N;;;;; +282C;BRAILLE PATTERN DOTS-346;So;0;L;;;;;N;;;;; +282D;BRAILLE PATTERN DOTS-1346;So;0;L;;;;;N;;;;; +282E;BRAILLE PATTERN DOTS-2346;So;0;L;;;;;N;;;;; +282F;BRAILLE PATTERN DOTS-12346;So;0;L;;;;;N;;;;; +2830;BRAILLE PATTERN DOTS-56;So;0;L;;;;;N;;;;; +2831;BRAILLE PATTERN DOTS-156;So;0;L;;;;;N;;;;; +2832;BRAILLE PATTERN DOTS-256;So;0;L;;;;;N;;;;; +2833;BRAILLE PATTERN DOTS-1256;So;0;L;;;;;N;;;;; +2834;BRAILLE PATTERN DOTS-356;So;0;L;;;;;N;;;;; +2835;BRAILLE PATTERN DOTS-1356;So;0;L;;;;;N;;;;; +2836;BRAILLE PATTERN DOTS-2356;So;0;L;;;;;N;;;;; +2837;BRAILLE PATTERN DOTS-12356;So;0;L;;;;;N;;;;; +2838;BRAILLE PATTERN DOTS-456;So;0;L;;;;;N;;;;; +2839;BRAILLE PATTERN DOTS-1456;So;0;L;;;;;N;;;;; +283A;BRAILLE PATTERN DOTS-2456;So;0;L;;;;;N;;;;; +283B;BRAILLE PATTERN DOTS-12456;So;0;L;;;;;N;;;;; +283C;BRAILLE PATTERN DOTS-3456;So;0;L;;;;;N;;;;; +283D;BRAILLE PATTERN DOTS-13456;So;0;L;;;;;N;;;;; +283E;BRAILLE PATTERN DOTS-23456;So;0;L;;;;;N;;;;; +283F;BRAILLE PATTERN DOTS-123456;So;0;L;;;;;N;;;;; +2840;BRAILLE PATTERN DOTS-7;So;0;L;;;;;N;;;;; +2841;BRAILLE PATTERN DOTS-17;So;0;L;;;;;N;;;;; +2842;BRAILLE PATTERN DOTS-27;So;0;L;;;;;N;;;;; +2843;BRAILLE PATTERN DOTS-127;So;0;L;;;;;N;;;;; +2844;BRAILLE PATTERN DOTS-37;So;0;L;;;;;N;;;;; +2845;BRAILLE PATTERN DOTS-137;So;0;L;;;;;N;;;;; +2846;BRAILLE PATTERN DOTS-237;So;0;L;;;;;N;;;;; +2847;BRAILLE PATTERN DOTS-1237;So;0;L;;;;;N;;;;; +2848;BRAILLE PATTERN DOTS-47;So;0;L;;;;;N;;;;; +2849;BRAILLE PATTERN DOTS-147;So;0;L;;;;;N;;;;; +284A;BRAILLE PATTERN DOTS-247;So;0;L;;;;;N;;;;; +284B;BRAILLE PATTERN DOTS-1247;So;0;L;;;;;N;;;;; +284C;BRAILLE PATTERN DOTS-347;So;0;L;;;;;N;;;;; +284D;BRAILLE PATTERN DOTS-1347;So;0;L;;;;;N;;;;; +284E;BRAILLE PATTERN DOTS-2347;So;0;L;;;;;N;;;;; +284F;BRAILLE PATTERN DOTS-12347;So;0;L;;;;;N;;;;; +2850;BRAILLE PATTERN DOTS-57;So;0;L;;;;;N;;;;; +2851;BRAILLE PATTERN DOTS-157;So;0;L;;;;;N;;;;; +2852;BRAILLE PATTERN DOTS-257;So;0;L;;;;;N;;;;; +2853;BRAILLE PATTERN DOTS-1257;So;0;L;;;;;N;;;;; +2854;BRAILLE PATTERN DOTS-357;So;0;L;;;;;N;;;;; +2855;BRAILLE PATTERN DOTS-1357;So;0;L;;;;;N;;;;; +2856;BRAILLE PATTERN DOTS-2357;So;0;L;;;;;N;;;;; +2857;BRAILLE PATTERN DOTS-12357;So;0;L;;;;;N;;;;; +2858;BRAILLE PATTERN DOTS-457;So;0;L;;;;;N;;;;; +2859;BRAILLE PATTERN DOTS-1457;So;0;L;;;;;N;;;;; +285A;BRAILLE PATTERN DOTS-2457;So;0;L;;;;;N;;;;; +285B;BRAILLE PATTERN DOTS-12457;So;0;L;;;;;N;;;;; +285C;BRAILLE PATTERN DOTS-3457;So;0;L;;;;;N;;;;; +285D;BRAILLE PATTERN DOTS-13457;So;0;L;;;;;N;;;;; +285E;BRAILLE PATTERN DOTS-23457;So;0;L;;;;;N;;;;; +285F;BRAILLE PATTERN DOTS-123457;So;0;L;;;;;N;;;;; +2860;BRAILLE PATTERN DOTS-67;So;0;L;;;;;N;;;;; +2861;BRAILLE PATTERN DOTS-167;So;0;L;;;;;N;;;;; +2862;BRAILLE PATTERN DOTS-267;So;0;L;;;;;N;;;;; +2863;BRAILLE PATTERN DOTS-1267;So;0;L;;;;;N;;;;; +2864;BRAILLE PATTERN DOTS-367;So;0;L;;;;;N;;;;; +2865;BRAILLE PATTERN DOTS-1367;So;0;L;;;;;N;;;;; +2866;BRAILLE PATTERN DOTS-2367;So;0;L;;;;;N;;;;; +2867;BRAILLE PATTERN DOTS-12367;So;0;L;;;;;N;;;;; +2868;BRAILLE PATTERN DOTS-467;So;0;L;;;;;N;;;;; +2869;BRAILLE PATTERN DOTS-1467;So;0;L;;;;;N;;;;; +286A;BRAILLE PATTERN DOTS-2467;So;0;L;;;;;N;;;;; +286B;BRAILLE PATTERN DOTS-12467;So;0;L;;;;;N;;;;; +286C;BRAILLE PATTERN DOTS-3467;So;0;L;;;;;N;;;;; +286D;BRAILLE PATTERN DOTS-13467;So;0;L;;;;;N;;;;; +286E;BRAILLE PATTERN DOTS-23467;So;0;L;;;;;N;;;;; +286F;BRAILLE PATTERN DOTS-123467;So;0;L;;;;;N;;;;; +2870;BRAILLE PATTERN DOTS-567;So;0;L;;;;;N;;;;; +2871;BRAILLE PATTERN DOTS-1567;So;0;L;;;;;N;;;;; +2872;BRAILLE PATTERN DOTS-2567;So;0;L;;;;;N;;;;; +2873;BRAILLE PATTERN DOTS-12567;So;0;L;;;;;N;;;;; +2874;BRAILLE PATTERN DOTS-3567;So;0;L;;;;;N;;;;; +2875;BRAILLE PATTERN DOTS-13567;So;0;L;;;;;N;;;;; +2876;BRAILLE PATTERN DOTS-23567;So;0;L;;;;;N;;;;; +2877;BRAILLE PATTERN DOTS-123567;So;0;L;;;;;N;;;;; +2878;BRAILLE PATTERN DOTS-4567;So;0;L;;;;;N;;;;; +2879;BRAILLE PATTERN DOTS-14567;So;0;L;;;;;N;;;;; +287A;BRAILLE PATTERN DOTS-24567;So;0;L;;;;;N;;;;; +287B;BRAILLE PATTERN DOTS-124567;So;0;L;;;;;N;;;;; +287C;BRAILLE PATTERN DOTS-34567;So;0;L;;;;;N;;;;; +287D;BRAILLE PATTERN DOTS-134567;So;0;L;;;;;N;;;;; +287E;BRAILLE PATTERN DOTS-234567;So;0;L;;;;;N;;;;; +287F;BRAILLE PATTERN DOTS-1234567;So;0;L;;;;;N;;;;; +2880;BRAILLE PATTERN DOTS-8;So;0;L;;;;;N;;;;; +2881;BRAILLE PATTERN DOTS-18;So;0;L;;;;;N;;;;; +2882;BRAILLE PATTERN DOTS-28;So;0;L;;;;;N;;;;; +2883;BRAILLE PATTERN DOTS-128;So;0;L;;;;;N;;;;; +2884;BRAILLE PATTERN DOTS-38;So;0;L;;;;;N;;;;; +2885;BRAILLE PATTERN DOTS-138;So;0;L;;;;;N;;;;; +2886;BRAILLE PATTERN DOTS-238;So;0;L;;;;;N;;;;; +2887;BRAILLE PATTERN DOTS-1238;So;0;L;;;;;N;;;;; +2888;BRAILLE PATTERN DOTS-48;So;0;L;;;;;N;;;;; +2889;BRAILLE PATTERN DOTS-148;So;0;L;;;;;N;;;;; +288A;BRAILLE PATTERN DOTS-248;So;0;L;;;;;N;;;;; +288B;BRAILLE PATTERN DOTS-1248;So;0;L;;;;;N;;;;; +288C;BRAILLE PATTERN DOTS-348;So;0;L;;;;;N;;;;; +288D;BRAILLE PATTERN DOTS-1348;So;0;L;;;;;N;;;;; +288E;BRAILLE PATTERN DOTS-2348;So;0;L;;;;;N;;;;; +288F;BRAILLE PATTERN DOTS-12348;So;0;L;;;;;N;;;;; +2890;BRAILLE PATTERN DOTS-58;So;0;L;;;;;N;;;;; +2891;BRAILLE PATTERN DOTS-158;So;0;L;;;;;N;;;;; +2892;BRAILLE PATTERN DOTS-258;So;0;L;;;;;N;;;;; +2893;BRAILLE PATTERN DOTS-1258;So;0;L;;;;;N;;;;; +2894;BRAILLE PATTERN DOTS-358;So;0;L;;;;;N;;;;; +2895;BRAILLE PATTERN DOTS-1358;So;0;L;;;;;N;;;;; +2896;BRAILLE PATTERN DOTS-2358;So;0;L;;;;;N;;;;; +2897;BRAILLE PATTERN DOTS-12358;So;0;L;;;;;N;;;;; +2898;BRAILLE PATTERN DOTS-458;So;0;L;;;;;N;;;;; +2899;BRAILLE PATTERN DOTS-1458;So;0;L;;;;;N;;;;; +289A;BRAILLE PATTERN DOTS-2458;So;0;L;;;;;N;;;;; +289B;BRAILLE PATTERN DOTS-12458;So;0;L;;;;;N;;;;; +289C;BRAILLE PATTERN DOTS-3458;So;0;L;;;;;N;;;;; +289D;BRAILLE PATTERN DOTS-13458;So;0;L;;;;;N;;;;; +289E;BRAILLE PATTERN DOTS-23458;So;0;L;;;;;N;;;;; +289F;BRAILLE PATTERN DOTS-123458;So;0;L;;;;;N;;;;; +28A0;BRAILLE PATTERN DOTS-68;So;0;L;;;;;N;;;;; +28A1;BRAILLE PATTERN DOTS-168;So;0;L;;;;;N;;;;; +28A2;BRAILLE PATTERN DOTS-268;So;0;L;;;;;N;;;;; +28A3;BRAILLE PATTERN DOTS-1268;So;0;L;;;;;N;;;;; +28A4;BRAILLE PATTERN DOTS-368;So;0;L;;;;;N;;;;; +28A5;BRAILLE PATTERN DOTS-1368;So;0;L;;;;;N;;;;; +28A6;BRAILLE PATTERN DOTS-2368;So;0;L;;;;;N;;;;; +28A7;BRAILLE PATTERN DOTS-12368;So;0;L;;;;;N;;;;; +28A8;BRAILLE PATTERN DOTS-468;So;0;L;;;;;N;;;;; +28A9;BRAILLE PATTERN DOTS-1468;So;0;L;;;;;N;;;;; +28AA;BRAILLE PATTERN DOTS-2468;So;0;L;;;;;N;;;;; +28AB;BRAILLE PATTERN DOTS-12468;So;0;L;;;;;N;;;;; +28AC;BRAILLE PATTERN DOTS-3468;So;0;L;;;;;N;;;;; +28AD;BRAILLE PATTERN DOTS-13468;So;0;L;;;;;N;;;;; +28AE;BRAILLE PATTERN DOTS-23468;So;0;L;;;;;N;;;;; +28AF;BRAILLE PATTERN DOTS-123468;So;0;L;;;;;N;;;;; +28B0;BRAILLE PATTERN DOTS-568;So;0;L;;;;;N;;;;; +28B1;BRAILLE PATTERN DOTS-1568;So;0;L;;;;;N;;;;; +28B2;BRAILLE PATTERN DOTS-2568;So;0;L;;;;;N;;;;; +28B3;BRAILLE PATTERN DOTS-12568;So;0;L;;;;;N;;;;; +28B4;BRAILLE PATTERN DOTS-3568;So;0;L;;;;;N;;;;; +28B5;BRAILLE PATTERN DOTS-13568;So;0;L;;;;;N;;;;; +28B6;BRAILLE PATTERN DOTS-23568;So;0;L;;;;;N;;;;; +28B7;BRAILLE PATTERN DOTS-123568;So;0;L;;;;;N;;;;; +28B8;BRAILLE PATTERN DOTS-4568;So;0;L;;;;;N;;;;; +28B9;BRAILLE PATTERN DOTS-14568;So;0;L;;;;;N;;;;; +28BA;BRAILLE PATTERN DOTS-24568;So;0;L;;;;;N;;;;; +28BB;BRAILLE PATTERN DOTS-124568;So;0;L;;;;;N;;;;; +28BC;BRAILLE PATTERN DOTS-34568;So;0;L;;;;;N;;;;; +28BD;BRAILLE PATTERN DOTS-134568;So;0;L;;;;;N;;;;; +28BE;BRAILLE PATTERN DOTS-234568;So;0;L;;;;;N;;;;; +28BF;BRAILLE PATTERN DOTS-1234568;So;0;L;;;;;N;;;;; +28C0;BRAILLE PATTERN DOTS-78;So;0;L;;;;;N;;;;; +28C1;BRAILLE PATTERN DOTS-178;So;0;L;;;;;N;;;;; +28C2;BRAILLE PATTERN DOTS-278;So;0;L;;;;;N;;;;; +28C3;BRAILLE PATTERN DOTS-1278;So;0;L;;;;;N;;;;; +28C4;BRAILLE PATTERN DOTS-378;So;0;L;;;;;N;;;;; +28C5;BRAILLE PATTERN DOTS-1378;So;0;L;;;;;N;;;;; +28C6;BRAILLE PATTERN DOTS-2378;So;0;L;;;;;N;;;;; +28C7;BRAILLE PATTERN DOTS-12378;So;0;L;;;;;N;;;;; +28C8;BRAILLE PATTERN DOTS-478;So;0;L;;;;;N;;;;; +28C9;BRAILLE PATTERN DOTS-1478;So;0;L;;;;;N;;;;; +28CA;BRAILLE PATTERN DOTS-2478;So;0;L;;;;;N;;;;; +28CB;BRAILLE PATTERN DOTS-12478;So;0;L;;;;;N;;;;; +28CC;BRAILLE PATTERN DOTS-3478;So;0;L;;;;;N;;;;; +28CD;BRAILLE PATTERN DOTS-13478;So;0;L;;;;;N;;;;; +28CE;BRAILLE PATTERN DOTS-23478;So;0;L;;;;;N;;;;; +28CF;BRAILLE PATTERN DOTS-123478;So;0;L;;;;;N;;;;; +28D0;BRAILLE PATTERN DOTS-578;So;0;L;;;;;N;;;;; +28D1;BRAILLE PATTERN DOTS-1578;So;0;L;;;;;N;;;;; +28D2;BRAILLE PATTERN DOTS-2578;So;0;L;;;;;N;;;;; +28D3;BRAILLE PATTERN DOTS-12578;So;0;L;;;;;N;;;;; +28D4;BRAILLE PATTERN DOTS-3578;So;0;L;;;;;N;;;;; +28D5;BRAILLE PATTERN DOTS-13578;So;0;L;;;;;N;;;;; +28D6;BRAILLE PATTERN DOTS-23578;So;0;L;;;;;N;;;;; +28D7;BRAILLE PATTERN DOTS-123578;So;0;L;;;;;N;;;;; +28D8;BRAILLE PATTERN DOTS-4578;So;0;L;;;;;N;;;;; +28D9;BRAILLE PATTERN DOTS-14578;So;0;L;;;;;N;;;;; +28DA;BRAILLE PATTERN DOTS-24578;So;0;L;;;;;N;;;;; +28DB;BRAILLE PATTERN DOTS-124578;So;0;L;;;;;N;;;;; +28DC;BRAILLE PATTERN DOTS-34578;So;0;L;;;;;N;;;;; +28DD;BRAILLE PATTERN DOTS-134578;So;0;L;;;;;N;;;;; +28DE;BRAILLE PATTERN DOTS-234578;So;0;L;;;;;N;;;;; +28DF;BRAILLE PATTERN DOTS-1234578;So;0;L;;;;;N;;;;; +28E0;BRAILLE PATTERN DOTS-678;So;0;L;;;;;N;;;;; +28E1;BRAILLE PATTERN DOTS-1678;So;0;L;;;;;N;;;;; +28E2;BRAILLE PATTERN DOTS-2678;So;0;L;;;;;N;;;;; +28E3;BRAILLE PATTERN DOTS-12678;So;0;L;;;;;N;;;;; +28E4;BRAILLE PATTERN DOTS-3678;So;0;L;;;;;N;;;;; +28E5;BRAILLE PATTERN DOTS-13678;So;0;L;;;;;N;;;;; +28E6;BRAILLE PATTERN DOTS-23678;So;0;L;;;;;N;;;;; +28E7;BRAILLE PATTERN DOTS-123678;So;0;L;;;;;N;;;;; +28E8;BRAILLE PATTERN DOTS-4678;So;0;L;;;;;N;;;;; +28E9;BRAILLE PATTERN DOTS-14678;So;0;L;;;;;N;;;;; +28EA;BRAILLE PATTERN DOTS-24678;So;0;L;;;;;N;;;;; +28EB;BRAILLE PATTERN DOTS-124678;So;0;L;;;;;N;;;;; +28EC;BRAILLE PATTERN DOTS-34678;So;0;L;;;;;N;;;;; +28ED;BRAILLE PATTERN DOTS-134678;So;0;L;;;;;N;;;;; +28EE;BRAILLE PATTERN DOTS-234678;So;0;L;;;;;N;;;;; +28EF;BRAILLE PATTERN DOTS-1234678;So;0;L;;;;;N;;;;; +28F0;BRAILLE PATTERN DOTS-5678;So;0;L;;;;;N;;;;; +28F1;BRAILLE PATTERN DOTS-15678;So;0;L;;;;;N;;;;; +28F2;BRAILLE PATTERN DOTS-25678;So;0;L;;;;;N;;;;; +28F3;BRAILLE PATTERN DOTS-125678;So;0;L;;;;;N;;;;; +28F4;BRAILLE PATTERN DOTS-35678;So;0;L;;;;;N;;;;; +28F5;BRAILLE PATTERN DOTS-135678;So;0;L;;;;;N;;;;; +28F6;BRAILLE PATTERN DOTS-235678;So;0;L;;;;;N;;;;; +28F7;BRAILLE PATTERN DOTS-1235678;So;0;L;;;;;N;;;;; +28F8;BRAILLE PATTERN DOTS-45678;So;0;L;;;;;N;;;;; +28F9;BRAILLE PATTERN DOTS-145678;So;0;L;;;;;N;;;;; +28FA;BRAILLE PATTERN DOTS-245678;So;0;L;;;;;N;;;;; +28FB;BRAILLE PATTERN DOTS-1245678;So;0;L;;;;;N;;;;; +28FC;BRAILLE PATTERN DOTS-345678;So;0;L;;;;;N;;;;; +28FD;BRAILLE PATTERN DOTS-1345678;So;0;L;;;;;N;;;;; +28FE;BRAILLE PATTERN DOTS-2345678;So;0;L;;;;;N;;;;; +28FF;BRAILLE PATTERN DOTS-12345678;So;0;L;;;;;N;;;;; 2900;RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; 2901;RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; 2902;LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; @@ -8043,6 +9092,564 @@ 2B0B;SOUTH WEST BLACK ARROW;So;0;ON;;;;;N;;;;; 2B0C;LEFT RIGHT BLACK ARROW;So;0;ON;;;;;N;;;;; 2B0D;UP DOWN BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0E;RIGHTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;; +2B0F;RIGHTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;; +2B10;LEFTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;; +2B11;LEFTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;; +2B12;SQUARE WITH TOP HALF BLACK;So;0;ON;;;;;N;;;;; +2B13;SQUARE WITH BOTTOM HALF BLACK;So;0;ON;;;;;N;;;;; +2B14;SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; +2B15;SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; +2B16;DIAMOND WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; +2B17;DIAMOND WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; +2B18;DIAMOND WITH TOP HALF BLACK;So;0;ON;;;;;N;;;;; +2B19;DIAMOND WITH BOTTOM HALF BLACK;So;0;ON;;;;;N;;;;; +2B1A;DOTTED SQUARE;So;0;ON;;;;;N;;;;; +2B1B;BLACK LARGE SQUARE;So;0;ON;;;;;N;;;;; +2B1C;WHITE LARGE SQUARE;So;0;ON;;;;;N;;;;; +2B1D;BLACK VERY SMALL SQUARE;So;0;ON;;;;;N;;;;; +2B1E;WHITE VERY SMALL SQUARE;So;0;ON;;;;;N;;;;; +2B1F;BLACK PENTAGON;So;0;ON;;;;;N;;;;; +2B20;WHITE PENTAGON;So;0;ON;;;;;N;;;;; +2B21;WHITE HEXAGON;So;0;ON;;;;;N;;;;; +2B22;BLACK HEXAGON;So;0;ON;;;;;N;;;;; +2B23;HORIZONTAL BLACK HEXAGON;So;0;ON;;;;;N;;;;; +2B24;BLACK LARGE CIRCLE;So;0;ON;;;;;N;;;;; +2B25;BLACK MEDIUM DIAMOND;So;0;ON;;;;;N;;;;; +2B26;WHITE MEDIUM DIAMOND;So;0;ON;;;;;N;;;;; +2B27;BLACK MEDIUM LOZENGE;So;0;ON;;;;;N;;;;; +2B28;WHITE MEDIUM LOZENGE;So;0;ON;;;;;N;;;;; +2B29;BLACK SMALL DIAMOND;So;0;ON;;;;;N;;;;; +2B2A;BLACK SMALL LOZENGE;So;0;ON;;;;;N;;;;; +2B2B;WHITE SMALL LOZENGE;So;0;ON;;;;;N;;;;; +2B2C;BLACK HORIZONTAL ELLIPSE;So;0;ON;;;;;N;;;;; +2B2D;WHITE HORIZONTAL ELLIPSE;So;0;ON;;;;;N;;;;; +2B2E;BLACK VERTICAL ELLIPSE;So;0;ON;;;;;N;;;;; +2B2F;WHITE VERTICAL ELLIPSE;So;0;ON;;;;;N;;;;; +2B30;LEFT ARROW WITH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +2B31;THREE LEFTWARDS ARROWS;Sm;0;ON;;;;;N;;;;; +2B32;LEFT ARROW WITH CIRCLED PLUS;Sm;0;ON;;;;;N;;;;; +2B33;LONG LEFTWARDS SQUIGGLE ARROW;Sm;0;ON;;;;;N;;;;; +2B34;LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B35;LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B36;LEFTWARDS TWO-HEADED ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +2B37;LEFTWARDS TWO-HEADED TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +2B38;LEFTWARDS ARROW WITH DOTTED STEM;Sm;0;ON;;;;;N;;;;; +2B39;LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B3A;LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B3B;LEFTWARDS TWO-HEADED ARROW WITH TAIL;Sm;0;ON;;;;;N;;;;; +2B3C;LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B3D;LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B3E;LEFTWARDS ARROW THROUGH X;Sm;0;ON;;;;;N;;;;; +2B3F;WAVE ARROW POINTING DIRECTLY LEFT;Sm;0;ON;;;;;N;;;;; +2B40;EQUALS SIGN ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2B41;REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2B42;LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; +2B43;RIGHTWARDS ARROW THROUGH GREATER-THAN;Sm;0;ON;;;;;N;;;;; +2B44;RIGHTWARDS ARROW THROUGH SUPERSET;Sm;0;ON;;;;;N;;;;; +2B45;LEFTWARDS QUADRUPLE ARROW;So;0;ON;;;;;N;;;;; +2B46;RIGHTWARDS QUADRUPLE ARROW;So;0;ON;;;;;N;;;;; +2B47;REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2B48;RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; +2B49;TILDE OPERATOR ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2B4A;LEFTWARDS ARROW ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; +2B4B;LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; +2B4C;RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; +2B50;WHITE MEDIUM STAR;So;0;ON;;;;;N;;;;; +2B51;BLACK SMALL STAR;So;0;ON;;;;;N;;;;; +2B52;WHITE SMALL STAR;So;0;ON;;;;;N;;;;; +2B53;BLACK RIGHT-POINTING PENTAGON;So;0;ON;;;;;N;;;;; +2B54;WHITE RIGHT-POINTING PENTAGON;So;0;ON;;;;;N;;;;; +2C00;GLAGOLITIC CAPITAL LETTER AZU;Lu;0;L;;;;;N;;;;2C30; +2C01;GLAGOLITIC CAPITAL LETTER BUKY;Lu;0;L;;;;;N;;;;2C31; +2C02;GLAGOLITIC CAPITAL LETTER VEDE;Lu;0;L;;;;;N;;;;2C32; +2C03;GLAGOLITIC CAPITAL LETTER GLAGOLI;Lu;0;L;;;;;N;;;;2C33; +2C04;GLAGOLITIC CAPITAL LETTER DOBRO;Lu;0;L;;;;;N;;;;2C34; +2C05;GLAGOLITIC CAPITAL LETTER YESTU;Lu;0;L;;;;;N;;;;2C35; +2C06;GLAGOLITIC CAPITAL LETTER ZHIVETE;Lu;0;L;;;;;N;;;;2C36; +2C07;GLAGOLITIC CAPITAL LETTER DZELO;Lu;0;L;;;;;N;;;;2C37; +2C08;GLAGOLITIC CAPITAL LETTER ZEMLJA;Lu;0;L;;;;;N;;;;2C38; +2C09;GLAGOLITIC CAPITAL LETTER IZHE;Lu;0;L;;;;;N;;;;2C39; +2C0A;GLAGOLITIC CAPITAL LETTER INITIAL IZHE;Lu;0;L;;;;;N;;;;2C3A; +2C0B;GLAGOLITIC CAPITAL LETTER I;Lu;0;L;;;;;N;;;;2C3B; +2C0C;GLAGOLITIC CAPITAL LETTER DJERVI;Lu;0;L;;;;;N;;;;2C3C; +2C0D;GLAGOLITIC CAPITAL LETTER KAKO;Lu;0;L;;;;;N;;;;2C3D; +2C0E;GLAGOLITIC CAPITAL LETTER LJUDIJE;Lu;0;L;;;;;N;;;;2C3E; +2C0F;GLAGOLITIC CAPITAL LETTER MYSLITE;Lu;0;L;;;;;N;;;;2C3F; +2C10;GLAGOLITIC CAPITAL LETTER NASHI;Lu;0;L;;;;;N;;;;2C40; +2C11;GLAGOLITIC CAPITAL LETTER ONU;Lu;0;L;;;;;N;;;;2C41; +2C12;GLAGOLITIC CAPITAL LETTER POKOJI;Lu;0;L;;;;;N;;;;2C42; +2C13;GLAGOLITIC CAPITAL LETTER RITSI;Lu;0;L;;;;;N;;;;2C43; +2C14;GLAGOLITIC CAPITAL LETTER SLOVO;Lu;0;L;;;;;N;;;;2C44; +2C15;GLAGOLITIC CAPITAL LETTER TVRIDO;Lu;0;L;;;;;N;;;;2C45; +2C16;GLAGOLITIC CAPITAL LETTER UKU;Lu;0;L;;;;;N;;;;2C46; +2C17;GLAGOLITIC CAPITAL LETTER FRITU;Lu;0;L;;;;;N;;;;2C47; +2C18;GLAGOLITIC CAPITAL LETTER HERU;Lu;0;L;;;;;N;;;;2C48; +2C19;GLAGOLITIC CAPITAL LETTER OTU;Lu;0;L;;;;;N;;;;2C49; +2C1A;GLAGOLITIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;2C4A; +2C1B;GLAGOLITIC CAPITAL LETTER SHTA;Lu;0;L;;;;;N;;;;2C4B; +2C1C;GLAGOLITIC CAPITAL LETTER TSI;Lu;0;L;;;;;N;;;;2C4C; +2C1D;GLAGOLITIC CAPITAL LETTER CHRIVI;Lu;0;L;;;;;N;;;;2C4D; +2C1E;GLAGOLITIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;2C4E; +2C1F;GLAGOLITIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;;;;2C4F; +2C20;GLAGOLITIC CAPITAL LETTER YERI;Lu;0;L;;;;;N;;;;2C50; +2C21;GLAGOLITIC CAPITAL LETTER YATI;Lu;0;L;;;;;N;;;;2C51; +2C22;GLAGOLITIC CAPITAL LETTER SPIDERY HA;Lu;0;L;;;;;N;;;;2C52; +2C23;GLAGOLITIC CAPITAL LETTER YU;Lu;0;L;;;;;N;;;;2C53; +2C24;GLAGOLITIC CAPITAL LETTER SMALL YUS;Lu;0;L;;;;;N;;;;2C54; +2C25;GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL;Lu;0;L;;;;;N;;;;2C55; +2C26;GLAGOLITIC CAPITAL LETTER YO;Lu;0;L;;;;;N;;;;2C56; +2C27;GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS;Lu;0;L;;;;;N;;;;2C57; +2C28;GLAGOLITIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;2C58; +2C29;GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS;Lu;0;L;;;;;N;;;;2C59; +2C2A;GLAGOLITIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;2C5A; +2C2B;GLAGOLITIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;2C5B; +2C2C;GLAGOLITIC CAPITAL LETTER SHTAPIC;Lu;0;L;;;;;N;;;;2C5C; +2C2D;GLAGOLITIC CAPITAL LETTER TROKUTASTI A;Lu;0;L;;;;;N;;;;2C5D; +2C2E;GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE;Lu;0;L;;;;;N;;;;2C5E; +2C30;GLAGOLITIC SMALL LETTER AZU;Ll;0;L;;;;;N;;;2C00;;2C00 +2C31;GLAGOLITIC SMALL LETTER BUKY;Ll;0;L;;;;;N;;;2C01;;2C01 +2C32;GLAGOLITIC SMALL LETTER VEDE;Ll;0;L;;;;;N;;;2C02;;2C02 +2C33;GLAGOLITIC SMALL LETTER GLAGOLI;Ll;0;L;;;;;N;;;2C03;;2C03 +2C34;GLAGOLITIC SMALL LETTER DOBRO;Ll;0;L;;;;;N;;;2C04;;2C04 +2C35;GLAGOLITIC SMALL LETTER YESTU;Ll;0;L;;;;;N;;;2C05;;2C05 +2C36;GLAGOLITIC SMALL LETTER ZHIVETE;Ll;0;L;;;;;N;;;2C06;;2C06 +2C37;GLAGOLITIC SMALL LETTER DZELO;Ll;0;L;;;;;N;;;2C07;;2C07 +2C38;GLAGOLITIC SMALL LETTER ZEMLJA;Ll;0;L;;;;;N;;;2C08;;2C08 +2C39;GLAGOLITIC SMALL LETTER IZHE;Ll;0;L;;;;;N;;;2C09;;2C09 +2C3A;GLAGOLITIC SMALL LETTER INITIAL IZHE;Ll;0;L;;;;;N;;;2C0A;;2C0A +2C3B;GLAGOLITIC SMALL LETTER I;Ll;0;L;;;;;N;;;2C0B;;2C0B +2C3C;GLAGOLITIC SMALL LETTER DJERVI;Ll;0;L;;;;;N;;;2C0C;;2C0C +2C3D;GLAGOLITIC SMALL LETTER KAKO;Ll;0;L;;;;;N;;;2C0D;;2C0D +2C3E;GLAGOLITIC SMALL LETTER LJUDIJE;Ll;0;L;;;;;N;;;2C0E;;2C0E +2C3F;GLAGOLITIC SMALL LETTER MYSLITE;Ll;0;L;;;;;N;;;2C0F;;2C0F +2C40;GLAGOLITIC SMALL LETTER NASHI;Ll;0;L;;;;;N;;;2C10;;2C10 +2C41;GLAGOLITIC SMALL LETTER ONU;Ll;0;L;;;;;N;;;2C11;;2C11 +2C42;GLAGOLITIC SMALL LETTER POKOJI;Ll;0;L;;;;;N;;;2C12;;2C12 +2C43;GLAGOLITIC SMALL LETTER RITSI;Ll;0;L;;;;;N;;;2C13;;2C13 +2C44;GLAGOLITIC SMALL LETTER SLOVO;Ll;0;L;;;;;N;;;2C14;;2C14 +2C45;GLAGOLITIC SMALL LETTER TVRIDO;Ll;0;L;;;;;N;;;2C15;;2C15 +2C46;GLAGOLITIC SMALL LETTER UKU;Ll;0;L;;;;;N;;;2C16;;2C16 +2C47;GLAGOLITIC SMALL LETTER FRITU;Ll;0;L;;;;;N;;;2C17;;2C17 +2C48;GLAGOLITIC SMALL LETTER HERU;Ll;0;L;;;;;N;;;2C18;;2C18 +2C49;GLAGOLITIC SMALL LETTER OTU;Ll;0;L;;;;;N;;;2C19;;2C19 +2C4A;GLAGOLITIC SMALL LETTER PE;Ll;0;L;;;;;N;;;2C1A;;2C1A +2C4B;GLAGOLITIC SMALL LETTER SHTA;Ll;0;L;;;;;N;;;2C1B;;2C1B +2C4C;GLAGOLITIC SMALL LETTER TSI;Ll;0;L;;;;;N;;;2C1C;;2C1C +2C4D;GLAGOLITIC SMALL LETTER CHRIVI;Ll;0;L;;;;;N;;;2C1D;;2C1D +2C4E;GLAGOLITIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;2C1E;;2C1E +2C4F;GLAGOLITIC SMALL LETTER YERU;Ll;0;L;;;;;N;;;2C1F;;2C1F +2C50;GLAGOLITIC SMALL LETTER YERI;Ll;0;L;;;;;N;;;2C20;;2C20 +2C51;GLAGOLITIC SMALL LETTER YATI;Ll;0;L;;;;;N;;;2C21;;2C21 +2C52;GLAGOLITIC SMALL LETTER SPIDERY HA;Ll;0;L;;;;;N;;;2C22;;2C22 +2C53;GLAGOLITIC SMALL LETTER YU;Ll;0;L;;;;;N;;;2C23;;2C23 +2C54;GLAGOLITIC SMALL LETTER SMALL YUS;Ll;0;L;;;;;N;;;2C24;;2C24 +2C55;GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL;Ll;0;L;;;;;N;;;2C25;;2C25 +2C56;GLAGOLITIC SMALL LETTER YO;Ll;0;L;;;;;N;;;2C26;;2C26 +2C57;GLAGOLITIC SMALL LETTER IOTATED SMALL YUS;Ll;0;L;;;;;N;;;2C27;;2C27 +2C58;GLAGOLITIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;2C28;;2C28 +2C59;GLAGOLITIC SMALL LETTER IOTATED BIG YUS;Ll;0;L;;;;;N;;;2C29;;2C29 +2C5A;GLAGOLITIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;2C2A;;2C2A +2C5B;GLAGOLITIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;2C2B;;2C2B +2C5C;GLAGOLITIC SMALL LETTER SHTAPIC;Ll;0;L;;;;;N;;;2C2C;;2C2C +2C5D;GLAGOLITIC SMALL LETTER TROKUTASTI A;Ll;0;L;;;;;N;;;2C2D;;2C2D +2C5E;GLAGOLITIC SMALL LETTER LATINATE MYSLITE;Ll;0;L;;;;;N;;;2C2E;;2C2E +2C60;LATIN CAPITAL LETTER L WITH DOUBLE BAR;Lu;0;L;;;;;N;;;;2C61; +2C61;LATIN SMALL LETTER L WITH DOUBLE BAR;Ll;0;L;;;;;N;;;2C60;;2C60 +2C62;LATIN CAPITAL LETTER L WITH MIDDLE TILDE;Lu;0;L;;;;;N;;;;026B; +2C63;LATIN CAPITAL LETTER P WITH STROKE;Lu;0;L;;;;;N;;;;1D7D; +2C64;LATIN CAPITAL LETTER R WITH TAIL;Lu;0;L;;;;;N;;;;027D; +2C65;LATIN SMALL LETTER A WITH STROKE;Ll;0;L;;;;;N;;;023A;;023A +2C66;LATIN SMALL LETTER T WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;023E;;023E +2C67;LATIN CAPITAL LETTER H WITH DESCENDER;Lu;0;L;;;;;N;;;;2C68; +2C68;LATIN SMALL LETTER H WITH DESCENDER;Ll;0;L;;;;;N;;;2C67;;2C67 +2C69;LATIN CAPITAL LETTER K WITH DESCENDER;Lu;0;L;;;;;N;;;;2C6A; +2C6A;LATIN SMALL LETTER K WITH DESCENDER;Ll;0;L;;;;;N;;;2C69;;2C69 +2C6B;LATIN CAPITAL LETTER Z WITH DESCENDER;Lu;0;L;;;;;N;;;;2C6C; +2C6C;LATIN SMALL LETTER Z WITH DESCENDER;Ll;0;L;;;;;N;;;2C6B;;2C6B +2C6D;LATIN CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;0251; +2C6E;LATIN CAPITAL LETTER M WITH HOOK;Lu;0;L;;;;;N;;;;0271; +2C6F;LATIN CAPITAL LETTER TURNED A;Lu;0;L;;;;;N;;;;0250; +2C71;LATIN SMALL LETTER V WITH RIGHT HOOK;Ll;0;L;;;;;N;;;;; +2C72;LATIN CAPITAL LETTER W WITH HOOK;Lu;0;L;;;;;N;;;;2C73; +2C73;LATIN SMALL LETTER W WITH HOOK;Ll;0;L;;;;;N;;;2C72;;2C72 +2C74;LATIN SMALL LETTER V WITH CURL;Ll;0;L;;;;;N;;;;; +2C75;LATIN CAPITAL LETTER HALF H;Lu;0;L;;;;;N;;;;2C76; +2C76;LATIN SMALL LETTER HALF H;Ll;0;L;;;;;N;;;2C75;;2C75 +2C77;LATIN SMALL LETTER TAILLESS PHI;Ll;0;L;;;;;N;;;;; +2C78;LATIN SMALL LETTER E WITH NOTCH;Ll;0;L;;;;;N;;;;; +2C79;LATIN SMALL LETTER TURNED R WITH TAIL;Ll;0;L;;;;;N;;;;; +2C7A;LATIN SMALL LETTER O WITH LOW RING INSIDE;Ll;0;L;;;;;N;;;;; +2C7B;LATIN LETTER SMALL CAPITAL TURNED E;Ll;0;L;;;;;N;;;;; +2C7C;LATIN SUBSCRIPT SMALL LETTER J;Ll;0;L;<sub> 006A;;;;N;;;;; +2C7D;MODIFIER LETTER CAPITAL V;Lm;0;L;<super> 0056;;;;N;;;;; +2C80;COPTIC CAPITAL LETTER ALFA;Lu;0;L;;;;;N;;;;2C81; +2C81;COPTIC SMALL LETTER ALFA;Ll;0;L;;;;;N;;;2C80;;2C80 +2C82;COPTIC CAPITAL LETTER VIDA;Lu;0;L;;;;;N;;;;2C83; +2C83;COPTIC SMALL LETTER VIDA;Ll;0;L;;;;;N;;;2C82;;2C82 +2C84;COPTIC CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;2C85; +2C85;COPTIC SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;2C84;;2C84 +2C86;COPTIC CAPITAL LETTER DALDA;Lu;0;L;;;;;N;;;;2C87; +2C87;COPTIC SMALL LETTER DALDA;Ll;0;L;;;;;N;;;2C86;;2C86 +2C88;COPTIC CAPITAL LETTER EIE;Lu;0;L;;;;;N;;;;2C89; +2C89;COPTIC SMALL LETTER EIE;Ll;0;L;;;;;N;;;2C88;;2C88 +2C8A;COPTIC CAPITAL LETTER SOU;Lu;0;L;;;;;N;;;;2C8B; +2C8B;COPTIC SMALL LETTER SOU;Ll;0;L;;;;;N;;;2C8A;;2C8A +2C8C;COPTIC CAPITAL LETTER ZATA;Lu;0;L;;;;;N;;;;2C8D; +2C8D;COPTIC SMALL LETTER ZATA;Ll;0;L;;;;;N;;;2C8C;;2C8C +2C8E;COPTIC CAPITAL LETTER HATE;Lu;0;L;;;;;N;;;;2C8F; +2C8F;COPTIC SMALL LETTER HATE;Ll;0;L;;;;;N;;;2C8E;;2C8E +2C90;COPTIC CAPITAL LETTER THETHE;Lu;0;L;;;;;N;;;;2C91; +2C91;COPTIC SMALL LETTER THETHE;Ll;0;L;;;;;N;;;2C90;;2C90 +2C92;COPTIC CAPITAL LETTER IAUDA;Lu;0;L;;;;;N;;;;2C93; +2C93;COPTIC SMALL LETTER IAUDA;Ll;0;L;;;;;N;;;2C92;;2C92 +2C94;COPTIC CAPITAL LETTER KAPA;Lu;0;L;;;;;N;;;;2C95; +2C95;COPTIC SMALL LETTER KAPA;Ll;0;L;;;;;N;;;2C94;;2C94 +2C96;COPTIC CAPITAL LETTER LAULA;Lu;0;L;;;;;N;;;;2C97; +2C97;COPTIC SMALL LETTER LAULA;Ll;0;L;;;;;N;;;2C96;;2C96 +2C98;COPTIC CAPITAL LETTER MI;Lu;0;L;;;;;N;;;;2C99; +2C99;COPTIC SMALL LETTER MI;Ll;0;L;;;;;N;;;2C98;;2C98 +2C9A;COPTIC CAPITAL LETTER NI;Lu;0;L;;;;;N;;;;2C9B; +2C9B;COPTIC SMALL LETTER NI;Ll;0;L;;;;;N;;;2C9A;;2C9A +2C9C;COPTIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;2C9D; +2C9D;COPTIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;2C9C;;2C9C +2C9E;COPTIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;2C9F; +2C9F;COPTIC SMALL LETTER O;Ll;0;L;;;;;N;;;2C9E;;2C9E +2CA0;COPTIC CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;2CA1; +2CA1;COPTIC SMALL LETTER PI;Ll;0;L;;;;;N;;;2CA0;;2CA0 +2CA2;COPTIC CAPITAL LETTER RO;Lu;0;L;;;;;N;;;;2CA3; +2CA3;COPTIC SMALL LETTER RO;Ll;0;L;;;;;N;;;2CA2;;2CA2 +2CA4;COPTIC CAPITAL LETTER SIMA;Lu;0;L;;;;;N;;;;2CA5; +2CA5;COPTIC SMALL LETTER SIMA;Ll;0;L;;;;;N;;;2CA4;;2CA4 +2CA6;COPTIC CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;2CA7; +2CA7;COPTIC SMALL LETTER TAU;Ll;0;L;;;;;N;;;2CA6;;2CA6 +2CA8;COPTIC CAPITAL LETTER UA;Lu;0;L;;;;;N;;;;2CA9; +2CA9;COPTIC SMALL LETTER UA;Ll;0;L;;;;;N;;;2CA8;;2CA8 +2CAA;COPTIC CAPITAL LETTER FI;Lu;0;L;;;;;N;;;;2CAB; +2CAB;COPTIC SMALL LETTER FI;Ll;0;L;;;;;N;;;2CAA;;2CAA +2CAC;COPTIC CAPITAL LETTER KHI;Lu;0;L;;;;;N;;;;2CAD; +2CAD;COPTIC SMALL LETTER KHI;Ll;0;L;;;;;N;;;2CAC;;2CAC +2CAE;COPTIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;2CAF; +2CAF;COPTIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;2CAE;;2CAE +2CB0;COPTIC CAPITAL LETTER OOU;Lu;0;L;;;;;N;;;;2CB1; +2CB1;COPTIC SMALL LETTER OOU;Ll;0;L;;;;;N;;;2CB0;;2CB0 +2CB2;COPTIC CAPITAL LETTER DIALECT-P ALEF;Lu;0;L;;;;;N;;;;2CB3; +2CB3;COPTIC SMALL LETTER DIALECT-P ALEF;Ll;0;L;;;;;N;;;2CB2;;2CB2 +2CB4;COPTIC CAPITAL LETTER OLD COPTIC AIN;Lu;0;L;;;;;N;;;;2CB5; +2CB5;COPTIC SMALL LETTER OLD COPTIC AIN;Ll;0;L;;;;;N;;;2CB4;;2CB4 +2CB6;COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE;Lu;0;L;;;;;N;;;;2CB7; +2CB7;COPTIC SMALL LETTER CRYPTOGRAMMIC EIE;Ll;0;L;;;;;N;;;2CB6;;2CB6 +2CB8;COPTIC CAPITAL LETTER DIALECT-P KAPA;Lu;0;L;;;;;N;;;;2CB9; +2CB9;COPTIC SMALL LETTER DIALECT-P KAPA;Ll;0;L;;;;;N;;;2CB8;;2CB8 +2CBA;COPTIC CAPITAL LETTER DIALECT-P NI;Lu;0;L;;;;;N;;;;2CBB; +2CBB;COPTIC SMALL LETTER DIALECT-P NI;Ll;0;L;;;;;N;;;2CBA;;2CBA +2CBC;COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI;Lu;0;L;;;;;N;;;;2CBD; +2CBD;COPTIC SMALL LETTER CRYPTOGRAMMIC NI;Ll;0;L;;;;;N;;;2CBC;;2CBC +2CBE;COPTIC CAPITAL LETTER OLD COPTIC OOU;Lu;0;L;;;;;N;;;;2CBF; +2CBF;COPTIC SMALL LETTER OLD COPTIC OOU;Ll;0;L;;;;;N;;;2CBE;;2CBE +2CC0;COPTIC CAPITAL LETTER SAMPI;Lu;0;L;;;;;N;;;;2CC1; +2CC1;COPTIC SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;2CC0;;2CC0 +2CC2;COPTIC CAPITAL LETTER CROSSED SHEI;Lu;0;L;;;;;N;;;;2CC3; +2CC3;COPTIC SMALL LETTER CROSSED SHEI;Ll;0;L;;;;;N;;;2CC2;;2CC2 +2CC4;COPTIC CAPITAL LETTER OLD COPTIC SHEI;Lu;0;L;;;;;N;;;;2CC5; +2CC5;COPTIC SMALL LETTER OLD COPTIC SHEI;Ll;0;L;;;;;N;;;2CC4;;2CC4 +2CC6;COPTIC CAPITAL LETTER OLD COPTIC ESH;Lu;0;L;;;;;N;;;;2CC7; +2CC7;COPTIC SMALL LETTER OLD COPTIC ESH;Ll;0;L;;;;;N;;;2CC6;;2CC6 +2CC8;COPTIC CAPITAL LETTER AKHMIMIC KHEI;Lu;0;L;;;;;N;;;;2CC9; +2CC9;COPTIC SMALL LETTER AKHMIMIC KHEI;Ll;0;L;;;;;N;;;2CC8;;2CC8 +2CCA;COPTIC CAPITAL LETTER DIALECT-P HORI;Lu;0;L;;;;;N;;;;2CCB; +2CCB;COPTIC SMALL LETTER DIALECT-P HORI;Ll;0;L;;;;;N;;;2CCA;;2CCA +2CCC;COPTIC CAPITAL LETTER OLD COPTIC HORI;Lu;0;L;;;;;N;;;;2CCD; +2CCD;COPTIC SMALL LETTER OLD COPTIC HORI;Ll;0;L;;;;;N;;;2CCC;;2CCC +2CCE;COPTIC CAPITAL LETTER OLD COPTIC HA;Lu;0;L;;;;;N;;;;2CCF; +2CCF;COPTIC SMALL LETTER OLD COPTIC HA;Ll;0;L;;;;;N;;;2CCE;;2CCE +2CD0;COPTIC CAPITAL LETTER L-SHAPED HA;Lu;0;L;;;;;N;;;;2CD1; +2CD1;COPTIC SMALL LETTER L-SHAPED HA;Ll;0;L;;;;;N;;;2CD0;;2CD0 +2CD2;COPTIC CAPITAL LETTER OLD COPTIC HEI;Lu;0;L;;;;;N;;;;2CD3; +2CD3;COPTIC SMALL LETTER OLD COPTIC HEI;Ll;0;L;;;;;N;;;2CD2;;2CD2 +2CD4;COPTIC CAPITAL LETTER OLD COPTIC HAT;Lu;0;L;;;;;N;;;;2CD5; +2CD5;COPTIC SMALL LETTER OLD COPTIC HAT;Ll;0;L;;;;;N;;;2CD4;;2CD4 +2CD6;COPTIC CAPITAL LETTER OLD COPTIC GANGIA;Lu;0;L;;;;;N;;;;2CD7; +2CD7;COPTIC SMALL LETTER OLD COPTIC GANGIA;Ll;0;L;;;;;N;;;2CD6;;2CD6 +2CD8;COPTIC CAPITAL LETTER OLD COPTIC DJA;Lu;0;L;;;;;N;;;;2CD9; +2CD9;COPTIC SMALL LETTER OLD COPTIC DJA;Ll;0;L;;;;;N;;;2CD8;;2CD8 +2CDA;COPTIC CAPITAL LETTER OLD COPTIC SHIMA;Lu;0;L;;;;;N;;;;2CDB; +2CDB;COPTIC SMALL LETTER OLD COPTIC SHIMA;Ll;0;L;;;;;N;;;2CDA;;2CDA +2CDC;COPTIC CAPITAL LETTER OLD NUBIAN SHIMA;Lu;0;L;;;;;N;;;;2CDD; +2CDD;COPTIC SMALL LETTER OLD NUBIAN SHIMA;Ll;0;L;;;;;N;;;2CDC;;2CDC +2CDE;COPTIC CAPITAL LETTER OLD NUBIAN NGI;Lu;0;L;;;;;N;;;;2CDF; +2CDF;COPTIC SMALL LETTER OLD NUBIAN NGI;Ll;0;L;;;;;N;;;2CDE;;2CDE +2CE0;COPTIC CAPITAL LETTER OLD NUBIAN NYI;Lu;0;L;;;;;N;;;;2CE1; +2CE1;COPTIC SMALL LETTER OLD NUBIAN NYI;Ll;0;L;;;;;N;;;2CE0;;2CE0 +2CE2;COPTIC CAPITAL LETTER OLD NUBIAN WAU;Lu;0;L;;;;;N;;;;2CE3; +2CE3;COPTIC SMALL LETTER OLD NUBIAN WAU;Ll;0;L;;;;;N;;;2CE2;;2CE2 +2CE4;COPTIC SYMBOL KAI;Ll;0;L;;;;;N;;;;; +2CE5;COPTIC SYMBOL MI RO;So;0;ON;;;;;N;;;;; +2CE6;COPTIC SYMBOL PI RO;So;0;ON;;;;;N;;;;; +2CE7;COPTIC SYMBOL STAUROS;So;0;ON;;;;;N;;;;; +2CE8;COPTIC SYMBOL TAU RO;So;0;ON;;;;;N;;;;; +2CE9;COPTIC SYMBOL KHI RO;So;0;ON;;;;;N;;;;; +2CEA;COPTIC SYMBOL SHIMA SIMA;So;0;ON;;;;;N;;;;; +2CF9;COPTIC OLD NUBIAN FULL STOP;Po;0;ON;;;;;N;;;;; +2CFA;COPTIC OLD NUBIAN DIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;; +2CFB;COPTIC OLD NUBIAN INDIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;; +2CFC;COPTIC OLD NUBIAN VERSE DIVIDER;Po;0;ON;;;;;N;;;;; +2CFD;COPTIC FRACTION ONE HALF;No;0;ON;;;;1/2;N;;;;; +2CFE;COPTIC FULL STOP;Po;0;ON;;;;;N;;;;; +2CFF;COPTIC MORPHOLOGICAL DIVIDER;Po;0;ON;;;;;N;;;;; +2D00;GEORGIAN SMALL LETTER AN;Ll;0;L;;;;;N;;Khutsuri;10A0;;10A0 +2D01;GEORGIAN SMALL LETTER BAN;Ll;0;L;;;;;N;;Khutsuri;10A1;;10A1 +2D02;GEORGIAN SMALL LETTER GAN;Ll;0;L;;;;;N;;Khutsuri;10A2;;10A2 +2D03;GEORGIAN SMALL LETTER DON;Ll;0;L;;;;;N;;Khutsuri;10A3;;10A3 +2D04;GEORGIAN SMALL LETTER EN;Ll;0;L;;;;;N;;Khutsuri;10A4;;10A4 +2D05;GEORGIAN SMALL LETTER VIN;Ll;0;L;;;;;N;;Khutsuri;10A5;;10A5 +2D06;GEORGIAN SMALL LETTER ZEN;Ll;0;L;;;;;N;;Khutsuri;10A6;;10A6 +2D07;GEORGIAN SMALL LETTER TAN;Ll;0;L;;;;;N;;Khutsuri;10A7;;10A7 +2D08;GEORGIAN SMALL LETTER IN;Ll;0;L;;;;;N;;Khutsuri;10A8;;10A8 +2D09;GEORGIAN SMALL LETTER KAN;Ll;0;L;;;;;N;;Khutsuri;10A9;;10A9 +2D0A;GEORGIAN SMALL LETTER LAS;Ll;0;L;;;;;N;;Khutsuri;10AA;;10AA +2D0B;GEORGIAN SMALL LETTER MAN;Ll;0;L;;;;;N;;Khutsuri;10AB;;10AB +2D0C;GEORGIAN SMALL LETTER NAR;Ll;0;L;;;;;N;;Khutsuri;10AC;;10AC +2D0D;GEORGIAN SMALL LETTER ON;Ll;0;L;;;;;N;;Khutsuri;10AD;;10AD +2D0E;GEORGIAN SMALL LETTER PAR;Ll;0;L;;;;;N;;Khutsuri;10AE;;10AE +2D0F;GEORGIAN SMALL LETTER ZHAR;Ll;0;L;;;;;N;;Khutsuri;10AF;;10AF +2D10;GEORGIAN SMALL LETTER RAE;Ll;0;L;;;;;N;;Khutsuri;10B0;;10B0 +2D11;GEORGIAN SMALL LETTER SAN;Ll;0;L;;;;;N;;Khutsuri;10B1;;10B1 +2D12;GEORGIAN SMALL LETTER TAR;Ll;0;L;;;;;N;;Khutsuri;10B2;;10B2 +2D13;GEORGIAN SMALL LETTER UN;Ll;0;L;;;;;N;;Khutsuri;10B3;;10B3 +2D14;GEORGIAN SMALL LETTER PHAR;Ll;0;L;;;;;N;;Khutsuri;10B4;;10B4 +2D15;GEORGIAN SMALL LETTER KHAR;Ll;0;L;;;;;N;;Khutsuri;10B5;;10B5 +2D16;GEORGIAN SMALL LETTER GHAN;Ll;0;L;;;;;N;;Khutsuri;10B6;;10B6 +2D17;GEORGIAN SMALL LETTER QAR;Ll;0;L;;;;;N;;Khutsuri;10B7;;10B7 +2D18;GEORGIAN SMALL LETTER SHIN;Ll;0;L;;;;;N;;Khutsuri;10B8;;10B8 +2D19;GEORGIAN SMALL LETTER CHIN;Ll;0;L;;;;;N;;Khutsuri;10B9;;10B9 +2D1A;GEORGIAN SMALL LETTER CAN;Ll;0;L;;;;;N;;Khutsuri;10BA;;10BA +2D1B;GEORGIAN SMALL LETTER JIL;Ll;0;L;;;;;N;;Khutsuri;10BB;;10BB +2D1C;GEORGIAN SMALL LETTER CIL;Ll;0;L;;;;;N;;Khutsuri;10BC;;10BC +2D1D;GEORGIAN SMALL LETTER CHAR;Ll;0;L;;;;;N;;Khutsuri;10BD;;10BD +2D1E;GEORGIAN SMALL LETTER XAN;Ll;0;L;;;;;N;;Khutsuri;10BE;;10BE +2D1F;GEORGIAN SMALL LETTER JHAN;Ll;0;L;;;;;N;;Khutsuri;10BF;;10BF +2D20;GEORGIAN SMALL LETTER HAE;Ll;0;L;;;;;N;;Khutsuri;10C0;;10C0 +2D21;GEORGIAN SMALL LETTER HE;Ll;0;L;;;;;N;;Khutsuri;10C1;;10C1 +2D22;GEORGIAN SMALL LETTER HIE;Ll;0;L;;;;;N;;Khutsuri;10C2;;10C2 +2D23;GEORGIAN SMALL LETTER WE;Ll;0;L;;;;;N;;Khutsuri;10C3;;10C3 +2D24;GEORGIAN SMALL LETTER HAR;Ll;0;L;;;;;N;;Khutsuri;10C4;;10C4 +2D25;GEORGIAN SMALL LETTER HOE;Ll;0;L;;;;;N;;Khutsuri;10C5;;10C5 +2D30;TIFINAGH LETTER YA;Lo;0;L;;;;;N;;;;; +2D31;TIFINAGH LETTER YAB;Lo;0;L;;;;;N;;;;; +2D32;TIFINAGH LETTER YABH;Lo;0;L;;;;;N;;;;; +2D33;TIFINAGH LETTER YAG;Lo;0;L;;;;;N;;;;; +2D34;TIFINAGH LETTER YAGHH;Lo;0;L;;;;;N;;;;; +2D35;TIFINAGH LETTER BERBER ACADEMY YAJ;Lo;0;L;;;;;N;;;;; +2D36;TIFINAGH LETTER YAJ;Lo;0;L;;;;;N;;;;; +2D37;TIFINAGH LETTER YAD;Lo;0;L;;;;;N;;;;; +2D38;TIFINAGH LETTER YADH;Lo;0;L;;;;;N;;;;; +2D39;TIFINAGH LETTER YADD;Lo;0;L;;;;;N;;;;; +2D3A;TIFINAGH LETTER YADDH;Lo;0;L;;;;;N;;;;; +2D3B;TIFINAGH LETTER YEY;Lo;0;L;;;;;N;;;;; +2D3C;TIFINAGH LETTER YAF;Lo;0;L;;;;;N;;;;; +2D3D;TIFINAGH LETTER YAK;Lo;0;L;;;;;N;;;;; +2D3E;TIFINAGH LETTER TUAREG YAK;Lo;0;L;;;;;N;;;;; +2D3F;TIFINAGH LETTER YAKHH;Lo;0;L;;;;;N;;;;; +2D40;TIFINAGH LETTER YAH;Lo;0;L;;;;;N;;Tuareg yab;;; +2D41;TIFINAGH LETTER BERBER ACADEMY YAH;Lo;0;L;;;;;N;;;;; +2D42;TIFINAGH LETTER TUAREG YAH;Lo;0;L;;;;;N;;;;; +2D43;TIFINAGH LETTER YAHH;Lo;0;L;;;;;N;;;;; +2D44;TIFINAGH LETTER YAA;Lo;0;L;;;;;N;;;;; +2D45;TIFINAGH LETTER YAKH;Lo;0;L;;;;;N;;;;; +2D46;TIFINAGH LETTER TUAREG YAKH;Lo;0;L;;;;;N;;;;; +2D47;TIFINAGH LETTER YAQ;Lo;0;L;;;;;N;;;;; +2D48;TIFINAGH LETTER TUAREG YAQ;Lo;0;L;;;;;N;;;;; +2D49;TIFINAGH LETTER YI;Lo;0;L;;;;;N;;;;; +2D4A;TIFINAGH LETTER YAZH;Lo;0;L;;;;;N;;;;; +2D4B;TIFINAGH LETTER AHAGGAR YAZH;Lo;0;L;;;;;N;;;;; +2D4C;TIFINAGH LETTER TUAREG YAZH;Lo;0;L;;;;;N;;;;; +2D4D;TIFINAGH LETTER YAL;Lo;0;L;;;;;N;;;;; +2D4E;TIFINAGH LETTER YAM;Lo;0;L;;;;;N;;;;; +2D4F;TIFINAGH LETTER YAN;Lo;0;L;;;;;N;;;;; +2D50;TIFINAGH LETTER TUAREG YAGN;Lo;0;L;;;;;N;;;;; +2D51;TIFINAGH LETTER TUAREG YANG;Lo;0;L;;;;;N;;;;; +2D52;TIFINAGH LETTER YAP;Lo;0;L;;;;;N;;;;; +2D53;TIFINAGH LETTER YU;Lo;0;L;;;;;N;;Tuareg yaw;;; +2D54;TIFINAGH LETTER YAR;Lo;0;L;;;;;N;;;;; +2D55;TIFINAGH LETTER YARR;Lo;0;L;;;;;N;;;;; +2D56;TIFINAGH LETTER YAGH;Lo;0;L;;;;;N;;;;; +2D57;TIFINAGH LETTER TUAREG YAGH;Lo;0;L;;;;;N;;;;; +2D58;TIFINAGH LETTER AYER YAGH;Lo;0;L;;;;;N;;Adrar yaj;;; +2D59;TIFINAGH LETTER YAS;Lo;0;L;;;;;N;;;;; +2D5A;TIFINAGH LETTER YASS;Lo;0;L;;;;;N;;;;; +2D5B;TIFINAGH LETTER YASH;Lo;0;L;;;;;N;;;;; +2D5C;TIFINAGH LETTER YAT;Lo;0;L;;;;;N;;;;; +2D5D;TIFINAGH LETTER YATH;Lo;0;L;;;;;N;;;;; +2D5E;TIFINAGH LETTER YACH;Lo;0;L;;;;;N;;;;; +2D5F;TIFINAGH LETTER YATT;Lo;0;L;;;;;N;;;;; +2D60;TIFINAGH LETTER YAV;Lo;0;L;;;;;N;;;;; +2D61;TIFINAGH LETTER YAW;Lo;0;L;;;;;N;;;;; +2D62;TIFINAGH LETTER YAY;Lo;0;L;;;;;N;;;;; +2D63;TIFINAGH LETTER YAZ;Lo;0;L;;;;;N;;;;; +2D64;TIFINAGH LETTER TAWELLEMET YAZ;Lo;0;L;;;;;N;;harpoon yaz;;; +2D65;TIFINAGH LETTER YAZZ;Lo;0;L;;;;;N;;;;; +2D6F;TIFINAGH MODIFIER LETTER LABIALIZATION MARK;Lm;0;L;<super> 2D61;;;;N;;tamatart;;; +2D80;ETHIOPIC SYLLABLE LOA;Lo;0;L;;;;;N;;;;; +2D81;ETHIOPIC SYLLABLE MOA;Lo;0;L;;;;;N;;;;; +2D82;ETHIOPIC SYLLABLE ROA;Lo;0;L;;;;;N;;;;; +2D83;ETHIOPIC SYLLABLE SOA;Lo;0;L;;;;;N;;;;; +2D84;ETHIOPIC SYLLABLE SHOA;Lo;0;L;;;;;N;;;;; +2D85;ETHIOPIC SYLLABLE BOA;Lo;0;L;;;;;N;;;;; +2D86;ETHIOPIC SYLLABLE TOA;Lo;0;L;;;;;N;;;;; +2D87;ETHIOPIC SYLLABLE COA;Lo;0;L;;;;;N;;;;; +2D88;ETHIOPIC SYLLABLE NOA;Lo;0;L;;;;;N;;;;; +2D89;ETHIOPIC SYLLABLE NYOA;Lo;0;L;;;;;N;;;;; +2D8A;ETHIOPIC SYLLABLE GLOTTAL OA;Lo;0;L;;;;;N;;;;; +2D8B;ETHIOPIC SYLLABLE ZOA;Lo;0;L;;;;;N;;;;; +2D8C;ETHIOPIC SYLLABLE DOA;Lo;0;L;;;;;N;;;;; +2D8D;ETHIOPIC SYLLABLE DDOA;Lo;0;L;;;;;N;;;;; +2D8E;ETHIOPIC SYLLABLE JOA;Lo;0;L;;;;;N;;;;; +2D8F;ETHIOPIC SYLLABLE THOA;Lo;0;L;;;;;N;;;;; +2D90;ETHIOPIC SYLLABLE CHOA;Lo;0;L;;;;;N;;;;; +2D91;ETHIOPIC SYLLABLE PHOA;Lo;0;L;;;;;N;;;;; +2D92;ETHIOPIC SYLLABLE POA;Lo;0;L;;;;;N;;;;; +2D93;ETHIOPIC SYLLABLE GGWA;Lo;0;L;;;;;N;;;;; +2D94;ETHIOPIC SYLLABLE GGWI;Lo;0;L;;;;;N;;;;; +2D95;ETHIOPIC SYLLABLE GGWEE;Lo;0;L;;;;;N;;;;; +2D96;ETHIOPIC SYLLABLE GGWE;Lo;0;L;;;;;N;;;;; +2DA0;ETHIOPIC SYLLABLE SSA;Lo;0;L;;;;;N;;;;; +2DA1;ETHIOPIC SYLLABLE SSU;Lo;0;L;;;;;N;;;;; +2DA2;ETHIOPIC SYLLABLE SSI;Lo;0;L;;;;;N;;;;; +2DA3;ETHIOPIC SYLLABLE SSAA;Lo;0;L;;;;;N;;;;; +2DA4;ETHIOPIC SYLLABLE SSEE;Lo;0;L;;;;;N;;;;; +2DA5;ETHIOPIC SYLLABLE SSE;Lo;0;L;;;;;N;;;;; +2DA6;ETHIOPIC SYLLABLE SSO;Lo;0;L;;;;;N;;;;; +2DA8;ETHIOPIC SYLLABLE CCA;Lo;0;L;;;;;N;;;;; +2DA9;ETHIOPIC SYLLABLE CCU;Lo;0;L;;;;;N;;;;; +2DAA;ETHIOPIC SYLLABLE CCI;Lo;0;L;;;;;N;;;;; +2DAB;ETHIOPIC SYLLABLE CCAA;Lo;0;L;;;;;N;;;;; +2DAC;ETHIOPIC SYLLABLE CCEE;Lo;0;L;;;;;N;;;;; +2DAD;ETHIOPIC SYLLABLE CCE;Lo;0;L;;;;;N;;;;; +2DAE;ETHIOPIC SYLLABLE CCO;Lo;0;L;;;;;N;;;;; +2DB0;ETHIOPIC SYLLABLE ZZA;Lo;0;L;;;;;N;;;;; +2DB1;ETHIOPIC SYLLABLE ZZU;Lo;0;L;;;;;N;;;;; +2DB2;ETHIOPIC SYLLABLE ZZI;Lo;0;L;;;;;N;;;;; +2DB3;ETHIOPIC SYLLABLE ZZAA;Lo;0;L;;;;;N;;;;; +2DB4;ETHIOPIC SYLLABLE ZZEE;Lo;0;L;;;;;N;;;;; +2DB5;ETHIOPIC SYLLABLE ZZE;Lo;0;L;;;;;N;;;;; +2DB6;ETHIOPIC SYLLABLE ZZO;Lo;0;L;;;;;N;;;;; +2DB8;ETHIOPIC SYLLABLE CCHA;Lo;0;L;;;;;N;;;;; +2DB9;ETHIOPIC SYLLABLE CCHU;Lo;0;L;;;;;N;;;;; +2DBA;ETHIOPIC SYLLABLE CCHI;Lo;0;L;;;;;N;;;;; +2DBB;ETHIOPIC SYLLABLE CCHAA;Lo;0;L;;;;;N;;;;; +2DBC;ETHIOPIC SYLLABLE CCHEE;Lo;0;L;;;;;N;;;;; +2DBD;ETHIOPIC SYLLABLE CCHE;Lo;0;L;;;;;N;;;;; +2DBE;ETHIOPIC SYLLABLE CCHO;Lo;0;L;;;;;N;;;;; +2DC0;ETHIOPIC SYLLABLE QYA;Lo;0;L;;;;;N;;;;; +2DC1;ETHIOPIC SYLLABLE QYU;Lo;0;L;;;;;N;;;;; +2DC2;ETHIOPIC SYLLABLE QYI;Lo;0;L;;;;;N;;;;; +2DC3;ETHIOPIC SYLLABLE QYAA;Lo;0;L;;;;;N;;;;; +2DC4;ETHIOPIC SYLLABLE QYEE;Lo;0;L;;;;;N;;;;; +2DC5;ETHIOPIC SYLLABLE QYE;Lo;0;L;;;;;N;;;;; +2DC6;ETHIOPIC SYLLABLE QYO;Lo;0;L;;;;;N;;;;; +2DC8;ETHIOPIC SYLLABLE KYA;Lo;0;L;;;;;N;;;;; +2DC9;ETHIOPIC SYLLABLE KYU;Lo;0;L;;;;;N;;;;; +2DCA;ETHIOPIC SYLLABLE KYI;Lo;0;L;;;;;N;;;;; +2DCB;ETHIOPIC SYLLABLE KYAA;Lo;0;L;;;;;N;;;;; +2DCC;ETHIOPIC SYLLABLE KYEE;Lo;0;L;;;;;N;;;;; +2DCD;ETHIOPIC SYLLABLE KYE;Lo;0;L;;;;;N;;;;; +2DCE;ETHIOPIC SYLLABLE KYO;Lo;0;L;;;;;N;;;;; +2DD0;ETHIOPIC SYLLABLE XYA;Lo;0;L;;;;;N;;;;; +2DD1;ETHIOPIC SYLLABLE XYU;Lo;0;L;;;;;N;;;;; +2DD2;ETHIOPIC SYLLABLE XYI;Lo;0;L;;;;;N;;;;; +2DD3;ETHIOPIC SYLLABLE XYAA;Lo;0;L;;;;;N;;;;; +2DD4;ETHIOPIC SYLLABLE XYEE;Lo;0;L;;;;;N;;;;; +2DD5;ETHIOPIC SYLLABLE XYE;Lo;0;L;;;;;N;;;;; +2DD6;ETHIOPIC SYLLABLE XYO;Lo;0;L;;;;;N;;;;; +2DD8;ETHIOPIC SYLLABLE GYA;Lo;0;L;;;;;N;;;;; +2DD9;ETHIOPIC SYLLABLE GYU;Lo;0;L;;;;;N;;;;; +2DDA;ETHIOPIC SYLLABLE GYI;Lo;0;L;;;;;N;;;;; +2DDB;ETHIOPIC SYLLABLE GYAA;Lo;0;L;;;;;N;;;;; +2DDC;ETHIOPIC SYLLABLE GYEE;Lo;0;L;;;;;N;;;;; +2DDD;ETHIOPIC SYLLABLE GYE;Lo;0;L;;;;;N;;;;; +2DDE;ETHIOPIC SYLLABLE GYO;Lo;0;L;;;;;N;;;;; +2DE0;COMBINING CYRILLIC LETTER BE;Mn;230;NSM;;;;;N;;;;; +2DE1;COMBINING CYRILLIC LETTER VE;Mn;230;NSM;;;;;N;;;;; +2DE2;COMBINING CYRILLIC LETTER GHE;Mn;230;NSM;;;;;N;;;;; +2DE3;COMBINING CYRILLIC LETTER DE;Mn;230;NSM;;;;;N;;;;; +2DE4;COMBINING CYRILLIC LETTER ZHE;Mn;230;NSM;;;;;N;;;;; +2DE5;COMBINING CYRILLIC LETTER ZE;Mn;230;NSM;;;;;N;;;;; +2DE6;COMBINING CYRILLIC LETTER KA;Mn;230;NSM;;;;;N;;;;; +2DE7;COMBINING CYRILLIC LETTER EL;Mn;230;NSM;;;;;N;;;;; +2DE8;COMBINING CYRILLIC LETTER EM;Mn;230;NSM;;;;;N;;;;; +2DE9;COMBINING CYRILLIC LETTER EN;Mn;230;NSM;;;;;N;;;;; +2DEA;COMBINING CYRILLIC LETTER O;Mn;230;NSM;;;;;N;;;;; +2DEB;COMBINING CYRILLIC LETTER PE;Mn;230;NSM;;;;;N;;;;; +2DEC;COMBINING CYRILLIC LETTER ER;Mn;230;NSM;;;;;N;;;;; +2DED;COMBINING CYRILLIC LETTER ES;Mn;230;NSM;;;;;N;;;;; +2DEE;COMBINING CYRILLIC LETTER TE;Mn;230;NSM;;;;;N;;;;; +2DEF;COMBINING CYRILLIC LETTER HA;Mn;230;NSM;;;;;N;;;;; +2DF0;COMBINING CYRILLIC LETTER TSE;Mn;230;NSM;;;;;N;;;;; +2DF1;COMBINING CYRILLIC LETTER CHE;Mn;230;NSM;;;;;N;;;;; +2DF2;COMBINING CYRILLIC LETTER SHA;Mn;230;NSM;;;;;N;;;;; +2DF3;COMBINING CYRILLIC LETTER SHCHA;Mn;230;NSM;;;;;N;;;;; +2DF4;COMBINING CYRILLIC LETTER FITA;Mn;230;NSM;;;;;N;;;;; +2DF5;COMBINING CYRILLIC LETTER ES-TE;Mn;230;NSM;;;;;N;;;;; +2DF6;COMBINING CYRILLIC LETTER A;Mn;230;NSM;;;;;N;;;;; +2DF7;COMBINING CYRILLIC LETTER IE;Mn;230;NSM;;;;;N;;;;; +2DF8;COMBINING CYRILLIC LETTER DJERV;Mn;230;NSM;;;;;N;;;;; +2DF9;COMBINING CYRILLIC LETTER MONOGRAPH UK;Mn;230;NSM;;;;;N;;;;; +2DFA;COMBINING CYRILLIC LETTER YAT;Mn;230;NSM;;;;;N;;;;; +2DFB;COMBINING CYRILLIC LETTER YU;Mn;230;NSM;;;;;N;;;;; +2DFC;COMBINING CYRILLIC LETTER IOTIFIED A;Mn;230;NSM;;;;;N;;;;; +2DFD;COMBINING CYRILLIC LETTER LITTLE YUS;Mn;230;NSM;;;;;N;;;;; +2DFE;COMBINING CYRILLIC LETTER BIG YUS;Mn;230;NSM;;;;;N;;;;; +2DFF;COMBINING CYRILLIC LETTER IOTIFIED BIG YUS;Mn;230;NSM;;;;;N;;;;; +2E00;RIGHT ANGLE SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;; +2E01;RIGHT ANGLE DOTTED SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;; +2E02;LEFT SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E03;RIGHT SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E04;LEFT DOTTED SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E05;RIGHT DOTTED SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E06;RAISED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;; +2E07;RAISED DOTTED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;; +2E08;DOTTED TRANSPOSITION MARKER;Po;0;ON;;;;;N;;;;; +2E09;LEFT TRANSPOSITION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E0A;RIGHT TRANSPOSITION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E0B;RAISED SQUARE;Po;0;ON;;;;;N;;;;; +2E0C;LEFT RAISED OMISSION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E0D;RIGHT RAISED OMISSION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E0E;EDITORIAL CORONIS;Po;0;ON;;;;;N;;;;; +2E0F;PARAGRAPHOS;Po;0;ON;;;;;N;;;;; +2E10;FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;; +2E11;REVERSED FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;; +2E12;HYPODIASTOLE;Po;0;ON;;;;;N;;;;; +2E13;DOTTED OBELOS;Po;0;ON;;;;;N;;;;; +2E14;DOWNWARDS ANCORA;Po;0;ON;;;;;N;;;;; +2E15;UPWARDS ANCORA;Po;0;ON;;;;;N;;;;; +2E16;DOTTED RIGHT-POINTING ANGLE;Po;0;ON;;;;;N;;;;; +2E17;DOUBLE OBLIQUE HYPHEN;Pd;0;ON;;;;;N;;;;; +2E18;INVERTED INTERROBANG;Po;0;ON;;;;;N;;;;; +2E19;PALM BRANCH;Po;0;ON;;;;;N;;;;; +2E1A;HYPHEN WITH DIAERESIS;Pd;0;ON;;;;;N;;;;; +2E1B;TILDE WITH RING ABOVE;Po;0;ON;;;;;N;;;;; +2E1C;LEFT LOW PARAPHRASE BRACKET;Pi;0;ON;;;;;Y;;;;; +2E1D;RIGHT LOW PARAPHRASE BRACKET;Pf;0;ON;;;;;Y;;;;; +2E1E;TILDE WITH DOT ABOVE;Po;0;ON;;;;;N;;;;; +2E1F;TILDE WITH DOT BELOW;Po;0;ON;;;;;N;;;;; +2E20;LEFT VERTICAL BAR WITH QUILL;Pi;0;ON;;;;;Y;;;;; +2E21;RIGHT VERTICAL BAR WITH QUILL;Pf;0;ON;;;;;Y;;;;; +2E22;TOP LEFT HALF BRACKET;Ps;0;ON;;;;;Y;;;;; +2E23;TOP RIGHT HALF BRACKET;Pe;0;ON;;;;;Y;;;;; +2E24;BOTTOM LEFT HALF BRACKET;Ps;0;ON;;;;;Y;;;;; +2E25;BOTTOM RIGHT HALF BRACKET;Pe;0;ON;;;;;Y;;;;; +2E26;LEFT SIDEWAYS U BRACKET;Ps;0;ON;;;;;Y;;;;; +2E27;RIGHT SIDEWAYS U BRACKET;Pe;0;ON;;;;;Y;;;;; +2E28;LEFT DOUBLE PARENTHESIS;Ps;0;ON;;;;;Y;;;;; +2E29;RIGHT DOUBLE PARENTHESIS;Pe;0;ON;;;;;Y;;;;; +2E2A;TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +2E2B;ONE DOT OVER TWO DOTS PUNCTUATION;Po;0;ON;;;;;N;;;;; +2E2C;SQUARED FOUR DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +2E2D;FIVE DOT MARK;Po;0;ON;;;;;N;;;;; +2E2E;REVERSED QUESTION MARK;Po;0;ON;;;;;N;;;;; +2E2F;VERTICAL TILDE;Lm;0;ON;;;;;N;;;;; +2E30;RING POINT;Po;0;ON;;;;;N;;;;; 2E80;CJK RADICAL REPEAT;So;0;ON;;;;;N;;;;; 2E81;CJK RADICAL CLIFF;So;0;ON;;;;;N;;;;; 2E82;CJK RADICAL SECOND ONE;So;0;ON;;;;;N;;;;; @@ -8632,7 +10239,7 @@ 30F8;KATAKANA LETTER VI;Lo;0;L;30F0 3099;;;;N;;;;; 30F9;KATAKANA LETTER VE;Lo;0;L;30F1 3099;;;;N;;;;; 30FA;KATAKANA LETTER VO;Lo;0;L;30F2 3099;;;;N;;;;; -30FB;KATAKANA MIDDLE DOT;Pc;0;ON;;;;;N;;;;; +30FB;KATAKANA MIDDLE DOT;Po;0;ON;;;;;N;;;;; 30FC;KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L;;;;;N;;;;; 30FD;KATAKANA ITERATION MARK;Lm;0;L;;;;;N;;;;; 30FE;KATAKANA VOICED ITERATION MARK;Lm;0;L;30FD 3099;;;;N;;;;; @@ -8677,6 +10284,7 @@ 312A;BOPOMOFO LETTER V;Lo;0;L;;;;;N;;;;; 312B;BOPOMOFO LETTER NG;Lo;0;L;;;;;N;;;;; 312C;BOPOMOFO LETTER GN;Lo;0;L;;;;;N;;;;; +312D;BOPOMOFO LETTER IH;Lo;0;L;;;;;N;;;;; 3131;HANGUL LETTER KIYEOK;Lo;0;L;<compat> 1100;;;;N;HANGUL LETTER GIYEOG;;;; 3132;HANGUL LETTER SSANGKIYEOK;Lo;0;L;<compat> 1101;;;;N;HANGUL LETTER SSANG GIYEOG;;;; 3133;HANGUL LETTER KIYEOK-SIOS;Lo;0;L;<compat> 11AA;;;;N;HANGUL LETTER GIYEOG SIOS;;;; @@ -8811,6 +10419,42 @@ 31B5;BOPOMOFO FINAL LETTER T;Lo;0;L;;;;;N;;;;; 31B6;BOPOMOFO FINAL LETTER K;Lo;0;L;;;;;N;;;;; 31B7;BOPOMOFO FINAL LETTER H;Lo;0;L;;;;;N;;;;; +31C0;CJK STROKE T;So;0;ON;;;;;N;;;;; +31C1;CJK STROKE WG;So;0;ON;;;;;N;;;;; +31C2;CJK STROKE XG;So;0;ON;;;;;N;;;;; +31C3;CJK STROKE BXG;So;0;ON;;;;;N;;;;; +31C4;CJK STROKE SW;So;0;ON;;;;;N;;;;; +31C5;CJK STROKE HZZ;So;0;ON;;;;;N;;;;; +31C6;CJK STROKE HZG;So;0;ON;;;;;N;;;;; +31C7;CJK STROKE HP;So;0;ON;;;;;N;;;;; +31C8;CJK STROKE HZWG;So;0;ON;;;;;N;;;;; +31C9;CJK STROKE SZWG;So;0;ON;;;;;N;;;;; +31CA;CJK STROKE HZT;So;0;ON;;;;;N;;;;; +31CB;CJK STROKE HZZP;So;0;ON;;;;;N;;;;; +31CC;CJK STROKE HPWG;So;0;ON;;;;;N;;;;; +31CD;CJK STROKE HZW;So;0;ON;;;;;N;;;;; +31CE;CJK STROKE HZZZ;So;0;ON;;;;;N;;;;; +31CF;CJK STROKE N;So;0;ON;;;;;N;;;;; +31D0;CJK STROKE H;So;0;ON;;;;;N;;;;; +31D1;CJK STROKE S;So;0;ON;;;;;N;;;;; +31D2;CJK STROKE P;So;0;ON;;;;;N;;;;; +31D3;CJK STROKE SP;So;0;ON;;;;;N;;;;; +31D4;CJK STROKE D;So;0;ON;;;;;N;;;;; +31D5;CJK STROKE HZ;So;0;ON;;;;;N;;;;; +31D6;CJK STROKE HG;So;0;ON;;;;;N;;;;; +31D7;CJK STROKE SZ;So;0;ON;;;;;N;;;;; +31D8;CJK STROKE SWZ;So;0;ON;;;;;N;;;;; +31D9;CJK STROKE ST;So;0;ON;;;;;N;;;;; +31DA;CJK STROKE SG;So;0;ON;;;;;N;;;;; +31DB;CJK STROKE PD;So;0;ON;;;;;N;;;;; +31DC;CJK STROKE PZ;So;0;ON;;;;;N;;;;; +31DD;CJK STROKE TN;So;0;ON;;;;;N;;;;; +31DE;CJK STROKE SZZ;So;0;ON;;;;;N;;;;; +31DF;CJK STROKE SWG;So;0;ON;;;;;N;;;;; +31E0;CJK STROKE HXWG;So;0;ON;;;;;N;;;;; +31E1;CJK STROKE HZZZG;So;0;ON;;;;;N;;;;; +31E2;CJK STROKE PG;So;0;ON;;;;;N;;;;; +31E3;CJK STROKE Q;So;0;ON;;;;;N;;;;; 31F0;KATAKANA LETTER SMALL KU;Lo;0;L;;;;;N;;;;; 31F1;KATAKANA LETTER SMALL SI;Lo;0;L;;;;;N;;;;; 31F2;KATAKANA LETTER SMALL SU;Lo;0;L;;;;;N;;;;; @@ -8940,6 +10584,7 @@ 327B;CIRCLED HANGUL HIEUH A;So;0;L;<circle> 1112 1161;;;;N;CIRCLED HANGUL HA;;;; 327C;CIRCLED KOREAN CHARACTER CHAMKO;So;0;ON;<circle> 110E 1161 11B7 1100 1169;;;;N;;;;; 327D;CIRCLED KOREAN CHARACTER JUEUI;So;0;ON;<circle> 110C 116E 110B 1174;;;;N;;;;; +327E;CIRCLED HANGUL IEUNG U;So;0;ON;<circle> 110B 116E;;;;N;;;;; 327F;KOREAN STANDARD SYMBOL;So;0;L;;;;;N;;;;; 3280;CIRCLED IDEOGRAPH ONE;No;0;L;<circle> 4E00;;;1;N;;;;; 3281;CIRCLED IDEOGRAPH TWO;No;0;L;<circle> 4E8C;;;2;N;;;;; @@ -9391,7 +11036,7 @@ 4DFE;HEXAGRAM FOR AFTER COMPLETION;So;0;ON;;;;;N;;;;; 4DFF;HEXAGRAM FOR BEFORE COMPLETION;So;0;ON;;;;;N;;;;; 4E00;<CJK Ideograph, First>;Lo;0;L;;;;;N;;;;; -9FA5;<CJK Ideograph, Last>;Lo;0;L;;;;;N;;;;; +9FC3;<CJK Ideograph, Last>;Lo;0;L;;;;;N;;;;; A000;YI SYLLABLE IT;Lo;0;L;;;;;N;;;;; A001;YI SYLLABLE IX;Lo;0;L;;;;;N;;;;; A002;YI SYLLABLE I;Lo;0;L;;;;;N;;;;; @@ -9413,7 +11058,7 @@ A011;YI SYLLABLE O;Lo;0;L;;;;;N;;;;; A012;YI SYLLABLE OP;Lo;0;L;;;;;N;;;;; A013;YI SYLLABLE EX;Lo;0;L;;;;;N;;;;; A014;YI SYLLABLE E;Lo;0;L;;;;;N;;;;; -A015;YI SYLLABLE WU;Lo;0;L;;;;;N;;;;; +A015;YI SYLLABLE WU;Lm;0;L;;;;;N;;;;; A016;YI SYLLABLE BIT;Lo;0;L;;;;;N;;;;; A017;YI SYLLABLE BIX;Lo;0;L;;;;;N;;;;; A018;YI SYLLABLE BI;Lo;0;L;;;;;N;;;;; @@ -10612,6 +12257,879 @@ A4C3;YI RADICAL CHE;So;0;ON;;;;;N;;;;; A4C4;YI RADICAL ZZIET;So;0;ON;;;;;N;;;;; A4C5;YI RADICAL NBIE;So;0;ON;;;;;N;;;;; A4C6;YI RADICAL KE;So;0;ON;;;;;N;;;;; +A500;VAI SYLLABLE EE;Lo;0;L;;;;;N;;;;; +A501;VAI SYLLABLE EEN;Lo;0;L;;;;;N;;;;; +A502;VAI SYLLABLE HEE;Lo;0;L;;;;;N;;;;; +A503;VAI SYLLABLE WEE;Lo;0;L;;;;;N;;;;; +A504;VAI SYLLABLE WEEN;Lo;0;L;;;;;N;;;;; +A505;VAI SYLLABLE PEE;Lo;0;L;;;;;N;;;;; +A506;VAI SYLLABLE BHEE;Lo;0;L;;;;;N;;;;; +A507;VAI SYLLABLE BEE;Lo;0;L;;;;;N;;;;; +A508;VAI SYLLABLE MBEE;Lo;0;L;;;;;N;;;;; +A509;VAI SYLLABLE KPEE;Lo;0;L;;;;;N;;;;; +A50A;VAI SYLLABLE MGBEE;Lo;0;L;;;;;N;;;;; +A50B;VAI SYLLABLE GBEE;Lo;0;L;;;;;N;;;;; +A50C;VAI SYLLABLE FEE;Lo;0;L;;;;;N;;;;; +A50D;VAI SYLLABLE VEE;Lo;0;L;;;;;N;;;;; +A50E;VAI SYLLABLE TEE;Lo;0;L;;;;;N;;;;; +A50F;VAI SYLLABLE THEE;Lo;0;L;;;;;N;;;;; +A510;VAI SYLLABLE DHEE;Lo;0;L;;;;;N;;;;; +A511;VAI SYLLABLE DHHEE;Lo;0;L;;;;;N;;;;; +A512;VAI SYLLABLE LEE;Lo;0;L;;;;;N;;;;; +A513;VAI SYLLABLE REE;Lo;0;L;;;;;N;;;;; +A514;VAI SYLLABLE DEE;Lo;0;L;;;;;N;;;;; +A515;VAI SYLLABLE NDEE;Lo;0;L;;;;;N;;;;; +A516;VAI SYLLABLE SEE;Lo;0;L;;;;;N;;;;; +A517;VAI SYLLABLE SHEE;Lo;0;L;;;;;N;;;;; +A518;VAI SYLLABLE ZEE;Lo;0;L;;;;;N;;;;; +A519;VAI SYLLABLE ZHEE;Lo;0;L;;;;;N;;;;; +A51A;VAI SYLLABLE CEE;Lo;0;L;;;;;N;;;;; +A51B;VAI SYLLABLE JEE;Lo;0;L;;;;;N;;;;; +A51C;VAI SYLLABLE NJEE;Lo;0;L;;;;;N;;;;; +A51D;VAI SYLLABLE YEE;Lo;0;L;;;;;N;;;;; +A51E;VAI SYLLABLE KEE;Lo;0;L;;;;;N;;;;; +A51F;VAI SYLLABLE NGGEE;Lo;0;L;;;;;N;;;;; +A520;VAI SYLLABLE GEE;Lo;0;L;;;;;N;;;;; +A521;VAI SYLLABLE MEE;Lo;0;L;;;;;N;;;;; +A522;VAI SYLLABLE NEE;Lo;0;L;;;;;N;;;;; +A523;VAI SYLLABLE NYEE;Lo;0;L;;;;;N;;;;; +A524;VAI SYLLABLE I;Lo;0;L;;;;;N;;;;; +A525;VAI SYLLABLE IN;Lo;0;L;;;;;N;;;;; +A526;VAI SYLLABLE HI;Lo;0;L;;;;;N;;;;; +A527;VAI SYLLABLE HIN;Lo;0;L;;;;;N;;;;; +A528;VAI SYLLABLE WI;Lo;0;L;;;;;N;;;;; +A529;VAI SYLLABLE WIN;Lo;0;L;;;;;N;;;;; +A52A;VAI SYLLABLE PI;Lo;0;L;;;;;N;;;;; +A52B;VAI SYLLABLE BHI;Lo;0;L;;;;;N;;;;; +A52C;VAI SYLLABLE BI;Lo;0;L;;;;;N;;;;; +A52D;VAI SYLLABLE MBI;Lo;0;L;;;;;N;;;;; +A52E;VAI SYLLABLE KPI;Lo;0;L;;;;;N;;;;; +A52F;VAI SYLLABLE MGBI;Lo;0;L;;;;;N;;;;; +A530;VAI SYLLABLE GBI;Lo;0;L;;;;;N;;;;; +A531;VAI SYLLABLE FI;Lo;0;L;;;;;N;;;;; +A532;VAI SYLLABLE VI;Lo;0;L;;;;;N;;;;; +A533;VAI SYLLABLE TI;Lo;0;L;;;;;N;;;;; +A534;VAI SYLLABLE THI;Lo;0;L;;;;;N;;;;; +A535;VAI SYLLABLE DHI;Lo;0;L;;;;;N;;;;; +A536;VAI SYLLABLE DHHI;Lo;0;L;;;;;N;;;;; +A537;VAI SYLLABLE LI;Lo;0;L;;;;;N;;;;; +A538;VAI SYLLABLE RI;Lo;0;L;;;;;N;;;;; +A539;VAI SYLLABLE DI;Lo;0;L;;;;;N;;;;; +A53A;VAI SYLLABLE NDI;Lo;0;L;;;;;N;;;;; +A53B;VAI SYLLABLE SI;Lo;0;L;;;;;N;;;;; +A53C;VAI SYLLABLE SHI;Lo;0;L;;;;;N;;;;; +A53D;VAI SYLLABLE ZI;Lo;0;L;;;;;N;;;;; +A53E;VAI SYLLABLE ZHI;Lo;0;L;;;;;N;;;;; +A53F;VAI SYLLABLE CI;Lo;0;L;;;;;N;;;;; +A540;VAI SYLLABLE JI;Lo;0;L;;;;;N;;;;; +A541;VAI SYLLABLE NJI;Lo;0;L;;;;;N;;;;; +A542;VAI SYLLABLE YI;Lo;0;L;;;;;N;;;;; +A543;VAI SYLLABLE KI;Lo;0;L;;;;;N;;;;; +A544;VAI SYLLABLE NGGI;Lo;0;L;;;;;N;;;;; +A545;VAI SYLLABLE GI;Lo;0;L;;;;;N;;;;; +A546;VAI SYLLABLE MI;Lo;0;L;;;;;N;;;;; +A547;VAI SYLLABLE NI;Lo;0;L;;;;;N;;;;; +A548;VAI SYLLABLE NYI;Lo;0;L;;;;;N;;;;; +A549;VAI SYLLABLE A;Lo;0;L;;;;;N;;;;; +A54A;VAI SYLLABLE AN;Lo;0;L;;;;;N;;;;; +A54B;VAI SYLLABLE NGAN;Lo;0;L;;;;;N;;;;; +A54C;VAI SYLLABLE HA;Lo;0;L;;;;;N;;;;; +A54D;VAI SYLLABLE HAN;Lo;0;L;;;;;N;;;;; +A54E;VAI SYLLABLE WA;Lo;0;L;;;;;N;;;;; +A54F;VAI SYLLABLE WAN;Lo;0;L;;;;;N;;;;; +A550;VAI SYLLABLE PA;Lo;0;L;;;;;N;;;;; +A551;VAI SYLLABLE BHA;Lo;0;L;;;;;N;;;;; +A552;VAI SYLLABLE BA;Lo;0;L;;;;;N;;;;; +A553;VAI SYLLABLE MBA;Lo;0;L;;;;;N;;;;; +A554;VAI SYLLABLE KPA;Lo;0;L;;;;;N;;;;; +A555;VAI SYLLABLE KPAN;Lo;0;L;;;;;N;;;;; +A556;VAI SYLLABLE MGBA;Lo;0;L;;;;;N;;;;; +A557;VAI SYLLABLE GBA;Lo;0;L;;;;;N;;;;; +A558;VAI SYLLABLE FA;Lo;0;L;;;;;N;;;;; +A559;VAI SYLLABLE VA;Lo;0;L;;;;;N;;;;; +A55A;VAI SYLLABLE TA;Lo;0;L;;;;;N;;;;; +A55B;VAI SYLLABLE THA;Lo;0;L;;;;;N;;;;; +A55C;VAI SYLLABLE DHA;Lo;0;L;;;;;N;;;;; +A55D;VAI SYLLABLE DHHA;Lo;0;L;;;;;N;;;;; +A55E;VAI SYLLABLE LA;Lo;0;L;;;;;N;;;;; +A55F;VAI SYLLABLE RA;Lo;0;L;;;;;N;;;;; +A560;VAI SYLLABLE DA;Lo;0;L;;;;;N;;;;; +A561;VAI SYLLABLE NDA;Lo;0;L;;;;;N;;;;; +A562;VAI SYLLABLE SA;Lo;0;L;;;;;N;;;;; +A563;VAI SYLLABLE SHA;Lo;0;L;;;;;N;;;;; +A564;VAI SYLLABLE ZA;Lo;0;L;;;;;N;;;;; +A565;VAI SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; +A566;VAI SYLLABLE CA;Lo;0;L;;;;;N;;;;; +A567;VAI SYLLABLE JA;Lo;0;L;;;;;N;;;;; +A568;VAI SYLLABLE NJA;Lo;0;L;;;;;N;;;;; +A569;VAI SYLLABLE YA;Lo;0;L;;;;;N;;;;; +A56A;VAI SYLLABLE KA;Lo;0;L;;;;;N;;;;; +A56B;VAI SYLLABLE KAN;Lo;0;L;;;;;N;;;;; +A56C;VAI SYLLABLE NGGA;Lo;0;L;;;;;N;;;;; +A56D;VAI SYLLABLE GA;Lo;0;L;;;;;N;;;;; +A56E;VAI SYLLABLE MA;Lo;0;L;;;;;N;;;;; +A56F;VAI SYLLABLE NA;Lo;0;L;;;;;N;;;;; +A570;VAI SYLLABLE NYA;Lo;0;L;;;;;N;;;;; +A571;VAI SYLLABLE OO;Lo;0;L;;;;;N;;;;; +A572;VAI SYLLABLE OON;Lo;0;L;;;;;N;;;;; +A573;VAI SYLLABLE HOO;Lo;0;L;;;;;N;;;;; +A574;VAI SYLLABLE WOO;Lo;0;L;;;;;N;;;;; +A575;VAI SYLLABLE WOON;Lo;0;L;;;;;N;;;;; +A576;VAI SYLLABLE POO;Lo;0;L;;;;;N;;;;; +A577;VAI SYLLABLE BHOO;Lo;0;L;;;;;N;;;;; +A578;VAI SYLLABLE BOO;Lo;0;L;;;;;N;;;;; +A579;VAI SYLLABLE MBOO;Lo;0;L;;;;;N;;;;; +A57A;VAI SYLLABLE KPOO;Lo;0;L;;;;;N;;;;; +A57B;VAI SYLLABLE MGBOO;Lo;0;L;;;;;N;;;;; +A57C;VAI SYLLABLE GBOO;Lo;0;L;;;;;N;;;;; +A57D;VAI SYLLABLE FOO;Lo;0;L;;;;;N;;;;; +A57E;VAI SYLLABLE VOO;Lo;0;L;;;;;N;;;;; +A57F;VAI SYLLABLE TOO;Lo;0;L;;;;;N;;;;; +A580;VAI SYLLABLE THOO;Lo;0;L;;;;;N;;;;; +A581;VAI SYLLABLE DHOO;Lo;0;L;;;;;N;;;;; +A582;VAI SYLLABLE DHHOO;Lo;0;L;;;;;N;;;;; +A583;VAI SYLLABLE LOO;Lo;0;L;;;;;N;;;;; +A584;VAI SYLLABLE ROO;Lo;0;L;;;;;N;;;;; +A585;VAI SYLLABLE DOO;Lo;0;L;;;;;N;;;;; +A586;VAI SYLLABLE NDOO;Lo;0;L;;;;;N;;;;; +A587;VAI SYLLABLE SOO;Lo;0;L;;;;;N;;;;; +A588;VAI SYLLABLE SHOO;Lo;0;L;;;;;N;;;;; +A589;VAI SYLLABLE ZOO;Lo;0;L;;;;;N;;;;; +A58A;VAI SYLLABLE ZHOO;Lo;0;L;;;;;N;;;;; +A58B;VAI SYLLABLE COO;Lo;0;L;;;;;N;;;;; +A58C;VAI SYLLABLE JOO;Lo;0;L;;;;;N;;;;; +A58D;VAI SYLLABLE NJOO;Lo;0;L;;;;;N;;;;; +A58E;VAI SYLLABLE YOO;Lo;0;L;;;;;N;;;;; +A58F;VAI SYLLABLE KOO;Lo;0;L;;;;;N;;;;; +A590;VAI SYLLABLE NGGOO;Lo;0;L;;;;;N;;;;; +A591;VAI SYLLABLE GOO;Lo;0;L;;;;;N;;;;; +A592;VAI SYLLABLE MOO;Lo;0;L;;;;;N;;;;; +A593;VAI SYLLABLE NOO;Lo;0;L;;;;;N;;;;; +A594;VAI SYLLABLE NYOO;Lo;0;L;;;;;N;;;;; +A595;VAI SYLLABLE U;Lo;0;L;;;;;N;;;;; +A596;VAI SYLLABLE UN;Lo;0;L;;;;;N;;;;; +A597;VAI SYLLABLE HU;Lo;0;L;;;;;N;;;;; +A598;VAI SYLLABLE HUN;Lo;0;L;;;;;N;;;;; +A599;VAI SYLLABLE WU;Lo;0;L;;;;;N;;;;; +A59A;VAI SYLLABLE WUN;Lo;0;L;;;;;N;;;;; +A59B;VAI SYLLABLE PU;Lo;0;L;;;;;N;;;;; +A59C;VAI SYLLABLE BHU;Lo;0;L;;;;;N;;;;; +A59D;VAI SYLLABLE BU;Lo;0;L;;;;;N;;;;; +A59E;VAI SYLLABLE MBU;Lo;0;L;;;;;N;;;;; +A59F;VAI SYLLABLE KPU;Lo;0;L;;;;;N;;;;; +A5A0;VAI SYLLABLE MGBU;Lo;0;L;;;;;N;;;;; +A5A1;VAI SYLLABLE GBU;Lo;0;L;;;;;N;;;;; +A5A2;VAI SYLLABLE FU;Lo;0;L;;;;;N;;;;; +A5A3;VAI SYLLABLE VU;Lo;0;L;;;;;N;;;;; +A5A4;VAI SYLLABLE TU;Lo;0;L;;;;;N;;;;; +A5A5;VAI SYLLABLE THU;Lo;0;L;;;;;N;;;;; +A5A6;VAI SYLLABLE DHU;Lo;0;L;;;;;N;;;;; +A5A7;VAI SYLLABLE DHHU;Lo;0;L;;;;;N;;;;; +A5A8;VAI SYLLABLE LU;Lo;0;L;;;;;N;;;;; +A5A9;VAI SYLLABLE RU;Lo;0;L;;;;;N;;;;; +A5AA;VAI SYLLABLE DU;Lo;0;L;;;;;N;;;;; +A5AB;VAI SYLLABLE NDU;Lo;0;L;;;;;N;;;;; +A5AC;VAI SYLLABLE SU;Lo;0;L;;;;;N;;;;; +A5AD;VAI SYLLABLE SHU;Lo;0;L;;;;;N;;;;; +A5AE;VAI SYLLABLE ZU;Lo;0;L;;;;;N;;;;; +A5AF;VAI SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; +A5B0;VAI SYLLABLE CU;Lo;0;L;;;;;N;;;;; +A5B1;VAI SYLLABLE JU;Lo;0;L;;;;;N;;;;; +A5B2;VAI SYLLABLE NJU;Lo;0;L;;;;;N;;;;; +A5B3;VAI SYLLABLE YU;Lo;0;L;;;;;N;;;;; +A5B4;VAI SYLLABLE KU;Lo;0;L;;;;;N;;;;; +A5B5;VAI SYLLABLE NGGU;Lo;0;L;;;;;N;;;;; +A5B6;VAI SYLLABLE GU;Lo;0;L;;;;;N;;;;; +A5B7;VAI SYLLABLE MU;Lo;0;L;;;;;N;;;;; +A5B8;VAI SYLLABLE NU;Lo;0;L;;;;;N;;;;; +A5B9;VAI SYLLABLE NYU;Lo;0;L;;;;;N;;;;; +A5BA;VAI SYLLABLE O;Lo;0;L;;;;;N;;;;; +A5BB;VAI SYLLABLE ON;Lo;0;L;;;;;N;;;;; +A5BC;VAI SYLLABLE NGON;Lo;0;L;;;;;N;;;;; +A5BD;VAI SYLLABLE HO;Lo;0;L;;;;;N;;;;; +A5BE;VAI SYLLABLE HON;Lo;0;L;;;;;N;;;;; +A5BF;VAI SYLLABLE WO;Lo;0;L;;;;;N;;;;; +A5C0;VAI SYLLABLE WON;Lo;0;L;;;;;N;;;;; +A5C1;VAI SYLLABLE PO;Lo;0;L;;;;;N;;;;; +A5C2;VAI SYLLABLE BHO;Lo;0;L;;;;;N;;;;; +A5C3;VAI SYLLABLE BO;Lo;0;L;;;;;N;;;;; +A5C4;VAI SYLLABLE MBO;Lo;0;L;;;;;N;;;;; +A5C5;VAI SYLLABLE KPO;Lo;0;L;;;;;N;;;;; +A5C6;VAI SYLLABLE MGBO;Lo;0;L;;;;;N;;;;; +A5C7;VAI SYLLABLE GBO;Lo;0;L;;;;;N;;;;; +A5C8;VAI SYLLABLE GBON;Lo;0;L;;;;;N;;;;; +A5C9;VAI SYLLABLE FO;Lo;0;L;;;;;N;;;;; +A5CA;VAI SYLLABLE VO;Lo;0;L;;;;;N;;;;; +A5CB;VAI SYLLABLE TO;Lo;0;L;;;;;N;;;;; +A5CC;VAI SYLLABLE THO;Lo;0;L;;;;;N;;;;; +A5CD;VAI SYLLABLE DHO;Lo;0;L;;;;;N;;;;; +A5CE;VAI SYLLABLE DHHO;Lo;0;L;;;;;N;;;;; +A5CF;VAI SYLLABLE LO;Lo;0;L;;;;;N;;;;; +A5D0;VAI SYLLABLE RO;Lo;0;L;;;;;N;;;;; +A5D1;VAI SYLLABLE DO;Lo;0;L;;;;;N;;;;; +A5D2;VAI SYLLABLE NDO;Lo;0;L;;;;;N;;;;; +A5D3;VAI SYLLABLE SO;Lo;0;L;;;;;N;;;;; +A5D4;VAI SYLLABLE SHO;Lo;0;L;;;;;N;;;;; +A5D5;VAI SYLLABLE ZO;Lo;0;L;;;;;N;;;;; +A5D6;VAI SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; +A5D7;VAI SYLLABLE CO;Lo;0;L;;;;;N;;;;; +A5D8;VAI SYLLABLE JO;Lo;0;L;;;;;N;;;;; +A5D9;VAI SYLLABLE NJO;Lo;0;L;;;;;N;;;;; +A5DA;VAI SYLLABLE YO;Lo;0;L;;;;;N;;;;; +A5DB;VAI SYLLABLE KO;Lo;0;L;;;;;N;;;;; +A5DC;VAI SYLLABLE NGGO;Lo;0;L;;;;;N;;;;; +A5DD;VAI SYLLABLE GO;Lo;0;L;;;;;N;;;;; +A5DE;VAI SYLLABLE MO;Lo;0;L;;;;;N;;;;; +A5DF;VAI SYLLABLE NO;Lo;0;L;;;;;N;;;;; +A5E0;VAI SYLLABLE NYO;Lo;0;L;;;;;N;;;;; +A5E1;VAI SYLLABLE E;Lo;0;L;;;;;N;;;;; +A5E2;VAI SYLLABLE EN;Lo;0;L;;;;;N;;;;; +A5E3;VAI SYLLABLE NGEN;Lo;0;L;;;;;N;;;;; +A5E4;VAI SYLLABLE HE;Lo;0;L;;;;;N;;;;; +A5E5;VAI SYLLABLE HEN;Lo;0;L;;;;;N;;;;; +A5E6;VAI SYLLABLE WE;Lo;0;L;;;;;N;;;;; +A5E7;VAI SYLLABLE WEN;Lo;0;L;;;;;N;;;;; +A5E8;VAI SYLLABLE PE;Lo;0;L;;;;;N;;;;; +A5E9;VAI SYLLABLE BHE;Lo;0;L;;;;;N;;;;; +A5EA;VAI SYLLABLE BE;Lo;0;L;;;;;N;;;;; +A5EB;VAI SYLLABLE MBE;Lo;0;L;;;;;N;;;;; +A5EC;VAI SYLLABLE KPE;Lo;0;L;;;;;N;;;;; +A5ED;VAI SYLLABLE KPEN;Lo;0;L;;;;;N;;;;; +A5EE;VAI SYLLABLE MGBE;Lo;0;L;;;;;N;;;;; +A5EF;VAI SYLLABLE GBE;Lo;0;L;;;;;N;;;;; +A5F0;VAI SYLLABLE GBEN;Lo;0;L;;;;;N;;;;; +A5F1;VAI SYLLABLE FE;Lo;0;L;;;;;N;;;;; +A5F2;VAI SYLLABLE VE;Lo;0;L;;;;;N;;;;; +A5F3;VAI SYLLABLE TE;Lo;0;L;;;;;N;;;;; +A5F4;VAI SYLLABLE THE;Lo;0;L;;;;;N;;;;; +A5F5;VAI SYLLABLE DHE;Lo;0;L;;;;;N;;;;; +A5F6;VAI SYLLABLE DHHE;Lo;0;L;;;;;N;;;;; +A5F7;VAI SYLLABLE LE;Lo;0;L;;;;;N;;;;; +A5F8;VAI SYLLABLE RE;Lo;0;L;;;;;N;;;;; +A5F9;VAI SYLLABLE DE;Lo;0;L;;;;;N;;;;; +A5FA;VAI SYLLABLE NDE;Lo;0;L;;;;;N;;;;; +A5FB;VAI SYLLABLE SE;Lo;0;L;;;;;N;;;;; +A5FC;VAI SYLLABLE SHE;Lo;0;L;;;;;N;;;;; +A5FD;VAI SYLLABLE ZE;Lo;0;L;;;;;N;;;;; +A5FE;VAI SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; +A5FF;VAI SYLLABLE CE;Lo;0;L;;;;;N;;;;; +A600;VAI SYLLABLE JE;Lo;0;L;;;;;N;;;;; +A601;VAI SYLLABLE NJE;Lo;0;L;;;;;N;;;;; +A602;VAI SYLLABLE YE;Lo;0;L;;;;;N;;;;; +A603;VAI SYLLABLE KE;Lo;0;L;;;;;N;;;;; +A604;VAI SYLLABLE NGGE;Lo;0;L;;;;;N;;;;; +A605;VAI SYLLABLE NGGEN;Lo;0;L;;;;;N;;;;; +A606;VAI SYLLABLE GE;Lo;0;L;;;;;N;;;;; +A607;VAI SYLLABLE GEN;Lo;0;L;;;;;N;;;;; +A608;VAI SYLLABLE ME;Lo;0;L;;;;;N;;;;; +A609;VAI SYLLABLE NE;Lo;0;L;;;;;N;;;;; +A60A;VAI SYLLABLE NYE;Lo;0;L;;;;;N;;;;; +A60B;VAI SYLLABLE NG;Lo;0;L;;;;;N;;;;; +A60C;VAI SYLLABLE LENGTHENER;Lm;0;L;;;;;N;;;;; +A60D;VAI COMMA;Po;0;ON;;;;;N;;;;; +A60E;VAI FULL STOP;Po;0;ON;;;;;N;;;;; +A60F;VAI QUESTION MARK;Po;0;ON;;;;;N;;;;; +A610;VAI SYLLABLE NDOLE FA;Lo;0;L;;;;;N;;;;; +A611;VAI SYLLABLE NDOLE KA;Lo;0;L;;;;;N;;;;; +A612;VAI SYLLABLE NDOLE SOO;Lo;0;L;;;;;N;;;;; +A613;VAI SYMBOL FEENG;Lo;0;L;;;;;N;;;;; +A614;VAI SYMBOL KEENG;Lo;0;L;;;;;N;;;;; +A615;VAI SYMBOL TING;Lo;0;L;;;;;N;;;;; +A616;VAI SYMBOL NII;Lo;0;L;;;;;N;;;;; +A617;VAI SYMBOL BANG;Lo;0;L;;;;;N;;;;; +A618;VAI SYMBOL FAA;Lo;0;L;;;;;N;;;;; +A619;VAI SYMBOL TAA;Lo;0;L;;;;;N;;;;; +A61A;VAI SYMBOL DANG;Lo;0;L;;;;;N;;;;; +A61B;VAI SYMBOL DOONG;Lo;0;L;;;;;N;;;;; +A61C;VAI SYMBOL KUNG;Lo;0;L;;;;;N;;;;; +A61D;VAI SYMBOL TONG;Lo;0;L;;;;;N;;;;; +A61E;VAI SYMBOL DO-O;Lo;0;L;;;;;N;;;;; +A61F;VAI SYMBOL JONG;Lo;0;L;;;;;N;;;;; +A620;VAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +A621;VAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A622;VAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A623;VAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A624;VAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A625;VAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A626;VAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A627;VAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A628;VAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A629;VAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A62A;VAI SYLLABLE NDOLE MA;Lo;0;L;;;;;N;;;;; +A62B;VAI SYLLABLE NDOLE DO;Lo;0;L;;;;;N;;;;; +A640;CYRILLIC CAPITAL LETTER ZEMLYA;Lu;0;L;;;;;N;;;;A641; +A641;CYRILLIC SMALL LETTER ZEMLYA;Ll;0;L;;;;;N;;;A640;;A640 +A642;CYRILLIC CAPITAL LETTER DZELO;Lu;0;L;;;;;N;;;;A643; +A643;CYRILLIC SMALL LETTER DZELO;Ll;0;L;;;;;N;;;A642;;A642 +A644;CYRILLIC CAPITAL LETTER REVERSED DZE;Lu;0;L;;;;;N;;;;A645; +A645;CYRILLIC SMALL LETTER REVERSED DZE;Ll;0;L;;;;;N;;;A644;;A644 +A646;CYRILLIC CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;A647; +A647;CYRILLIC SMALL LETTER IOTA;Ll;0;L;;;;;N;;;A646;;A646 +A648;CYRILLIC CAPITAL LETTER DJERV;Lu;0;L;;;;;N;;;;A649; +A649;CYRILLIC SMALL LETTER DJERV;Ll;0;L;;;;;N;;;A648;;A648 +A64A;CYRILLIC CAPITAL LETTER MONOGRAPH UK;Lu;0;L;;;;;N;;;;A64B; +A64B;CYRILLIC SMALL LETTER MONOGRAPH UK;Ll;0;L;;;;;N;;;A64A;;A64A +A64C;CYRILLIC CAPITAL LETTER BROAD OMEGA;Lu;0;L;;;;;N;;;;A64D; +A64D;CYRILLIC SMALL LETTER BROAD OMEGA;Ll;0;L;;;;;N;;;A64C;;A64C +A64E;CYRILLIC CAPITAL LETTER NEUTRAL YER;Lu;0;L;;;;;N;;;;A64F; +A64F;CYRILLIC SMALL LETTER NEUTRAL YER;Ll;0;L;;;;;N;;;A64E;;A64E +A650;CYRILLIC CAPITAL LETTER YERU WITH BACK YER;Lu;0;L;;;;;N;;;;A651; +A651;CYRILLIC SMALL LETTER YERU WITH BACK YER;Ll;0;L;;;;;N;;;A650;;A650 +A652;CYRILLIC CAPITAL LETTER IOTIFIED YAT;Lu;0;L;;;;;N;;;;A653; +A653;CYRILLIC SMALL LETTER IOTIFIED YAT;Ll;0;L;;;;;N;;;A652;;A652 +A654;CYRILLIC CAPITAL LETTER REVERSED YU;Lu;0;L;;;;;N;;;;A655; +A655;CYRILLIC SMALL LETTER REVERSED YU;Ll;0;L;;;;;N;;;A654;;A654 +A656;CYRILLIC CAPITAL LETTER IOTIFIED A;Lu;0;L;;;;;N;;;;A657; +A657;CYRILLIC SMALL LETTER IOTIFIED A;Ll;0;L;;;;;N;;;A656;;A656 +A658;CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS;Lu;0;L;;;;;N;;;;A659; +A659;CYRILLIC SMALL LETTER CLOSED LITTLE YUS;Ll;0;L;;;;;N;;;A658;;A658 +A65A;CYRILLIC CAPITAL LETTER BLENDED YUS;Lu;0;L;;;;;N;;;;A65B; +A65B;CYRILLIC SMALL LETTER BLENDED YUS;Ll;0;L;;;;;N;;;A65A;;A65A +A65C;CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS;Lu;0;L;;;;;N;;;;A65D; +A65D;CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS;Ll;0;L;;;;;N;;;A65C;;A65C +A65E;CYRILLIC CAPITAL LETTER YN;Lu;0;L;;;;;N;;;;A65F; +A65F;CYRILLIC SMALL LETTER YN;Ll;0;L;;;;;N;;;A65E;;A65E +A662;CYRILLIC CAPITAL LETTER SOFT DE;Lu;0;L;;;;;N;;;;A663; +A663;CYRILLIC SMALL LETTER SOFT DE;Ll;0;L;;;;;N;;;A662;;A662 +A664;CYRILLIC CAPITAL LETTER SOFT EL;Lu;0;L;;;;;N;;;;A665; +A665;CYRILLIC SMALL LETTER SOFT EL;Ll;0;L;;;;;N;;;A664;;A664 +A666;CYRILLIC CAPITAL LETTER SOFT EM;Lu;0;L;;;;;N;;;;A667; +A667;CYRILLIC SMALL LETTER SOFT EM;Ll;0;L;;;;;N;;;A666;;A666 +A668;CYRILLIC CAPITAL LETTER MONOCULAR O;Lu;0;L;;;;;N;;;;A669; +A669;CYRILLIC SMALL LETTER MONOCULAR O;Ll;0;L;;;;;N;;;A668;;A668 +A66A;CYRILLIC CAPITAL LETTER BINOCULAR O;Lu;0;L;;;;;N;;;;A66B; +A66B;CYRILLIC SMALL LETTER BINOCULAR O;Ll;0;L;;;;;N;;;A66A;;A66A +A66C;CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O;Lu;0;L;;;;;N;;;;A66D; +A66D;CYRILLIC SMALL LETTER DOUBLE MONOCULAR O;Ll;0;L;;;;;N;;;A66C;;A66C +A66E;CYRILLIC LETTER MULTIOCULAR O;Lo;0;L;;;;;N;;;;; +A66F;COMBINING CYRILLIC VZMET;Mn;230;NSM;;;;;N;;;;; +A670;COMBINING CYRILLIC TEN MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; +A671;COMBINING CYRILLIC HUNDRED MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; +A672;COMBINING CYRILLIC THOUSAND MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; +A673;SLAVONIC ASTERISK;Po;0;ON;;;;;N;;;;; +A67C;COMBINING CYRILLIC KAVYKA;Mn;230;NSM;;;;;N;;;;; +A67D;COMBINING CYRILLIC PAYEROK;Mn;230;NSM;;;;;N;;;;; +A67E;CYRILLIC KAVYKA;Po;0;ON;;;;;N;;;;; +A67F;CYRILLIC PAYEROK;Lm;0;ON;;;;;N;;;;; +A680;CYRILLIC CAPITAL LETTER DWE;Lu;0;L;;;;;N;;;;A681; +A681;CYRILLIC SMALL LETTER DWE;Ll;0;L;;;;;N;;;A680;;A680 +A682;CYRILLIC CAPITAL LETTER DZWE;Lu;0;L;;;;;N;;;;A683; +A683;CYRILLIC SMALL LETTER DZWE;Ll;0;L;;;;;N;;;A682;;A682 +A684;CYRILLIC CAPITAL LETTER ZHWE;Lu;0;L;;;;;N;;;;A685; +A685;CYRILLIC SMALL LETTER ZHWE;Ll;0;L;;;;;N;;;A684;;A684 +A686;CYRILLIC CAPITAL LETTER CCHE;Lu;0;L;;;;;N;;;;A687; +A687;CYRILLIC SMALL LETTER CCHE;Ll;0;L;;;;;N;;;A686;;A686 +A688;CYRILLIC CAPITAL LETTER DZZE;Lu;0;L;;;;;N;;;;A689; +A689;CYRILLIC SMALL LETTER DZZE;Ll;0;L;;;;;N;;;A688;;A688 +A68A;CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;A68B; +A68B;CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;A68A;;A68A +A68C;CYRILLIC CAPITAL LETTER TWE;Lu;0;L;;;;;N;;;;A68D; +A68D;CYRILLIC SMALL LETTER TWE;Ll;0;L;;;;;N;;;A68C;;A68C +A68E;CYRILLIC CAPITAL LETTER TSWE;Lu;0;L;;;;;N;;;;A68F; +A68F;CYRILLIC SMALL LETTER TSWE;Ll;0;L;;;;;N;;;A68E;;A68E +A690;CYRILLIC CAPITAL LETTER TSSE;Lu;0;L;;;;;N;;;;A691; +A691;CYRILLIC SMALL LETTER TSSE;Ll;0;L;;;;;N;;;A690;;A690 +A692;CYRILLIC CAPITAL LETTER TCHE;Lu;0;L;;;;;N;;;;A693; +A693;CYRILLIC SMALL LETTER TCHE;Ll;0;L;;;;;N;;;A692;;A692 +A694;CYRILLIC CAPITAL LETTER HWE;Lu;0;L;;;;;N;;;;A695; +A695;CYRILLIC SMALL LETTER HWE;Ll;0;L;;;;;N;;;A694;;A694 +A696;CYRILLIC CAPITAL LETTER SHWE;Lu;0;L;;;;;N;;;;A697; +A697;CYRILLIC SMALL LETTER SHWE;Ll;0;L;;;;;N;;;A696;;A696 +A700;MODIFIER LETTER CHINESE TONE YIN PING;Sk;0;ON;;;;;N;;;;; +A701;MODIFIER LETTER CHINESE TONE YANG PING;Sk;0;ON;;;;;N;;;;; +A702;MODIFIER LETTER CHINESE TONE YIN SHANG;Sk;0;ON;;;;;N;;;;; +A703;MODIFIER LETTER CHINESE TONE YANG SHANG;Sk;0;ON;;;;;N;;;;; +A704;MODIFIER LETTER CHINESE TONE YIN QU;Sk;0;ON;;;;;N;;;;; +A705;MODIFIER LETTER CHINESE TONE YANG QU;Sk;0;ON;;;;;N;;;;; +A706;MODIFIER LETTER CHINESE TONE YIN RU;Sk;0;ON;;;;;N;;;;; +A707;MODIFIER LETTER CHINESE TONE YANG RU;Sk;0;ON;;;;;N;;;;; +A708;MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A709;MODIFIER LETTER HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70A;MODIFIER LETTER MID DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70B;MODIFIER LETTER LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70C;MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70D;MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A70E;MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A70F;MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A710;MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A711;MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A712;MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A713;MODIFIER LETTER HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A714;MODIFIER LETTER MID LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A715;MODIFIER LETTER LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A716;MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A717;MODIFIER LETTER DOT VERTICAL BAR;Lm;0;ON;;;;;N;;;;; +A718;MODIFIER LETTER DOT SLASH;Lm;0;ON;;;;;N;;;;; +A719;MODIFIER LETTER DOT HORIZONTAL BAR;Lm;0;ON;;;;;N;;;;; +A71A;MODIFIER LETTER LOWER RIGHT CORNER ANGLE;Lm;0;ON;;;;;N;;;;; +A71B;MODIFIER LETTER RAISED UP ARROW;Lm;0;ON;;;;;N;;;;; +A71C;MODIFIER LETTER RAISED DOWN ARROW;Lm;0;ON;;;;;N;;;;; +A71D;MODIFIER LETTER RAISED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;; +A71E;MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;; +A71F;MODIFIER LETTER LOW INVERTED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;; +A720;MODIFIER LETTER STRESS AND HIGH TONE;Sk;0;ON;;;;;N;;;;; +A721;MODIFIER LETTER STRESS AND LOW TONE;Sk;0;ON;;;;;N;;;;; +A722;LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF;Lu;0;L;;;;;N;;;;A723; +A723;LATIN SMALL LETTER EGYPTOLOGICAL ALEF;Ll;0;L;;;;;N;;;A722;;A722 +A724;LATIN CAPITAL LETTER EGYPTOLOGICAL AIN;Lu;0;L;;;;;N;;;;A725; +A725;LATIN SMALL LETTER EGYPTOLOGICAL AIN;Ll;0;L;;;;;N;;;A724;;A724 +A726;LATIN CAPITAL LETTER HENG;Lu;0;L;;;;;N;;;;A727; +A727;LATIN SMALL LETTER HENG;Ll;0;L;;;;;N;;;A726;;A726 +A728;LATIN CAPITAL LETTER TZ;Lu;0;L;;;;;N;;;;A729; +A729;LATIN SMALL LETTER TZ;Ll;0;L;;;;;N;;;A728;;A728 +A72A;LATIN CAPITAL LETTER TRESILLO;Lu;0;L;;;;;N;;;;A72B; +A72B;LATIN SMALL LETTER TRESILLO;Ll;0;L;;;;;N;;;A72A;;A72A +A72C;LATIN CAPITAL LETTER CUATRILLO;Lu;0;L;;;;;N;;;;A72D; +A72D;LATIN SMALL LETTER CUATRILLO;Ll;0;L;;;;;N;;;A72C;;A72C +A72E;LATIN CAPITAL LETTER CUATRILLO WITH COMMA;Lu;0;L;;;;;N;;;;A72F; +A72F;LATIN SMALL LETTER CUATRILLO WITH COMMA;Ll;0;L;;;;;N;;;A72E;;A72E +A730;LATIN LETTER SMALL CAPITAL F;Ll;0;L;;;;;N;;;;; +A731;LATIN LETTER SMALL CAPITAL S;Ll;0;L;;;;;N;;;;; +A732;LATIN CAPITAL LETTER AA;Lu;0;L;;;;;N;;;;A733; +A733;LATIN SMALL LETTER AA;Ll;0;L;;;;;N;;;A732;;A732 +A734;LATIN CAPITAL LETTER AO;Lu;0;L;;;;;N;;;;A735; +A735;LATIN SMALL LETTER AO;Ll;0;L;;;;;N;;;A734;;A734 +A736;LATIN CAPITAL LETTER AU;Lu;0;L;;;;;N;;;;A737; +A737;LATIN SMALL LETTER AU;Ll;0;L;;;;;N;;;A736;;A736 +A738;LATIN CAPITAL LETTER AV;Lu;0;L;;;;;N;;;;A739; +A739;LATIN SMALL LETTER AV;Ll;0;L;;;;;N;;;A738;;A738 +A73A;LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR;Lu;0;L;;;;;N;;;;A73B; +A73B;LATIN SMALL LETTER AV WITH HORIZONTAL BAR;Ll;0;L;;;;;N;;;A73A;;A73A +A73C;LATIN CAPITAL LETTER AY;Lu;0;L;;;;;N;;;;A73D; +A73D;LATIN SMALL LETTER AY;Ll;0;L;;;;;N;;;A73C;;A73C +A73E;LATIN CAPITAL LETTER REVERSED C WITH DOT;Lu;0;L;;;;;N;;;;A73F; +A73F;LATIN SMALL LETTER REVERSED C WITH DOT;Ll;0;L;;;;;N;;;A73E;;A73E +A740;LATIN CAPITAL LETTER K WITH STROKE;Lu;0;L;;;;;N;;;;A741; +A741;LATIN SMALL LETTER K WITH STROKE;Ll;0;L;;;;;N;;;A740;;A740 +A742;LATIN CAPITAL LETTER K WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A743; +A743;LATIN SMALL LETTER K WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A742;;A742 +A744;LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A745; +A745;LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE;Ll;0;L;;;;;N;;;A744;;A744 +A746;LATIN CAPITAL LETTER BROKEN L;Lu;0;L;;;;;N;;;;A747; +A747;LATIN SMALL LETTER BROKEN L;Ll;0;L;;;;;N;;;A746;;A746 +A748;LATIN CAPITAL LETTER L WITH HIGH STROKE;Lu;0;L;;;;;N;;;;A749; +A749;LATIN SMALL LETTER L WITH HIGH STROKE;Ll;0;L;;;;;N;;;A748;;A748 +A74A;LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY;Lu;0;L;;;;;N;;;;A74B; +A74B;LATIN SMALL LETTER O WITH LONG STROKE OVERLAY;Ll;0;L;;;;;N;;;A74A;;A74A +A74C;LATIN CAPITAL LETTER O WITH LOOP;Lu;0;L;;;;;N;;;;A74D; +A74D;LATIN SMALL LETTER O WITH LOOP;Ll;0;L;;;;;N;;;A74C;;A74C +A74E;LATIN CAPITAL LETTER OO;Lu;0;L;;;;;N;;;;A74F; +A74F;LATIN SMALL LETTER OO;Ll;0;L;;;;;N;;;A74E;;A74E +A750;LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A751; +A751;LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A750;;A750 +A752;LATIN CAPITAL LETTER P WITH FLOURISH;Lu;0;L;;;;;N;;;;A753; +A753;LATIN SMALL LETTER P WITH FLOURISH;Ll;0;L;;;;;N;;;A752;;A752 +A754;LATIN CAPITAL LETTER P WITH SQUIRREL TAIL;Lu;0;L;;;;;N;;;;A755; +A755;LATIN SMALL LETTER P WITH SQUIRREL TAIL;Ll;0;L;;;;;N;;;A754;;A754 +A756;LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A757; +A757;LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A756;;A756 +A758;LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A759; +A759;LATIN SMALL LETTER Q WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A758;;A758 +A75A;LATIN CAPITAL LETTER R ROTUNDA;Lu;0;L;;;;;N;;;;A75B; +A75B;LATIN SMALL LETTER R ROTUNDA;Ll;0;L;;;;;N;;;A75A;;A75A +A75C;LATIN CAPITAL LETTER RUM ROTUNDA;Lu;0;L;;;;;N;;;;A75D; +A75D;LATIN SMALL LETTER RUM ROTUNDA;Ll;0;L;;;;;N;;;A75C;;A75C +A75E;LATIN CAPITAL LETTER V WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A75F; +A75F;LATIN SMALL LETTER V WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A75E;;A75E +A760;LATIN CAPITAL LETTER VY;Lu;0;L;;;;;N;;;;A761; +A761;LATIN SMALL LETTER VY;Ll;0;L;;;;;N;;;A760;;A760 +A762;LATIN CAPITAL LETTER VISIGOTHIC Z;Lu;0;L;;;;;N;;;;A763; +A763;LATIN SMALL LETTER VISIGOTHIC Z;Ll;0;L;;;;;N;;;A762;;A762 +A764;LATIN CAPITAL LETTER THORN WITH STROKE;Lu;0;L;;;;;N;;;;A765; +A765;LATIN SMALL LETTER THORN WITH STROKE;Ll;0;L;;;;;N;;;A764;;A764 +A766;LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A767; +A767;LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A766;;A766 +A768;LATIN CAPITAL LETTER VEND;Lu;0;L;;;;;N;;;;A769; +A769;LATIN SMALL LETTER VEND;Ll;0;L;;;;;N;;;A768;;A768 +A76A;LATIN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;A76B; +A76B;LATIN SMALL LETTER ET;Ll;0;L;;;;;N;;;A76A;;A76A +A76C;LATIN CAPITAL LETTER IS;Lu;0;L;;;;;N;;;;A76D; +A76D;LATIN SMALL LETTER IS;Ll;0;L;;;;;N;;;A76C;;A76C +A76E;LATIN CAPITAL LETTER CON;Lu;0;L;;;;;N;;;;A76F; +A76F;LATIN SMALL LETTER CON;Ll;0;L;;;;;N;;;A76E;;A76E +A770;MODIFIER LETTER US;Lm;0;L;<super> A76F;;;;N;;;;; +A771;LATIN SMALL LETTER DUM;Ll;0;L;;;;;N;;;;; +A772;LATIN SMALL LETTER LUM;Ll;0;L;;;;;N;;;;; +A773;LATIN SMALL LETTER MUM;Ll;0;L;;;;;N;;;;; +A774;LATIN SMALL LETTER NUM;Ll;0;L;;;;;N;;;;; +A775;LATIN SMALL LETTER RUM;Ll;0;L;;;;;N;;;;; +A776;LATIN LETTER SMALL CAPITAL RUM;Ll;0;L;;;;;N;;;;; +A777;LATIN SMALL LETTER TUM;Ll;0;L;;;;;N;;;;; +A778;LATIN SMALL LETTER UM;Ll;0;L;;;;;N;;;;; +A779;LATIN CAPITAL LETTER INSULAR D;Lu;0;L;;;;;N;;;;A77A; +A77A;LATIN SMALL LETTER INSULAR D;Ll;0;L;;;;;N;;;A779;;A779 +A77B;LATIN CAPITAL LETTER INSULAR F;Lu;0;L;;;;;N;;;;A77C; +A77C;LATIN SMALL LETTER INSULAR F;Ll;0;L;;;;;N;;;A77B;;A77B +A77D;LATIN CAPITAL LETTER INSULAR G;Lu;0;L;;;;;N;;;;1D79; +A77E;LATIN CAPITAL LETTER TURNED INSULAR G;Lu;0;L;;;;;N;;;;A77F; +A77F;LATIN SMALL LETTER TURNED INSULAR G;Ll;0;L;;;;;N;;;A77E;;A77E +A780;LATIN CAPITAL LETTER TURNED L;Lu;0;L;;;;;N;;;;A781; +A781;LATIN SMALL LETTER TURNED L;Ll;0;L;;;;;N;;;A780;;A780 +A782;LATIN CAPITAL LETTER INSULAR R;Lu;0;L;;;;;N;;;;A783; +A783;LATIN SMALL LETTER INSULAR R;Ll;0;L;;;;;N;;;A782;;A782 +A784;LATIN CAPITAL LETTER INSULAR S;Lu;0;L;;;;;N;;;;A785; +A785;LATIN SMALL LETTER INSULAR S;Ll;0;L;;;;;N;;;A784;;A784 +A786;LATIN CAPITAL LETTER INSULAR T;Lu;0;L;;;;;N;;;;A787; +A787;LATIN SMALL LETTER INSULAR T;Ll;0;L;;;;;N;;;A786;;A786 +A788;MODIFIER LETTER LOW CIRCUMFLEX ACCENT;Lm;0;ON;;;;;N;;;;; +A789;MODIFIER LETTER COLON;Sk;0;L;;;;;N;;;;; +A78A;MODIFIER LETTER SHORT EQUALS SIGN;Sk;0;L;;;;;N;;;;; +A78B;LATIN CAPITAL LETTER SALTILLO;Lu;0;L;;;;;N;;;;A78C; +A78C;LATIN SMALL LETTER SALTILLO;Ll;0;L;;;;;N;;;A78B;;A78B +A7FB;LATIN EPIGRAPHIC LETTER REVERSED F;Lo;0;L;;;;;N;;;;; +A7FC;LATIN EPIGRAPHIC LETTER REVERSED P;Lo;0;L;;;;;N;;;;; +A7FD;LATIN EPIGRAPHIC LETTER INVERTED M;Lo;0;L;;;;;N;;;;; +A7FE;LATIN EPIGRAPHIC LETTER I LONGA;Lo;0;L;;;;;N;;;;; +A7FF;LATIN EPIGRAPHIC LETTER ARCHAIC M;Lo;0;L;;;;;N;;;;; +A800;SYLOTI NAGRI LETTER A;Lo;0;L;;;;;N;;;;; +A801;SYLOTI NAGRI LETTER I;Lo;0;L;;;;;N;;;;; +A802;SYLOTI NAGRI SIGN DVISVARA;Mn;0;NSM;;;;;N;;;;; +A803;SYLOTI NAGRI LETTER U;Lo;0;L;;;;;N;;;;; +A804;SYLOTI NAGRI LETTER E;Lo;0;L;;;;;N;;;;; +A805;SYLOTI NAGRI LETTER O;Lo;0;L;;;;;N;;;;; +A806;SYLOTI NAGRI SIGN HASANTA;Mn;9;NSM;;;;;N;;;;; +A807;SYLOTI NAGRI LETTER KO;Lo;0;L;;;;;N;;;;; +A808;SYLOTI NAGRI LETTER KHO;Lo;0;L;;;;;N;;;;; +A809;SYLOTI NAGRI LETTER GO;Lo;0;L;;;;;N;;;;; +A80A;SYLOTI NAGRI LETTER GHO;Lo;0;L;;;;;N;;;;; +A80B;SYLOTI NAGRI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +A80C;SYLOTI NAGRI LETTER CO;Lo;0;L;;;;;N;;;;; +A80D;SYLOTI NAGRI LETTER CHO;Lo;0;L;;;;;N;;;;; +A80E;SYLOTI NAGRI LETTER JO;Lo;0;L;;;;;N;;;;; +A80F;SYLOTI NAGRI LETTER JHO;Lo;0;L;;;;;N;;;;; +A810;SYLOTI NAGRI LETTER TTO;Lo;0;L;;;;;N;;;;; +A811;SYLOTI NAGRI LETTER TTHO;Lo;0;L;;;;;N;;;;; +A812;SYLOTI NAGRI LETTER DDO;Lo;0;L;;;;;N;;;;; +A813;SYLOTI NAGRI LETTER DDHO;Lo;0;L;;;;;N;;;;; +A814;SYLOTI NAGRI LETTER TO;Lo;0;L;;;;;N;;;;; +A815;SYLOTI NAGRI LETTER THO;Lo;0;L;;;;;N;;;;; +A816;SYLOTI NAGRI LETTER DO;Lo;0;L;;;;;N;;;;; +A817;SYLOTI NAGRI LETTER DHO;Lo;0;L;;;;;N;;;;; +A818;SYLOTI NAGRI LETTER NO;Lo;0;L;;;;;N;;;;; +A819;SYLOTI NAGRI LETTER PO;Lo;0;L;;;;;N;;;;; +A81A;SYLOTI NAGRI LETTER PHO;Lo;0;L;;;;;N;;;;; +A81B;SYLOTI NAGRI LETTER BO;Lo;0;L;;;;;N;;;;; +A81C;SYLOTI NAGRI LETTER BHO;Lo;0;L;;;;;N;;;;; +A81D;SYLOTI NAGRI LETTER MO;Lo;0;L;;;;;N;;;;; +A81E;SYLOTI NAGRI LETTER RO;Lo;0;L;;;;;N;;;;; +A81F;SYLOTI NAGRI LETTER LO;Lo;0;L;;;;;N;;;;; +A820;SYLOTI NAGRI LETTER RRO;Lo;0;L;;;;;N;;;;; +A821;SYLOTI NAGRI LETTER SO;Lo;0;L;;;;;N;;;;; +A822;SYLOTI NAGRI LETTER HO;Lo;0;L;;;;;N;;;;; +A823;SYLOTI NAGRI VOWEL SIGN A;Mc;0;L;;;;;N;;;;; +A824;SYLOTI NAGRI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +A825;SYLOTI NAGRI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +A826;SYLOTI NAGRI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +A827;SYLOTI NAGRI VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +A828;SYLOTI NAGRI POETRY MARK-1;So;0;ON;;;;;N;;;;; +A829;SYLOTI NAGRI POETRY MARK-2;So;0;ON;;;;;N;;;;; +A82A;SYLOTI NAGRI POETRY MARK-3;So;0;ON;;;;;N;;;;; +A82B;SYLOTI NAGRI POETRY MARK-4;So;0;ON;;;;;N;;;;; +A840;PHAGS-PA LETTER KA;Lo;0;L;;;;;N;;;;; +A841;PHAGS-PA LETTER KHA;Lo;0;L;;;;;N;;;;; +A842;PHAGS-PA LETTER GA;Lo;0;L;;;;;N;;;;; +A843;PHAGS-PA LETTER NGA;Lo;0;L;;;;;N;;;;; +A844;PHAGS-PA LETTER CA;Lo;0;L;;;;;N;;;;; +A845;PHAGS-PA LETTER CHA;Lo;0;L;;;;;N;;;;; +A846;PHAGS-PA LETTER JA;Lo;0;L;;;;;N;;;;; +A847;PHAGS-PA LETTER NYA;Lo;0;L;;;;;N;;;;; +A848;PHAGS-PA LETTER TA;Lo;0;L;;;;;N;;;;; +A849;PHAGS-PA LETTER THA;Lo;0;L;;;;;N;;;;; +A84A;PHAGS-PA LETTER DA;Lo;0;L;;;;;N;;;;; +A84B;PHAGS-PA LETTER NA;Lo;0;L;;;;;N;;;;; +A84C;PHAGS-PA LETTER PA;Lo;0;L;;;;;N;;;;; +A84D;PHAGS-PA LETTER PHA;Lo;0;L;;;;;N;;;;; +A84E;PHAGS-PA LETTER BA;Lo;0;L;;;;;N;;;;; +A84F;PHAGS-PA LETTER MA;Lo;0;L;;;;;N;;;;; +A850;PHAGS-PA LETTER TSA;Lo;0;L;;;;;N;;;;; +A851;PHAGS-PA LETTER TSHA;Lo;0;L;;;;;N;;;;; +A852;PHAGS-PA LETTER DZA;Lo;0;L;;;;;N;;;;; +A853;PHAGS-PA LETTER WA;Lo;0;L;;;;;N;;;;; +A854;PHAGS-PA LETTER ZHA;Lo;0;L;;;;;N;;;;; +A855;PHAGS-PA LETTER ZA;Lo;0;L;;;;;N;;;;; +A856;PHAGS-PA LETTER SMALL A;Lo;0;L;;;;;N;;;;; +A857;PHAGS-PA LETTER YA;Lo;0;L;;;;;N;;;;; +A858;PHAGS-PA LETTER RA;Lo;0;L;;;;;N;;;;; +A859;PHAGS-PA LETTER LA;Lo;0;L;;;;;N;;;;; +A85A;PHAGS-PA LETTER SHA;Lo;0;L;;;;;N;;;;; +A85B;PHAGS-PA LETTER SA;Lo;0;L;;;;;N;;;;; +A85C;PHAGS-PA LETTER HA;Lo;0;L;;;;;N;;;;; +A85D;PHAGS-PA LETTER A;Lo;0;L;;;;;N;;;;; +A85E;PHAGS-PA LETTER I;Lo;0;L;;;;;N;;;;; +A85F;PHAGS-PA LETTER U;Lo;0;L;;;;;N;;;;; +A860;PHAGS-PA LETTER E;Lo;0;L;;;;;N;;;;; +A861;PHAGS-PA LETTER O;Lo;0;L;;;;;N;;;;; +A862;PHAGS-PA LETTER QA;Lo;0;L;;;;;N;;;;; +A863;PHAGS-PA LETTER XA;Lo;0;L;;;;;N;;;;; +A864;PHAGS-PA LETTER FA;Lo;0;L;;;;;N;;;;; +A865;PHAGS-PA LETTER GGA;Lo;0;L;;;;;N;;;;; +A866;PHAGS-PA LETTER EE;Lo;0;L;;;;;N;;;;; +A867;PHAGS-PA SUBJOINED LETTER WA;Lo;0;L;;;;;N;;;;; +A868;PHAGS-PA SUBJOINED LETTER YA;Lo;0;L;;;;;N;;;;; +A869;PHAGS-PA LETTER TTA;Lo;0;L;;;;;N;;;;; +A86A;PHAGS-PA LETTER TTHA;Lo;0;L;;;;;N;;;;; +A86B;PHAGS-PA LETTER DDA;Lo;0;L;;;;;N;;;;; +A86C;PHAGS-PA LETTER NNA;Lo;0;L;;;;;N;;;;; +A86D;PHAGS-PA LETTER ALTERNATE YA;Lo;0;L;;;;;N;;;;; +A86E;PHAGS-PA LETTER VOICELESS SHA;Lo;0;L;;;;;N;;;;; +A86F;PHAGS-PA LETTER VOICED HA;Lo;0;L;;;;;N;;;;; +A870;PHAGS-PA LETTER ASPIRATED FA;Lo;0;L;;;;;N;;;;; +A871;PHAGS-PA SUBJOINED LETTER RA;Lo;0;L;;;;;N;;;;; +A872;PHAGS-PA SUPERFIXED LETTER RA;Lo;0;L;;;;;N;;;;; +A873;PHAGS-PA LETTER CANDRABINDU;Lo;0;L;;;;;N;;;;; +A874;PHAGS-PA SINGLE HEAD MARK;Po;0;ON;;;;;N;;;;; +A875;PHAGS-PA DOUBLE HEAD MARK;Po;0;ON;;;;;N;;;;; +A876;PHAGS-PA MARK SHAD;Po;0;ON;;;;;N;;;;; +A877;PHAGS-PA MARK DOUBLE SHAD;Po;0;ON;;;;;N;;;;; +A880;SAURASHTRA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +A881;SAURASHTRA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +A882;SAURASHTRA LETTER A;Lo;0;L;;;;;N;;;;; +A883;SAURASHTRA LETTER AA;Lo;0;L;;;;;N;;;;; +A884;SAURASHTRA LETTER I;Lo;0;L;;;;;N;;;;; +A885;SAURASHTRA LETTER II;Lo;0;L;;;;;N;;;;; +A886;SAURASHTRA LETTER U;Lo;0;L;;;;;N;;;;; +A887;SAURASHTRA LETTER UU;Lo;0;L;;;;;N;;;;; +A888;SAURASHTRA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +A889;SAURASHTRA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +A88A;SAURASHTRA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +A88B;SAURASHTRA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +A88C;SAURASHTRA LETTER E;Lo;0;L;;;;;N;;;;; +A88D;SAURASHTRA LETTER EE;Lo;0;L;;;;;N;;;;; +A88E;SAURASHTRA LETTER AI;Lo;0;L;;;;;N;;;;; +A88F;SAURASHTRA LETTER O;Lo;0;L;;;;;N;;;;; +A890;SAURASHTRA LETTER OO;Lo;0;L;;;;;N;;;;; +A891;SAURASHTRA LETTER AU;Lo;0;L;;;;;N;;;;; +A892;SAURASHTRA LETTER KA;Lo;0;L;;;;;N;;;;; +A893;SAURASHTRA LETTER KHA;Lo;0;L;;;;;N;;;;; +A894;SAURASHTRA LETTER GA;Lo;0;L;;;;;N;;;;; +A895;SAURASHTRA LETTER GHA;Lo;0;L;;;;;N;;;;; +A896;SAURASHTRA LETTER NGA;Lo;0;L;;;;;N;;;;; +A897;SAURASHTRA LETTER CA;Lo;0;L;;;;;N;;;;; +A898;SAURASHTRA LETTER CHA;Lo;0;L;;;;;N;;;;; +A899;SAURASHTRA LETTER JA;Lo;0;L;;;;;N;;;;; +A89A;SAURASHTRA LETTER JHA;Lo;0;L;;;;;N;;;;; +A89B;SAURASHTRA LETTER NYA;Lo;0;L;;;;;N;;;;; +A89C;SAURASHTRA LETTER TTA;Lo;0;L;;;;;N;;;;; +A89D;SAURASHTRA LETTER TTHA;Lo;0;L;;;;;N;;;;; +A89E;SAURASHTRA LETTER DDA;Lo;0;L;;;;;N;;;;; +A89F;SAURASHTRA LETTER DDHA;Lo;0;L;;;;;N;;;;; +A8A0;SAURASHTRA LETTER NNA;Lo;0;L;;;;;N;;;;; +A8A1;SAURASHTRA LETTER TA;Lo;0;L;;;;;N;;;;; +A8A2;SAURASHTRA LETTER THA;Lo;0;L;;;;;N;;;;; +A8A3;SAURASHTRA LETTER DA;Lo;0;L;;;;;N;;;;; +A8A4;SAURASHTRA LETTER DHA;Lo;0;L;;;;;N;;;;; +A8A5;SAURASHTRA LETTER NA;Lo;0;L;;;;;N;;;;; +A8A6;SAURASHTRA LETTER PA;Lo;0;L;;;;;N;;;;; +A8A7;SAURASHTRA LETTER PHA;Lo;0;L;;;;;N;;;;; +A8A8;SAURASHTRA LETTER BA;Lo;0;L;;;;;N;;;;; +A8A9;SAURASHTRA LETTER BHA;Lo;0;L;;;;;N;;;;; +A8AA;SAURASHTRA LETTER MA;Lo;0;L;;;;;N;;;;; +A8AB;SAURASHTRA LETTER YA;Lo;0;L;;;;;N;;;;; +A8AC;SAURASHTRA LETTER RA;Lo;0;L;;;;;N;;;;; +A8AD;SAURASHTRA LETTER LA;Lo;0;L;;;;;N;;;;; +A8AE;SAURASHTRA LETTER VA;Lo;0;L;;;;;N;;;;; +A8AF;SAURASHTRA LETTER SHA;Lo;0;L;;;;;N;;;;; +A8B0;SAURASHTRA LETTER SSA;Lo;0;L;;;;;N;;;;; +A8B1;SAURASHTRA LETTER SA;Lo;0;L;;;;;N;;;;; +A8B2;SAURASHTRA LETTER HA;Lo;0;L;;;;;N;;;;; +A8B3;SAURASHTRA LETTER LLA;Lo;0;L;;;;;N;;;;; +A8B4;SAURASHTRA CONSONANT SIGN HAARU;Mc;0;L;;;;;N;;;;; +A8B5;SAURASHTRA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +A8B6;SAURASHTRA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +A8B7;SAURASHTRA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +A8B8;SAURASHTRA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +A8B9;SAURASHTRA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +A8BA;SAURASHTRA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +A8BB;SAURASHTRA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +A8BC;SAURASHTRA VOWEL SIGN VOCALIC L;Mc;0;L;;;;;N;;;;; +A8BD;SAURASHTRA VOWEL SIGN VOCALIC LL;Mc;0;L;;;;;N;;;;; +A8BE;SAURASHTRA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +A8BF;SAURASHTRA VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +A8C0;SAURASHTRA VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +A8C1;SAURASHTRA VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +A8C2;SAURASHTRA VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +A8C3;SAURASHTRA VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +A8C4;SAURASHTRA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +A8CE;SAURASHTRA DANDA;Po;0;L;;;;;N;;;;; +A8CF;SAURASHTRA DOUBLE DANDA;Po;0;L;;;;;N;;;;; +A8D0;SAURASHTRA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +A8D1;SAURASHTRA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A8D2;SAURASHTRA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A8D3;SAURASHTRA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A8D4;SAURASHTRA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A8D5;SAURASHTRA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A8D6;SAURASHTRA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A8D7;SAURASHTRA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A8D8;SAURASHTRA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A8D9;SAURASHTRA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A900;KAYAH LI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +A901;KAYAH LI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A902;KAYAH LI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A903;KAYAH LI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A904;KAYAH LI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A905;KAYAH LI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A906;KAYAH LI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A907;KAYAH LI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A908;KAYAH LI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A909;KAYAH LI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A90A;KAYAH LI LETTER KA;Lo;0;L;;;;;N;;;;; +A90B;KAYAH LI LETTER KHA;Lo;0;L;;;;;N;;;;; +A90C;KAYAH LI LETTER GA;Lo;0;L;;;;;N;;;;; +A90D;KAYAH LI LETTER NGA;Lo;0;L;;;;;N;;;;; +A90E;KAYAH LI LETTER SA;Lo;0;L;;;;;N;;;;; +A90F;KAYAH LI LETTER SHA;Lo;0;L;;;;;N;;;;; +A910;KAYAH LI LETTER ZA;Lo;0;L;;;;;N;;;;; +A911;KAYAH LI LETTER NYA;Lo;0;L;;;;;N;;;;; +A912;KAYAH LI LETTER TA;Lo;0;L;;;;;N;;;;; +A913;KAYAH LI LETTER HTA;Lo;0;L;;;;;N;;;;; +A914;KAYAH LI LETTER NA;Lo;0;L;;;;;N;;;;; +A915;KAYAH LI LETTER PA;Lo;0;L;;;;;N;;;;; +A916;KAYAH LI LETTER PHA;Lo;0;L;;;;;N;;;;; +A917;KAYAH LI LETTER MA;Lo;0;L;;;;;N;;;;; +A918;KAYAH LI LETTER DA;Lo;0;L;;;;;N;;;;; +A919;KAYAH LI LETTER BA;Lo;0;L;;;;;N;;;;; +A91A;KAYAH LI LETTER RA;Lo;0;L;;;;;N;;;;; +A91B;KAYAH LI LETTER YA;Lo;0;L;;;;;N;;;;; +A91C;KAYAH LI LETTER LA;Lo;0;L;;;;;N;;;;; +A91D;KAYAH LI LETTER WA;Lo;0;L;;;;;N;;;;; +A91E;KAYAH LI LETTER THA;Lo;0;L;;;;;N;;;;; +A91F;KAYAH LI LETTER HA;Lo;0;L;;;;;N;;;;; +A920;KAYAH LI LETTER VA;Lo;0;L;;;;;N;;;;; +A921;KAYAH LI LETTER CA;Lo;0;L;;;;;N;;;;; +A922;KAYAH LI LETTER A;Lo;0;L;;;;;N;;;;; +A923;KAYAH LI LETTER OE;Lo;0;L;;;;;N;;;;; +A924;KAYAH LI LETTER I;Lo;0;L;;;;;N;;;;; +A925;KAYAH LI LETTER OO;Lo;0;L;;;;;N;;;;; +A926;KAYAH LI VOWEL UE;Mn;0;NSM;;;;;N;;;;; +A927;KAYAH LI VOWEL E;Mn;0;NSM;;;;;N;;;;; +A928;KAYAH LI VOWEL U;Mn;0;NSM;;;;;N;;;;; +A929;KAYAH LI VOWEL EE;Mn;0;NSM;;;;;N;;;;; +A92A;KAYAH LI VOWEL O;Mn;0;NSM;;;;;N;;;;; +A92B;KAYAH LI TONE PLOPHU;Mn;220;NSM;;;;;N;;;;; +A92C;KAYAH LI TONE CALYA;Mn;220;NSM;;;;;N;;;;; +A92D;KAYAH LI TONE CALYA PLOPHU;Mn;220;NSM;;;;;N;;;;; +A92E;KAYAH LI SIGN CWI;Po;0;L;;;;;N;;;;; +A92F;KAYAH LI SIGN SHYA;Po;0;L;;;;;N;;;;; +A930;REJANG LETTER KA;Lo;0;L;;;;;N;;;;; +A931;REJANG LETTER GA;Lo;0;L;;;;;N;;;;; +A932;REJANG LETTER NGA;Lo;0;L;;;;;N;;;;; +A933;REJANG LETTER TA;Lo;0;L;;;;;N;;;;; +A934;REJANG LETTER DA;Lo;0;L;;;;;N;;;;; +A935;REJANG LETTER NA;Lo;0;L;;;;;N;;;;; +A936;REJANG LETTER PA;Lo;0;L;;;;;N;;;;; +A937;REJANG LETTER BA;Lo;0;L;;;;;N;;;;; +A938;REJANG LETTER MA;Lo;0;L;;;;;N;;;;; +A939;REJANG LETTER CA;Lo;0;L;;;;;N;;;;; +A93A;REJANG LETTER JA;Lo;0;L;;;;;N;;;;; +A93B;REJANG LETTER NYA;Lo;0;L;;;;;N;;;;; +A93C;REJANG LETTER SA;Lo;0;L;;;;;N;;;;; +A93D;REJANG LETTER RA;Lo;0;L;;;;;N;;;;; +A93E;REJANG LETTER LA;Lo;0;L;;;;;N;;;;; +A93F;REJANG LETTER YA;Lo;0;L;;;;;N;;;;; +A940;REJANG LETTER WA;Lo;0;L;;;;;N;;;;; +A941;REJANG LETTER HA;Lo;0;L;;;;;N;;;;; +A942;REJANG LETTER MBA;Lo;0;L;;;;;N;;;;; +A943;REJANG LETTER NGGA;Lo;0;L;;;;;N;;;;; +A944;REJANG LETTER NDA;Lo;0;L;;;;;N;;;;; +A945;REJANG LETTER NYJA;Lo;0;L;;;;;N;;;;; +A946;REJANG LETTER A;Lo;0;L;;;;;N;;;;; +A947;REJANG VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +A948;REJANG VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +A949;REJANG VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +A94A;REJANG VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +A94B;REJANG VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +A94C;REJANG VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +A94D;REJANG VOWEL SIGN EU;Mn;0;NSM;;;;;N;;;;; +A94E;REJANG VOWEL SIGN EA;Mn;0;NSM;;;;;N;;;;; +A94F;REJANG CONSONANT SIGN NG;Mn;0;NSM;;;;;N;;;;; +A950;REJANG CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;; +A951;REJANG CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;; +A952;REJANG CONSONANT SIGN H;Mc;0;L;;;;;N;;;;; +A953;REJANG VIRAMA;Mc;9;L;;;;;N;;;;; +A95F;REJANG SECTION MARK;Po;0;L;;;;;N;;;;; +AA00;CHAM LETTER A;Lo;0;L;;;;;N;;;;; +AA01;CHAM LETTER I;Lo;0;L;;;;;N;;;;; +AA02;CHAM LETTER U;Lo;0;L;;;;;N;;;;; +AA03;CHAM LETTER E;Lo;0;L;;;;;N;;;;; +AA04;CHAM LETTER AI;Lo;0;L;;;;;N;;;;; +AA05;CHAM LETTER O;Lo;0;L;;;;;N;;;;; +AA06;CHAM LETTER KA;Lo;0;L;;;;;N;;;;; +AA07;CHAM LETTER KHA;Lo;0;L;;;;;N;;;;; +AA08;CHAM LETTER GA;Lo;0;L;;;;;N;;;;; +AA09;CHAM LETTER GHA;Lo;0;L;;;;;N;;;;; +AA0A;CHAM LETTER NGUE;Lo;0;L;;;;;N;;;;; +AA0B;CHAM LETTER NGA;Lo;0;L;;;;;N;;;;; +AA0C;CHAM LETTER CHA;Lo;0;L;;;;;N;;;;; +AA0D;CHAM LETTER CHHA;Lo;0;L;;;;;N;;;;; +AA0E;CHAM LETTER JA;Lo;0;L;;;;;N;;;;; +AA0F;CHAM LETTER JHA;Lo;0;L;;;;;N;;;;; +AA10;CHAM LETTER NHUE;Lo;0;L;;;;;N;;;;; +AA11;CHAM LETTER NHA;Lo;0;L;;;;;N;;;;; +AA12;CHAM LETTER NHJA;Lo;0;L;;;;;N;;;;; +AA13;CHAM LETTER TA;Lo;0;L;;;;;N;;;;; +AA14;CHAM LETTER THA;Lo;0;L;;;;;N;;;;; +AA15;CHAM LETTER DA;Lo;0;L;;;;;N;;;;; +AA16;CHAM LETTER DHA;Lo;0;L;;;;;N;;;;; +AA17;CHAM LETTER NUE;Lo;0;L;;;;;N;;;;; +AA18;CHAM LETTER NA;Lo;0;L;;;;;N;;;;; +AA19;CHAM LETTER DDA;Lo;0;L;;;;;N;;;;; +AA1A;CHAM LETTER PA;Lo;0;L;;;;;N;;;;; +AA1B;CHAM LETTER PPA;Lo;0;L;;;;;N;;;;; +AA1C;CHAM LETTER PHA;Lo;0;L;;;;;N;;;;; +AA1D;CHAM LETTER BA;Lo;0;L;;;;;N;;;;; +AA1E;CHAM LETTER BHA;Lo;0;L;;;;;N;;;;; +AA1F;CHAM LETTER MUE;Lo;0;L;;;;;N;;;;; +AA20;CHAM LETTER MA;Lo;0;L;;;;;N;;;;; +AA21;CHAM LETTER BBA;Lo;0;L;;;;;N;;;;; +AA22;CHAM LETTER YA;Lo;0;L;;;;;N;;;;; +AA23;CHAM LETTER RA;Lo;0;L;;;;;N;;;;; +AA24;CHAM LETTER LA;Lo;0;L;;;;;N;;;;; +AA25;CHAM LETTER VA;Lo;0;L;;;;;N;;;;; +AA26;CHAM LETTER SSA;Lo;0;L;;;;;N;;;;; +AA27;CHAM LETTER SA;Lo;0;L;;;;;N;;;;; +AA28;CHAM LETTER HA;Lo;0;L;;;;;N;;;;; +AA29;CHAM VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +AA2A;CHAM VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +AA2B;CHAM VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +AA2C;CHAM VOWEL SIGN EI;Mn;0;NSM;;;;;N;;;;; +AA2D;CHAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +AA2E;CHAM VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;; +AA2F;CHAM VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +AA30;CHAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +AA31;CHAM VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +AA32;CHAM VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; +AA33;CHAM CONSONANT SIGN YA;Mc;0;L;;;;;N;;;;; +AA34;CHAM CONSONANT SIGN RA;Mc;0;L;;;;;N;;;;; +AA35;CHAM CONSONANT SIGN LA;Mn;0;NSM;;;;;N;;;;; +AA36;CHAM CONSONANT SIGN WA;Mn;0;NSM;;;;;N;;;;; +AA40;CHAM LETTER FINAL K;Lo;0;L;;;;;N;;;;; +AA41;CHAM LETTER FINAL G;Lo;0;L;;;;;N;;;;; +AA42;CHAM LETTER FINAL NG;Lo;0;L;;;;;N;;;;; +AA43;CHAM CONSONANT SIGN FINAL NG;Mn;0;NSM;;;;;N;;;;; +AA44;CHAM LETTER FINAL CH;Lo;0;L;;;;;N;;;;; +AA45;CHAM LETTER FINAL T;Lo;0;L;;;;;N;;;;; +AA46;CHAM LETTER FINAL N;Lo;0;L;;;;;N;;;;; +AA47;CHAM LETTER FINAL P;Lo;0;L;;;;;N;;;;; +AA48;CHAM LETTER FINAL Y;Lo;0;L;;;;;N;;;;; +AA49;CHAM LETTER FINAL R;Lo;0;L;;;;;N;;;;; +AA4A;CHAM LETTER FINAL L;Lo;0;L;;;;;N;;;;; +AA4B;CHAM LETTER FINAL SS;Lo;0;L;;;;;N;;;;; +AA4C;CHAM CONSONANT SIGN FINAL M;Mn;0;NSM;;;;;N;;;;; +AA4D;CHAM CONSONANT SIGN FINAL H;Mc;0;L;;;;;N;;;;; +AA50;CHAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +AA51;CHAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +AA52;CHAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +AA53;CHAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +AA54;CHAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +AA55;CHAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +AA56;CHAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +AA57;CHAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +AA58;CHAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +AA59;CHAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +AA5C;CHAM PUNCTUATION SPIRAL;Po;0;L;;;;;N;;;;; +AA5D;CHAM PUNCTUATION DANDA;Po;0;L;;;;;N;;;;; +AA5E;CHAM PUNCTUATION DOUBLE DANDA;Po;0;L;;;;;N;;;;; +AA5F;CHAM PUNCTUATION TRIPLE DANDA;Po;0;L;;;;;N;;;;; AC00;<Hangul Syllable, First>;Lo;0;L;;;;;N;;;;; D7A3;<Hangul Syllable, Last>;Lo;0;L;;;;;N;;;;; D800;<Non Private Use High Surrogate, First>;Cs;0;L;;;;;N;;;;; @@ -10729,7 +13247,7 @@ F967;CJK COMPATIBILITY IDEOGRAPH-F967;Lo;0;L;4E0D;;;;N;;;;; F968;CJK COMPATIBILITY IDEOGRAPH-F968;Lo;0;L;6CCC;;;;N;;;;; F969;CJK COMPATIBILITY IDEOGRAPH-F969;Lo;0;L;6578;;;;N;;;;; F96A;CJK COMPATIBILITY IDEOGRAPH-F96A;Lo;0;L;7D22;;;;N;;;;; -F96B;CJK COMPATIBILITY IDEOGRAPH-F96B;Lo;0;L;53C3;;;;N;;;;; +F96B;CJK COMPATIBILITY IDEOGRAPH-F96B;Lo;0;L;53C3;;;3;N;;;;; F96C;CJK COMPATIBILITY IDEOGRAPH-F96C;Lo;0;L;585E;;;;N;;;;; F96D;CJK COMPATIBILITY IDEOGRAPH-F96D;Lo;0;L;7701;;;;N;;;;; F96E;CJK COMPATIBILITY IDEOGRAPH-F96E;Lo;0;L;8449;;;;N;;;;; @@ -10737,12 +13255,12 @@ F96F;CJK COMPATIBILITY IDEOGRAPH-F96F;Lo;0;L;8AAA;;;;N;;;;; F970;CJK COMPATIBILITY IDEOGRAPH-F970;Lo;0;L;6BBA;;;;N;;;;; F971;CJK COMPATIBILITY IDEOGRAPH-F971;Lo;0;L;8FB0;;;;N;;;;; F972;CJK COMPATIBILITY IDEOGRAPH-F972;Lo;0;L;6C88;;;;N;;;;; -F973;CJK COMPATIBILITY IDEOGRAPH-F973;Lo;0;L;62FE;;;;N;;;;; +F973;CJK COMPATIBILITY IDEOGRAPH-F973;Lo;0;L;62FE;;;10;N;;;;; F974;CJK COMPATIBILITY IDEOGRAPH-F974;Lo;0;L;82E5;;;;N;;;;; F975;CJK COMPATIBILITY IDEOGRAPH-F975;Lo;0;L;63A0;;;;N;;;;; F976;CJK COMPATIBILITY IDEOGRAPH-F976;Lo;0;L;7565;;;;N;;;;; F977;CJK COMPATIBILITY IDEOGRAPH-F977;Lo;0;L;4EAE;;;;N;;;;; -F978;CJK COMPATIBILITY IDEOGRAPH-F978;Lo;0;L;5169;;;;N;;;;; +F978;CJK COMPATIBILITY IDEOGRAPH-F978;Lo;0;L;5169;;;2;N;;;;; F979;CJK COMPATIBILITY IDEOGRAPH-F979;Lo;0;L;51C9;;;;N;;;;; F97A;CJK COMPATIBILITY IDEOGRAPH-F97A;Lo;0;L;6881;;;;N;;;;; F97B;CJK COMPATIBILITY IDEOGRAPH-F97B;Lo;0;L;7CE7;;;;N;;;;; @@ -10800,7 +13318,7 @@ F9AE;CJK COMPATIBILITY IDEOGRAPH-F9AE;Lo;0;L;7469;;;;N;;;;; F9AF;CJK COMPATIBILITY IDEOGRAPH-F9AF;Lo;0;L;7F9A;;;;N;;;;; F9B0;CJK COMPATIBILITY IDEOGRAPH-F9B0;Lo;0;L;8046;;;;N;;;;; F9B1;CJK COMPATIBILITY IDEOGRAPH-F9B1;Lo;0;L;9234;;;;N;;;;; -F9B2;CJK COMPATIBILITY IDEOGRAPH-F9B2;Lo;0;L;96F6;;;;N;;;;; +F9B2;CJK COMPATIBILITY IDEOGRAPH-F9B2;Lo;0;L;96F6;;;0;N;;;;; F9B3;CJK COMPATIBILITY IDEOGRAPH-F9B3;Lo;0;L;9748;;;;N;;;;; F9B4;CJK COMPATIBILITY IDEOGRAPH-F9B4;Lo;0;L;9818;;;;N;;;;; F9B5;CJK COMPATIBILITY IDEOGRAPH-F9B5;Lo;0;L;4F8B;;;;N;;;;; @@ -10831,9 +13349,9 @@ F9CD;CJK COMPATIBILITY IDEOGRAPH-F9CD;Lo;0;L;7559;;;;N;;;;; F9CE;CJK COMPATIBILITY IDEOGRAPH-F9CE;Lo;0;L;786B;;;;N;;;;; F9CF;CJK COMPATIBILITY IDEOGRAPH-F9CF;Lo;0;L;7D10;;;;N;;;;; F9D0;CJK COMPATIBILITY IDEOGRAPH-F9D0;Lo;0;L;985E;;;;N;;;;; -F9D1;CJK COMPATIBILITY IDEOGRAPH-F9D1;Lo;0;L;516D;;;;N;;;;; +F9D1;CJK COMPATIBILITY IDEOGRAPH-F9D1;Lo;0;L;516D;;;6;N;;;;; F9D2;CJK COMPATIBILITY IDEOGRAPH-F9D2;Lo;0;L;622E;;;;N;;;;; -F9D3;CJK COMPATIBILITY IDEOGRAPH-F9D3;Lo;0;L;9678;;;;N;;;;; +F9D3;CJK COMPATIBILITY IDEOGRAPH-F9D3;Lo;0;L;9678;;;6;N;;;;; F9D4;CJK COMPATIBILITY IDEOGRAPH-F9D4;Lo;0;L;502B;;;;N;;;;; F9D5;CJK COMPATIBILITY IDEOGRAPH-F9D5;Lo;0;L;5D19;;;;N;;;;; F9D6;CJK COMPATIBILITY IDEOGRAPH-F9D6;Lo;0;L;6DEA;;;;N;;;;; @@ -10875,7 +13393,7 @@ F9F9;CJK COMPATIBILITY IDEOGRAPH-F9F9;Lo;0;L;7C92;;;;N;;;;; F9FA;CJK COMPATIBILITY IDEOGRAPH-F9FA;Lo;0;L;72C0;;;;N;;;;; F9FB;CJK COMPATIBILITY IDEOGRAPH-F9FB;Lo;0;L;7099;;;;N;;;;; F9FC;CJK COMPATIBILITY IDEOGRAPH-F9FC;Lo;0;L;8B58;;;;N;;;;; -F9FD;CJK COMPATIBILITY IDEOGRAPH-F9FD;Lo;0;L;4EC0;;;;N;;;;; +F9FD;CJK COMPATIBILITY IDEOGRAPH-F9FD;Lo;0;L;4EC0;;;10;N;;;;; F9FE;CJK COMPATIBILITY IDEOGRAPH-F9FE;Lo;0;L;8336;;;;N;;;;; F9FF;CJK COMPATIBILITY IDEOGRAPH-F9FF;Lo;0;L;523A;;;;N;;;;; FA00;CJK COMPATIBILITY IDEOGRAPH-FA00;Lo;0;L;5207;;;;N;;;;; @@ -10983,6 +13501,112 @@ FA67;CJK COMPATIBILITY IDEOGRAPH-FA67;Lo;0;L;9038;;;;N;;;;; FA68;CJK COMPATIBILITY IDEOGRAPH-FA68;Lo;0;L;96E3;;;;N;;;;; FA69;CJK COMPATIBILITY IDEOGRAPH-FA69;Lo;0;L;97FF;;;;N;;;;; FA6A;CJK COMPATIBILITY IDEOGRAPH-FA6A;Lo;0;L;983B;;;;N;;;;; +FA70;CJK COMPATIBILITY IDEOGRAPH-FA70;Lo;0;L;4E26;;;;N;;;;; +FA71;CJK COMPATIBILITY IDEOGRAPH-FA71;Lo;0;L;51B5;;;;N;;;;; +FA72;CJK COMPATIBILITY IDEOGRAPH-FA72;Lo;0;L;5168;;;;N;;;;; +FA73;CJK COMPATIBILITY IDEOGRAPH-FA73;Lo;0;L;4F80;;;;N;;;;; +FA74;CJK COMPATIBILITY IDEOGRAPH-FA74;Lo;0;L;5145;;;;N;;;;; +FA75;CJK COMPATIBILITY IDEOGRAPH-FA75;Lo;0;L;5180;;;;N;;;;; +FA76;CJK COMPATIBILITY IDEOGRAPH-FA76;Lo;0;L;52C7;;;;N;;;;; +FA77;CJK COMPATIBILITY IDEOGRAPH-FA77;Lo;0;L;52FA;;;;N;;;;; +FA78;CJK COMPATIBILITY IDEOGRAPH-FA78;Lo;0;L;559D;;;;N;;;;; +FA79;CJK COMPATIBILITY IDEOGRAPH-FA79;Lo;0;L;5555;;;;N;;;;; +FA7A;CJK COMPATIBILITY IDEOGRAPH-FA7A;Lo;0;L;5599;;;;N;;;;; +FA7B;CJK COMPATIBILITY IDEOGRAPH-FA7B;Lo;0;L;55E2;;;;N;;;;; +FA7C;CJK COMPATIBILITY IDEOGRAPH-FA7C;Lo;0;L;585A;;;;N;;;;; +FA7D;CJK COMPATIBILITY IDEOGRAPH-FA7D;Lo;0;L;58B3;;;;N;;;;; +FA7E;CJK COMPATIBILITY IDEOGRAPH-FA7E;Lo;0;L;5944;;;;N;;;;; +FA7F;CJK COMPATIBILITY IDEOGRAPH-FA7F;Lo;0;L;5954;;;;N;;;;; +FA80;CJK COMPATIBILITY IDEOGRAPH-FA80;Lo;0;L;5A62;;;;N;;;;; +FA81;CJK COMPATIBILITY IDEOGRAPH-FA81;Lo;0;L;5B28;;;;N;;;;; +FA82;CJK COMPATIBILITY IDEOGRAPH-FA82;Lo;0;L;5ED2;;;;N;;;;; +FA83;CJK COMPATIBILITY IDEOGRAPH-FA83;Lo;0;L;5ED9;;;;N;;;;; +FA84;CJK COMPATIBILITY IDEOGRAPH-FA84;Lo;0;L;5F69;;;;N;;;;; +FA85;CJK COMPATIBILITY IDEOGRAPH-FA85;Lo;0;L;5FAD;;;;N;;;;; +FA86;CJK COMPATIBILITY IDEOGRAPH-FA86;Lo;0;L;60D8;;;;N;;;;; +FA87;CJK COMPATIBILITY IDEOGRAPH-FA87;Lo;0;L;614E;;;;N;;;;; +FA88;CJK COMPATIBILITY IDEOGRAPH-FA88;Lo;0;L;6108;;;;N;;;;; +FA89;CJK COMPATIBILITY IDEOGRAPH-FA89;Lo;0;L;618E;;;;N;;;;; +FA8A;CJK COMPATIBILITY IDEOGRAPH-FA8A;Lo;0;L;6160;;;;N;;;;; +FA8B;CJK COMPATIBILITY IDEOGRAPH-FA8B;Lo;0;L;61F2;;;;N;;;;; +FA8C;CJK COMPATIBILITY IDEOGRAPH-FA8C;Lo;0;L;6234;;;;N;;;;; +FA8D;CJK COMPATIBILITY IDEOGRAPH-FA8D;Lo;0;L;63C4;;;;N;;;;; +FA8E;CJK COMPATIBILITY IDEOGRAPH-FA8E;Lo;0;L;641C;;;;N;;;;; +FA8F;CJK COMPATIBILITY IDEOGRAPH-FA8F;Lo;0;L;6452;;;;N;;;;; +FA90;CJK COMPATIBILITY IDEOGRAPH-FA90;Lo;0;L;6556;;;;N;;;;; +FA91;CJK COMPATIBILITY IDEOGRAPH-FA91;Lo;0;L;6674;;;;N;;;;; +FA92;CJK COMPATIBILITY IDEOGRAPH-FA92;Lo;0;L;6717;;;;N;;;;; +FA93;CJK COMPATIBILITY IDEOGRAPH-FA93;Lo;0;L;671B;;;;N;;;;; +FA94;CJK COMPATIBILITY IDEOGRAPH-FA94;Lo;0;L;6756;;;;N;;;;; +FA95;CJK COMPATIBILITY IDEOGRAPH-FA95;Lo;0;L;6B79;;;;N;;;;; +FA96;CJK COMPATIBILITY IDEOGRAPH-FA96;Lo;0;L;6BBA;;;;N;;;;; +FA97;CJK COMPATIBILITY IDEOGRAPH-FA97;Lo;0;L;6D41;;;;N;;;;; +FA98;CJK COMPATIBILITY IDEOGRAPH-FA98;Lo;0;L;6EDB;;;;N;;;;; +FA99;CJK COMPATIBILITY IDEOGRAPH-FA99;Lo;0;L;6ECB;;;;N;;;;; +FA9A;CJK COMPATIBILITY IDEOGRAPH-FA9A;Lo;0;L;6F22;;;;N;;;;; +FA9B;CJK COMPATIBILITY IDEOGRAPH-FA9B;Lo;0;L;701E;;;;N;;;;; +FA9C;CJK COMPATIBILITY IDEOGRAPH-FA9C;Lo;0;L;716E;;;;N;;;;; +FA9D;CJK COMPATIBILITY IDEOGRAPH-FA9D;Lo;0;L;77A7;;;;N;;;;; +FA9E;CJK COMPATIBILITY IDEOGRAPH-FA9E;Lo;0;L;7235;;;;N;;;;; +FA9F;CJK COMPATIBILITY IDEOGRAPH-FA9F;Lo;0;L;72AF;;;;N;;;;; +FAA0;CJK COMPATIBILITY IDEOGRAPH-FAA0;Lo;0;L;732A;;;;N;;;;; +FAA1;CJK COMPATIBILITY IDEOGRAPH-FAA1;Lo;0;L;7471;;;;N;;;;; +FAA2;CJK COMPATIBILITY IDEOGRAPH-FAA2;Lo;0;L;7506;;;;N;;;;; +FAA3;CJK COMPATIBILITY IDEOGRAPH-FAA3;Lo;0;L;753B;;;;N;;;;; +FAA4;CJK COMPATIBILITY IDEOGRAPH-FAA4;Lo;0;L;761D;;;;N;;;;; +FAA5;CJK COMPATIBILITY IDEOGRAPH-FAA5;Lo;0;L;761F;;;;N;;;;; +FAA6;CJK COMPATIBILITY IDEOGRAPH-FAA6;Lo;0;L;76CA;;;;N;;;;; +FAA7;CJK COMPATIBILITY IDEOGRAPH-FAA7;Lo;0;L;76DB;;;;N;;;;; +FAA8;CJK COMPATIBILITY IDEOGRAPH-FAA8;Lo;0;L;76F4;;;;N;;;;; +FAA9;CJK COMPATIBILITY IDEOGRAPH-FAA9;Lo;0;L;774A;;;;N;;;;; +FAAA;CJK COMPATIBILITY IDEOGRAPH-FAAA;Lo;0;L;7740;;;;N;;;;; +FAAB;CJK COMPATIBILITY IDEOGRAPH-FAAB;Lo;0;L;78CC;;;;N;;;;; +FAAC;CJK COMPATIBILITY IDEOGRAPH-FAAC;Lo;0;L;7AB1;;;;N;;;;; +FAAD;CJK COMPATIBILITY IDEOGRAPH-FAAD;Lo;0;L;7BC0;;;;N;;;;; +FAAE;CJK COMPATIBILITY IDEOGRAPH-FAAE;Lo;0;L;7C7B;;;;N;;;;; +FAAF;CJK COMPATIBILITY IDEOGRAPH-FAAF;Lo;0;L;7D5B;;;;N;;;;; +FAB0;CJK COMPATIBILITY IDEOGRAPH-FAB0;Lo;0;L;7DF4;;;;N;;;;; +FAB1;CJK COMPATIBILITY IDEOGRAPH-FAB1;Lo;0;L;7F3E;;;;N;;;;; +FAB2;CJK COMPATIBILITY IDEOGRAPH-FAB2;Lo;0;L;8005;;;;N;;;;; +FAB3;CJK COMPATIBILITY IDEOGRAPH-FAB3;Lo;0;L;8352;;;;N;;;;; +FAB4;CJK COMPATIBILITY IDEOGRAPH-FAB4;Lo;0;L;83EF;;;;N;;;;; +FAB5;CJK COMPATIBILITY IDEOGRAPH-FAB5;Lo;0;L;8779;;;;N;;;;; +FAB6;CJK COMPATIBILITY IDEOGRAPH-FAB6;Lo;0;L;8941;;;;N;;;;; +FAB7;CJK COMPATIBILITY IDEOGRAPH-FAB7;Lo;0;L;8986;;;;N;;;;; +FAB8;CJK COMPATIBILITY IDEOGRAPH-FAB8;Lo;0;L;8996;;;;N;;;;; +FAB9;CJK COMPATIBILITY IDEOGRAPH-FAB9;Lo;0;L;8ABF;;;;N;;;;; +FABA;CJK COMPATIBILITY IDEOGRAPH-FABA;Lo;0;L;8AF8;;;;N;;;;; +FABB;CJK COMPATIBILITY IDEOGRAPH-FABB;Lo;0;L;8ACB;;;;N;;;;; +FABC;CJK COMPATIBILITY IDEOGRAPH-FABC;Lo;0;L;8B01;;;;N;;;;; +FABD;CJK COMPATIBILITY IDEOGRAPH-FABD;Lo;0;L;8AFE;;;;N;;;;; +FABE;CJK COMPATIBILITY IDEOGRAPH-FABE;Lo;0;L;8AED;;;;N;;;;; +FABF;CJK COMPATIBILITY IDEOGRAPH-FABF;Lo;0;L;8B39;;;;N;;;;; +FAC0;CJK COMPATIBILITY IDEOGRAPH-FAC0;Lo;0;L;8B8A;;;;N;;;;; +FAC1;CJK COMPATIBILITY IDEOGRAPH-FAC1;Lo;0;L;8D08;;;;N;;;;; +FAC2;CJK COMPATIBILITY IDEOGRAPH-FAC2;Lo;0;L;8F38;;;;N;;;;; +FAC3;CJK COMPATIBILITY IDEOGRAPH-FAC3;Lo;0;L;9072;;;;N;;;;; +FAC4;CJK COMPATIBILITY IDEOGRAPH-FAC4;Lo;0;L;9199;;;;N;;;;; +FAC5;CJK COMPATIBILITY IDEOGRAPH-FAC5;Lo;0;L;9276;;;;N;;;;; +FAC6;CJK COMPATIBILITY IDEOGRAPH-FAC6;Lo;0;L;967C;;;;N;;;;; +FAC7;CJK COMPATIBILITY IDEOGRAPH-FAC7;Lo;0;L;96E3;;;;N;;;;; +FAC8;CJK COMPATIBILITY IDEOGRAPH-FAC8;Lo;0;L;9756;;;;N;;;;; +FAC9;CJK COMPATIBILITY IDEOGRAPH-FAC9;Lo;0;L;97DB;;;;N;;;;; +FACA;CJK COMPATIBILITY IDEOGRAPH-FACA;Lo;0;L;97FF;;;;N;;;;; +FACB;CJK COMPATIBILITY IDEOGRAPH-FACB;Lo;0;L;980B;;;;N;;;;; +FACC;CJK COMPATIBILITY IDEOGRAPH-FACC;Lo;0;L;983B;;;;N;;;;; +FACD;CJK COMPATIBILITY IDEOGRAPH-FACD;Lo;0;L;9B12;;;;N;;;;; +FACE;CJK COMPATIBILITY IDEOGRAPH-FACE;Lo;0;L;9F9C;;;;N;;;;; +FACF;CJK COMPATIBILITY IDEOGRAPH-FACF;Lo;0;L;2284A;;;;N;;;;; +FAD0;CJK COMPATIBILITY IDEOGRAPH-FAD0;Lo;0;L;22844;;;;N;;;;; +FAD1;CJK COMPATIBILITY IDEOGRAPH-FAD1;Lo;0;L;233D5;;;;N;;;;; +FAD2;CJK COMPATIBILITY IDEOGRAPH-FAD2;Lo;0;L;3B9D;;;;N;;;;; +FAD3;CJK COMPATIBILITY IDEOGRAPH-FAD3;Lo;0;L;4018;;;;N;;;;; +FAD4;CJK COMPATIBILITY IDEOGRAPH-FAD4;Lo;0;L;4039;;;;N;;;;; +FAD5;CJK COMPATIBILITY IDEOGRAPH-FAD5;Lo;0;L;25249;;;;N;;;;; +FAD6;CJK COMPATIBILITY IDEOGRAPH-FAD6;Lo;0;L;25CD0;;;;N;;;;; +FAD7;CJK COMPATIBILITY IDEOGRAPH-FAD7;Lo;0;L;27ED3;;;;N;;;;; +FAD8;CJK COMPATIBILITY IDEOGRAPH-FAD8;Lo;0;L;9F43;;;;N;;;;; +FAD9;CJK COMPATIBILITY IDEOGRAPH-FAD9;Lo;0;L;9F8E;;;;N;;;;; FB00;LATIN SMALL LIGATURE FF;Ll;0;L;<compat> 0066 0066;;;;N;;;;; FB01;LATIN SMALL LIGATURE FI;Ll;0;L;<compat> 0066 0069;;;;N;;;;; FB02;LATIN SMALL LIGATURE FL;Ll;0;L;<compat> 0066 006C;;;;N;;;;; @@ -11007,7 +13631,7 @@ FB25;HEBREW LETTER WIDE LAMED;Lo;0;R;<font> 05DC;;;;N;;;;; FB26;HEBREW LETTER WIDE FINAL MEM;Lo;0;R;<font> 05DD;;;;N;;;;; FB27;HEBREW LETTER WIDE RESH;Lo;0;R;<font> 05E8;;;;N;;;;; FB28;HEBREW LETTER WIDE TAV;Lo;0;R;<font> 05EA;;;;N;;;;; -FB29;HEBREW LETTER ALTERNATIVE PLUS SIGN;Sm;0;ET;<font> 002B;;;;N;;;;; +FB29;HEBREW LETTER ALTERNATIVE PLUS SIGN;Sm;0;ES;<font> 002B;;;;N;;;;; FB2A;HEBREW LETTER SHIN WITH SHIN DOT;Lo;0;R;05E9 05C1;;;;N;;;;; FB2B;HEBREW LETTER SHIN WITH SIN DOT;Lo;0;R;05E9 05C2;;;;N;;;;; FB2C;HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT;Lo;0;R;FB49 05C1;;;;N;;;;; @@ -11652,10 +14276,23 @@ FE0C;VARIATION SELECTOR-13;Mn;0;NSM;;;;;N;;;;; FE0D;VARIATION SELECTOR-14;Mn;0;NSM;;;;;N;;;;; FE0E;VARIATION SELECTOR-15;Mn;0;NSM;;;;;N;;;;; FE0F;VARIATION SELECTOR-16;Mn;0;NSM;;;;;N;;;;; +FE10;PRESENTATION FORM FOR VERTICAL COMMA;Po;0;ON;<vertical> 002C;;;;N;;;;; +FE11;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA;Po;0;ON;<vertical> 3001;;;;N;;;;; +FE12;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP;Po;0;ON;<vertical> 3002;;;;N;;;;; +FE13;PRESENTATION FORM FOR VERTICAL COLON;Po;0;ON;<vertical> 003A;;;;N;;;;; +FE14;PRESENTATION FORM FOR VERTICAL SEMICOLON;Po;0;ON;<vertical> 003B;;;;N;;;;; +FE15;PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK;Po;0;ON;<vertical> 0021;;;;N;;;;; +FE16;PRESENTATION FORM FOR VERTICAL QUESTION MARK;Po;0;ON;<vertical> 003F;;;;N;;;;; +FE17;PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET;Ps;0;ON;<vertical> 3016;;;;N;;;;; +FE18;PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET;Pe;0;ON;<vertical> 3017;;;;N;;;;; +FE19;PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS;Po;0;ON;<vertical> 2026;;;;N;;;;; FE20;COMBINING LIGATURE LEFT HALF;Mn;230;NSM;;;;;N;;;;; FE21;COMBINING LIGATURE RIGHT HALF;Mn;230;NSM;;;;;N;;;;; FE22;COMBINING DOUBLE TILDE LEFT HALF;Mn;230;NSM;;;;;N;;;;; FE23;COMBINING DOUBLE TILDE RIGHT HALF;Mn;230;NSM;;;;;N;;;;; +FE24;COMBINING MACRON LEFT HALF;Mn;230;NSM;;;;;N;;;;; +FE25;COMBINING MACRON RIGHT HALF;Mn;230;NSM;;;;;N;;;;; +FE26;COMBINING CONJOINING MACRON;Mn;230;NSM;;;;;N;;;;; FE30;PRESENTATION FORM FOR VERTICAL TWO DOT LEADER;Po;0;ON;<vertical> 2025;;;;N;GLYPH FOR VERTICAL TWO DOT LEADER;;;; FE31;PRESENTATION FORM FOR VERTICAL EM DASH;Pd;0;ON;<vertical> 2014;;;;N;GLYPH FOR VERTICAL EM DASH;;;; FE32;PRESENTATION FORM FOR VERTICAL EN DASH;Pd;0;ON;<vertical> 2013;;;;N;GLYPH FOR VERTICAL EN DASH;;;; @@ -11696,19 +14333,19 @@ FE55;SMALL COLON;Po;0;CS;<small> 003A;;;;N;;;;; FE56;SMALL QUESTION MARK;Po;0;ON;<small> 003F;;;;N;;;;; FE57;SMALL EXCLAMATION MARK;Po;0;ON;<small> 0021;;;;N;;;;; FE58;SMALL EM DASH;Pd;0;ON;<small> 2014;;;;N;;;;; -FE59;SMALL LEFT PARENTHESIS;Ps;0;ON;<small> 0028;;;;N;SMALL OPENING PARENTHESIS;;;; -FE5A;SMALL RIGHT PARENTHESIS;Pe;0;ON;<small> 0029;;;;N;SMALL CLOSING PARENTHESIS;;;; -FE5B;SMALL LEFT CURLY BRACKET;Ps;0;ON;<small> 007B;;;;N;SMALL OPENING CURLY BRACKET;;;; -FE5C;SMALL RIGHT CURLY BRACKET;Pe;0;ON;<small> 007D;;;;N;SMALL CLOSING CURLY BRACKET;;;; -FE5D;SMALL LEFT TORTOISE SHELL BRACKET;Ps;0;ON;<small> 3014;;;;N;SMALL OPENING TORTOISE SHELL BRACKET;;;; -FE5E;SMALL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;<small> 3015;;;;N;SMALL CLOSING TORTOISE SHELL BRACKET;;;; +FE59;SMALL LEFT PARENTHESIS;Ps;0;ON;<small> 0028;;;;Y;SMALL OPENING PARENTHESIS;;;; +FE5A;SMALL RIGHT PARENTHESIS;Pe;0;ON;<small> 0029;;;;Y;SMALL CLOSING PARENTHESIS;;;; +FE5B;SMALL LEFT CURLY BRACKET;Ps;0;ON;<small> 007B;;;;Y;SMALL OPENING CURLY BRACKET;;;; +FE5C;SMALL RIGHT CURLY BRACKET;Pe;0;ON;<small> 007D;;;;Y;SMALL CLOSING CURLY BRACKET;;;; +FE5D;SMALL LEFT TORTOISE SHELL BRACKET;Ps;0;ON;<small> 3014;;;;Y;SMALL OPENING TORTOISE SHELL BRACKET;;;; +FE5E;SMALL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;<small> 3015;;;;Y;SMALL CLOSING TORTOISE SHELL BRACKET;;;; FE5F;SMALL NUMBER SIGN;Po;0;ET;<small> 0023;;;;N;;;;; FE60;SMALL AMPERSAND;Po;0;ON;<small> 0026;;;;N;;;;; FE61;SMALL ASTERISK;Po;0;ON;<small> 002A;;;;N;;;;; -FE62;SMALL PLUS SIGN;Sm;0;ET;<small> 002B;;;;N;;;;; -FE63;SMALL HYPHEN-MINUS;Pd;0;ET;<small> 002D;;;;N;;;;; -FE64;SMALL LESS-THAN SIGN;Sm;0;ON;<small> 003C;;;;N;;;;; -FE65;SMALL GREATER-THAN SIGN;Sm;0;ON;<small> 003E;;;;N;;;;; +FE62;SMALL PLUS SIGN;Sm;0;ES;<small> 002B;;;;N;;;;; +FE63;SMALL HYPHEN-MINUS;Pd;0;ES;<small> 002D;;;;N;;;;; +FE64;SMALL LESS-THAN SIGN;Sm;0;ON;<small> 003C;;;;Y;;;;; +FE65;SMALL GREATER-THAN SIGN;Sm;0;ON;<small> 003E;;;;Y;;;;; FE66;SMALL EQUALS SIGN;Sm;0;ON;<small> 003D;;;;N;;;;; FE68;SMALL REVERSE SOLIDUS;Po;0;ON;<small> 005C;;;;N;SMALL BACKSLASH;;;; FE69;SMALL DOLLAR SIGN;Sc;0;ET;<small> 0024;;;;N;;;;; @@ -11865,11 +14502,11 @@ FF07;FULLWIDTH APOSTROPHE;Po;0;ON;<wide> 0027;;;;N;;;;; FF08;FULLWIDTH LEFT PARENTHESIS;Ps;0;ON;<wide> 0028;;;;Y;FULLWIDTH OPENING PARENTHESIS;;;; FF09;FULLWIDTH RIGHT PARENTHESIS;Pe;0;ON;<wide> 0029;;;;Y;FULLWIDTH CLOSING PARENTHESIS;;;; FF0A;FULLWIDTH ASTERISK;Po;0;ON;<wide> 002A;;;;N;;;;; -FF0B;FULLWIDTH PLUS SIGN;Sm;0;ET;<wide> 002B;;;;N;;;;; +FF0B;FULLWIDTH PLUS SIGN;Sm;0;ES;<wide> 002B;;;;N;;;;; FF0C;FULLWIDTH COMMA;Po;0;CS;<wide> 002C;;;;N;;;;; -FF0D;FULLWIDTH HYPHEN-MINUS;Pd;0;ET;<wide> 002D;;;;N;;;;; +FF0D;FULLWIDTH HYPHEN-MINUS;Pd;0;ES;<wide> 002D;;;;N;;;;; FF0E;FULLWIDTH FULL STOP;Po;0;CS;<wide> 002E;;;;N;FULLWIDTH PERIOD;;;; -FF0F;FULLWIDTH SOLIDUS;Po;0;ES;<wide> 002F;;;;N;FULLWIDTH SLASH;;;; +FF0F;FULLWIDTH SOLIDUS;Po;0;CS;<wide> 002F;;;;N;FULLWIDTH SLASH;;;; FF10;FULLWIDTH DIGIT ZERO;Nd;0;EN;<wide> 0030;0;0;0;N;;;;; FF11;FULLWIDTH DIGIT ONE;Nd;0;EN;<wide> 0031;1;1;1;N;;;;; FF12;FULLWIDTH DIGIT TWO;Nd;0;EN;<wide> 0032;2;2;2;N;;;;; @@ -11955,7 +14592,7 @@ FF61;HALFWIDTH IDEOGRAPHIC FULL STOP;Po;0;ON;<narrow> 3002;;;;N;HALFWIDTH IDEOGR FF62;HALFWIDTH LEFT CORNER BRACKET;Ps;0;ON;<narrow> 300C;;;;Y;HALFWIDTH OPENING CORNER BRACKET;;;; FF63;HALFWIDTH RIGHT CORNER BRACKET;Pe;0;ON;<narrow> 300D;;;;Y;HALFWIDTH CLOSING CORNER BRACKET;;;; FF64;HALFWIDTH IDEOGRAPHIC COMMA;Po;0;ON;<narrow> 3001;;;;N;;;;; -FF65;HALFWIDTH KATAKANA MIDDLE DOT;Pc;0;ON;<narrow> 30FB;;;;N;;;;; +FF65;HALFWIDTH KATAKANA MIDDLE DOT;Po;0;ON;<narrow> 30FB;;;;N;;;;; FF66;HALFWIDTH KATAKANA LETTER WO;Lo;0;L;<narrow> 30F2;;;;N;;;;; FF67;HALFWIDTH KATAKANA LETTER SMALL A;Lo;0;L;<narrow> 30A1;;;;N;;;;; FF68;HALFWIDTH KATAKANA LETTER SMALL I;Lo;0;L;<narrow> 30A3;;;;N;;;;; @@ -12080,9 +14717,9 @@ FFEB;HALFWIDTH RIGHTWARDS ARROW;Sm;0;ON;<narrow> 2192;;;;N;;;;; FFEC;HALFWIDTH DOWNWARDS ARROW;Sm;0;ON;<narrow> 2193;;;;N;;;;; FFED;HALFWIDTH BLACK SQUARE;So;0;ON;<narrow> 25A0;;;;N;;;;; FFEE;HALFWIDTH WHITE CIRCLE;So;0;ON;<narrow> 25CB;;;;N;;;;; -FFF9;INTERLINEAR ANNOTATION ANCHOR;Cf;0;BN;;;;;N;;;;; -FFFA;INTERLINEAR ANNOTATION SEPARATOR;Cf;0;BN;;;;;N;;;;; -FFFB;INTERLINEAR ANNOTATION TERMINATOR;Cf;0;BN;;;;;N;;;;; +FFF9;INTERLINEAR ANNOTATION ANCHOR;Cf;0;ON;;;;;N;;;;; +FFFA;INTERLINEAR ANNOTATION SEPARATOR;Cf;0;ON;;;;;N;;;;; +FFFB;INTERLINEAR ANNOTATION TERMINATOR;Cf;0;ON;;;;;N;;;;; FFFC;OBJECT REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 10000;LINEAR B SYLLABLE B008 A;Lo;0;L;;;;;N;;;;; @@ -12353,6 +14990,217 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1013D;AEGEAN LIQUID MEASURE FIRST SUBUNIT;So;0;L;;;;;N;;;;; 1013E;AEGEAN MEASURE SECOND SUBUNIT;So;0;L;;;;;N;;;;; 1013F;AEGEAN MEASURE THIRD SUBUNIT;So;0;L;;;;;N;;;;; +10140;GREEK ACROPHONIC ATTIC ONE QUARTER;Nl;0;ON;;;;1/4;N;;;;; +10141;GREEK ACROPHONIC ATTIC ONE HALF;Nl;0;ON;;;;1/2;N;;;;; +10142;GREEK ACROPHONIC ATTIC ONE DRACHMA;Nl;0;ON;;;;1;N;;;;; +10143;GREEK ACROPHONIC ATTIC FIVE;Nl;0;ON;;;;5;N;;;;; +10144;GREEK ACROPHONIC ATTIC FIFTY;Nl;0;ON;;;;50;N;;;;; +10145;GREEK ACROPHONIC ATTIC FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +10146;GREEK ACROPHONIC ATTIC FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;; +10147;GREEK ACROPHONIC ATTIC FIFTY THOUSAND;Nl;0;ON;;;;50000;N;;;;; +10148;GREEK ACROPHONIC ATTIC FIVE TALENTS;Nl;0;ON;;;;5;N;;;;; +10149;GREEK ACROPHONIC ATTIC TEN TALENTS;Nl;0;ON;;;;10;N;;;;; +1014A;GREEK ACROPHONIC ATTIC FIFTY TALENTS;Nl;0;ON;;;;50;N;;;;; +1014B;GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS;Nl;0;ON;;;;100;N;;;;; +1014C;GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS;Nl;0;ON;;;;500;N;;;;; +1014D;GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS;Nl;0;ON;;;;1000;N;;;;; +1014E;GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS;Nl;0;ON;;;;5000;N;;;;; +1014F;GREEK ACROPHONIC ATTIC FIVE STATERS;Nl;0;ON;;;;5;N;;;;; +10150;GREEK ACROPHONIC ATTIC TEN STATERS;Nl;0;ON;;;;10;N;;;;; +10151;GREEK ACROPHONIC ATTIC FIFTY STATERS;Nl;0;ON;;;;50;N;;;;; +10152;GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS;Nl;0;ON;;;;100;N;;;;; +10153;GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS;Nl;0;ON;;;;500;N;;;;; +10154;GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS;Nl;0;ON;;;;1000;N;;;;; +10155;GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS;Nl;0;ON;;;;10000;N;;;;; +10156;GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS;Nl;0;ON;;;;50000;N;;;;; +10157;GREEK ACROPHONIC ATTIC TEN MNAS;Nl;0;ON;;;;10;N;;;;; +10158;GREEK ACROPHONIC HERAEUM ONE PLETHRON;Nl;0;ON;;;;1;N;;;;; +10159;GREEK ACROPHONIC THESPIAN ONE;Nl;0;ON;;;;1;N;;;;; +1015A;GREEK ACROPHONIC HERMIONIAN ONE;Nl;0;ON;;;;1;N;;;;; +1015B;GREEK ACROPHONIC EPIDAUREAN TWO;Nl;0;ON;;;;2;N;;;;; +1015C;GREEK ACROPHONIC THESPIAN TWO;Nl;0;ON;;;;2;N;;;;; +1015D;GREEK ACROPHONIC CYRENAIC TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;; +1015E;GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;; +1015F;GREEK ACROPHONIC TROEZENIAN FIVE;Nl;0;ON;;;;5;N;;;;; +10160;GREEK ACROPHONIC TROEZENIAN TEN;Nl;0;ON;;;;10;N;;;;; +10161;GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM;Nl;0;ON;;;;10;N;;;;; +10162;GREEK ACROPHONIC HERMIONIAN TEN;Nl;0;ON;;;;10;N;;;;; +10163;GREEK ACROPHONIC MESSENIAN TEN;Nl;0;ON;;;;10;N;;;;; +10164;GREEK ACROPHONIC THESPIAN TEN;Nl;0;ON;;;;10;N;;;;; +10165;GREEK ACROPHONIC THESPIAN THIRTY;Nl;0;ON;;;;30;N;;;;; +10166;GREEK ACROPHONIC TROEZENIAN FIFTY;Nl;0;ON;;;;50;N;;;;; +10167;GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM;Nl;0;ON;;;;50;N;;;;; +10168;GREEK ACROPHONIC HERMIONIAN FIFTY;Nl;0;ON;;;;50;N;;;;; +10169;GREEK ACROPHONIC THESPIAN FIFTY;Nl;0;ON;;;;50;N;;;;; +1016A;GREEK ACROPHONIC THESPIAN ONE HUNDRED;Nl;0;ON;;;;100;N;;;;; +1016B;GREEK ACROPHONIC THESPIAN THREE HUNDRED;Nl;0;ON;;;;300;N;;;;; +1016C;GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +1016D;GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +1016E;GREEK ACROPHONIC THESPIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +1016F;GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +10170;GREEK ACROPHONIC NAXIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +10171;GREEK ACROPHONIC THESPIAN ONE THOUSAND;Nl;0;ON;;;;1000;N;;;;; +10172;GREEK ACROPHONIC THESPIAN FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;; +10173;GREEK ACROPHONIC DELPHIC FIVE MNAS;Nl;0;ON;;;;5;N;;;;; +10174;GREEK ACROPHONIC STRATIAN FIFTY MNAS;Nl;0;ON;;;;50;N;;;;; +10175;GREEK ONE HALF SIGN;No;0;ON;;;;1/2;N;;;;; +10176;GREEK ONE HALF SIGN ALTERNATE FORM;No;0;ON;;;;1/2;N;;;;; +10177;GREEK TWO THIRDS SIGN;No;0;ON;;;;2/3;N;;;;; +10178;GREEK THREE QUARTERS SIGN;No;0;ON;;;;3/4;N;;;;; +10179;GREEK YEAR SIGN;So;0;ON;;;;;N;;;;; +1017A;GREEK TALENT SIGN;So;0;ON;;;;;N;;;;; +1017B;GREEK DRACHMA SIGN;So;0;ON;;;;;N;;;;; +1017C;GREEK OBOL SIGN;So;0;ON;;;;;N;;;;; +1017D;GREEK TWO OBOLS SIGN;So;0;ON;;;;;N;;;;; +1017E;GREEK THREE OBOLS SIGN;So;0;ON;;;;;N;;;;; +1017F;GREEK FOUR OBOLS SIGN;So;0;ON;;;;;N;;;;; +10180;GREEK FIVE OBOLS SIGN;So;0;ON;;;;;N;;;;; +10181;GREEK METRETES SIGN;So;0;ON;;;;;N;;;;; +10182;GREEK KYATHOS BASE SIGN;So;0;ON;;;;;N;;;;; +10183;GREEK LITRA SIGN;So;0;ON;;;;;N;;;;; +10184;GREEK OUNKIA SIGN;So;0;ON;;;;;N;;;;; +10185;GREEK XESTES SIGN;So;0;ON;;;;;N;;;;; +10186;GREEK ARTABE SIGN;So;0;ON;;;;;N;;;;; +10187;GREEK AROURA SIGN;So;0;ON;;;;;N;;;;; +10188;GREEK GRAMMA SIGN;So;0;ON;;;;;N;;;;; +10189;GREEK TRYBLION BASE SIGN;So;0;ON;;;;;N;;;;; +1018A;GREEK ZERO SIGN;No;0;ON;;;;0;N;;;;; +10190;ROMAN SEXTANS SIGN;So;0;ON;;;;;N;;;;; +10191;ROMAN UNCIA SIGN;So;0;ON;;;;;N;;;;; +10192;ROMAN SEMUNCIA SIGN;So;0;ON;;;;;N;;;;; +10193;ROMAN SEXTULA SIGN;So;0;ON;;;;;N;;;;; +10194;ROMAN DIMIDIA SEXTULA SIGN;So;0;ON;;;;;N;;;;; +10195;ROMAN SILIQUA SIGN;So;0;ON;;;;;N;;;;; +10196;ROMAN DENARIUS SIGN;So;0;ON;;;;;N;;;;; +10197;ROMAN QUINARIUS SIGN;So;0;ON;;;;;N;;;;; +10198;ROMAN SESTERTIUS SIGN;So;0;ON;;;;;N;;;;; +10199;ROMAN DUPONDIUS SIGN;So;0;ON;;;;;N;;;;; +1019A;ROMAN AS SIGN;So;0;ON;;;;;N;;;;; +1019B;ROMAN CENTURIAL SIGN;So;0;ON;;;;;N;;;;; +101D0;PHAISTOS DISC SIGN PEDESTRIAN;So;0;L;;;;;N;;;;; +101D1;PHAISTOS DISC SIGN PLUMED HEAD;So;0;L;;;;;N;;;;; +101D2;PHAISTOS DISC SIGN TATTOOED HEAD;So;0;L;;;;;N;;;;; +101D3;PHAISTOS DISC SIGN CAPTIVE;So;0;L;;;;;N;;;;; +101D4;PHAISTOS DISC SIGN CHILD;So;0;L;;;;;N;;;;; +101D5;PHAISTOS DISC SIGN WOMAN;So;0;L;;;;;N;;;;; +101D6;PHAISTOS DISC SIGN HELMET;So;0;L;;;;;N;;;;; +101D7;PHAISTOS DISC SIGN GAUNTLET;So;0;L;;;;;N;;;;; +101D8;PHAISTOS DISC SIGN TIARA;So;0;L;;;;;N;;;;; +101D9;PHAISTOS DISC SIGN ARROW;So;0;L;;;;;N;;;;; +101DA;PHAISTOS DISC SIGN BOW;So;0;L;;;;;N;;;;; +101DB;PHAISTOS DISC SIGN SHIELD;So;0;L;;;;;N;;;;; +101DC;PHAISTOS DISC SIGN CLUB;So;0;L;;;;;N;;;;; +101DD;PHAISTOS DISC SIGN MANACLES;So;0;L;;;;;N;;;;; +101DE;PHAISTOS DISC SIGN MATTOCK;So;0;L;;;;;N;;;;; +101DF;PHAISTOS DISC SIGN SAW;So;0;L;;;;;N;;;;; +101E0;PHAISTOS DISC SIGN LID;So;0;L;;;;;N;;;;; +101E1;PHAISTOS DISC SIGN BOOMERANG;So;0;L;;;;;N;;;;; +101E2;PHAISTOS DISC SIGN CARPENTRY PLANE;So;0;L;;;;;N;;;;; +101E3;PHAISTOS DISC SIGN DOLIUM;So;0;L;;;;;N;;;;; +101E4;PHAISTOS DISC SIGN COMB;So;0;L;;;;;N;;;;; +101E5;PHAISTOS DISC SIGN SLING;So;0;L;;;;;N;;;;; +101E6;PHAISTOS DISC SIGN COLUMN;So;0;L;;;;;N;;;;; +101E7;PHAISTOS DISC SIGN BEEHIVE;So;0;L;;;;;N;;;;; +101E8;PHAISTOS DISC SIGN SHIP;So;0;L;;;;;N;;;;; +101E9;PHAISTOS DISC SIGN HORN;So;0;L;;;;;N;;;;; +101EA;PHAISTOS DISC SIGN HIDE;So;0;L;;;;;N;;;;; +101EB;PHAISTOS DISC SIGN BULLS LEG;So;0;L;;;;;N;;;;; +101EC;PHAISTOS DISC SIGN CAT;So;0;L;;;;;N;;;;; +101ED;PHAISTOS DISC SIGN RAM;So;0;L;;;;;N;;;;; +101EE;PHAISTOS DISC SIGN EAGLE;So;0;L;;;;;N;;;;; +101EF;PHAISTOS DISC SIGN DOVE;So;0;L;;;;;N;;;;; +101F0;PHAISTOS DISC SIGN TUNNY;So;0;L;;;;;N;;;;; +101F1;PHAISTOS DISC SIGN BEE;So;0;L;;;;;N;;;;; +101F2;PHAISTOS DISC SIGN PLANE TREE;So;0;L;;;;;N;;;;; +101F3;PHAISTOS DISC SIGN VINE;So;0;L;;;;;N;;;;; +101F4;PHAISTOS DISC SIGN PAPYRUS;So;0;L;;;;;N;;;;; +101F5;PHAISTOS DISC SIGN ROSETTE;So;0;L;;;;;N;;;;; +101F6;PHAISTOS DISC SIGN LILY;So;0;L;;;;;N;;;;; +101F7;PHAISTOS DISC SIGN OX BACK;So;0;L;;;;;N;;;;; +101F8;PHAISTOS DISC SIGN FLUTE;So;0;L;;;;;N;;;;; +101F9;PHAISTOS DISC SIGN GRATER;So;0;L;;;;;N;;;;; +101FA;PHAISTOS DISC SIGN STRAINER;So;0;L;;;;;N;;;;; +101FB;PHAISTOS DISC SIGN SMALL AXE;So;0;L;;;;;N;;;;; +101FC;PHAISTOS DISC SIGN WAVY BAND;So;0;L;;;;;N;;;;; +101FD;PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE;Mn;220;NSM;;;;;N;;;;; +10280;LYCIAN LETTER A;Lo;0;L;;;;;N;;;;; +10281;LYCIAN LETTER E;Lo;0;L;;;;;N;;;;; +10282;LYCIAN LETTER B;Lo;0;L;;;;;N;;;;; +10283;LYCIAN LETTER BH;Lo;0;L;;;;;N;;;;; +10284;LYCIAN LETTER G;Lo;0;L;;;;;N;;;;; +10285;LYCIAN LETTER D;Lo;0;L;;;;;N;;;;; +10286;LYCIAN LETTER I;Lo;0;L;;;;;N;;;;; +10287;LYCIAN LETTER W;Lo;0;L;;;;;N;;;;; +10288;LYCIAN LETTER Z;Lo;0;L;;;;;N;;;;; +10289;LYCIAN LETTER TH;Lo;0;L;;;;;N;;;;; +1028A;LYCIAN LETTER J;Lo;0;L;;;;;N;;;;; +1028B;LYCIAN LETTER K;Lo;0;L;;;;;N;;;;; +1028C;LYCIAN LETTER Q;Lo;0;L;;;;;N;;;;; +1028D;LYCIAN LETTER L;Lo;0;L;;;;;N;;;;; +1028E;LYCIAN LETTER M;Lo;0;L;;;;;N;;;;; +1028F;LYCIAN LETTER N;Lo;0;L;;;;;N;;;;; +10290;LYCIAN LETTER MM;Lo;0;L;;;;;N;;;;; +10291;LYCIAN LETTER NN;Lo;0;L;;;;;N;;;;; +10292;LYCIAN LETTER U;Lo;0;L;;;;;N;;;;; +10293;LYCIAN LETTER P;Lo;0;L;;;;;N;;;;; +10294;LYCIAN LETTER KK;Lo;0;L;;;;;N;;;;; +10295;LYCIAN LETTER R;Lo;0;L;;;;;N;;;;; +10296;LYCIAN LETTER S;Lo;0;L;;;;;N;;;;; +10297;LYCIAN LETTER T;Lo;0;L;;;;;N;;;;; +10298;LYCIAN LETTER TT;Lo;0;L;;;;;N;;;;; +10299;LYCIAN LETTER AN;Lo;0;L;;;;;N;;;;; +1029A;LYCIAN LETTER EN;Lo;0;L;;;;;N;;;;; +1029B;LYCIAN LETTER H;Lo;0;L;;;;;N;;;;; +1029C;LYCIAN LETTER X;Lo;0;L;;;;;N;;;;; +102A0;CARIAN LETTER A;Lo;0;L;;;;;N;;;;; +102A1;CARIAN LETTER P2;Lo;0;L;;;;;N;;;;; +102A2;CARIAN LETTER D;Lo;0;L;;;;;N;;;;; +102A3;CARIAN LETTER L;Lo;0;L;;;;;N;;;;; +102A4;CARIAN LETTER UUU;Lo;0;L;;;;;N;;;;; +102A5;CARIAN LETTER R;Lo;0;L;;;;;N;;;;; +102A6;CARIAN LETTER LD;Lo;0;L;;;;;N;;;;; +102A7;CARIAN LETTER A2;Lo;0;L;;;;;N;;;;; +102A8;CARIAN LETTER Q;Lo;0;L;;;;;N;;;;; +102A9;CARIAN LETTER B;Lo;0;L;;;;;N;;;;; +102AA;CARIAN LETTER M;Lo;0;L;;;;;N;;;;; +102AB;CARIAN LETTER O;Lo;0;L;;;;;N;;;;; +102AC;CARIAN LETTER D2;Lo;0;L;;;;;N;;;;; +102AD;CARIAN LETTER T;Lo;0;L;;;;;N;;;;; +102AE;CARIAN LETTER SH;Lo;0;L;;;;;N;;;;; +102AF;CARIAN LETTER SH2;Lo;0;L;;;;;N;;;;; +102B0;CARIAN LETTER S;Lo;0;L;;;;;N;;;;; +102B1;CARIAN LETTER C-18;Lo;0;L;;;;;N;;;;; +102B2;CARIAN LETTER U;Lo;0;L;;;;;N;;;;; +102B3;CARIAN LETTER NN;Lo;0;L;;;;;N;;;;; +102B4;CARIAN LETTER X;Lo;0;L;;;;;N;;;;; +102B5;CARIAN LETTER N;Lo;0;L;;;;;N;;;;; +102B6;CARIAN LETTER TT2;Lo;0;L;;;;;N;;;;; +102B7;CARIAN LETTER P;Lo;0;L;;;;;N;;;;; +102B8;CARIAN LETTER SS;Lo;0;L;;;;;N;;;;; +102B9;CARIAN LETTER I;Lo;0;L;;;;;N;;;;; +102BA;CARIAN LETTER E;Lo;0;L;;;;;N;;;;; +102BB;CARIAN LETTER UUUU;Lo;0;L;;;;;N;;;;; +102BC;CARIAN LETTER K;Lo;0;L;;;;;N;;;;; +102BD;CARIAN LETTER K2;Lo;0;L;;;;;N;;;;; +102BE;CARIAN LETTER ND;Lo;0;L;;;;;N;;;;; +102BF;CARIAN LETTER UU;Lo;0;L;;;;;N;;;;; +102C0;CARIAN LETTER G;Lo;0;L;;;;;N;;;;; +102C1;CARIAN LETTER G2;Lo;0;L;;;;;N;;;;; +102C2;CARIAN LETTER ST;Lo;0;L;;;;;N;;;;; +102C3;CARIAN LETTER ST2;Lo;0;L;;;;;N;;;;; +102C4;CARIAN LETTER NG;Lo;0;L;;;;;N;;;;; +102C5;CARIAN LETTER II;Lo;0;L;;;;;N;;;;; +102C6;CARIAN LETTER C-39;Lo;0;L;;;;;N;;;;; +102C7;CARIAN LETTER TT;Lo;0;L;;;;;N;;;;; +102C8;CARIAN LETTER UUU2;Lo;0;L;;;;;N;;;;; +102C9;CARIAN LETTER RR;Lo;0;L;;;;;N;;;;; +102CA;CARIAN LETTER MB;Lo;0;L;;;;;N;;;;; +102CB;CARIAN LETTER MB2;Lo;0;L;;;;;N;;;;; +102CC;CARIAN LETTER MB3;Lo;0;L;;;;;N;;;;; +102CD;CARIAN LETTER MB4;Lo;0;L;;;;;N;;;;; +102CE;CARIAN LETTER LD2;Lo;0;L;;;;;N;;;;; +102CF;CARIAN LETTER E2;Lo;0;L;;;;;N;;;;; +102D0;CARIAN LETTER UUU3;Lo;0;L;;;;;N;;;;; 10300;OLD ITALIC LETTER A;Lo;0;L;;;;;N;;;;; 10301;OLD ITALIC LETTER BE;Lo;0;L;;;;;N;;;;; 10302;OLD ITALIC LETTER KE;Lo;0;L;;;;;N;;;;; @@ -12405,7 +15253,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1033E;GOTHIC LETTER JER;Lo;0;L;;;;;N;;;;; 1033F;GOTHIC LETTER URUS;Lo;0;L;;;;;N;;;;; 10340;GOTHIC LETTER PAIRTHRA;Lo;0;L;;;;;N;;;;; -10341;GOTHIC LETTER NINETY;Lo;0;L;;;;;N;;;;; +10341;GOTHIC LETTER NINETY;Nl;0;L;;;;90;N;;;;; 10342;GOTHIC LETTER RAIDA;Lo;0;L;;;;;N;;;;; 10343;GOTHIC LETTER SAUIL;Lo;0;L;;;;;N;;;;; 10344;GOTHIC LETTER TEIWS;Lo;0;L;;;;;N;;;;; @@ -12414,7 +15262,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 10347;GOTHIC LETTER IGGWS;Lo;0;L;;;;;N;;;;; 10348;GOTHIC LETTER HWAIR;Lo;0;L;;;;;N;;;;; 10349;GOTHIC LETTER OTHAL;Lo;0;L;;;;;N;;;;; -1034A;GOTHIC LETTER NINE HUNDRED;Nl;0;L;;;;;N;;;;; +1034A;GOTHIC LETTER NINE HUNDRED;Nl;0;L;;;;900;N;;;;; 10380;UGARITIC LETTER ALPA;Lo;0;L;;;;;N;;;;; 10381;UGARITIC LETTER BETA;Lo;0;L;;;;;N;;;;; 10382;UGARITIC LETTER GAMLA;Lo;0;L;;;;;N;;;;; @@ -12446,6 +15294,56 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1039C;UGARITIC LETTER U;Lo;0;L;;;;;N;;;;; 1039D;UGARITIC LETTER SSU;Lo;0;L;;;;;N;;;;; 1039F;UGARITIC WORD DIVIDER;Po;0;L;;;;;N;;;;; +103A0;OLD PERSIAN SIGN A;Lo;0;L;;;;;N;;;;; +103A1;OLD PERSIAN SIGN I;Lo;0;L;;;;;N;;;;; +103A2;OLD PERSIAN SIGN U;Lo;0;L;;;;;N;;;;; +103A3;OLD PERSIAN SIGN KA;Lo;0;L;;;;;N;;;;; +103A4;OLD PERSIAN SIGN KU;Lo;0;L;;;;;N;;;;; +103A5;OLD PERSIAN SIGN GA;Lo;0;L;;;;;N;;;;; +103A6;OLD PERSIAN SIGN GU;Lo;0;L;;;;;N;;;;; +103A7;OLD PERSIAN SIGN XA;Lo;0;L;;;;;N;;;;; +103A8;OLD PERSIAN SIGN CA;Lo;0;L;;;;;N;;;;; +103A9;OLD PERSIAN SIGN JA;Lo;0;L;;;;;N;;;;; +103AA;OLD PERSIAN SIGN JI;Lo;0;L;;;;;N;;;;; +103AB;OLD PERSIAN SIGN TA;Lo;0;L;;;;;N;;;;; +103AC;OLD PERSIAN SIGN TU;Lo;0;L;;;;;N;;;;; +103AD;OLD PERSIAN SIGN DA;Lo;0;L;;;;;N;;;;; +103AE;OLD PERSIAN SIGN DI;Lo;0;L;;;;;N;;;;; +103AF;OLD PERSIAN SIGN DU;Lo;0;L;;;;;N;;;;; +103B0;OLD PERSIAN SIGN THA;Lo;0;L;;;;;N;;;;; +103B1;OLD PERSIAN SIGN PA;Lo;0;L;;;;;N;;;;; +103B2;OLD PERSIAN SIGN BA;Lo;0;L;;;;;N;;;;; +103B3;OLD PERSIAN SIGN FA;Lo;0;L;;;;;N;;;;; +103B4;OLD PERSIAN SIGN NA;Lo;0;L;;;;;N;;;;; +103B5;OLD PERSIAN SIGN NU;Lo;0;L;;;;;N;;;;; +103B6;OLD PERSIAN SIGN MA;Lo;0;L;;;;;N;;;;; +103B7;OLD PERSIAN SIGN MI;Lo;0;L;;;;;N;;;;; +103B8;OLD PERSIAN SIGN MU;Lo;0;L;;;;;N;;;;; +103B9;OLD PERSIAN SIGN YA;Lo;0;L;;;;;N;;;;; +103BA;OLD PERSIAN SIGN VA;Lo;0;L;;;;;N;;;;; +103BB;OLD PERSIAN SIGN VI;Lo;0;L;;;;;N;;;;; +103BC;OLD PERSIAN SIGN RA;Lo;0;L;;;;;N;;;;; +103BD;OLD PERSIAN SIGN RU;Lo;0;L;;;;;N;;;;; +103BE;OLD PERSIAN SIGN LA;Lo;0;L;;;;;N;;;;; +103BF;OLD PERSIAN SIGN SA;Lo;0;L;;;;;N;;;;; +103C0;OLD PERSIAN SIGN ZA;Lo;0;L;;;;;N;;;;; +103C1;OLD PERSIAN SIGN SHA;Lo;0;L;;;;;N;;;;; +103C2;OLD PERSIAN SIGN SSA;Lo;0;L;;;;;N;;;;; +103C3;OLD PERSIAN SIGN HA;Lo;0;L;;;;;N;;;;; +103C8;OLD PERSIAN SIGN AURAMAZDAA;Lo;0;L;;;;;N;;;;; +103C9;OLD PERSIAN SIGN AURAMAZDAA-2;Lo;0;L;;;;;N;;;;; +103CA;OLD PERSIAN SIGN AURAMAZDAAHA;Lo;0;L;;;;;N;;;;; +103CB;OLD PERSIAN SIGN XSHAAYATHIYA;Lo;0;L;;;;;N;;;;; +103CC;OLD PERSIAN SIGN DAHYAAUSH;Lo;0;L;;;;;N;;;;; +103CD;OLD PERSIAN SIGN DAHYAAUSH-2;Lo;0;L;;;;;N;;;;; +103CE;OLD PERSIAN SIGN BAGA;Lo;0;L;;;;;N;;;;; +103CF;OLD PERSIAN SIGN BUUMISH;Lo;0;L;;;;;N;;;;; +103D0;OLD PERSIAN WORD DIVIDER;Po;0;L;;;;;N;;;;; +103D1;OLD PERSIAN NUMBER ONE;Nl;0;L;;;;1;N;;;;; +103D2;OLD PERSIAN NUMBER TWO;Nl;0;L;;;;2;N;;;;; +103D3;OLD PERSIAN NUMBER TEN;Nl;0;L;;;;10;N;;;;; +103D4;OLD PERSIAN NUMBER TWENTY;Nl;0;L;;;;20;N;;;;; +103D5;OLD PERSIAN NUMBER HUNDRED;Nl;0;L;;;;100;N;;;;; 10400;DESERET CAPITAL LETTER LONG I;Lu;0;L;;;;;N;;;;10428; 10401;DESERET CAPITAL LETTER LONG E;Lu;0;L;;;;;N;;;;10429; 10402;DESERET CAPITAL LETTER LONG A;Lu;0;L;;;;;N;;;;1042A; @@ -12669,6 +15567,1107 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 10838;CYPRIOT SYLLABLE XE;Lo;0;R;;;;;N;;;;; 1083C;CYPRIOT SYLLABLE ZA;Lo;0;R;;;;;N;;;;; 1083F;CYPRIOT SYLLABLE ZO;Lo;0;R;;;;;N;;;;; +10900;PHOENICIAN LETTER ALF;Lo;0;R;;;;;N;;;;; +10901;PHOENICIAN LETTER BET;Lo;0;R;;;;;N;;;;; +10902;PHOENICIAN LETTER GAML;Lo;0;R;;;;;N;;;;; +10903;PHOENICIAN LETTER DELT;Lo;0;R;;;;;N;;;;; +10904;PHOENICIAN LETTER HE;Lo;0;R;;;;;N;;;;; +10905;PHOENICIAN LETTER WAU;Lo;0;R;;;;;N;;;;; +10906;PHOENICIAN LETTER ZAI;Lo;0;R;;;;;N;;;;; +10907;PHOENICIAN LETTER HET;Lo;0;R;;;;;N;;;;; +10908;PHOENICIAN LETTER TET;Lo;0;R;;;;;N;;;;; +10909;PHOENICIAN LETTER YOD;Lo;0;R;;;;;N;;;;; +1090A;PHOENICIAN LETTER KAF;Lo;0;R;;;;;N;;;;; +1090B;PHOENICIAN LETTER LAMD;Lo;0;R;;;;;N;;;;; +1090C;PHOENICIAN LETTER MEM;Lo;0;R;;;;;N;;;;; +1090D;PHOENICIAN LETTER NUN;Lo;0;R;;;;;N;;;;; +1090E;PHOENICIAN LETTER SEMK;Lo;0;R;;;;;N;;;;; +1090F;PHOENICIAN LETTER AIN;Lo;0;R;;;;;N;;;;; +10910;PHOENICIAN LETTER PE;Lo;0;R;;;;;N;;;;; +10911;PHOENICIAN LETTER SADE;Lo;0;R;;;;;N;;;;; +10912;PHOENICIAN LETTER QOF;Lo;0;R;;;;;N;;;;; +10913;PHOENICIAN LETTER ROSH;Lo;0;R;;;;;N;;;;; +10914;PHOENICIAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +10915;PHOENICIAN LETTER TAU;Lo;0;R;;;;;N;;;;; +10916;PHOENICIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10917;PHOENICIAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10918;PHOENICIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10919;PHOENICIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +1091F;PHOENICIAN WORD SEPARATOR;Po;0;ON;;;;;N;;;;; +10920;LYDIAN LETTER A;Lo;0;R;;;;;N;;;;; +10921;LYDIAN LETTER B;Lo;0;R;;;;;N;;;;; +10922;LYDIAN LETTER G;Lo;0;R;;;;;N;;;;; +10923;LYDIAN LETTER D;Lo;0;R;;;;;N;;;;; +10924;LYDIAN LETTER E;Lo;0;R;;;;;N;;;;; +10925;LYDIAN LETTER V;Lo;0;R;;;;;N;;;;; +10926;LYDIAN LETTER I;Lo;0;R;;;;;N;;;;; +10927;LYDIAN LETTER Y;Lo;0;R;;;;;N;;;;; +10928;LYDIAN LETTER K;Lo;0;R;;;;;N;;;;; +10929;LYDIAN LETTER L;Lo;0;R;;;;;N;;;;; +1092A;LYDIAN LETTER M;Lo;0;R;;;;;N;;;;; +1092B;LYDIAN LETTER N;Lo;0;R;;;;;N;;;;; +1092C;LYDIAN LETTER O;Lo;0;R;;;;;N;;;;; +1092D;LYDIAN LETTER R;Lo;0;R;;;;;N;;;;; +1092E;LYDIAN LETTER SS;Lo;0;R;;;;;N;;;;; +1092F;LYDIAN LETTER T;Lo;0;R;;;;;N;;;;; +10930;LYDIAN LETTER U;Lo;0;R;;;;;N;;;;; +10931;LYDIAN LETTER F;Lo;0;R;;;;;N;;;;; +10932;LYDIAN LETTER Q;Lo;0;R;;;;;N;;;;; +10933;LYDIAN LETTER S;Lo;0;R;;;;;N;;;;; +10934;LYDIAN LETTER TT;Lo;0;R;;;;;N;;;;; +10935;LYDIAN LETTER AN;Lo;0;R;;;;;N;;;;; +10936;LYDIAN LETTER EN;Lo;0;R;;;;;N;;;;; +10937;LYDIAN LETTER LY;Lo;0;R;;;;;N;;;;; +10938;LYDIAN LETTER NN;Lo;0;R;;;;;N;;;;; +10939;LYDIAN LETTER C;Lo;0;R;;;;;N;;;;; +1093F;LYDIAN TRIANGULAR MARK;Po;0;R;;;;;N;;;;; +10A00;KHAROSHTHI LETTER A;Lo;0;R;;;;;N;;;;; +10A01;KHAROSHTHI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +10A02;KHAROSHTHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +10A03;KHAROSHTHI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +10A05;KHAROSHTHI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +10A06;KHAROSHTHI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +10A0C;KHAROSHTHI VOWEL LENGTH MARK;Mn;0;NSM;;;;;N;;;;; +10A0D;KHAROSHTHI SIGN DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;; +10A0E;KHAROSHTHI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +10A0F;KHAROSHTHI SIGN VISARGA;Mn;230;NSM;;;;;N;;;;; +10A10;KHAROSHTHI LETTER KA;Lo;0;R;;;;;N;;;;; +10A11;KHAROSHTHI LETTER KHA;Lo;0;R;;;;;N;;;;; +10A12;KHAROSHTHI LETTER GA;Lo;0;R;;;;;N;;;;; +10A13;KHAROSHTHI LETTER GHA;Lo;0;R;;;;;N;;;;; +10A15;KHAROSHTHI LETTER CA;Lo;0;R;;;;;N;;;;; +10A16;KHAROSHTHI LETTER CHA;Lo;0;R;;;;;N;;;;; +10A17;KHAROSHTHI LETTER JA;Lo;0;R;;;;;N;;;;; +10A19;KHAROSHTHI LETTER NYA;Lo;0;R;;;;;N;;;;; +10A1A;KHAROSHTHI LETTER TTA;Lo;0;R;;;;;N;;;;; +10A1B;KHAROSHTHI LETTER TTHA;Lo;0;R;;;;;N;;;;; +10A1C;KHAROSHTHI LETTER DDA;Lo;0;R;;;;;N;;;;; +10A1D;KHAROSHTHI LETTER DDHA;Lo;0;R;;;;;N;;;;; +10A1E;KHAROSHTHI LETTER NNA;Lo;0;R;;;;;N;;;;; +10A1F;KHAROSHTHI LETTER TA;Lo;0;R;;;;;N;;;;; +10A20;KHAROSHTHI LETTER THA;Lo;0;R;;;;;N;;;;; +10A21;KHAROSHTHI LETTER DA;Lo;0;R;;;;;N;;;;; +10A22;KHAROSHTHI LETTER DHA;Lo;0;R;;;;;N;;;;; +10A23;KHAROSHTHI LETTER NA;Lo;0;R;;;;;N;;;;; +10A24;KHAROSHTHI LETTER PA;Lo;0;R;;;;;N;;;;; +10A25;KHAROSHTHI LETTER PHA;Lo;0;R;;;;;N;;;;; +10A26;KHAROSHTHI LETTER BA;Lo;0;R;;;;;N;;;;; +10A27;KHAROSHTHI LETTER BHA;Lo;0;R;;;;;N;;;;; +10A28;KHAROSHTHI LETTER MA;Lo;0;R;;;;;N;;;;; +10A29;KHAROSHTHI LETTER YA;Lo;0;R;;;;;N;;;;; +10A2A;KHAROSHTHI LETTER RA;Lo;0;R;;;;;N;;;;; +10A2B;KHAROSHTHI LETTER LA;Lo;0;R;;;;;N;;;;; +10A2C;KHAROSHTHI LETTER VA;Lo;0;R;;;;;N;;;;; +10A2D;KHAROSHTHI LETTER SHA;Lo;0;R;;;;;N;;;;; +10A2E;KHAROSHTHI LETTER SSA;Lo;0;R;;;;;N;;;;; +10A2F;KHAROSHTHI LETTER SA;Lo;0;R;;;;;N;;;;; +10A30;KHAROSHTHI LETTER ZA;Lo;0;R;;;;;N;;;;; +10A31;KHAROSHTHI LETTER HA;Lo;0;R;;;;;N;;;;; +10A32;KHAROSHTHI LETTER KKA;Lo;0;R;;;;;N;;;;; +10A33;KHAROSHTHI LETTER TTTHA;Lo;0;R;;;;;N;;;;; +10A38;KHAROSHTHI SIGN BAR ABOVE;Mn;230;NSM;;;;;N;;;;; +10A39;KHAROSHTHI SIGN CAUDA;Mn;1;NSM;;;;;N;;;;; +10A3A;KHAROSHTHI SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;; +10A3F;KHAROSHTHI VIRAMA;Mn;9;NSM;;;;;N;;;;; +10A40;KHAROSHTHI DIGIT ONE;No;0;R;;;1;1;N;;;;; +10A41;KHAROSHTHI DIGIT TWO;No;0;R;;;2;2;N;;;;; +10A42;KHAROSHTHI DIGIT THREE;No;0;R;;;3;3;N;;;;; +10A43;KHAROSHTHI DIGIT FOUR;No;0;R;;;4;4;N;;;;; +10A44;KHAROSHTHI NUMBER TEN;No;0;R;;;;10;N;;;;; +10A45;KHAROSHTHI NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10A46;KHAROSHTHI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10A47;KHAROSHTHI NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +10A50;KHAROSHTHI PUNCTUATION DOT;Po;0;R;;;;;N;;;;; +10A51;KHAROSHTHI PUNCTUATION SMALL CIRCLE;Po;0;R;;;;;N;;;;; +10A52;KHAROSHTHI PUNCTUATION CIRCLE;Po;0;R;;;;;N;;;;; +10A53;KHAROSHTHI PUNCTUATION CRESCENT BAR;Po;0;R;;;;;N;;;;; +10A54;KHAROSHTHI PUNCTUATION MANGALAM;Po;0;R;;;;;N;;;;; +10A55;KHAROSHTHI PUNCTUATION LOTUS;Po;0;R;;;;;N;;;;; +10A56;KHAROSHTHI PUNCTUATION DANDA;Po;0;R;;;;;N;;;;; +10A57;KHAROSHTHI PUNCTUATION DOUBLE DANDA;Po;0;R;;;;;N;;;;; +10A58;KHAROSHTHI PUNCTUATION LINES;Po;0;R;;;;;N;;;;; +12000;CUNEIFORM SIGN A;Lo;0;L;;;;;N;;;;; +12001;CUNEIFORM SIGN A TIMES A;Lo;0;L;;;;;N;;;;; +12002;CUNEIFORM SIGN A TIMES BAD;Lo;0;L;;;;;N;;;;; +12003;CUNEIFORM SIGN A TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12004;CUNEIFORM SIGN A TIMES HA;Lo;0;L;;;;;N;;;;; +12005;CUNEIFORM SIGN A TIMES IGI;Lo;0;L;;;;;N;;;;; +12006;CUNEIFORM SIGN A TIMES LAGAR GUNU;Lo;0;L;;;;;N;;;;; +12007;CUNEIFORM SIGN A TIMES MUSH;Lo;0;L;;;;;N;;;;; +12008;CUNEIFORM SIGN A TIMES SAG;Lo;0;L;;;;;N;;;;; +12009;CUNEIFORM SIGN A2;Lo;0;L;;;;;N;;;;; +1200A;CUNEIFORM SIGN AB;Lo;0;L;;;;;N;;;;; +1200B;CUNEIFORM SIGN AB TIMES ASH2;Lo;0;L;;;;;N;;;;; +1200C;CUNEIFORM SIGN AB TIMES DUN3 GUNU;Lo;0;L;;;;;N;;;;; +1200D;CUNEIFORM SIGN AB TIMES GAL;Lo;0;L;;;;;N;;;;; +1200E;CUNEIFORM SIGN AB TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1200F;CUNEIFORM SIGN AB TIMES HA;Lo;0;L;;;;;N;;;;; +12010;CUNEIFORM SIGN AB TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +12011;CUNEIFORM SIGN AB TIMES IMIN;Lo;0;L;;;;;N;;;;; +12012;CUNEIFORM SIGN AB TIMES LAGAB;Lo;0;L;;;;;N;;;;; +12013;CUNEIFORM SIGN AB TIMES SHESH;Lo;0;L;;;;;N;;;;; +12014;CUNEIFORM SIGN AB TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;; +12015;CUNEIFORM SIGN AB GUNU;Lo;0;L;;;;;N;;;;; +12016;CUNEIFORM SIGN AB2;Lo;0;L;;;;;N;;;;; +12017;CUNEIFORM SIGN AB2 TIMES BALAG;Lo;0;L;;;;;N;;;;; +12018;CUNEIFORM SIGN AB2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12019;CUNEIFORM SIGN AB2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; +1201A;CUNEIFORM SIGN AB2 TIMES SHA3;Lo;0;L;;;;;N;;;;; +1201B;CUNEIFORM SIGN AB2 TIMES TAK4;Lo;0;L;;;;;N;;;;; +1201C;CUNEIFORM SIGN AD;Lo;0;L;;;;;N;;;;; +1201D;CUNEIFORM SIGN AK;Lo;0;L;;;;;N;;;;; +1201E;CUNEIFORM SIGN AK TIMES ERIN2;Lo;0;L;;;;;N;;;;; +1201F;CUNEIFORM SIGN AK TIMES SHITA PLUS GISH;Lo;0;L;;;;;N;;;;; +12020;CUNEIFORM SIGN AL;Lo;0;L;;;;;N;;;;; +12021;CUNEIFORM SIGN AL TIMES AL;Lo;0;L;;;;;N;;;;; +12022;CUNEIFORM SIGN AL TIMES DIM2;Lo;0;L;;;;;N;;;;; +12023;CUNEIFORM SIGN AL TIMES GISH;Lo;0;L;;;;;N;;;;; +12024;CUNEIFORM SIGN AL TIMES HA;Lo;0;L;;;;;N;;;;; +12025;CUNEIFORM SIGN AL TIMES KAD3;Lo;0;L;;;;;N;;;;; +12026;CUNEIFORM SIGN AL TIMES KI;Lo;0;L;;;;;N;;;;; +12027;CUNEIFORM SIGN AL TIMES SHE;Lo;0;L;;;;;N;;;;; +12028;CUNEIFORM SIGN AL TIMES USH;Lo;0;L;;;;;N;;;;; +12029;CUNEIFORM SIGN ALAN;Lo;0;L;;;;;N;;;;; +1202A;CUNEIFORM SIGN ALEPH;Lo;0;L;;;;;N;;;;; +1202B;CUNEIFORM SIGN AMAR;Lo;0;L;;;;;N;;;;; +1202C;CUNEIFORM SIGN AMAR TIMES SHE;Lo;0;L;;;;;N;;;;; +1202D;CUNEIFORM SIGN AN;Lo;0;L;;;;;N;;;;; +1202E;CUNEIFORM SIGN AN OVER AN;Lo;0;L;;;;;N;;;;; +1202F;CUNEIFORM SIGN AN THREE TIMES;Lo;0;L;;;;;N;;;;; +12030;CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA;Lo;0;L;;;;;N;;;;; +12031;CUNEIFORM SIGN AN PLUS NAGA SQUARED;Lo;0;L;;;;;N;;;;; +12032;CUNEIFORM SIGN ANSHE;Lo;0;L;;;;;N;;;;; +12033;CUNEIFORM SIGN APIN;Lo;0;L;;;;;N;;;;; +12034;CUNEIFORM SIGN ARAD;Lo;0;L;;;;;N;;;;; +12035;CUNEIFORM SIGN ARAD TIMES KUR;Lo;0;L;;;;;N;;;;; +12036;CUNEIFORM SIGN ARKAB;Lo;0;L;;;;;N;;;;; +12037;CUNEIFORM SIGN ASAL2;Lo;0;L;;;;;N;;;;; +12038;CUNEIFORM SIGN ASH;Lo;0;L;;;;;N;;;;; +12039;CUNEIFORM SIGN ASH ZIDA TENU;Lo;0;L;;;;;N;;;;; +1203A;CUNEIFORM SIGN ASH KABA TENU;Lo;0;L;;;;;N;;;;; +1203B;CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP;Lo;0;L;;;;;N;;;;; +1203C;CUNEIFORM SIGN ASH OVER ASH OVER ASH;Lo;0;L;;;;;N;;;;; +1203D;CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH;Lo;0;L;;;;;N;;;;; +1203E;CUNEIFORM SIGN ASH2;Lo;0;L;;;;;N;;;;; +1203F;CUNEIFORM SIGN ASHGAB;Lo;0;L;;;;;N;;;;; +12040;CUNEIFORM SIGN BA;Lo;0;L;;;;;N;;;;; +12041;CUNEIFORM SIGN BAD;Lo;0;L;;;;;N;;;;; +12042;CUNEIFORM SIGN BAG3;Lo;0;L;;;;;N;;;;; +12043;CUNEIFORM SIGN BAHAR2;Lo;0;L;;;;;N;;;;; +12044;CUNEIFORM SIGN BAL;Lo;0;L;;;;;N;;;;; +12045;CUNEIFORM SIGN BAL OVER BAL;Lo;0;L;;;;;N;;;;; +12046;CUNEIFORM SIGN BALAG;Lo;0;L;;;;;N;;;;; +12047;CUNEIFORM SIGN BAR;Lo;0;L;;;;;N;;;;; +12048;CUNEIFORM SIGN BARA2;Lo;0;L;;;;;N;;;;; +12049;CUNEIFORM SIGN BI;Lo;0;L;;;;;N;;;;; +1204A;CUNEIFORM SIGN BI TIMES A;Lo;0;L;;;;;N;;;;; +1204B;CUNEIFORM SIGN BI TIMES GAR;Lo;0;L;;;;;N;;;;; +1204C;CUNEIFORM SIGN BI TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +1204D;CUNEIFORM SIGN BU;Lo;0;L;;;;;N;;;;; +1204E;CUNEIFORM SIGN BU OVER BU AB;Lo;0;L;;;;;N;;;;; +1204F;CUNEIFORM SIGN BU OVER BU UN;Lo;0;L;;;;;N;;;;; +12050;CUNEIFORM SIGN BU CROSSING BU;Lo;0;L;;;;;N;;;;; +12051;CUNEIFORM SIGN BULUG;Lo;0;L;;;;;N;;;;; +12052;CUNEIFORM SIGN BULUG OVER BULUG;Lo;0;L;;;;;N;;;;; +12053;CUNEIFORM SIGN BUR;Lo;0;L;;;;;N;;;;; +12054;CUNEIFORM SIGN BUR2;Lo;0;L;;;;;N;;;;; +12055;CUNEIFORM SIGN DA;Lo;0;L;;;;;N;;;;; +12056;CUNEIFORM SIGN DAG;Lo;0;L;;;;;N;;;;; +12057;CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH;Lo;0;L;;;;;N;;;;; +12058;CUNEIFORM SIGN DAG KISIM5 TIMES AMAR;Lo;0;L;;;;;N;;;;; +12059;CUNEIFORM SIGN DAG KISIM5 TIMES BALAG;Lo;0;L;;;;;N;;;;; +1205A;CUNEIFORM SIGN DAG KISIM5 TIMES BI;Lo;0;L;;;;;N;;;;; +1205B;CUNEIFORM SIGN DAG KISIM5 TIMES GA;Lo;0;L;;;;;N;;;;; +1205C;CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH;Lo;0;L;;;;;N;;;;; +1205D;CUNEIFORM SIGN DAG KISIM5 TIMES GI;Lo;0;L;;;;;N;;;;; +1205E;CUNEIFORM SIGN DAG KISIM5 TIMES GIR2;Lo;0;L;;;;;N;;;;; +1205F;CUNEIFORM SIGN DAG KISIM5 TIMES GUD;Lo;0;L;;;;;N;;;;; +12060;CUNEIFORM SIGN DAG KISIM5 TIMES HA;Lo;0;L;;;;;N;;;;; +12061;CUNEIFORM SIGN DAG KISIM5 TIMES IR;Lo;0;L;;;;;N;;;;; +12062;CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU;Lo;0;L;;;;;N;;;;; +12063;CUNEIFORM SIGN DAG KISIM5 TIMES KAK;Lo;0;L;;;;;N;;;;; +12064;CUNEIFORM SIGN DAG KISIM5 TIMES LA;Lo;0;L;;;;;N;;;;; +12065;CUNEIFORM SIGN DAG KISIM5 TIMES LU;Lo;0;L;;;;;N;;;;; +12066;CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2;Lo;0;L;;;;;N;;;;; +12067;CUNEIFORM SIGN DAG KISIM5 TIMES LUM;Lo;0;L;;;;;N;;;;; +12068;CUNEIFORM SIGN DAG KISIM5 TIMES NE;Lo;0;L;;;;;N;;;;; +12069;CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP;Lo;0;L;;;;;N;;;;; +1206A;CUNEIFORM SIGN DAG KISIM5 TIMES SI;Lo;0;L;;;;;N;;;;; +1206B;CUNEIFORM SIGN DAG KISIM5 TIMES TAK4;Lo;0;L;;;;;N;;;;; +1206C;CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2;Lo;0;L;;;;;N;;;;; +1206D;CUNEIFORM SIGN DAG KISIM5 TIMES USH;Lo;0;L;;;;;N;;;;; +1206E;CUNEIFORM SIGN DAM;Lo;0;L;;;;;N;;;;; +1206F;CUNEIFORM SIGN DAR;Lo;0;L;;;;;N;;;;; +12070;CUNEIFORM SIGN DARA3;Lo;0;L;;;;;N;;;;; +12071;CUNEIFORM SIGN DARA4;Lo;0;L;;;;;N;;;;; +12072;CUNEIFORM SIGN DI;Lo;0;L;;;;;N;;;;; +12073;CUNEIFORM SIGN DIB;Lo;0;L;;;;;N;;;;; +12074;CUNEIFORM SIGN DIM;Lo;0;L;;;;;N;;;;; +12075;CUNEIFORM SIGN DIM TIMES SHE;Lo;0;L;;;;;N;;;;; +12076;CUNEIFORM SIGN DIM2;Lo;0;L;;;;;N;;;;; +12077;CUNEIFORM SIGN DIN;Lo;0;L;;;;;N;;;;; +12078;CUNEIFORM SIGN DIN KASKAL U GUNU DISH;Lo;0;L;;;;;N;;;;; +12079;CUNEIFORM SIGN DISH;Lo;0;L;;;;;N;;;;; +1207A;CUNEIFORM SIGN DU;Lo;0;L;;;;;N;;;;; +1207B;CUNEIFORM SIGN DU OVER DU;Lo;0;L;;;;;N;;;;; +1207C;CUNEIFORM SIGN DU GUNU;Lo;0;L;;;;;N;;;;; +1207D;CUNEIFORM SIGN DU SHESHIG;Lo;0;L;;;;;N;;;;; +1207E;CUNEIFORM SIGN DUB;Lo;0;L;;;;;N;;;;; +1207F;CUNEIFORM SIGN DUB TIMES ESH2;Lo;0;L;;;;;N;;;;; +12080;CUNEIFORM SIGN DUB2;Lo;0;L;;;;;N;;;;; +12081;CUNEIFORM SIGN DUG;Lo;0;L;;;;;N;;;;; +12082;CUNEIFORM SIGN DUGUD;Lo;0;L;;;;;N;;;;; +12083;CUNEIFORM SIGN DUH;Lo;0;L;;;;;N;;;;; +12084;CUNEIFORM SIGN DUN;Lo;0;L;;;;;N;;;;; +12085;CUNEIFORM SIGN DUN3;Lo;0;L;;;;;N;;;;; +12086;CUNEIFORM SIGN DUN3 GUNU;Lo;0;L;;;;;N;;;;; +12087;CUNEIFORM SIGN DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;; +12088;CUNEIFORM SIGN DUN4;Lo;0;L;;;;;N;;;;; +12089;CUNEIFORM SIGN DUR2;Lo;0;L;;;;;N;;;;; +1208A;CUNEIFORM SIGN E;Lo;0;L;;;;;N;;;;; +1208B;CUNEIFORM SIGN E TIMES PAP;Lo;0;L;;;;;N;;;;; +1208C;CUNEIFORM SIGN E OVER E NUN OVER NUN;Lo;0;L;;;;;N;;;;; +1208D;CUNEIFORM SIGN E2;Lo;0;L;;;;;N;;;;; +1208E;CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA;Lo;0;L;;;;;N;;;;; +1208F;CUNEIFORM SIGN E2 TIMES GAR;Lo;0;L;;;;;N;;;;; +12090;CUNEIFORM SIGN E2 TIMES MI;Lo;0;L;;;;;N;;;;; +12091;CUNEIFORM SIGN E2 TIMES SAL;Lo;0;L;;;;;N;;;;; +12092;CUNEIFORM SIGN E2 TIMES SHE;Lo;0;L;;;;;N;;;;; +12093;CUNEIFORM SIGN E2 TIMES U;Lo;0;L;;;;;N;;;;; +12094;CUNEIFORM SIGN EDIN;Lo;0;L;;;;;N;;;;; +12095;CUNEIFORM SIGN EGIR;Lo;0;L;;;;;N;;;;; +12096;CUNEIFORM SIGN EL;Lo;0;L;;;;;N;;;;; +12097;CUNEIFORM SIGN EN;Lo;0;L;;;;;N;;;;; +12098;CUNEIFORM SIGN EN TIMES GAN2;Lo;0;L;;;;;N;;;;; +12099;CUNEIFORM SIGN EN TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1209A;CUNEIFORM SIGN EN TIMES ME;Lo;0;L;;;;;N;;;;; +1209B;CUNEIFORM SIGN EN CROSSING EN;Lo;0;L;;;;;N;;;;; +1209C;CUNEIFORM SIGN EN OPPOSING EN;Lo;0;L;;;;;N;;;;; +1209D;CUNEIFORM SIGN EN SQUARED;Lo;0;L;;;;;N;;;;; +1209E;CUNEIFORM SIGN EREN;Lo;0;L;;;;;N;;;;; +1209F;CUNEIFORM SIGN ERIN2;Lo;0;L;;;;;N;;;;; +120A0;CUNEIFORM SIGN ESH2;Lo;0;L;;;;;N;;;;; +120A1;CUNEIFORM SIGN EZEN;Lo;0;L;;;;;N;;;;; +120A2;CUNEIFORM SIGN EZEN TIMES A;Lo;0;L;;;;;N;;;;; +120A3;CUNEIFORM SIGN EZEN TIMES A PLUS LAL;Lo;0;L;;;;;N;;;;; +120A4;CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL;Lo;0;L;;;;;N;;;;; +120A5;CUNEIFORM SIGN EZEN TIMES AN;Lo;0;L;;;;;N;;;;; +120A6;CUNEIFORM SIGN EZEN TIMES BAD;Lo;0;L;;;;;N;;;;; +120A7;CUNEIFORM SIGN EZEN TIMES DUN3 GUNU;Lo;0;L;;;;;N;;;;; +120A8;CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;; +120A9;CUNEIFORM SIGN EZEN TIMES HA;Lo;0;L;;;;;N;;;;; +120AA;CUNEIFORM SIGN EZEN TIMES HA GUNU;Lo;0;L;;;;;N;;;;; +120AB;CUNEIFORM SIGN EZEN TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +120AC;CUNEIFORM SIGN EZEN TIMES KASKAL;Lo;0;L;;;;;N;;;;; +120AD;CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED;Lo;0;L;;;;;N;;;;; +120AE;CUNEIFORM SIGN EZEN TIMES KU3;Lo;0;L;;;;;N;;;;; +120AF;CUNEIFORM SIGN EZEN TIMES LA;Lo;0;L;;;;;N;;;;; +120B0;CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL;Lo;0;L;;;;;N;;;;; +120B1;CUNEIFORM SIGN EZEN TIMES LI;Lo;0;L;;;;;N;;;;; +120B2;CUNEIFORM SIGN EZEN TIMES LU;Lo;0;L;;;;;N;;;;; +120B3;CUNEIFORM SIGN EZEN TIMES U2;Lo;0;L;;;;;N;;;;; +120B4;CUNEIFORM SIGN EZEN TIMES UD;Lo;0;L;;;;;N;;;;; +120B5;CUNEIFORM SIGN GA;Lo;0;L;;;;;N;;;;; +120B6;CUNEIFORM SIGN GA GUNU;Lo;0;L;;;;;N;;;;; +120B7;CUNEIFORM SIGN GA2;Lo;0;L;;;;;N;;;;; +120B8;CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA;Lo;0;L;;;;;N;;;;; +120B9;CUNEIFORM SIGN GA2 TIMES A PLUS HA;Lo;0;L;;;;;N;;;;; +120BA;CUNEIFORM SIGN GA2 TIMES A PLUS IGI;Lo;0;L;;;;;N;;;;; +120BB;CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB;Lo;0;L;;;;;N;;;;; +120BC;CUNEIFORM SIGN GA2 TIMES AN;Lo;0;L;;;;;N;;;;; +120BD;CUNEIFORM SIGN GA2 TIMES ASH;Lo;0;L;;;;;N;;;;; +120BE;CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL;Lo;0;L;;;;;N;;;;; +120BF;CUNEIFORM SIGN GA2 TIMES BAD;Lo;0;L;;;;;N;;;;; +120C0;CUNEIFORM SIGN GA2 TIMES BAR PLUS RA;Lo;0;L;;;;;N;;;;; +120C1;CUNEIFORM SIGN GA2 TIMES BUR;Lo;0;L;;;;;N;;;;; +120C2;CUNEIFORM SIGN GA2 TIMES BUR PLUS RA;Lo;0;L;;;;;N;;;;; +120C3;CUNEIFORM SIGN GA2 TIMES DA;Lo;0;L;;;;;N;;;;; +120C4;CUNEIFORM SIGN GA2 TIMES DI;Lo;0;L;;;;;N;;;;; +120C5;CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE;Lo;0;L;;;;;N;;;;; +120C6;CUNEIFORM SIGN GA2 TIMES DUB;Lo;0;L;;;;;N;;;;; +120C7;CUNEIFORM SIGN GA2 TIMES EL;Lo;0;L;;;;;N;;;;; +120C8;CUNEIFORM SIGN GA2 TIMES EL PLUS LA;Lo;0;L;;;;;N;;;;; +120C9;CUNEIFORM SIGN GA2 TIMES EN;Lo;0;L;;;;;N;;;;; +120CA;CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +120CB;CUNEIFORM SIGN GA2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +120CC;CUNEIFORM SIGN GA2 TIMES GAR;Lo;0;L;;;;;N;;;;; +120CD;CUNEIFORM SIGN GA2 TIMES GI;Lo;0;L;;;;;N;;;;; +120CE;CUNEIFORM SIGN GA2 TIMES GI4;Lo;0;L;;;;;N;;;;; +120CF;CUNEIFORM SIGN GA2 TIMES GI4 PLUS A;Lo;0;L;;;;;N;;;;; +120D0;CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU;Lo;0;L;;;;;N;;;;; +120D1;CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2;Lo;0;L;;;;;N;;;;; +120D2;CUNEIFORM SIGN GA2 TIMES HAL;Lo;0;L;;;;;N;;;;; +120D3;CUNEIFORM SIGN GA2 TIMES HAL PLUS LA;Lo;0;L;;;;;N;;;;; +120D4;CUNEIFORM SIGN GA2 TIMES HI PLUS LI;Lo;0;L;;;;;N;;;;; +120D5;CUNEIFORM SIGN GA2 TIMES HUB2;Lo;0;L;;;;;N;;;;; +120D6;CUNEIFORM SIGN GA2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +120D7;CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH;Lo;0;L;;;;;N;;;;; +120D8;CUNEIFORM SIGN GA2 TIMES KAK;Lo;0;L;;;;;N;;;;; +120D9;CUNEIFORM SIGN GA2 TIMES KASKAL;Lo;0;L;;;;;N;;;;; +120DA;CUNEIFORM SIGN GA2 TIMES KID;Lo;0;L;;;;;N;;;;; +120DB;CUNEIFORM SIGN GA2 TIMES KID PLUS LAL;Lo;0;L;;;;;N;;;;; +120DC;CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN;Lo;0;L;;;;;N;;;;; +120DD;CUNEIFORM SIGN GA2 TIMES LA;Lo;0;L;;;;;N;;;;; +120DE;CUNEIFORM SIGN GA2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; +120DF;CUNEIFORM SIGN GA2 TIMES MI;Lo;0;L;;;;;N;;;;; +120E0;CUNEIFORM SIGN GA2 TIMES NUN;Lo;0;L;;;;;N;;;;; +120E1;CUNEIFORM SIGN GA2 TIMES NUN OVER NUN;Lo;0;L;;;;;N;;;;; +120E2;CUNEIFORM SIGN GA2 TIMES PA;Lo;0;L;;;;;N;;;;; +120E3;CUNEIFORM SIGN GA2 TIMES SAL;Lo;0;L;;;;;N;;;;; +120E4;CUNEIFORM SIGN GA2 TIMES SAR;Lo;0;L;;;;;N;;;;; +120E5;CUNEIFORM SIGN GA2 TIMES SHE;Lo;0;L;;;;;N;;;;; +120E6;CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR;Lo;0;L;;;;;N;;;;; +120E7;CUNEIFORM SIGN GA2 TIMES SHID;Lo;0;L;;;;;N;;;;; +120E8;CUNEIFORM SIGN GA2 TIMES SUM;Lo;0;L;;;;;N;;;;; +120E9;CUNEIFORM SIGN GA2 TIMES TAK4;Lo;0;L;;;;;N;;;;; +120EA;CUNEIFORM SIGN GA2 TIMES U;Lo;0;L;;;;;N;;;;; +120EB;CUNEIFORM SIGN GA2 TIMES UD;Lo;0;L;;;;;N;;;;; +120EC;CUNEIFORM SIGN GA2 TIMES UD PLUS DU;Lo;0;L;;;;;N;;;;; +120ED;CUNEIFORM SIGN GA2 OVER GA2;Lo;0;L;;;;;N;;;;; +120EE;CUNEIFORM SIGN GABA;Lo;0;L;;;;;N;;;;; +120EF;CUNEIFORM SIGN GABA CROSSING GABA;Lo;0;L;;;;;N;;;;; +120F0;CUNEIFORM SIGN GAD;Lo;0;L;;;;;N;;;;; +120F1;CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; +120F2;CUNEIFORM SIGN GAL;Lo;0;L;;;;;N;;;;; +120F3;CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; +120F4;CUNEIFORM SIGN GALAM;Lo;0;L;;;;;N;;;;; +120F5;CUNEIFORM SIGN GAM;Lo;0;L;;;;;N;;;;; +120F6;CUNEIFORM SIGN GAN;Lo;0;L;;;;;N;;;;; +120F7;CUNEIFORM SIGN GAN2;Lo;0;L;;;;;N;;;;; +120F8;CUNEIFORM SIGN GAN2 TENU;Lo;0;L;;;;;N;;;;; +120F9;CUNEIFORM SIGN GAN2 OVER GAN2;Lo;0;L;;;;;N;;;;; +120FA;CUNEIFORM SIGN GAN2 CROSSING GAN2;Lo;0;L;;;;;N;;;;; +120FB;CUNEIFORM SIGN GAR;Lo;0;L;;;;;N;;;;; +120FC;CUNEIFORM SIGN GAR3;Lo;0;L;;;;;N;;;;; +120FD;CUNEIFORM SIGN GASHAN;Lo;0;L;;;;;N;;;;; +120FE;CUNEIFORM SIGN GESHTIN;Lo;0;L;;;;;N;;;;; +120FF;CUNEIFORM SIGN GESHTIN TIMES KUR;Lo;0;L;;;;;N;;;;; +12100;CUNEIFORM SIGN GI;Lo;0;L;;;;;N;;;;; +12101;CUNEIFORM SIGN GI TIMES E;Lo;0;L;;;;;N;;;;; +12102;CUNEIFORM SIGN GI TIMES U;Lo;0;L;;;;;N;;;;; +12103;CUNEIFORM SIGN GI CROSSING GI;Lo;0;L;;;;;N;;;;; +12104;CUNEIFORM SIGN GI4;Lo;0;L;;;;;N;;;;; +12105;CUNEIFORM SIGN GI4 OVER GI4;Lo;0;L;;;;;N;;;;; +12106;CUNEIFORM SIGN GI4 CROSSING GI4;Lo;0;L;;;;;N;;;;; +12107;CUNEIFORM SIGN GIDIM;Lo;0;L;;;;;N;;;;; +12108;CUNEIFORM SIGN GIR2;Lo;0;L;;;;;N;;;;; +12109;CUNEIFORM SIGN GIR2 GUNU;Lo;0;L;;;;;N;;;;; +1210A;CUNEIFORM SIGN GIR3;Lo;0;L;;;;;N;;;;; +1210B;CUNEIFORM SIGN GIR3 TIMES A PLUS IGI;Lo;0;L;;;;;N;;;;; +1210C;CUNEIFORM SIGN GIR3 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1210D;CUNEIFORM SIGN GIR3 TIMES IGI;Lo;0;L;;;;;N;;;;; +1210E;CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI;Lo;0;L;;;;;N;;;;; +1210F;CUNEIFORM SIGN GIR3 TIMES PA;Lo;0;L;;;;;N;;;;; +12110;CUNEIFORM SIGN GISAL;Lo;0;L;;;;;N;;;;; +12111;CUNEIFORM SIGN GISH;Lo;0;L;;;;;N;;;;; +12112;CUNEIFORM SIGN GISH CROSSING GISH;Lo;0;L;;;;;N;;;;; +12113;CUNEIFORM SIGN GISH TIMES BAD;Lo;0;L;;;;;N;;;;; +12114;CUNEIFORM SIGN GISH TIMES TAK4;Lo;0;L;;;;;N;;;;; +12115;CUNEIFORM SIGN GISH TENU;Lo;0;L;;;;;N;;;;; +12116;CUNEIFORM SIGN GU;Lo;0;L;;;;;N;;;;; +12117;CUNEIFORM SIGN GU CROSSING GU;Lo;0;L;;;;;N;;;;; +12118;CUNEIFORM SIGN GU2;Lo;0;L;;;;;N;;;;; +12119;CUNEIFORM SIGN GU2 TIMES KAK;Lo;0;L;;;;;N;;;;; +1211A;CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +1211B;CUNEIFORM SIGN GU2 TIMES NUN;Lo;0;L;;;;;N;;;;; +1211C;CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2;Lo;0;L;;;;;N;;;;; +1211D;CUNEIFORM SIGN GU2 GUNU;Lo;0;L;;;;;N;;;;; +1211E;CUNEIFORM SIGN GUD;Lo;0;L;;;;;N;;;;; +1211F;CUNEIFORM SIGN GUD TIMES A PLUS KUR;Lo;0;L;;;;;N;;;;; +12120;CUNEIFORM SIGN GUD TIMES KUR;Lo;0;L;;;;;N;;;;; +12121;CUNEIFORM SIGN GUD OVER GUD LUGAL;Lo;0;L;;;;;N;;;;; +12122;CUNEIFORM SIGN GUL;Lo;0;L;;;;;N;;;;; +12123;CUNEIFORM SIGN GUM;Lo;0;L;;;;;N;;;;; +12124;CUNEIFORM SIGN GUM TIMES SHE;Lo;0;L;;;;;N;;;;; +12125;CUNEIFORM SIGN GUR;Lo;0;L;;;;;N;;;;; +12126;CUNEIFORM SIGN GUR7;Lo;0;L;;;;;N;;;;; +12127;CUNEIFORM SIGN GURUN;Lo;0;L;;;;;N;;;;; +12128;CUNEIFORM SIGN GURUSH;Lo;0;L;;;;;N;;;;; +12129;CUNEIFORM SIGN HA;Lo;0;L;;;;;N;;;;; +1212A;CUNEIFORM SIGN HA TENU;Lo;0;L;;;;;N;;;;; +1212B;CUNEIFORM SIGN HA GUNU;Lo;0;L;;;;;N;;;;; +1212C;CUNEIFORM SIGN HAL;Lo;0;L;;;;;N;;;;; +1212D;CUNEIFORM SIGN HI;Lo;0;L;;;;;N;;;;; +1212E;CUNEIFORM SIGN HI TIMES ASH;Lo;0;L;;;;;N;;;;; +1212F;CUNEIFORM SIGN HI TIMES ASH2;Lo;0;L;;;;;N;;;;; +12130;CUNEIFORM SIGN HI TIMES BAD;Lo;0;L;;;;;N;;;;; +12131;CUNEIFORM SIGN HI TIMES DISH;Lo;0;L;;;;;N;;;;; +12132;CUNEIFORM SIGN HI TIMES GAD;Lo;0;L;;;;;N;;;;; +12133;CUNEIFORM SIGN HI TIMES KIN;Lo;0;L;;;;;N;;;;; +12134;CUNEIFORM SIGN HI TIMES NUN;Lo;0;L;;;;;N;;;;; +12135;CUNEIFORM SIGN HI TIMES SHE;Lo;0;L;;;;;N;;;;; +12136;CUNEIFORM SIGN HI TIMES U;Lo;0;L;;;;;N;;;;; +12137;CUNEIFORM SIGN HU;Lo;0;L;;;;;N;;;;; +12138;CUNEIFORM SIGN HUB2;Lo;0;L;;;;;N;;;;; +12139;CUNEIFORM SIGN HUB2 TIMES AN;Lo;0;L;;;;;N;;;;; +1213A;CUNEIFORM SIGN HUB2 TIMES HAL;Lo;0;L;;;;;N;;;;; +1213B;CUNEIFORM SIGN HUB2 TIMES KASKAL;Lo;0;L;;;;;N;;;;; +1213C;CUNEIFORM SIGN HUB2 TIMES LISH;Lo;0;L;;;;;N;;;;; +1213D;CUNEIFORM SIGN HUB2 TIMES UD;Lo;0;L;;;;;N;;;;; +1213E;CUNEIFORM SIGN HUL2;Lo;0;L;;;;;N;;;;; +1213F;CUNEIFORM SIGN I;Lo;0;L;;;;;N;;;;; +12140;CUNEIFORM SIGN I A;Lo;0;L;;;;;N;;;;; +12141;CUNEIFORM SIGN IB;Lo;0;L;;;;;N;;;;; +12142;CUNEIFORM SIGN IDIM;Lo;0;L;;;;;N;;;;; +12143;CUNEIFORM SIGN IDIM OVER IDIM BUR;Lo;0;L;;;;;N;;;;; +12144;CUNEIFORM SIGN IDIM OVER IDIM SQUARED;Lo;0;L;;;;;N;;;;; +12145;CUNEIFORM SIGN IG;Lo;0;L;;;;;N;;;;; +12146;CUNEIFORM SIGN IGI;Lo;0;L;;;;;N;;;;; +12147;CUNEIFORM SIGN IGI DIB;Lo;0;L;;;;;N;;;;; +12148;CUNEIFORM SIGN IGI RI;Lo;0;L;;;;;N;;;;; +12149;CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD;Lo;0;L;;;;;N;;;;; +1214A;CUNEIFORM SIGN IGI GUNU;Lo;0;L;;;;;N;;;;; +1214B;CUNEIFORM SIGN IL;Lo;0;L;;;;;N;;;;; +1214C;CUNEIFORM SIGN IL TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1214D;CUNEIFORM SIGN IL2;Lo;0;L;;;;;N;;;;; +1214E;CUNEIFORM SIGN IM;Lo;0;L;;;;;N;;;;; +1214F;CUNEIFORM SIGN IM TIMES TAK4;Lo;0;L;;;;;N;;;;; +12150;CUNEIFORM SIGN IM CROSSING IM;Lo;0;L;;;;;N;;;;; +12151;CUNEIFORM SIGN IM OPPOSING IM;Lo;0;L;;;;;N;;;;; +12152;CUNEIFORM SIGN IM SQUARED;Lo;0;L;;;;;N;;;;; +12153;CUNEIFORM SIGN IMIN;Lo;0;L;;;;;N;;;;; +12154;CUNEIFORM SIGN IN;Lo;0;L;;;;;N;;;;; +12155;CUNEIFORM SIGN IR;Lo;0;L;;;;;N;;;;; +12156;CUNEIFORM SIGN ISH;Lo;0;L;;;;;N;;;;; +12157;CUNEIFORM SIGN KA;Lo;0;L;;;;;N;;;;; +12158;CUNEIFORM SIGN KA TIMES A;Lo;0;L;;;;;N;;;;; +12159;CUNEIFORM SIGN KA TIMES AD;Lo;0;L;;;;;N;;;;; +1215A;CUNEIFORM SIGN KA TIMES AD PLUS KU3;Lo;0;L;;;;;N;;;;; +1215B;CUNEIFORM SIGN KA TIMES ASH2;Lo;0;L;;;;;N;;;;; +1215C;CUNEIFORM SIGN KA TIMES BAD;Lo;0;L;;;;;N;;;;; +1215D;CUNEIFORM SIGN KA TIMES BALAG;Lo;0;L;;;;;N;;;;; +1215E;CUNEIFORM SIGN KA TIMES BAR;Lo;0;L;;;;;N;;;;; +1215F;CUNEIFORM SIGN KA TIMES BI;Lo;0;L;;;;;N;;;;; +12160;CUNEIFORM SIGN KA TIMES ERIN2;Lo;0;L;;;;;N;;;;; +12161;CUNEIFORM SIGN KA TIMES ESH2;Lo;0;L;;;;;N;;;;; +12162;CUNEIFORM SIGN KA TIMES GA;Lo;0;L;;;;;N;;;;; +12163;CUNEIFORM SIGN KA TIMES GAL;Lo;0;L;;;;;N;;;;; +12164;CUNEIFORM SIGN KA TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12165;CUNEIFORM SIGN KA TIMES GAR;Lo;0;L;;;;;N;;;;; +12166;CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A;Lo;0;L;;;;;N;;;;; +12167;CUNEIFORM SIGN KA TIMES GI;Lo;0;L;;;;;N;;;;; +12168;CUNEIFORM SIGN KA TIMES GIR2;Lo;0;L;;;;;N;;;;; +12169;CUNEIFORM SIGN KA TIMES GISH PLUS SAR;Lo;0;L;;;;;N;;;;; +1216A;CUNEIFORM SIGN KA TIMES GISH CROSSING GISH;Lo;0;L;;;;;N;;;;; +1216B;CUNEIFORM SIGN KA TIMES GU;Lo;0;L;;;;;N;;;;; +1216C;CUNEIFORM SIGN KA TIMES GUR7;Lo;0;L;;;;;N;;;;; +1216D;CUNEIFORM SIGN KA TIMES IGI;Lo;0;L;;;;;N;;;;; +1216E;CUNEIFORM SIGN KA TIMES IM;Lo;0;L;;;;;N;;;;; +1216F;CUNEIFORM SIGN KA TIMES KAK;Lo;0;L;;;;;N;;;;; +12170;CUNEIFORM SIGN KA TIMES KI;Lo;0;L;;;;;N;;;;; +12171;CUNEIFORM SIGN KA TIMES KID;Lo;0;L;;;;;N;;;;; +12172;CUNEIFORM SIGN KA TIMES LI;Lo;0;L;;;;;N;;;;; +12173;CUNEIFORM SIGN KA TIMES LU;Lo;0;L;;;;;N;;;;; +12174;CUNEIFORM SIGN KA TIMES ME;Lo;0;L;;;;;N;;;;; +12175;CUNEIFORM SIGN KA TIMES ME PLUS DU;Lo;0;L;;;;;N;;;;; +12176;CUNEIFORM SIGN KA TIMES ME PLUS GI;Lo;0;L;;;;;N;;;;; +12177;CUNEIFORM SIGN KA TIMES ME PLUS TE;Lo;0;L;;;;;N;;;;; +12178;CUNEIFORM SIGN KA TIMES MI;Lo;0;L;;;;;N;;;;; +12179;CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ;Lo;0;L;;;;;N;;;;; +1217A;CUNEIFORM SIGN KA TIMES NE;Lo;0;L;;;;;N;;;;; +1217B;CUNEIFORM SIGN KA TIMES NUN;Lo;0;L;;;;;N;;;;; +1217C;CUNEIFORM SIGN KA TIMES PI;Lo;0;L;;;;;N;;;;; +1217D;CUNEIFORM SIGN KA TIMES RU;Lo;0;L;;;;;N;;;;; +1217E;CUNEIFORM SIGN KA TIMES SA;Lo;0;L;;;;;N;;;;; +1217F;CUNEIFORM SIGN KA TIMES SAR;Lo;0;L;;;;;N;;;;; +12180;CUNEIFORM SIGN KA TIMES SHA;Lo;0;L;;;;;N;;;;; +12181;CUNEIFORM SIGN KA TIMES SHE;Lo;0;L;;;;;N;;;;; +12182;CUNEIFORM SIGN KA TIMES SHID;Lo;0;L;;;;;N;;;;; +12183;CUNEIFORM SIGN KA TIMES SHU;Lo;0;L;;;;;N;;;;; +12184;CUNEIFORM SIGN KA TIMES SIG;Lo;0;L;;;;;N;;;;; +12185;CUNEIFORM SIGN KA TIMES SUHUR;Lo;0;L;;;;;N;;;;; +12186;CUNEIFORM SIGN KA TIMES TAR;Lo;0;L;;;;;N;;;;; +12187;CUNEIFORM SIGN KA TIMES U;Lo;0;L;;;;;N;;;;; +12188;CUNEIFORM SIGN KA TIMES U2;Lo;0;L;;;;;N;;;;; +12189;CUNEIFORM SIGN KA TIMES UD;Lo;0;L;;;;;N;;;;; +1218A;CUNEIFORM SIGN KA TIMES UMUM TIMES PA;Lo;0;L;;;;;N;;;;; +1218B;CUNEIFORM SIGN KA TIMES USH;Lo;0;L;;;;;N;;;;; +1218C;CUNEIFORM SIGN KA TIMES ZI;Lo;0;L;;;;;N;;;;; +1218D;CUNEIFORM SIGN KA2;Lo;0;L;;;;;N;;;;; +1218E;CUNEIFORM SIGN KA2 CROSSING KA2;Lo;0;L;;;;;N;;;;; +1218F;CUNEIFORM SIGN KAB;Lo;0;L;;;;;N;;;;; +12190;CUNEIFORM SIGN KAD2;Lo;0;L;;;;;N;;;;; +12191;CUNEIFORM SIGN KAD3;Lo;0;L;;;;;N;;;;; +12192;CUNEIFORM SIGN KAD4;Lo;0;L;;;;;N;;;;; +12193;CUNEIFORM SIGN KAD5;Lo;0;L;;;;;N;;;;; +12194;CUNEIFORM SIGN KAD5 OVER KAD5;Lo;0;L;;;;;N;;;;; +12195;CUNEIFORM SIGN KAK;Lo;0;L;;;;;N;;;;; +12196;CUNEIFORM SIGN KAK TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +12197;CUNEIFORM SIGN KAL;Lo;0;L;;;;;N;;;;; +12198;CUNEIFORM SIGN KAL TIMES BAD;Lo;0;L;;;;;N;;;;; +12199;CUNEIFORM SIGN KAL CROSSING KAL;Lo;0;L;;;;;N;;;;; +1219A;CUNEIFORM SIGN KAM2;Lo;0;L;;;;;N;;;;; +1219B;CUNEIFORM SIGN KAM4;Lo;0;L;;;;;N;;;;; +1219C;CUNEIFORM SIGN KASKAL;Lo;0;L;;;;;N;;;;; +1219D;CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U;Lo;0;L;;;;;N;;;;; +1219E;CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U;Lo;0;L;;;;;N;;;;; +1219F;CUNEIFORM SIGN KESH2;Lo;0;L;;;;;N;;;;; +121A0;CUNEIFORM SIGN KI;Lo;0;L;;;;;N;;;;; +121A1;CUNEIFORM SIGN KI TIMES BAD;Lo;0;L;;;;;N;;;;; +121A2;CUNEIFORM SIGN KI TIMES U;Lo;0;L;;;;;N;;;;; +121A3;CUNEIFORM SIGN KI TIMES UD;Lo;0;L;;;;;N;;;;; +121A4;CUNEIFORM SIGN KID;Lo;0;L;;;;;N;;;;; +121A5;CUNEIFORM SIGN KIN;Lo;0;L;;;;;N;;;;; +121A6;CUNEIFORM SIGN KISAL;Lo;0;L;;;;;N;;;;; +121A7;CUNEIFORM SIGN KISH;Lo;0;L;;;;;N;;;;; +121A8;CUNEIFORM SIGN KISIM5;Lo;0;L;;;;;N;;;;; +121A9;CUNEIFORM SIGN KISIM5 OVER KISIM5;Lo;0;L;;;;;N;;;;; +121AA;CUNEIFORM SIGN KU;Lo;0;L;;;;;N;;;;; +121AB;CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2;Lo;0;L;;;;;N;;;;; +121AC;CUNEIFORM SIGN KU3;Lo;0;L;;;;;N;;;;; +121AD;CUNEIFORM SIGN KU4;Lo;0;L;;;;;N;;;;; +121AE;CUNEIFORM SIGN KU4 VARIANT FORM;Lo;0;L;;;;;N;;;;; +121AF;CUNEIFORM SIGN KU7;Lo;0;L;;;;;N;;;;; +121B0;CUNEIFORM SIGN KUL;Lo;0;L;;;;;N;;;;; +121B1;CUNEIFORM SIGN KUL GUNU;Lo;0;L;;;;;N;;;;; +121B2;CUNEIFORM SIGN KUN;Lo;0;L;;;;;N;;;;; +121B3;CUNEIFORM SIGN KUR;Lo;0;L;;;;;N;;;;; +121B4;CUNEIFORM SIGN KUR OPPOSING KUR;Lo;0;L;;;;;N;;;;; +121B5;CUNEIFORM SIGN KUSHU2;Lo;0;L;;;;;N;;;;; +121B6;CUNEIFORM SIGN KWU318;Lo;0;L;;;;;N;;;;; +121B7;CUNEIFORM SIGN LA;Lo;0;L;;;;;N;;;;; +121B8;CUNEIFORM SIGN LAGAB;Lo;0;L;;;;;N;;;;; +121B9;CUNEIFORM SIGN LAGAB TIMES A;Lo;0;L;;;;;N;;;;; +121BA;CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA;Lo;0;L;;;;;N;;;;; +121BB;CUNEIFORM SIGN LAGAB TIMES A PLUS GAR;Lo;0;L;;;;;N;;;;; +121BC;CUNEIFORM SIGN LAGAB TIMES A PLUS LAL;Lo;0;L;;;;;N;;;;; +121BD;CUNEIFORM SIGN LAGAB TIMES AL;Lo;0;L;;;;;N;;;;; +121BE;CUNEIFORM SIGN LAGAB TIMES AN;Lo;0;L;;;;;N;;;;; +121BF;CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU;Lo;0;L;;;;;N;;;;; +121C0;CUNEIFORM SIGN LAGAB TIMES BAD;Lo;0;L;;;;;N;;;;; +121C1;CUNEIFORM SIGN LAGAB TIMES BI;Lo;0;L;;;;;N;;;;; +121C2;CUNEIFORM SIGN LAGAB TIMES DAR;Lo;0;L;;;;;N;;;;; +121C3;CUNEIFORM SIGN LAGAB TIMES EN;Lo;0;L;;;;;N;;;;; +121C4;CUNEIFORM SIGN LAGAB TIMES GA;Lo;0;L;;;;;N;;;;; +121C5;CUNEIFORM SIGN LAGAB TIMES GAR;Lo;0;L;;;;;N;;;;; +121C6;CUNEIFORM SIGN LAGAB TIMES GUD;Lo;0;L;;;;;N;;;;; +121C7;CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD;Lo;0;L;;;;;N;;;;; +121C8;CUNEIFORM SIGN LAGAB TIMES HA;Lo;0;L;;;;;N;;;;; +121C9;CUNEIFORM SIGN LAGAB TIMES HAL;Lo;0;L;;;;;N;;;;; +121CA;CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN;Lo;0;L;;;;;N;;;;; +121CB;CUNEIFORM SIGN LAGAB TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +121CC;CUNEIFORM SIGN LAGAB TIMES IM;Lo;0;L;;;;;N;;;;; +121CD;CUNEIFORM SIGN LAGAB TIMES IM PLUS HA;Lo;0;L;;;;;N;;;;; +121CE;CUNEIFORM SIGN LAGAB TIMES IM PLUS LU;Lo;0;L;;;;;N;;;;; +121CF;CUNEIFORM SIGN LAGAB TIMES KI;Lo;0;L;;;;;N;;;;; +121D0;CUNEIFORM SIGN LAGAB TIMES KIN;Lo;0;L;;;;;N;;;;; +121D1;CUNEIFORM SIGN LAGAB TIMES KU3;Lo;0;L;;;;;N;;;;; +121D2;CUNEIFORM SIGN LAGAB TIMES KUL;Lo;0;L;;;;;N;;;;; +121D3;CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A;Lo;0;L;;;;;N;;;;; +121D4;CUNEIFORM SIGN LAGAB TIMES LAGAB;Lo;0;L;;;;;N;;;;; +121D5;CUNEIFORM SIGN LAGAB TIMES LISH;Lo;0;L;;;;;N;;;;; +121D6;CUNEIFORM SIGN LAGAB TIMES LU;Lo;0;L;;;;;N;;;;; +121D7;CUNEIFORM SIGN LAGAB TIMES LUL;Lo;0;L;;;;;N;;;;; +121D8;CUNEIFORM SIGN LAGAB TIMES ME;Lo;0;L;;;;;N;;;;; +121D9;CUNEIFORM SIGN LAGAB TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; +121DA;CUNEIFORM SIGN LAGAB TIMES MUSH;Lo;0;L;;;;;N;;;;; +121DB;CUNEIFORM SIGN LAGAB TIMES NE;Lo;0;L;;;;;N;;;;; +121DC;CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM;Lo;0;L;;;;;N;;;;; +121DD;CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2;Lo;0;L;;;;;N;;;;; +121DE;CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU;Lo;0;L;;;;;N;;;;; +121DF;CUNEIFORM SIGN LAGAB TIMES SHU2;Lo;0;L;;;;;N;;;;; +121E0;CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2;Lo;0;L;;;;;N;;;;; +121E1;CUNEIFORM SIGN LAGAB TIMES SUM;Lo;0;L;;;;;N;;;;; +121E2;CUNEIFORM SIGN LAGAB TIMES TAG;Lo;0;L;;;;;N;;;;; +121E3;CUNEIFORM SIGN LAGAB TIMES TAK4;Lo;0;L;;;;;N;;;;; +121E4;CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA;Lo;0;L;;;;;N;;;;; +121E5;CUNEIFORM SIGN LAGAB TIMES U;Lo;0;L;;;;;N;;;;; +121E6;CUNEIFORM SIGN LAGAB TIMES U PLUS A;Lo;0;L;;;;;N;;;;; +121E7;CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;; +121E8;CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;; +121E9;CUNEIFORM SIGN LAGAB TIMES UD;Lo;0;L;;;;;N;;;;; +121EA;CUNEIFORM SIGN LAGAB TIMES USH;Lo;0;L;;;;;N;;;;; +121EB;CUNEIFORM SIGN LAGAB SQUARED;Lo;0;L;;;;;N;;;;; +121EC;CUNEIFORM SIGN LAGAR;Lo;0;L;;;;;N;;;;; +121ED;CUNEIFORM SIGN LAGAR TIMES SHE;Lo;0;L;;;;;N;;;;; +121EE;CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM;Lo;0;L;;;;;N;;;;; +121EF;CUNEIFORM SIGN LAGAR GUNU;Lo;0;L;;;;;N;;;;; +121F0;CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE;Lo;0;L;;;;;N;;;;; +121F1;CUNEIFORM SIGN LAHSHU;Lo;0;L;;;;;N;;;;; +121F2;CUNEIFORM SIGN LAL;Lo;0;L;;;;;N;;;;; +121F3;CUNEIFORM SIGN LAL TIMES LAL;Lo;0;L;;;;;N;;;;; +121F4;CUNEIFORM SIGN LAM;Lo;0;L;;;;;N;;;;; +121F5;CUNEIFORM SIGN LAM TIMES KUR;Lo;0;L;;;;;N;;;;; +121F6;CUNEIFORM SIGN LAM TIMES KUR PLUS RU;Lo;0;L;;;;;N;;;;; +121F7;CUNEIFORM SIGN LI;Lo;0;L;;;;;N;;;;; +121F8;CUNEIFORM SIGN LIL;Lo;0;L;;;;;N;;;;; +121F9;CUNEIFORM SIGN LIMMU2;Lo;0;L;;;;;N;;;;; +121FA;CUNEIFORM SIGN LISH;Lo;0;L;;;;;N;;;;; +121FB;CUNEIFORM SIGN LU;Lo;0;L;;;;;N;;;;; +121FC;CUNEIFORM SIGN LU TIMES BAD;Lo;0;L;;;;;N;;;;; +121FD;CUNEIFORM SIGN LU2;Lo;0;L;;;;;N;;;;; +121FE;CUNEIFORM SIGN LU2 TIMES AL;Lo;0;L;;;;;N;;;;; +121FF;CUNEIFORM SIGN LU2 TIMES BAD;Lo;0;L;;;;;N;;;;; +12200;CUNEIFORM SIGN LU2 TIMES ESH2;Lo;0;L;;;;;N;;;;; +12201;CUNEIFORM SIGN LU2 TIMES ESH2 TENU;Lo;0;L;;;;;N;;;;; +12202;CUNEIFORM SIGN LU2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12203;CUNEIFORM SIGN LU2 TIMES HI TIMES BAD;Lo;0;L;;;;;N;;;;; +12204;CUNEIFORM SIGN LU2 TIMES IM;Lo;0;L;;;;;N;;;;; +12205;CUNEIFORM SIGN LU2 TIMES KAD2;Lo;0;L;;;;;N;;;;; +12206;CUNEIFORM SIGN LU2 TIMES KAD3;Lo;0;L;;;;;N;;;;; +12207;CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH;Lo;0;L;;;;;N;;;;; +12208;CUNEIFORM SIGN LU2 TIMES KI;Lo;0;L;;;;;N;;;;; +12209;CUNEIFORM SIGN LU2 TIMES LA PLUS ASH;Lo;0;L;;;;;N;;;;; +1220A;CUNEIFORM SIGN LU2 TIMES LAGAB;Lo;0;L;;;;;N;;;;; +1220B;CUNEIFORM SIGN LU2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; +1220C;CUNEIFORM SIGN LU2 TIMES NE;Lo;0;L;;;;;N;;;;; +1220D;CUNEIFORM SIGN LU2 TIMES NU;Lo;0;L;;;;;N;;;;; +1220E;CUNEIFORM SIGN LU2 TIMES SI PLUS ASH;Lo;0;L;;;;;N;;;;; +1220F;CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU;Lo;0;L;;;;;N;;;;; +12210;CUNEIFORM SIGN LU2 TIMES TUG2;Lo;0;L;;;;;N;;;;; +12211;CUNEIFORM SIGN LU2 TENU;Lo;0;L;;;;;N;;;;; +12212;CUNEIFORM SIGN LU2 CROSSING LU2;Lo;0;L;;;;;N;;;;; +12213;CUNEIFORM SIGN LU2 OPPOSING LU2;Lo;0;L;;;;;N;;;;; +12214;CUNEIFORM SIGN LU2 SQUARED;Lo;0;L;;;;;N;;;;; +12215;CUNEIFORM SIGN LU2 SHESHIG;Lo;0;L;;;;;N;;;;; +12216;CUNEIFORM SIGN LU3;Lo;0;L;;;;;N;;;;; +12217;CUNEIFORM SIGN LUGAL;Lo;0;L;;;;;N;;;;; +12218;CUNEIFORM SIGN LUGAL OVER LUGAL;Lo;0;L;;;;;N;;;;; +12219;CUNEIFORM SIGN LUGAL OPPOSING LUGAL;Lo;0;L;;;;;N;;;;; +1221A;CUNEIFORM SIGN LUGAL SHESHIG;Lo;0;L;;;;;N;;;;; +1221B;CUNEIFORM SIGN LUH;Lo;0;L;;;;;N;;;;; +1221C;CUNEIFORM SIGN LUL;Lo;0;L;;;;;N;;;;; +1221D;CUNEIFORM SIGN LUM;Lo;0;L;;;;;N;;;;; +1221E;CUNEIFORM SIGN LUM OVER LUM;Lo;0;L;;;;;N;;;;; +1221F;CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR;Lo;0;L;;;;;N;;;;; +12220;CUNEIFORM SIGN MA;Lo;0;L;;;;;N;;;;; +12221;CUNEIFORM SIGN MA TIMES TAK4;Lo;0;L;;;;;N;;;;; +12222;CUNEIFORM SIGN MA GUNU;Lo;0;L;;;;;N;;;;; +12223;CUNEIFORM SIGN MA2;Lo;0;L;;;;;N;;;;; +12224;CUNEIFORM SIGN MAH;Lo;0;L;;;;;N;;;;; +12225;CUNEIFORM SIGN MAR;Lo;0;L;;;;;N;;;;; +12226;CUNEIFORM SIGN MASH;Lo;0;L;;;;;N;;;;; +12227;CUNEIFORM SIGN MASH2;Lo;0;L;;;;;N;;;;; +12228;CUNEIFORM SIGN ME;Lo;0;L;;;;;N;;;;; +12229;CUNEIFORM SIGN MES;Lo;0;L;;;;;N;;;;; +1222A;CUNEIFORM SIGN MI;Lo;0;L;;;;;N;;;;; +1222B;CUNEIFORM SIGN MIN;Lo;0;L;;;;;N;;;;; +1222C;CUNEIFORM SIGN MU;Lo;0;L;;;;;N;;;;; +1222D;CUNEIFORM SIGN MU OVER MU;Lo;0;L;;;;;N;;;;; +1222E;CUNEIFORM SIGN MUG;Lo;0;L;;;;;N;;;;; +1222F;CUNEIFORM SIGN MUG GUNU;Lo;0;L;;;;;N;;;;; +12230;CUNEIFORM SIGN MUNSUB;Lo;0;L;;;;;N;;;;; +12231;CUNEIFORM SIGN MURGU2;Lo;0;L;;;;;N;;;;; +12232;CUNEIFORM SIGN MUSH;Lo;0;L;;;;;N;;;;; +12233;CUNEIFORM SIGN MUSH TIMES A;Lo;0;L;;;;;N;;;;; +12234;CUNEIFORM SIGN MUSH TIMES KUR;Lo;0;L;;;;;N;;;;; +12235;CUNEIFORM SIGN MUSH TIMES ZA;Lo;0;L;;;;;N;;;;; +12236;CUNEIFORM SIGN MUSH OVER MUSH;Lo;0;L;;;;;N;;;;; +12237;CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA;Lo;0;L;;;;;N;;;;; +12238;CUNEIFORM SIGN MUSH CROSSING MUSH;Lo;0;L;;;;;N;;;;; +12239;CUNEIFORM SIGN MUSH3;Lo;0;L;;;;;N;;;;; +1223A;CUNEIFORM SIGN MUSH3 TIMES A;Lo;0;L;;;;;N;;;;; +1223B;CUNEIFORM SIGN MUSH3 TIMES A PLUS DI;Lo;0;L;;;;;N;;;;; +1223C;CUNEIFORM SIGN MUSH3 TIMES DI;Lo;0;L;;;;;N;;;;; +1223D;CUNEIFORM SIGN MUSH3 GUNU;Lo;0;L;;;;;N;;;;; +1223E;CUNEIFORM SIGN NA;Lo;0;L;;;;;N;;;;; +1223F;CUNEIFORM SIGN NA2;Lo;0;L;;;;;N;;;;; +12240;CUNEIFORM SIGN NAGA;Lo;0;L;;;;;N;;;;; +12241;CUNEIFORM SIGN NAGA INVERTED;Lo;0;L;;;;;N;;;;; +12242;CUNEIFORM SIGN NAGA TIMES SHU TENU;Lo;0;L;;;;;N;;;;; +12243;CUNEIFORM SIGN NAGA OPPOSING NAGA;Lo;0;L;;;;;N;;;;; +12244;CUNEIFORM SIGN NAGAR;Lo;0;L;;;;;N;;;;; +12245;CUNEIFORM SIGN NAM NUTILLU;Lo;0;L;;;;;N;;;;; +12246;CUNEIFORM SIGN NAM;Lo;0;L;;;;;N;;;;; +12247;CUNEIFORM SIGN NAM2;Lo;0;L;;;;;N;;;;; +12248;CUNEIFORM SIGN NE;Lo;0;L;;;;;N;;;;; +12249;CUNEIFORM SIGN NE TIMES A;Lo;0;L;;;;;N;;;;; +1224A;CUNEIFORM SIGN NE TIMES UD;Lo;0;L;;;;;N;;;;; +1224B;CUNEIFORM SIGN NE SHESHIG;Lo;0;L;;;;;N;;;;; +1224C;CUNEIFORM SIGN NI;Lo;0;L;;;;;N;;;;; +1224D;CUNEIFORM SIGN NI TIMES E;Lo;0;L;;;;;N;;;;; +1224E;CUNEIFORM SIGN NI2;Lo;0;L;;;;;N;;;;; +1224F;CUNEIFORM SIGN NIM;Lo;0;L;;;;;N;;;;; +12250;CUNEIFORM SIGN NIM TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12251;CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU;Lo;0;L;;;;;N;;;;; +12252;CUNEIFORM SIGN NINDA2;Lo;0;L;;;;;N;;;;; +12253;CUNEIFORM SIGN NINDA2 TIMES AN;Lo;0;L;;;;;N;;;;; +12254;CUNEIFORM SIGN NINDA2 TIMES ASH;Lo;0;L;;;;;N;;;;; +12255;CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH;Lo;0;L;;;;;N;;;;; +12256;CUNEIFORM SIGN NINDA2 TIMES GUD;Lo;0;L;;;;;N;;;;; +12257;CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU;Lo;0;L;;;;;N;;;;; +12258;CUNEIFORM SIGN NINDA2 TIMES NE;Lo;0;L;;;;;N;;;;; +12259;CUNEIFORM SIGN NINDA2 TIMES NUN;Lo;0;L;;;;;N;;;;; +1225A;CUNEIFORM SIGN NINDA2 TIMES SHE;Lo;0;L;;;;;N;;;;; +1225B;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN;Lo;0;L;;;;;N;;;;; +1225C;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH;Lo;0;L;;;;;N;;;;; +1225D;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH;Lo;0;L;;;;;N;;;;; +1225E;CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;; +1225F;CUNEIFORM SIGN NINDA2 TIMES USH;Lo;0;L;;;;;N;;;;; +12260;CUNEIFORM SIGN NISAG;Lo;0;L;;;;;N;;;;; +12261;CUNEIFORM SIGN NU;Lo;0;L;;;;;N;;;;; +12262;CUNEIFORM SIGN NU11;Lo;0;L;;;;;N;;;;; +12263;CUNEIFORM SIGN NUN;Lo;0;L;;;;;N;;;;; +12264;CUNEIFORM SIGN NUN LAGAR TIMES GAR;Lo;0;L;;;;;N;;;;; +12265;CUNEIFORM SIGN NUN LAGAR TIMES MASH;Lo;0;L;;;;;N;;;;; +12266;CUNEIFORM SIGN NUN LAGAR TIMES SAL;Lo;0;L;;;;;N;;;;; +12267;CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL;Lo;0;L;;;;;N;;;;; +12268;CUNEIFORM SIGN NUN LAGAR TIMES USH;Lo;0;L;;;;;N;;;;; +12269;CUNEIFORM SIGN NUN TENU;Lo;0;L;;;;;N;;;;; +1226A;CUNEIFORM SIGN NUN OVER NUN;Lo;0;L;;;;;N;;;;; +1226B;CUNEIFORM SIGN NUN CROSSING NUN;Lo;0;L;;;;;N;;;;; +1226C;CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR;Lo;0;L;;;;;N;;;;; +1226D;CUNEIFORM SIGN NUNUZ;Lo;0;L;;;;;N;;;;; +1226E;CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB;Lo;0;L;;;;;N;;;;; +1226F;CUNEIFORM SIGN NUNUZ AB2 TIMES BI;Lo;0;L;;;;;N;;;;; +12270;CUNEIFORM SIGN NUNUZ AB2 TIMES DUG;Lo;0;L;;;;;N;;;;; +12271;CUNEIFORM SIGN NUNUZ AB2 TIMES GUD;Lo;0;L;;;;;N;;;;; +12272;CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +12273;CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3;Lo;0;L;;;;;N;;;;; +12274;CUNEIFORM SIGN NUNUZ AB2 TIMES LA;Lo;0;L;;;;;N;;;;; +12275;CUNEIFORM SIGN NUNUZ AB2 TIMES NE;Lo;0;L;;;;;N;;;;; +12276;CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3;Lo;0;L;;;;;N;;;;; +12277;CUNEIFORM SIGN NUNUZ AB2 TIMES U2;Lo;0;L;;;;;N;;;;; +12278;CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI;Lo;0;L;;;;;N;;;;; +12279;CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U;Lo;0;L;;;;;N;;;;; +1227A;CUNEIFORM SIGN PA;Lo;0;L;;;;;N;;;;; +1227B;CUNEIFORM SIGN PAD;Lo;0;L;;;;;N;;;;; +1227C;CUNEIFORM SIGN PAN;Lo;0;L;;;;;N;;;;; +1227D;CUNEIFORM SIGN PAP;Lo;0;L;;;;;N;;;;; +1227E;CUNEIFORM SIGN PESH2;Lo;0;L;;;;;N;;;;; +1227F;CUNEIFORM SIGN PI;Lo;0;L;;;;;N;;;;; +12280;CUNEIFORM SIGN PI TIMES A;Lo;0;L;;;;;N;;;;; +12281;CUNEIFORM SIGN PI TIMES AB;Lo;0;L;;;;;N;;;;; +12282;CUNEIFORM SIGN PI TIMES BI;Lo;0;L;;;;;N;;;;; +12283;CUNEIFORM SIGN PI TIMES BU;Lo;0;L;;;;;N;;;;; +12284;CUNEIFORM SIGN PI TIMES E;Lo;0;L;;;;;N;;;;; +12285;CUNEIFORM SIGN PI TIMES I;Lo;0;L;;;;;N;;;;; +12286;CUNEIFORM SIGN PI TIMES IB;Lo;0;L;;;;;N;;;;; +12287;CUNEIFORM SIGN PI TIMES U;Lo;0;L;;;;;N;;;;; +12288;CUNEIFORM SIGN PI TIMES U2;Lo;0;L;;;;;N;;;;; +12289;CUNEIFORM SIGN PI CROSSING PI;Lo;0;L;;;;;N;;;;; +1228A;CUNEIFORM SIGN PIRIG;Lo;0;L;;;;;N;;;;; +1228B;CUNEIFORM SIGN PIRIG TIMES KAL;Lo;0;L;;;;;N;;;;; +1228C;CUNEIFORM SIGN PIRIG TIMES UD;Lo;0;L;;;;;N;;;;; +1228D;CUNEIFORM SIGN PIRIG TIMES ZA;Lo;0;L;;;;;N;;;;; +1228E;CUNEIFORM SIGN PIRIG OPPOSING PIRIG;Lo;0;L;;;;;N;;;;; +1228F;CUNEIFORM SIGN RA;Lo;0;L;;;;;N;;;;; +12290;CUNEIFORM SIGN RAB;Lo;0;L;;;;;N;;;;; +12291;CUNEIFORM SIGN RI;Lo;0;L;;;;;N;;;;; +12292;CUNEIFORM SIGN RU;Lo;0;L;;;;;N;;;;; +12293;CUNEIFORM SIGN SA;Lo;0;L;;;;;N;;;;; +12294;CUNEIFORM SIGN SAG NUTILLU;Lo;0;L;;;;;N;;;;; +12295;CUNEIFORM SIGN SAG;Lo;0;L;;;;;N;;;;; +12296;CUNEIFORM SIGN SAG TIMES A;Lo;0;L;;;;;N;;;;; +12297;CUNEIFORM SIGN SAG TIMES DU;Lo;0;L;;;;;N;;;;; +12298;CUNEIFORM SIGN SAG TIMES DUB;Lo;0;L;;;;;N;;;;; +12299;CUNEIFORM SIGN SAG TIMES HA;Lo;0;L;;;;;N;;;;; +1229A;CUNEIFORM SIGN SAG TIMES KAK;Lo;0;L;;;;;N;;;;; +1229B;CUNEIFORM SIGN SAG TIMES KUR;Lo;0;L;;;;;N;;;;; +1229C;CUNEIFORM SIGN SAG TIMES LUM;Lo;0;L;;;;;N;;;;; +1229D;CUNEIFORM SIGN SAG TIMES MI;Lo;0;L;;;;;N;;;;; +1229E;CUNEIFORM SIGN SAG TIMES NUN;Lo;0;L;;;;;N;;;;; +1229F;CUNEIFORM SIGN SAG TIMES SAL;Lo;0;L;;;;;N;;;;; +122A0;CUNEIFORM SIGN SAG TIMES SHID;Lo;0;L;;;;;N;;;;; +122A1;CUNEIFORM SIGN SAG TIMES TAB;Lo;0;L;;;;;N;;;;; +122A2;CUNEIFORM SIGN SAG TIMES U2;Lo;0;L;;;;;N;;;;; +122A3;CUNEIFORM SIGN SAG TIMES UB;Lo;0;L;;;;;N;;;;; +122A4;CUNEIFORM SIGN SAG TIMES UM;Lo;0;L;;;;;N;;;;; +122A5;CUNEIFORM SIGN SAG TIMES UR;Lo;0;L;;;;;N;;;;; +122A6;CUNEIFORM SIGN SAG TIMES USH;Lo;0;L;;;;;N;;;;; +122A7;CUNEIFORM SIGN SAG OVER SAG;Lo;0;L;;;;;N;;;;; +122A8;CUNEIFORM SIGN SAG GUNU;Lo;0;L;;;;;N;;;;; +122A9;CUNEIFORM SIGN SAL;Lo;0;L;;;;;N;;;;; +122AA;CUNEIFORM SIGN SAL LAGAB TIMES ASH2;Lo;0;L;;;;;N;;;;; +122AB;CUNEIFORM SIGN SANGA2;Lo;0;L;;;;;N;;;;; +122AC;CUNEIFORM SIGN SAR;Lo;0;L;;;;;N;;;;; +122AD;CUNEIFORM SIGN SHA;Lo;0;L;;;;;N;;;;; +122AE;CUNEIFORM SIGN SHA3;Lo;0;L;;;;;N;;;;; +122AF;CUNEIFORM SIGN SHA3 TIMES A;Lo;0;L;;;;;N;;;;; +122B0;CUNEIFORM SIGN SHA3 TIMES BAD;Lo;0;L;;;;;N;;;;; +122B1;CUNEIFORM SIGN SHA3 TIMES GISH;Lo;0;L;;;;;N;;;;; +122B2;CUNEIFORM SIGN SHA3 TIMES NE;Lo;0;L;;;;;N;;;;; +122B3;CUNEIFORM SIGN SHA3 TIMES SHU2;Lo;0;L;;;;;N;;;;; +122B4;CUNEIFORM SIGN SHA3 TIMES TUR;Lo;0;L;;;;;N;;;;; +122B5;CUNEIFORM SIGN SHA3 TIMES U;Lo;0;L;;;;;N;;;;; +122B6;CUNEIFORM SIGN SHA3 TIMES U PLUS A;Lo;0;L;;;;;N;;;;; +122B7;CUNEIFORM SIGN SHA6;Lo;0;L;;;;;N;;;;; +122B8;CUNEIFORM SIGN SHAB6;Lo;0;L;;;;;N;;;;; +122B9;CUNEIFORM SIGN SHAR2;Lo;0;L;;;;;N;;;;; +122BA;CUNEIFORM SIGN SHE;Lo;0;L;;;;;N;;;;; +122BB;CUNEIFORM SIGN SHE HU;Lo;0;L;;;;;N;;;;; +122BC;CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; +122BD;CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR;Lo;0;L;;;;;N;;;;; +122BE;CUNEIFORM SIGN SHEG9;Lo;0;L;;;;;N;;;;; +122BF;CUNEIFORM SIGN SHEN;Lo;0;L;;;;;N;;;;; +122C0;CUNEIFORM SIGN SHESH;Lo;0;L;;;;;N;;;;; +122C1;CUNEIFORM SIGN SHESH2;Lo;0;L;;;;;N;;;;; +122C2;CUNEIFORM SIGN SHESHLAM;Lo;0;L;;;;;N;;;;; +122C3;CUNEIFORM SIGN SHID;Lo;0;L;;;;;N;;;;; +122C4;CUNEIFORM SIGN SHID TIMES A;Lo;0;L;;;;;N;;;;; +122C5;CUNEIFORM SIGN SHID TIMES IM;Lo;0;L;;;;;N;;;;; +122C6;CUNEIFORM SIGN SHIM;Lo;0;L;;;;;N;;;;; +122C7;CUNEIFORM SIGN SHIM TIMES A;Lo;0;L;;;;;N;;;;; +122C8;CUNEIFORM SIGN SHIM TIMES BAL;Lo;0;L;;;;;N;;;;; +122C9;CUNEIFORM SIGN SHIM TIMES BULUG;Lo;0;L;;;;;N;;;;; +122CA;CUNEIFORM SIGN SHIM TIMES DIN;Lo;0;L;;;;;N;;;;; +122CB;CUNEIFORM SIGN SHIM TIMES GAR;Lo;0;L;;;;;N;;;;; +122CC;CUNEIFORM SIGN SHIM TIMES IGI;Lo;0;L;;;;;N;;;;; +122CD;CUNEIFORM SIGN SHIM TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +122CE;CUNEIFORM SIGN SHIM TIMES KUSHU2;Lo;0;L;;;;;N;;;;; +122CF;CUNEIFORM SIGN SHIM TIMES LUL;Lo;0;L;;;;;N;;;;; +122D0;CUNEIFORM SIGN SHIM TIMES MUG;Lo;0;L;;;;;N;;;;; +122D1;CUNEIFORM SIGN SHIM TIMES SAL;Lo;0;L;;;;;N;;;;; +122D2;CUNEIFORM SIGN SHINIG;Lo;0;L;;;;;N;;;;; +122D3;CUNEIFORM SIGN SHIR;Lo;0;L;;;;;N;;;;; +122D4;CUNEIFORM SIGN SHIR TENU;Lo;0;L;;;;;N;;;;; +122D5;CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR;Lo;0;L;;;;;N;;;;; +122D6;CUNEIFORM SIGN SHITA;Lo;0;L;;;;;N;;;;; +122D7;CUNEIFORM SIGN SHU;Lo;0;L;;;;;N;;;;; +122D8;CUNEIFORM SIGN SHU OVER INVERTED SHU;Lo;0;L;;;;;N;;;;; +122D9;CUNEIFORM SIGN SHU2;Lo;0;L;;;;;N;;;;; +122DA;CUNEIFORM SIGN SHUBUR;Lo;0;L;;;;;N;;;;; +122DB;CUNEIFORM SIGN SI;Lo;0;L;;;;;N;;;;; +122DC;CUNEIFORM SIGN SI GUNU;Lo;0;L;;;;;N;;;;; +122DD;CUNEIFORM SIGN SIG;Lo;0;L;;;;;N;;;;; +122DE;CUNEIFORM SIGN SIG4;Lo;0;L;;;;;N;;;;; +122DF;CUNEIFORM SIGN SIG4 OVER SIG4 SHU2;Lo;0;L;;;;;N;;;;; +122E0;CUNEIFORM SIGN SIK2;Lo;0;L;;;;;N;;;;; +122E1;CUNEIFORM SIGN SILA3;Lo;0;L;;;;;N;;;;; +122E2;CUNEIFORM SIGN SU;Lo;0;L;;;;;N;;;;; +122E3;CUNEIFORM SIGN SU OVER SU;Lo;0;L;;;;;N;;;;; +122E4;CUNEIFORM SIGN SUD;Lo;0;L;;;;;N;;;;; +122E5;CUNEIFORM SIGN SUD2;Lo;0;L;;;;;N;;;;; +122E6;CUNEIFORM SIGN SUHUR;Lo;0;L;;;;;N;;;;; +122E7;CUNEIFORM SIGN SUM;Lo;0;L;;;;;N;;;;; +122E8;CUNEIFORM SIGN SUMASH;Lo;0;L;;;;;N;;;;; +122E9;CUNEIFORM SIGN SUR;Lo;0;L;;;;;N;;;;; +122EA;CUNEIFORM SIGN SUR9;Lo;0;L;;;;;N;;;;; +122EB;CUNEIFORM SIGN TA;Lo;0;L;;;;;N;;;;; +122EC;CUNEIFORM SIGN TA ASTERISK;Lo;0;L;;;;;N;;;;; +122ED;CUNEIFORM SIGN TA TIMES HI;Lo;0;L;;;;;N;;;;; +122EE;CUNEIFORM SIGN TA TIMES MI;Lo;0;L;;;;;N;;;;; +122EF;CUNEIFORM SIGN TA GUNU;Lo;0;L;;;;;N;;;;; +122F0;CUNEIFORM SIGN TAB;Lo;0;L;;;;;N;;;;; +122F1;CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH;Lo;0;L;;;;;N;;;;; +122F2;CUNEIFORM SIGN TAB SQUARED;Lo;0;L;;;;;N;;;;; +122F3;CUNEIFORM SIGN TAG;Lo;0;L;;;;;N;;;;; +122F4;CUNEIFORM SIGN TAG TIMES BI;Lo;0;L;;;;;N;;;;; +122F5;CUNEIFORM SIGN TAG TIMES GUD;Lo;0;L;;;;;N;;;;; +122F6;CUNEIFORM SIGN TAG TIMES SHE;Lo;0;L;;;;;N;;;;; +122F7;CUNEIFORM SIGN TAG TIMES SHU;Lo;0;L;;;;;N;;;;; +122F8;CUNEIFORM SIGN TAG TIMES TUG2;Lo;0;L;;;;;N;;;;; +122F9;CUNEIFORM SIGN TAG TIMES UD;Lo;0;L;;;;;N;;;;; +122FA;CUNEIFORM SIGN TAK4;Lo;0;L;;;;;N;;;;; +122FB;CUNEIFORM SIGN TAR;Lo;0;L;;;;;N;;;;; +122FC;CUNEIFORM SIGN TE;Lo;0;L;;;;;N;;;;; +122FD;CUNEIFORM SIGN TE GUNU;Lo;0;L;;;;;N;;;;; +122FE;CUNEIFORM SIGN TI;Lo;0;L;;;;;N;;;;; +122FF;CUNEIFORM SIGN TI TENU;Lo;0;L;;;;;N;;;;; +12300;CUNEIFORM SIGN TIL;Lo;0;L;;;;;N;;;;; +12301;CUNEIFORM SIGN TIR;Lo;0;L;;;;;N;;;;; +12302;CUNEIFORM SIGN TIR TIMES TAK4;Lo;0;L;;;;;N;;;;; +12303;CUNEIFORM SIGN TIR OVER TIR;Lo;0;L;;;;;N;;;;; +12304;CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; +12305;CUNEIFORM SIGN TU;Lo;0;L;;;;;N;;;;; +12306;CUNEIFORM SIGN TUG2;Lo;0;L;;;;;N;;;;; +12307;CUNEIFORM SIGN TUK;Lo;0;L;;;;;N;;;;; +12308;CUNEIFORM SIGN TUM;Lo;0;L;;;;;N;;;;; +12309;CUNEIFORM SIGN TUR;Lo;0;L;;;;;N;;;;; +1230A;CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA;Lo;0;L;;;;;N;;;;; +1230B;CUNEIFORM SIGN U;Lo;0;L;;;;;N;;;;; +1230C;CUNEIFORM SIGN U GUD;Lo;0;L;;;;;N;;;;; +1230D;CUNEIFORM SIGN U U U;Lo;0;L;;;;;N;;;;; +1230E;CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR;Lo;0;L;;;;;N;;;;; +1230F;CUNEIFORM SIGN U OVER U SUR OVER SUR;Lo;0;L;;;;;N;;;;; +12310;CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED;Lo;0;L;;;;;N;;;;; +12311;CUNEIFORM SIGN U2;Lo;0;L;;;;;N;;;;; +12312;CUNEIFORM SIGN UB;Lo;0;L;;;;;N;;;;; +12313;CUNEIFORM SIGN UD;Lo;0;L;;;;;N;;;;; +12314;CUNEIFORM SIGN UD KUSHU2;Lo;0;L;;;;;N;;;;; +12315;CUNEIFORM SIGN UD TIMES BAD;Lo;0;L;;;;;N;;;;; +12316;CUNEIFORM SIGN UD TIMES MI;Lo;0;L;;;;;N;;;;; +12317;CUNEIFORM SIGN UD TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;; +12318;CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU;Lo;0;L;;;;;N;;;;; +12319;CUNEIFORM SIGN UD GUNU;Lo;0;L;;;;;N;;;;; +1231A;CUNEIFORM SIGN UD SHESHIG;Lo;0;L;;;;;N;;;;; +1231B;CUNEIFORM SIGN UD SHESHIG TIMES BAD;Lo;0;L;;;;;N;;;;; +1231C;CUNEIFORM SIGN UDUG;Lo;0;L;;;;;N;;;;; +1231D;CUNEIFORM SIGN UM;Lo;0;L;;;;;N;;;;; +1231E;CUNEIFORM SIGN UM TIMES LAGAB;Lo;0;L;;;;;N;;;;; +1231F;CUNEIFORM SIGN UM TIMES ME PLUS DA;Lo;0;L;;;;;N;;;;; +12320;CUNEIFORM SIGN UM TIMES SHA3;Lo;0;L;;;;;N;;;;; +12321;CUNEIFORM SIGN UM TIMES U;Lo;0;L;;;;;N;;;;; +12322;CUNEIFORM SIGN UMBIN;Lo;0;L;;;;;N;;;;; +12323;CUNEIFORM SIGN UMUM;Lo;0;L;;;;;N;;;;; +12324;CUNEIFORM SIGN UMUM TIMES KASKAL;Lo;0;L;;;;;N;;;;; +12325;CUNEIFORM SIGN UMUM TIMES PA;Lo;0;L;;;;;N;;;;; +12326;CUNEIFORM SIGN UN;Lo;0;L;;;;;N;;;;; +12327;CUNEIFORM SIGN UN GUNU;Lo;0;L;;;;;N;;;;; +12328;CUNEIFORM SIGN UR;Lo;0;L;;;;;N;;;;; +12329;CUNEIFORM SIGN UR CROSSING UR;Lo;0;L;;;;;N;;;;; +1232A;CUNEIFORM SIGN UR SHESHIG;Lo;0;L;;;;;N;;;;; +1232B;CUNEIFORM SIGN UR2;Lo;0;L;;;;;N;;;;; +1232C;CUNEIFORM SIGN UR2 TIMES A PLUS HA;Lo;0;L;;;;;N;;;;; +1232D;CUNEIFORM SIGN UR2 TIMES A PLUS NA;Lo;0;L;;;;;N;;;;; +1232E;CUNEIFORM SIGN UR2 TIMES AL;Lo;0;L;;;;;N;;;;; +1232F;CUNEIFORM SIGN UR2 TIMES HA;Lo;0;L;;;;;N;;;;; +12330;CUNEIFORM SIGN UR2 TIMES NUN;Lo;0;L;;;;;N;;;;; +12331;CUNEIFORM SIGN UR2 TIMES U2;Lo;0;L;;;;;N;;;;; +12332;CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;; +12333;CUNEIFORM SIGN UR2 TIMES U2 PLUS BI;Lo;0;L;;;;;N;;;;; +12334;CUNEIFORM SIGN UR4;Lo;0;L;;;;;N;;;;; +12335;CUNEIFORM SIGN URI;Lo;0;L;;;;;N;;;;; +12336;CUNEIFORM SIGN URI3;Lo;0;L;;;;;N;;;;; +12337;CUNEIFORM SIGN URU;Lo;0;L;;;;;N;;;;; +12338;CUNEIFORM SIGN URU TIMES A;Lo;0;L;;;;;N;;;;; +12339;CUNEIFORM SIGN URU TIMES ASHGAB;Lo;0;L;;;;;N;;;;; +1233A;CUNEIFORM SIGN URU TIMES BAR;Lo;0;L;;;;;N;;;;; +1233B;CUNEIFORM SIGN URU TIMES DUN;Lo;0;L;;;;;N;;;;; +1233C;CUNEIFORM SIGN URU TIMES GA;Lo;0;L;;;;;N;;;;; +1233D;CUNEIFORM SIGN URU TIMES GAL;Lo;0;L;;;;;N;;;;; +1233E;CUNEIFORM SIGN URU TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1233F;CUNEIFORM SIGN URU TIMES GAR;Lo;0;L;;;;;N;;;;; +12340;CUNEIFORM SIGN URU TIMES GU;Lo;0;L;;;;;N;;;;; +12341;CUNEIFORM SIGN URU TIMES HA;Lo;0;L;;;;;N;;;;; +12342;CUNEIFORM SIGN URU TIMES IGI;Lo;0;L;;;;;N;;;;; +12343;CUNEIFORM SIGN URU TIMES IM;Lo;0;L;;;;;N;;;;; +12344;CUNEIFORM SIGN URU TIMES ISH;Lo;0;L;;;;;N;;;;; +12345;CUNEIFORM SIGN URU TIMES KI;Lo;0;L;;;;;N;;;;; +12346;CUNEIFORM SIGN URU TIMES LUM;Lo;0;L;;;;;N;;;;; +12347;CUNEIFORM SIGN URU TIMES MIN;Lo;0;L;;;;;N;;;;; +12348;CUNEIFORM SIGN URU TIMES PA;Lo;0;L;;;;;N;;;;; +12349;CUNEIFORM SIGN URU TIMES SHE;Lo;0;L;;;;;N;;;;; +1234A;CUNEIFORM SIGN URU TIMES SIG4;Lo;0;L;;;;;N;;;;; +1234B;CUNEIFORM SIGN URU TIMES TU;Lo;0;L;;;;;N;;;;; +1234C;CUNEIFORM SIGN URU TIMES U PLUS GUD;Lo;0;L;;;;;N;;;;; +1234D;CUNEIFORM SIGN URU TIMES UD;Lo;0;L;;;;;N;;;;; +1234E;CUNEIFORM SIGN URU TIMES URUDA;Lo;0;L;;;;;N;;;;; +1234F;CUNEIFORM SIGN URUDA;Lo;0;L;;;;;N;;;;; +12350;CUNEIFORM SIGN URUDA TIMES U;Lo;0;L;;;;;N;;;;; +12351;CUNEIFORM SIGN USH;Lo;0;L;;;;;N;;;;; +12352;CUNEIFORM SIGN USH TIMES A;Lo;0;L;;;;;N;;;;; +12353;CUNEIFORM SIGN USH TIMES KU;Lo;0;L;;;;;N;;;;; +12354;CUNEIFORM SIGN USH TIMES KUR;Lo;0;L;;;;;N;;;;; +12355;CUNEIFORM SIGN USH TIMES TAK4;Lo;0;L;;;;;N;;;;; +12356;CUNEIFORM SIGN USHX;Lo;0;L;;;;;N;;;;; +12357;CUNEIFORM SIGN USH2;Lo;0;L;;;;;N;;;;; +12358;CUNEIFORM SIGN USHUMX;Lo;0;L;;;;;N;;;;; +12359;CUNEIFORM SIGN UTUKI;Lo;0;L;;;;;N;;;;; +1235A;CUNEIFORM SIGN UZ3;Lo;0;L;;;;;N;;;;; +1235B;CUNEIFORM SIGN UZ3 TIMES KASKAL;Lo;0;L;;;;;N;;;;; +1235C;CUNEIFORM SIGN UZU;Lo;0;L;;;;;N;;;;; +1235D;CUNEIFORM SIGN ZA;Lo;0;L;;;;;N;;;;; +1235E;CUNEIFORM SIGN ZA TENU;Lo;0;L;;;;;N;;;;; +1235F;CUNEIFORM SIGN ZA SQUARED TIMES KUR;Lo;0;L;;;;;N;;;;; +12360;CUNEIFORM SIGN ZAG;Lo;0;L;;;;;N;;;;; +12361;CUNEIFORM SIGN ZAMX;Lo;0;L;;;;;N;;;;; +12362;CUNEIFORM SIGN ZE2;Lo;0;L;;;;;N;;;;; +12363;CUNEIFORM SIGN ZI;Lo;0;L;;;;;N;;;;; +12364;CUNEIFORM SIGN ZI OVER ZI;Lo;0;L;;;;;N;;;;; +12365;CUNEIFORM SIGN ZI3;Lo;0;L;;;;;N;;;;; +12366;CUNEIFORM SIGN ZIB;Lo;0;L;;;;;N;;;;; +12367;CUNEIFORM SIGN ZIB KABA TENU;Lo;0;L;;;;;N;;;;; +12368;CUNEIFORM SIGN ZIG;Lo;0;L;;;;;N;;;;; +12369;CUNEIFORM SIGN ZIZ2;Lo;0;L;;;;;N;;;;; +1236A;CUNEIFORM SIGN ZU;Lo;0;L;;;;;N;;;;; +1236B;CUNEIFORM SIGN ZU5;Lo;0;L;;;;;N;;;;; +1236C;CUNEIFORM SIGN ZU5 TIMES A;Lo;0;L;;;;;N;;;;; +1236D;CUNEIFORM SIGN ZUBUR;Lo;0;L;;;;;N;;;;; +1236E;CUNEIFORM SIGN ZUM;Lo;0;L;;;;;N;;;;; +12400;CUNEIFORM NUMERIC SIGN TWO ASH;Nl;0;L;;;;2;N;;;;; +12401;CUNEIFORM NUMERIC SIGN THREE ASH;Nl;0;L;;;;3;N;;;;; +12402;CUNEIFORM NUMERIC SIGN FOUR ASH;Nl;0;L;;;;4;N;;;;; +12403;CUNEIFORM NUMERIC SIGN FIVE ASH;Nl;0;L;;;;5;N;;;;; +12404;CUNEIFORM NUMERIC SIGN SIX ASH;Nl;0;L;;;;6;N;;;;; +12405;CUNEIFORM NUMERIC SIGN SEVEN ASH;Nl;0;L;;;;7;N;;;;; +12406;CUNEIFORM NUMERIC SIGN EIGHT ASH;Nl;0;L;;;;8;N;;;;; +12407;CUNEIFORM NUMERIC SIGN NINE ASH;Nl;0;L;;;;9;N;;;;; +12408;CUNEIFORM NUMERIC SIGN THREE DISH;Nl;0;L;;;;3;N;;;;; +12409;CUNEIFORM NUMERIC SIGN FOUR DISH;Nl;0;L;;;;4;N;;;;; +1240A;CUNEIFORM NUMERIC SIGN FIVE DISH;Nl;0;L;;;;5;N;;;;; +1240B;CUNEIFORM NUMERIC SIGN SIX DISH;Nl;0;L;;;;6;N;;;;; +1240C;CUNEIFORM NUMERIC SIGN SEVEN DISH;Nl;0;L;;;;7;N;;;;; +1240D;CUNEIFORM NUMERIC SIGN EIGHT DISH;Nl;0;L;;;;8;N;;;;; +1240E;CUNEIFORM NUMERIC SIGN NINE DISH;Nl;0;L;;;;9;N;;;;; +1240F;CUNEIFORM NUMERIC SIGN FOUR U;Nl;0;L;;;;4;N;;;;; +12410;CUNEIFORM NUMERIC SIGN FIVE U;Nl;0;L;;;;5;N;;;;; +12411;CUNEIFORM NUMERIC SIGN SIX U;Nl;0;L;;;;6;N;;;;; +12412;CUNEIFORM NUMERIC SIGN SEVEN U;Nl;0;L;;;;7;N;;;;; +12413;CUNEIFORM NUMERIC SIGN EIGHT U;Nl;0;L;;;;8;N;;;;; +12414;CUNEIFORM NUMERIC SIGN NINE U;Nl;0;L;;;;9;N;;;;; +12415;CUNEIFORM NUMERIC SIGN ONE GESH2;Nl;0;L;;;;1;N;;;;; +12416;CUNEIFORM NUMERIC SIGN TWO GESH2;Nl;0;L;;;;2;N;;;;; +12417;CUNEIFORM NUMERIC SIGN THREE GESH2;Nl;0;L;;;;3;N;;;;; +12418;CUNEIFORM NUMERIC SIGN FOUR GESH2;Nl;0;L;;;;4;N;;;;; +12419;CUNEIFORM NUMERIC SIGN FIVE GESH2;Nl;0;L;;;;5;N;;;;; +1241A;CUNEIFORM NUMERIC SIGN SIX GESH2;Nl;0;L;;;;6;N;;;;; +1241B;CUNEIFORM NUMERIC SIGN SEVEN GESH2;Nl;0;L;;;;7;N;;;;; +1241C;CUNEIFORM NUMERIC SIGN EIGHT GESH2;Nl;0;L;;;;8;N;;;;; +1241D;CUNEIFORM NUMERIC SIGN NINE GESH2;Nl;0;L;;;;9;N;;;;; +1241E;CUNEIFORM NUMERIC SIGN ONE GESHU;Nl;0;L;;;;1;N;;;;; +1241F;CUNEIFORM NUMERIC SIGN TWO GESHU;Nl;0;L;;;;2;N;;;;; +12420;CUNEIFORM NUMERIC SIGN THREE GESHU;Nl;0;L;;;;3;N;;;;; +12421;CUNEIFORM NUMERIC SIGN FOUR GESHU;Nl;0;L;;;;4;N;;;;; +12422;CUNEIFORM NUMERIC SIGN FIVE GESHU;Nl;0;L;;;;5;N;;;;; +12423;CUNEIFORM NUMERIC SIGN TWO SHAR2;Nl;0;L;;;;2;N;;;;; +12424;CUNEIFORM NUMERIC SIGN THREE SHAR2;Nl;0;L;;;;3;N;;;;; +12425;CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM;Nl;0;L;;;;3;N;;;;; +12426;CUNEIFORM NUMERIC SIGN FOUR SHAR2;Nl;0;L;;;;4;N;;;;; +12427;CUNEIFORM NUMERIC SIGN FIVE SHAR2;Nl;0;L;;;;5;N;;;;; +12428;CUNEIFORM NUMERIC SIGN SIX SHAR2;Nl;0;L;;;;6;N;;;;; +12429;CUNEIFORM NUMERIC SIGN SEVEN SHAR2;Nl;0;L;;;;7;N;;;;; +1242A;CUNEIFORM NUMERIC SIGN EIGHT SHAR2;Nl;0;L;;;;8;N;;;;; +1242B;CUNEIFORM NUMERIC SIGN NINE SHAR2;Nl;0;L;;;;9;N;;;;; +1242C;CUNEIFORM NUMERIC SIGN ONE SHARU;Nl;0;L;;;;1;N;;;;; +1242D;CUNEIFORM NUMERIC SIGN TWO SHARU;Nl;0;L;;;;2;N;;;;; +1242E;CUNEIFORM NUMERIC SIGN THREE SHARU;Nl;0;L;;;;3;N;;;;; +1242F;CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM;Nl;0;L;;;;3;N;;;;; +12430;CUNEIFORM NUMERIC SIGN FOUR SHARU;Nl;0;L;;;;4;N;;;;; +12431;CUNEIFORM NUMERIC SIGN FIVE SHARU;Nl;0;L;;;;5;N;;;;; +12432;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH;Nl;0;L;;;;;N;;;;; +12433;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN;Nl;0;L;;;;;N;;;;; +12434;CUNEIFORM NUMERIC SIGN ONE BURU;Nl;0;L;;;;1;N;;;;; +12435;CUNEIFORM NUMERIC SIGN TWO BURU;Nl;0;L;;;;2;N;;;;; +12436;CUNEIFORM NUMERIC SIGN THREE BURU;Nl;0;L;;;;3;N;;;;; +12437;CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM;Nl;0;L;;;;3;N;;;;; +12438;CUNEIFORM NUMERIC SIGN FOUR BURU;Nl;0;L;;;;4;N;;;;; +12439;CUNEIFORM NUMERIC SIGN FIVE BURU;Nl;0;L;;;;5;N;;;;; +1243A;CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16;Nl;0;L;;;;3;N;;;;; +1243B;CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21;Nl;0;L;;;;3;N;;;;; +1243C;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU;Nl;0;L;;;;4;N;;;;; +1243D;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4;Nl;0;L;;;;4;N;;;;; +1243E;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A;Nl;0;L;;;;4;N;;;;; +1243F;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B;Nl;0;L;;;;4;N;;;;; +12440;CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9;Nl;0;L;;;;6;N;;;;; +12441;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3;Nl;0;L;;;;7;N;;;;; +12442;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A;Nl;0;L;;;;7;N;;;;; +12443;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B;Nl;0;L;;;;7;N;;;;; +12444;CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU;Nl;0;L;;;;8;N;;;;; +12445;CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3;Nl;0;L;;;;8;N;;;;; +12446;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU;Nl;0;L;;;;9;N;;;;; +12447;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3;Nl;0;L;;;;9;N;;;;; +12448;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4;Nl;0;L;;;;9;N;;;;; +12449;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A;Nl;0;L;;;;9;N;;;;; +1244A;CUNEIFORM NUMERIC SIGN TWO ASH TENU;Nl;0;L;;;;2;N;;;;; +1244B;CUNEIFORM NUMERIC SIGN THREE ASH TENU;Nl;0;L;;;;3;N;;;;; +1244C;CUNEIFORM NUMERIC SIGN FOUR ASH TENU;Nl;0;L;;;;4;N;;;;; +1244D;CUNEIFORM NUMERIC SIGN FIVE ASH TENU;Nl;0;L;;;;5;N;;;;; +1244E;CUNEIFORM NUMERIC SIGN SIX ASH TENU;Nl;0;L;;;;6;N;;;;; +1244F;CUNEIFORM NUMERIC SIGN ONE BAN2;Nl;0;L;;;;1;N;;;;; +12450;CUNEIFORM NUMERIC SIGN TWO BAN2;Nl;0;L;;;;2;N;;;;; +12451;CUNEIFORM NUMERIC SIGN THREE BAN2;Nl;0;L;;;;3;N;;;;; +12452;CUNEIFORM NUMERIC SIGN FOUR BAN2;Nl;0;L;;;;4;N;;;;; +12453;CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM;Nl;0;L;;;;4;N;;;;; +12454;CUNEIFORM NUMERIC SIGN FIVE BAN2;Nl;0;L;;;;5;N;;;;; +12455;CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM;Nl;0;L;;;;5;N;;;;; +12456;CUNEIFORM NUMERIC SIGN NIGIDAMIN;Nl;0;L;;;;;N;;;;; +12457;CUNEIFORM NUMERIC SIGN NIGIDAESH;Nl;0;L;;;;;N;;;;; +12458;CUNEIFORM NUMERIC SIGN ONE ESHE3;Nl;0;L;;;;1;N;;;;; +12459;CUNEIFORM NUMERIC SIGN TWO ESHE3;Nl;0;L;;;;2;N;;;;; +1245A;CUNEIFORM NUMERIC SIGN ONE THIRD DISH;Nl;0;L;;;;1/3;N;;;;; +1245B;CUNEIFORM NUMERIC SIGN TWO THIRDS DISH;Nl;0;L;;;;2/3;N;;;;; +1245C;CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH;Nl;0;L;;;;5/6;N;;;;; +1245D;CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A;Nl;0;L;;;;1/3;N;;;;; +1245E;CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A;Nl;0;L;;;;2/3;N;;;;; +1245F;CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH;Nl;0;L;;;;1/8;N;;;;; +12460;CUNEIFORM NUMERIC SIGN ONE QUARTER ASH;Nl;0;L;;;;1/4;N;;;;; +12461;CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH;Nl;0;L;;;;1/6;N;;;;; +12462;CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER;Nl;0;L;;;;1/4;N;;;;; +12470;CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER;Po;0;L;;;;;N;;;;; +12471;CUNEIFORM PUNCTUATION SIGN VERTICAL COLON;Po;0;L;;;;;N;;;;; +12472;CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON;Po;0;L;;;;;N;;;;; +12473;CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON;Po;0;L;;;;;N;;;;; 1D000;BYZANTINE MUSICAL SYMBOL PSILI;So;0;L;;;;;N;;;;; 1D001;BYZANTINE MUSICAL SYMBOL DASEIA;So;0;L;;;;;N;;;;; 1D002;BYZANTINE MUSICAL SYMBOL PERISPOMENI;So;0;L;;;;;N;;;;; @@ -12954,6 +16953,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1D124;MUSICAL SYMBOL F CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;; 1D125;MUSICAL SYMBOL DRUM CLEF-1;So;0;L;;;;;N;;;;; 1D126;MUSICAL SYMBOL DRUM CLEF-2;So;0;L;;;;;N;;;;; +1D129;MUSICAL SYMBOL MULTIPLE MEASURE REST;So;0;L;;;;;N;;;;; 1D12A;MUSICAL SYMBOL DOUBLE SHARP;So;0;L;;;;;N;;;;; 1D12B;MUSICAL SYMBOL DOUBLE FLAT;So;0;L;;;;;N;;;;; 1D12C;MUSICAL SYMBOL FLAT UP;So;0;L;;;;;N;;;;; @@ -13134,12 +17134,82 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1D1DB;MUSICAL SYMBOL SCANDICUS FLEXUS;So;0;L;;;;;N;;;;; 1D1DC;MUSICAL SYMBOL TORCULUS RESUPINUS;So;0;L;;;;;N;;;;; 1D1DD;MUSICAL SYMBOL PES SUBPUNCTIS;So;0;L;;;;;N;;;;; -1D300;MONOGRAM FOR EARTH;So;0;ON;;;;;N;;;;; -1D301;DIGRAM FOR HEAVENLY EARTH;So;0;ON;;;;;N;;;;; -1D302;DIGRAM FOR HUMAN EARTH;So;0;ON;;;;;N;;;;; -1D303;DIGRAM FOR EARTHLY HEAVEN;So;0;ON;;;;;N;;;;; -1D304;DIGRAM FOR EARTHLY HUMAN;So;0;ON;;;;;N;;;;; -1D305;DIGRAM FOR EARTH;So;0;ON;;;;;N;;;;; +1D200;GREEK VOCAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;; +1D201;GREEK VOCAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;; +1D202;GREEK VOCAL NOTATION SYMBOL-3;So;0;ON;;;;;N;;;;; +1D203;GREEK VOCAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;; +1D204;GREEK VOCAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;; +1D205;GREEK VOCAL NOTATION SYMBOL-6;So;0;ON;;;;;N;;;;; +1D206;GREEK VOCAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;; +1D207;GREEK VOCAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;; +1D208;GREEK VOCAL NOTATION SYMBOL-9;So;0;ON;;;;;N;;;;; +1D209;GREEK VOCAL NOTATION SYMBOL-10;So;0;ON;;;;;N;;;;; +1D20A;GREEK VOCAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;; +1D20B;GREEK VOCAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;; +1D20C;GREEK VOCAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;; +1D20D;GREEK VOCAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;; +1D20E;GREEK VOCAL NOTATION SYMBOL-15;So;0;ON;;;;;N;;;;; +1D20F;GREEK VOCAL NOTATION SYMBOL-16;So;0;ON;;;;;N;;;;; +1D210;GREEK VOCAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;; +1D211;GREEK VOCAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;; +1D212;GREEK VOCAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;; +1D213;GREEK VOCAL NOTATION SYMBOL-20;So;0;ON;;;;;N;;;;; +1D214;GREEK VOCAL NOTATION SYMBOL-21;So;0;ON;;;;;N;;;;; +1D215;GREEK VOCAL NOTATION SYMBOL-22;So;0;ON;;;;;N;;;;; +1D216;GREEK VOCAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;; +1D217;GREEK VOCAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;; +1D218;GREEK VOCAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;; +1D219;GREEK VOCAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;; +1D21A;GREEK VOCAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;; +1D21B;GREEK VOCAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;; +1D21C;GREEK VOCAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;; +1D21D;GREEK INSTRUMENTAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;; +1D21E;GREEK INSTRUMENTAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;; +1D21F;GREEK INSTRUMENTAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;; +1D220;GREEK INSTRUMENTAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;; +1D221;GREEK INSTRUMENTAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;; +1D222;GREEK INSTRUMENTAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;; +1D223;GREEK INSTRUMENTAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;; +1D224;GREEK INSTRUMENTAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;; +1D225;GREEK INSTRUMENTAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;; +1D226;GREEK INSTRUMENTAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;; +1D227;GREEK INSTRUMENTAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;; +1D228;GREEK INSTRUMENTAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;; +1D229;GREEK INSTRUMENTAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;; +1D22A;GREEK INSTRUMENTAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;; +1D22B;GREEK INSTRUMENTAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;; +1D22C;GREEK INSTRUMENTAL NOTATION SYMBOL-25;So;0;ON;;;;;N;;;;; +1D22D;GREEK INSTRUMENTAL NOTATION SYMBOL-26;So;0;ON;;;;;N;;;;; +1D22E;GREEK INSTRUMENTAL NOTATION SYMBOL-27;So;0;ON;;;;;N;;;;; +1D22F;GREEK INSTRUMENTAL NOTATION SYMBOL-29;So;0;ON;;;;;N;;;;; +1D230;GREEK INSTRUMENTAL NOTATION SYMBOL-30;So;0;ON;;;;;N;;;;; +1D231;GREEK INSTRUMENTAL NOTATION SYMBOL-32;So;0;ON;;;;;N;;;;; +1D232;GREEK INSTRUMENTAL NOTATION SYMBOL-36;So;0;ON;;;;;N;;;;; +1D233;GREEK INSTRUMENTAL NOTATION SYMBOL-37;So;0;ON;;;;;N;;;;; +1D234;GREEK INSTRUMENTAL NOTATION SYMBOL-38;So;0;ON;;;;;N;;;;; +1D235;GREEK INSTRUMENTAL NOTATION SYMBOL-39;So;0;ON;;;;;N;;;;; +1D236;GREEK INSTRUMENTAL NOTATION SYMBOL-40;So;0;ON;;;;;N;;;;; +1D237;GREEK INSTRUMENTAL NOTATION SYMBOL-42;So;0;ON;;;;;N;;;;; +1D238;GREEK INSTRUMENTAL NOTATION SYMBOL-43;So;0;ON;;;;;N;;;;; +1D239;GREEK INSTRUMENTAL NOTATION SYMBOL-45;So;0;ON;;;;;N;;;;; +1D23A;GREEK INSTRUMENTAL NOTATION SYMBOL-47;So;0;ON;;;;;N;;;;; +1D23B;GREEK INSTRUMENTAL NOTATION SYMBOL-48;So;0;ON;;;;;N;;;;; +1D23C;GREEK INSTRUMENTAL NOTATION SYMBOL-49;So;0;ON;;;;;N;;;;; +1D23D;GREEK INSTRUMENTAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;; +1D23E;GREEK INSTRUMENTAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;; +1D23F;GREEK INSTRUMENTAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;; +1D240;GREEK INSTRUMENTAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;; +1D241;GREEK INSTRUMENTAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;; +1D242;COMBINING GREEK MUSICAL TRISEME;Mn;230;NSM;;;;;N;;;;; +1D243;COMBINING GREEK MUSICAL TETRASEME;Mn;230;NSM;;;;;N;;;;; +1D244;COMBINING GREEK MUSICAL PENTASEME;Mn;230;NSM;;;;;N;;;;; +1D245;GREEK MUSICAL LEIMMA;So;0;ON;;;;;N;;;;; +1D300;MONOGRAM FOR EARTH;So;0;ON;;;;;N;;ren *;;; +1D301;DIGRAM FOR HEAVENLY EARTH;So;0;ON;;;;;N;;tian ren *;;; +1D302;DIGRAM FOR HUMAN EARTH;So;0;ON;;;;;N;;di ren *;;; +1D303;DIGRAM FOR EARTHLY HEAVEN;So;0;ON;;;;;N;;ren tian *;;; +1D304;DIGRAM FOR EARTHLY HUMAN;So;0;ON;;;;;N;;ren di *;;; +1D305;DIGRAM FOR EARTH;So;0;ON;;;;;N;;ren ren *;;; 1D306;TETRAGRAM FOR CENTRE;So;0;ON;;;;;N;;;;; 1D307;TETRAGRAM FOR FULL CIRCLE;So;0;ON;;;;;N;;;;; 1D308;TETRAGRAM FOR MIRED;So;0;ON;;;;;N;;;;; @@ -13221,6 +17291,24 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1D354;TETRAGRAM FOR DIFFICULTIES;So;0;ON;;;;;N;;;;; 1D355;TETRAGRAM FOR LABOURING;So;0;ON;;;;;N;;;;; 1D356;TETRAGRAM FOR FOSTERING;So;0;ON;;;;;N;;;;; +1D360;COUNTING ROD UNIT DIGIT ONE;No;0;L;;;;1;N;;;;; +1D361;COUNTING ROD UNIT DIGIT TWO;No;0;L;;;;2;N;;;;; +1D362;COUNTING ROD UNIT DIGIT THREE;No;0;L;;;;3;N;;;;; +1D363;COUNTING ROD UNIT DIGIT FOUR;No;0;L;;;;4;N;;;;; +1D364;COUNTING ROD UNIT DIGIT FIVE;No;0;L;;;;5;N;;;;; +1D365;COUNTING ROD UNIT DIGIT SIX;No;0;L;;;;6;N;;;;; +1D366;COUNTING ROD UNIT DIGIT SEVEN;No;0;L;;;;7;N;;;;; +1D367;COUNTING ROD UNIT DIGIT EIGHT;No;0;L;;;;8;N;;;;; +1D368;COUNTING ROD UNIT DIGIT NINE;No;0;L;;;;9;N;;;;; +1D369;COUNTING ROD TENS DIGIT ONE;No;0;L;;;;10;N;;;;; +1D36A;COUNTING ROD TENS DIGIT TWO;No;0;L;;;;20;N;;;;; +1D36B;COUNTING ROD TENS DIGIT THREE;No;0;L;;;;30;N;;;;; +1D36C;COUNTING ROD TENS DIGIT FOUR;No;0;L;;;;40;N;;;;; +1D36D;COUNTING ROD TENS DIGIT FIVE;No;0;L;;;;50;N;;;;; +1D36E;COUNTING ROD TENS DIGIT SIX;No;0;L;;;;60;N;;;;; +1D36F;COUNTING ROD TENS DIGIT SEVEN;No;0;L;;;;70;N;;;;; +1D370;COUNTING ROD TENS DIGIT EIGHT;No;0;L;;;;80;N;;;;; +1D371;COUNTING ROD TENS DIGIT NINE;No;0;L;;;;90;N;;;;; 1D400;MATHEMATICAL BOLD CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; 1D401;MATHEMATICAL BOLD CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; 1D402;MATHEMATICAL BOLD CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; @@ -13873,6 +17961,8 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1D6A1;MATHEMATICAL MONOSPACE SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; 1D6A2;MATHEMATICAL MONOSPACE SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; 1D6A3;MATHEMATICAL MONOSPACE SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D6A4;MATHEMATICAL ITALIC SMALL DOTLESS I;Ll;0;L;<font> 0131;;;;N;;;;; +1D6A5;MATHEMATICAL ITALIC SMALL DOTLESS J;Ll;0;L;<font> 0237;;;;N;;;;; 1D6A8;MATHEMATICAL BOLD CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;; 1D6A9;MATHEMATICAL BOLD CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;; 1D6AA;MATHEMATICAL BOLD CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;; @@ -13924,7 +18014,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1D6D8;MATHEMATICAL BOLD SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;; 1D6D9;MATHEMATICAL BOLD SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;; 1D6DA;MATHEMATICAL BOLD SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;; -1D6DB;MATHEMATICAL BOLD PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;N;;;;; +1D6DB;MATHEMATICAL BOLD PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;; 1D6DC;MATHEMATICAL BOLD EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;; 1D6DD;MATHEMATICAL BOLD THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;; 1D6DE;MATHEMATICAL BOLD KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;; @@ -13982,7 +18072,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1D712;MATHEMATICAL ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;; 1D713;MATHEMATICAL ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;; 1D714;MATHEMATICAL ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;; -1D715;MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;N;;;;; +1D715;MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;; 1D716;MATHEMATICAL ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;; 1D717;MATHEMATICAL ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;; 1D718;MATHEMATICAL ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;; @@ -14040,7 +18130,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1D74C;MATHEMATICAL BOLD ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;; 1D74D;MATHEMATICAL BOLD ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;; 1D74E;MATHEMATICAL BOLD ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;; -1D74F;MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;N;;;;; +1D74F;MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;; 1D750;MATHEMATICAL BOLD ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;; 1D751;MATHEMATICAL BOLD ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;; 1D752;MATHEMATICAL BOLD ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;; @@ -14098,7 +18188,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1D786;MATHEMATICAL SANS-SERIF BOLD SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;; 1D787;MATHEMATICAL SANS-SERIF BOLD SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;; 1D788;MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;; -1D789;MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;N;;;;; +1D789;MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;; 1D78A;MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;; 1D78B;MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;; 1D78C;MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;; @@ -14156,13 +18246,15 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1D7C0;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;; 1D7C1;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;; 1D7C2;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;; -1D7C3;MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;N;;;;; +1D7C3;MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;; 1D7C4;MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;; 1D7C5;MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;; 1D7C6;MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;; 1D7C7;MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;; 1D7C8;MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;; 1D7C9;MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;; +1D7CA;MATHEMATICAL BOLD CAPITAL DIGAMMA;Lu;0;L;<font> 03DC;;;;N;;;;; +1D7CB;MATHEMATICAL BOLD SMALL DIGAMMA;Ll;0;L;<font> 03DD;;;;N;;;;; 1D7CE;MATHEMATICAL BOLD DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;; 1D7CF;MATHEMATICAL BOLD DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;; 1D7D0;MATHEMATICAL BOLD DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;; @@ -14213,6 +18305,150 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1D7FD;MATHEMATICAL MONOSPACE DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;; 1D7FE;MATHEMATICAL MONOSPACE DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;; 1D7FF;MATHEMATICAL MONOSPACE DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;; +1F000;MAHJONG TILE EAST WIND;So;0;ON;;;;;N;;;;; +1F001;MAHJONG TILE SOUTH WIND;So;0;ON;;;;;N;;;;; +1F002;MAHJONG TILE WEST WIND;So;0;ON;;;;;N;;;;; +1F003;MAHJONG TILE NORTH WIND;So;0;ON;;;;;N;;;;; +1F004;MAHJONG TILE RED DRAGON;So;0;ON;;;;;N;;;;; +1F005;MAHJONG TILE GREEN DRAGON;So;0;ON;;;;;N;;;;; +1F006;MAHJONG TILE WHITE DRAGON;So;0;ON;;;;;N;;;;; +1F007;MAHJONG TILE ONE OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F008;MAHJONG TILE TWO OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F009;MAHJONG TILE THREE OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00A;MAHJONG TILE FOUR OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00B;MAHJONG TILE FIVE OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00C;MAHJONG TILE SIX OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00D;MAHJONG TILE SEVEN OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00E;MAHJONG TILE EIGHT OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00F;MAHJONG TILE NINE OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F010;MAHJONG TILE ONE OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F011;MAHJONG TILE TWO OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F012;MAHJONG TILE THREE OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F013;MAHJONG TILE FOUR OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F014;MAHJONG TILE FIVE OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F015;MAHJONG TILE SIX OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F016;MAHJONG TILE SEVEN OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F017;MAHJONG TILE EIGHT OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F018;MAHJONG TILE NINE OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F019;MAHJONG TILE ONE OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01A;MAHJONG TILE TWO OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01B;MAHJONG TILE THREE OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01C;MAHJONG TILE FOUR OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01D;MAHJONG TILE FIVE OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01E;MAHJONG TILE SIX OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01F;MAHJONG TILE SEVEN OF CIRCLES;So;0;ON;;;;;N;;;;; +1F020;MAHJONG TILE EIGHT OF CIRCLES;So;0;ON;;;;;N;;;;; +1F021;MAHJONG TILE NINE OF CIRCLES;So;0;ON;;;;;N;;;;; +1F022;MAHJONG TILE PLUM;So;0;ON;;;;;N;;;;; +1F023;MAHJONG TILE ORCHID;So;0;ON;;;;;N;;;;; +1F024;MAHJONG TILE BAMBOO;So;0;ON;;;;;N;;;;; +1F025;MAHJONG TILE CHRYSANTHEMUM;So;0;ON;;;;;N;;;;; +1F026;MAHJONG TILE SPRING;So;0;ON;;;;;N;;;;; +1F027;MAHJONG TILE SUMMER;So;0;ON;;;;;N;;;;; +1F028;MAHJONG TILE AUTUMN;So;0;ON;;;;;N;;;;; +1F029;MAHJONG TILE WINTER;So;0;ON;;;;;N;;;;; +1F02A;MAHJONG TILE JOKER;So;0;ON;;;;;N;;;;; +1F02B;MAHJONG TILE BACK;So;0;ON;;;;;N;;;;; +1F030;DOMINO TILE HORIZONTAL BACK;So;0;ON;;;;;N;;;;; +1F031;DOMINO TILE HORIZONTAL-00-00;So;0;ON;;;;;N;;;;; +1F032;DOMINO TILE HORIZONTAL-00-01;So;0;ON;;;;;N;;;;; +1F033;DOMINO TILE HORIZONTAL-00-02;So;0;ON;;;;;N;;;;; +1F034;DOMINO TILE HORIZONTAL-00-03;So;0;ON;;;;;N;;;;; +1F035;DOMINO TILE HORIZONTAL-00-04;So;0;ON;;;;;N;;;;; +1F036;DOMINO TILE HORIZONTAL-00-05;So;0;ON;;;;;N;;;;; +1F037;DOMINO TILE HORIZONTAL-00-06;So;0;ON;;;;;N;;;;; +1F038;DOMINO TILE HORIZONTAL-01-00;So;0;ON;;;;;N;;;;; +1F039;DOMINO TILE HORIZONTAL-01-01;So;0;ON;;;;;N;;;;; +1F03A;DOMINO TILE HORIZONTAL-01-02;So;0;ON;;;;;N;;;;; +1F03B;DOMINO TILE HORIZONTAL-01-03;So;0;ON;;;;;N;;;;; +1F03C;DOMINO TILE HORIZONTAL-01-04;So;0;ON;;;;;N;;;;; +1F03D;DOMINO TILE HORIZONTAL-01-05;So;0;ON;;;;;N;;;;; +1F03E;DOMINO TILE HORIZONTAL-01-06;So;0;ON;;;;;N;;;;; +1F03F;DOMINO TILE HORIZONTAL-02-00;So;0;ON;;;;;N;;;;; +1F040;DOMINO TILE HORIZONTAL-02-01;So;0;ON;;;;;N;;;;; +1F041;DOMINO TILE HORIZONTAL-02-02;So;0;ON;;;;;N;;;;; +1F042;DOMINO TILE HORIZONTAL-02-03;So;0;ON;;;;;N;;;;; +1F043;DOMINO TILE HORIZONTAL-02-04;So;0;ON;;;;;N;;;;; +1F044;DOMINO TILE HORIZONTAL-02-05;So;0;ON;;;;;N;;;;; +1F045;DOMINO TILE HORIZONTAL-02-06;So;0;ON;;;;;N;;;;; +1F046;DOMINO TILE HORIZONTAL-03-00;So;0;ON;;;;;N;;;;; +1F047;DOMINO TILE HORIZONTAL-03-01;So;0;ON;;;;;N;;;;; +1F048;DOMINO TILE HORIZONTAL-03-02;So;0;ON;;;;;N;;;;; +1F049;DOMINO TILE HORIZONTAL-03-03;So;0;ON;;;;;N;;;;; +1F04A;DOMINO TILE HORIZONTAL-03-04;So;0;ON;;;;;N;;;;; +1F04B;DOMINO TILE HORIZONTAL-03-05;So;0;ON;;;;;N;;;;; +1F04C;DOMINO TILE HORIZONTAL-03-06;So;0;ON;;;;;N;;;;; +1F04D;DOMINO TILE HORIZONTAL-04-00;So;0;ON;;;;;N;;;;; +1F04E;DOMINO TILE HORIZONTAL-04-01;So;0;ON;;;;;N;;;;; +1F04F;DOMINO TILE HORIZONTAL-04-02;So;0;ON;;;;;N;;;;; +1F050;DOMINO TILE HORIZONTAL-04-03;So;0;ON;;;;;N;;;;; +1F051;DOMINO TILE HORIZONTAL-04-04;So;0;ON;;;;;N;;;;; +1F052;DOMINO TILE HORIZONTAL-04-05;So;0;ON;;;;;N;;;;; +1F053;DOMINO TILE HORIZONTAL-04-06;So;0;ON;;;;;N;;;;; +1F054;DOMINO TILE HORIZONTAL-05-00;So;0;ON;;;;;N;;;;; +1F055;DOMINO TILE HORIZONTAL-05-01;So;0;ON;;;;;N;;;;; +1F056;DOMINO TILE HORIZONTAL-05-02;So;0;ON;;;;;N;;;;; +1F057;DOMINO TILE HORIZONTAL-05-03;So;0;ON;;;;;N;;;;; +1F058;DOMINO TILE HORIZONTAL-05-04;So;0;ON;;;;;N;;;;; +1F059;DOMINO TILE HORIZONTAL-05-05;So;0;ON;;;;;N;;;;; +1F05A;DOMINO TILE HORIZONTAL-05-06;So;0;ON;;;;;N;;;;; +1F05B;DOMINO TILE HORIZONTAL-06-00;So;0;ON;;;;;N;;;;; +1F05C;DOMINO TILE HORIZONTAL-06-01;So;0;ON;;;;;N;;;;; +1F05D;DOMINO TILE HORIZONTAL-06-02;So;0;ON;;;;;N;;;;; +1F05E;DOMINO TILE HORIZONTAL-06-03;So;0;ON;;;;;N;;;;; +1F05F;DOMINO TILE HORIZONTAL-06-04;So;0;ON;;;;;N;;;;; +1F060;DOMINO TILE HORIZONTAL-06-05;So;0;ON;;;;;N;;;;; +1F061;DOMINO TILE HORIZONTAL-06-06;So;0;ON;;;;;N;;;;; +1F062;DOMINO TILE VERTICAL BACK;So;0;ON;;;;;N;;;;; +1F063;DOMINO TILE VERTICAL-00-00;So;0;ON;;;;;N;;;;; +1F064;DOMINO TILE VERTICAL-00-01;So;0;ON;;;;;N;;;;; +1F065;DOMINO TILE VERTICAL-00-02;So;0;ON;;;;;N;;;;; +1F066;DOMINO TILE VERTICAL-00-03;So;0;ON;;;;;N;;;;; +1F067;DOMINO TILE VERTICAL-00-04;So;0;ON;;;;;N;;;;; +1F068;DOMINO TILE VERTICAL-00-05;So;0;ON;;;;;N;;;;; +1F069;DOMINO TILE VERTICAL-00-06;So;0;ON;;;;;N;;;;; +1F06A;DOMINO TILE VERTICAL-01-00;So;0;ON;;;;;N;;;;; +1F06B;DOMINO TILE VERTICAL-01-01;So;0;ON;;;;;N;;;;; +1F06C;DOMINO TILE VERTICAL-01-02;So;0;ON;;;;;N;;;;; +1F06D;DOMINO TILE VERTICAL-01-03;So;0;ON;;;;;N;;;;; +1F06E;DOMINO TILE VERTICAL-01-04;So;0;ON;;;;;N;;;;; +1F06F;DOMINO TILE VERTICAL-01-05;So;0;ON;;;;;N;;;;; +1F070;DOMINO TILE VERTICAL-01-06;So;0;ON;;;;;N;;;;; +1F071;DOMINO TILE VERTICAL-02-00;So;0;ON;;;;;N;;;;; +1F072;DOMINO TILE VERTICAL-02-01;So;0;ON;;;;;N;;;;; +1F073;DOMINO TILE VERTICAL-02-02;So;0;ON;;;;;N;;;;; +1F074;DOMINO TILE VERTICAL-02-03;So;0;ON;;;;;N;;;;; +1F075;DOMINO TILE VERTICAL-02-04;So;0;ON;;;;;N;;;;; +1F076;DOMINO TILE VERTICAL-02-05;So;0;ON;;;;;N;;;;; +1F077;DOMINO TILE VERTICAL-02-06;So;0;ON;;;;;N;;;;; +1F078;DOMINO TILE VERTICAL-03-00;So;0;ON;;;;;N;;;;; +1F079;DOMINO TILE VERTICAL-03-01;So;0;ON;;;;;N;;;;; +1F07A;DOMINO TILE VERTICAL-03-02;So;0;ON;;;;;N;;;;; +1F07B;DOMINO TILE VERTICAL-03-03;So;0;ON;;;;;N;;;;; +1F07C;DOMINO TILE VERTICAL-03-04;So;0;ON;;;;;N;;;;; +1F07D;DOMINO TILE VERTICAL-03-05;So;0;ON;;;;;N;;;;; +1F07E;DOMINO TILE VERTICAL-03-06;So;0;ON;;;;;N;;;;; +1F07F;DOMINO TILE VERTICAL-04-00;So;0;ON;;;;;N;;;;; +1F080;DOMINO TILE VERTICAL-04-01;So;0;ON;;;;;N;;;;; +1F081;DOMINO TILE VERTICAL-04-02;So;0;ON;;;;;N;;;;; +1F082;DOMINO TILE VERTICAL-04-03;So;0;ON;;;;;N;;;;; +1F083;DOMINO TILE VERTICAL-04-04;So;0;ON;;;;;N;;;;; +1F084;DOMINO TILE VERTICAL-04-05;So;0;ON;;;;;N;;;;; +1F085;DOMINO TILE VERTICAL-04-06;So;0;ON;;;;;N;;;;; +1F086;DOMINO TILE VERTICAL-05-00;So;0;ON;;;;;N;;;;; +1F087;DOMINO TILE VERTICAL-05-01;So;0;ON;;;;;N;;;;; +1F088;DOMINO TILE VERTICAL-05-02;So;0;ON;;;;;N;;;;; +1F089;DOMINO TILE VERTICAL-05-03;So;0;ON;;;;;N;;;;; +1F08A;DOMINO TILE VERTICAL-05-04;So;0;ON;;;;;N;;;;; +1F08B;DOMINO TILE VERTICAL-05-05;So;0;ON;;;;;N;;;;; +1F08C;DOMINO TILE VERTICAL-05-06;So;0;ON;;;;;N;;;;; +1F08D;DOMINO TILE VERTICAL-06-00;So;0;ON;;;;;N;;;;; +1F08E;DOMINO TILE VERTICAL-06-01;So;0;ON;;;;;N;;;;; +1F08F;DOMINO TILE VERTICAL-06-02;So;0;ON;;;;;N;;;;; +1F090;DOMINO TILE VERTICAL-06-03;So;0;ON;;;;;N;;;;; +1F091;DOMINO TILE VERTICAL-06-04;So;0;ON;;;;;N;;;;; +1F092;DOMINO TILE VERTICAL-06-05;So;0;ON;;;;;N;;;;; +1F093;DOMINO TILE VERTICAL-06-06;So;0;ON;;;;;N;;;;; 20000;<CJK Ideograph Extension B, First>;Lo;0;L;;;;;N;;;;; 2A6D6;<CJK Ideograph Extension B, Last>;Lo;0;L;;;;;N;;;;; 2F800;CJK COMPATIBILITY IDEOGRAPH-2F800;Lo;0;L;4E3D;;;;N;;;;; @@ -14359,7 +18595,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 2F88D;CJK COMPATIBILITY IDEOGRAPH-2F88D;Lo;0;L;5EB6;;;;N;;;;; 2F88E;CJK COMPATIBILITY IDEOGRAPH-2F88E;Lo;0;L;5ECA;;;;N;;;;; 2F88F;CJK COMPATIBILITY IDEOGRAPH-2F88F;Lo;0;L;2A392;;;;N;;;;; -2F890;CJK COMPATIBILITY IDEOGRAPH-2F890;Lo;0;L;5EFE;;;;N;;;;; +2F890;CJK COMPATIBILITY IDEOGRAPH-2F890;Lo;0;L;5EFE;;;9;N;;;;; 2F891;CJK COMPATIBILITY IDEOGRAPH-2F891;Lo;0;L;22331;;;;N;;;;; 2F892;CJK COMPATIBILITY IDEOGRAPH-2F892;Lo;0;L;22331;;;;N;;;;; 2F893;CJK COMPATIBILITY IDEOGRAPH-2F893;Lo;0;L;8201;;;;N;;;;; diff --git a/jdk/make/tools/UnicodeData/VERSION b/jdk/make/tools/UnicodeData/VERSION new file mode 100644 index 00000000000..831446cbd27 --- /dev/null +++ b/jdk/make/tools/UnicodeData/VERSION @@ -0,0 +1 @@ +5.1.0 diff --git a/jdk/src/share/classes/java/lang/Character.java b/jdk/src/share/classes/java/lang/Character.java index 33b936f9c01..e33052ee170 100644 --- a/jdk/src/share/classes/java/lang/Character.java +++ b/jdk/src/share/classes/java/lang/Character.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-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 @@ -920,9 +920,9 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara */ public static final UnicodeBlock COMBINING_MARKS_FOR_SYMBOLS = new UnicodeBlock("COMBINING_MARKS_FOR_SYMBOLS", new String[] {"Combining Diacritical Marks for Symbols", - "CombiningDiacriticalMarksforSymbols", - "Combining Marks for Symbols", - "CombiningMarksforSymbols" }); + "CombiningDiacriticalMarksforSymbols", + "Combining Marks for Symbols", + "CombiningMarksforSymbols" }); /** * Constant for the "Letterlike Symbols" Unicode character block. @@ -1332,8 +1332,11 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara * @since 1.5 */ public static final UnicodeBlock CYRILLIC_SUPPLEMENTARY = - new UnicodeBlock("CYRILLIC_SUPPLEMENTARY", new String[] {"Cyrillic Supplementary", - "CyrillicSupplementary"}); + new UnicodeBlock("CYRILLIC_SUPPLEMENTARY", + new String[] {"Cyrillic Supplementary", + "CyrillicSupplementary", + "Cyrillic Supplement", + "CyrillicSupplement"}); /** * Constant for the "Tagalog" Unicode character block. @@ -1641,157 +1644,579 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara public static final UnicodeBlock LOW_SURROGATES = new UnicodeBlock("LOW_SURROGATES", new String[] {"Low Surrogates", "LowSurrogates"}); + /** + * Constant for the "Arabic Supplement" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock ARABIC_SUPPLEMENT = + new UnicodeBlock("ARABIC_SUPPLEMENT", + new String[] { "Arabic Supplement", + "ArabicSupplement"}); + + /** + * Constant for the "NKo" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock NKO = new UnicodeBlock("NKO"); + + /** + * Constant for the "Ethiopic Supplement" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock ETHIOPIC_SUPPLEMENT = + new UnicodeBlock("ETHIOPIC_SUPPLEMENT", + new String[] { "Ethiopic Supplement", + "EthiopicSupplement"}); + + /** + * Constant for the "New Tai Lue" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock NEW_TAI_LUE = + new UnicodeBlock("NEW_TAI_LUE", + new String[] { "New Tai Lue", + "NewTaiLue"}); + + /** + * Constant for the "Buginese" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock BUGINESE = + new UnicodeBlock("BUGINESE"); + + /** + * Constant for the "Balinese" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock BALINESE = + new UnicodeBlock("BALINESE"); + + /** + * Constant for the "Sundanese" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock SUNDANESE = + new UnicodeBlock("SUNDANESE"); + + /** + * Constant for the "Lepcha" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock LEPCHA = new UnicodeBlock("LEPCHA"); + + /** + * Constant for the "Ol Chiki" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock OL_CHIKI = + new UnicodeBlock("OL_CHIKI", + new String[] { "Ol Chiki", + "OlChiki"}); + + /** + * Constant for the "Phonetic Extensions Supplement" Unicode character + * block. + * @since 1.7 + */ + public static final UnicodeBlock PHONETIC_EXTENSIONS_SUPPLEMENT = + new UnicodeBlock("PHONETIC_EXTENSIONS_SUPPLEMENT", + new String[] { "Phonetic Extensions Supplement", + "PhoneticExtensionsSupplement"}); + + /** + * Constant for the "Combining Diacritical Marks Supplement" Unicode + * character block. + * @since 1.7 + */ + public static final UnicodeBlock COMBINING_DIACRITICAL_MARKS_SUPPLEMENT = + new UnicodeBlock("COMBINING_DIACRITICAL_MARKS_SUPPLEMENT", + new String[] { "Combining Diacritical Marks Supplement", + "CombiningDiacriticalMarksSupplement"}); + + /** + * Constant for the "Glagolitic" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock GLAGOLITIC = + new UnicodeBlock("GLAGOLITIC"); + + /** + * Constant for the "Latin Extended-C" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock LATIN_EXTENDED_C = + new UnicodeBlock("LATIN_EXTENDED_C", + new String[] { "Latin Extended-C", + "LatinExtended-C"}); + + /** + * Constant for the "Coptic" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock COPTIC = new UnicodeBlock("COPTIC"); + + /** + * Constant for the "Georgian Supplement" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock GEORGIAN_SUPPLEMENT = + new UnicodeBlock("GEORGIAN_SUPPLEMENT", + new String[] { "Georgian Supplement", + "GeorgianSupplement"}); + + /** + * Constant for the "Tifinagh" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock TIFINAGH = + new UnicodeBlock("TIFINAGH"); + + /** + * Constant for the "Ethiopic Extended" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock ETHIOPIC_EXTENDED = + new UnicodeBlock("ETHIOPIC_EXTENDED", + new String[] { "Ethiopic Extended", + "EthiopicExtended"}); + + /** + * Constant for the "Cyrillic Extended-A" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock CYRILLIC_EXTENDED_A = + new UnicodeBlock("CYRILLIC_EXTENDED_A", + new String[] { "Cyrillic Extended-A", + "CyrillicExtended-A"}); + + /** + * Constant for the "Supplemental Punctuation" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock SUPPLEMENTAL_PUNCTUATION = + new UnicodeBlock("SUPPLEMENTAL_PUNCTUATION", + new String[] { "Supplemental Punctuation", + "SupplementalPunctuation"}); + + /** + * Constant for the "CJK Strokes" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock CJK_STROKES = + new UnicodeBlock("CJK_STROKES", + new String[] { "CJK Strokes", + "CJKStrokes"}); + + /** + * Constant for the "Vai" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock VAI = new UnicodeBlock("VAI"); + + /** + * Constant for the "Cyrillic Extended-B" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock CYRILLIC_EXTENDED_B = + new UnicodeBlock("CYRILLIC_EXTENDED_B", + new String[] { "Cyrillic Extended-B", + "CyrillicExtended-B"}); + + /** + * Constant for the "Modifier Tone Letters" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock MODIFIER_TONE_LETTERS = + new UnicodeBlock("MODIFIER_TONE_LETTERS", + new String[] { "Modifier Tone Letters", + "ModifierToneLetters"}); + + /** + * Constant for the "Latin Extended-D" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock LATIN_EXTENDED_D = + new UnicodeBlock("LATIN_EXTENDED_D", + new String[] { "Latin Extended-D", + "LatinExtended-D"}); + + /** + * Constant for the "Syloti Nagri" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock SYLOTI_NAGRI = + new UnicodeBlock("SYLOTI_NAGRI", + new String[] { "Syloti Nagri", + "SylotiNagri"}); + + /** + * Constant for the "Phags-pa" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock PHAGS_PA = + new UnicodeBlock("PHAGS_PA", new String[] { "Phags-pa"}); + + /** + * Constant for the "Saurashtra" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock SAURASHTRA = + new UnicodeBlock("SAURASHTRA"); + + /** + * Constant for the "Kayah Li" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock KAYAH_LI = + new UnicodeBlock("KAYAH_LI", + new String[] { "Kayah Li", + "KayahLi"}); + + /** + * Constant for the "Rejang" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock REJANG = new UnicodeBlock("REJANG"); + + /** + * Constant for the "Cham" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock CHAM = new UnicodeBlock("CHAM"); + + /** + * Constant for the "Vertical Forms" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock VERTICAL_FORMS = + new UnicodeBlock("VERTICAL_FORMS", + new String[] { "Vertical Forms", + "VerticalForms"}); + + /** + * Constant for the "Ancient Greek Numbers" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock ANCIENT_GREEK_NUMBERS = + new UnicodeBlock("ANCIENT_GREEK_NUMBERS", + new String[] { "Ancient Greek Numbers", + "AncientGreekNumbers"}); + + /** + * Constant for the "Ancient Symbols" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock ANCIENT_SYMBOLS = + new UnicodeBlock("ANCIENT_SYMBOLS", + new String[] { "Ancient Symbols", + "AncientSymbols"}); + + /** + * Constant for the "Phaistos Disc" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock PHAISTOS_DISC = + new UnicodeBlock("PHAISTOS_DISC", + new String[] { "Phaistos Disc", + "PhaistosDisc"}); + + /** + * Constant for the "Lycian" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock LYCIAN = new UnicodeBlock("LYCIAN"); + + /** + * Constant for the "Carian" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock CARIAN = new UnicodeBlock("CARIAN"); + + /** + * Constant for the "Old Persian" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock OLD_PERSIAN = + new UnicodeBlock("OLD_PERSIAN", + new String[] { "Old Persian", + "OldPersian"}); + + /** + * Constant for the "Phoenician" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock PHOENICIAN = + new UnicodeBlock("PHOENICIAN"); + + /** + * Constant for the "Lydian" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock LYDIAN = new UnicodeBlock("LYDIAN"); + + /** + * Constant for the "Kharoshthi" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock KHAROSHTHI = + new UnicodeBlock("KHAROSHTHI"); + + /** + * Constant for the "Cuneiform" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock CUNEIFORM = + new UnicodeBlock("CUNEIFORM"); + + /** + * Constant for the "Cuneiform Numbers and Punctuation" Unicode + * character block. + * @since 1.7 + */ + public static final UnicodeBlock CUNEIFORM_NUMBERS_AND_PUNCTUATION = + new UnicodeBlock("CUNEIFORM_NUMBERS_AND_PUNCTUATION", + new String[] { "Cuneiform Numbers and Punctuation", + "CuneiformNumbersandPunctuation"}); + + /** + * Constant for the "Ancient Greek Musical Notation" Unicode character + * block. + * @since 1.7 + */ + public static final UnicodeBlock ANCIENT_GREEK_MUSICAL_NOTATION = + new UnicodeBlock("ANCIENT_GREEK_MUSICAL_NOTATION", + new String[] { "Ancient Greek Musical Notation", + "AncientGreekMusicalNotation"}); + + /** + * Constant for the "Counting Rod Numerals" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock COUNTING_ROD_NUMERALS = + new UnicodeBlock("COUNTING_ROD_NUMERALS", + new String[] { "Counting Rod Numerals", + "CountingRodNumerals"}); + + /** + * Constant for the "Mahjong Tiles" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock MAHJONG_TILES = + new UnicodeBlock("MAHJONG_TILES", + new String[] { "Mahjong Tiles", + "MahjongTiles"}); + + /** + * Constant for the "Domino Tiles" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock DOMINO_TILES = + new UnicodeBlock("DOMINO_TILES", + new String[] { "Domino Tiles", + "DominoTiles"}); + private static final int blockStarts[] = { - 0x0000, // Basic Latin - 0x0080, // Latin-1 Supplement - 0x0100, // Latin Extended-A - 0x0180, // Latin Extended-B - 0x0250, // IPA Extensions - 0x02B0, // Spacing Modifier Letters - 0x0300, // Combining Diacritical Marks - 0x0370, // Greek and Coptic - 0x0400, // Cyrillic - 0x0500, // Cyrillic Supplementary - 0x0530, // Armenian - 0x0590, // Hebrew - 0x0600, // Arabic - 0x0700, // Syriac - 0x0750, // unassigned - 0x0780, // Thaana - 0x07C0, // unassigned - 0x0900, // Devanagari - 0x0980, // Bengali - 0x0A00, // Gurmukhi - 0x0A80, // Gujarati - 0x0B00, // Oriya - 0x0B80, // Tamil - 0x0C00, // Telugu - 0x0C80, // Kannada - 0x0D00, // Malayalam - 0x0D80, // Sinhala - 0x0E00, // Thai - 0x0E80, // Lao - 0x0F00, // Tibetan - 0x1000, // Myanmar - 0x10A0, // Georgian - 0x1100, // Hangul Jamo - 0x1200, // Ethiopic - 0x1380, // unassigned - 0x13A0, // Cherokee - 0x1400, // Unified Canadian Aboriginal Syllabics - 0x1680, // Ogham - 0x16A0, // Runic - 0x1700, // Tagalog - 0x1720, // Hanunoo - 0x1740, // Buhid - 0x1760, // Tagbanwa - 0x1780, // Khmer - 0x1800, // Mongolian - 0x18B0, // unassigned - 0x1900, // Limbu - 0x1950, // Tai Le - 0x1980, // unassigned - 0x19E0, // Khmer Symbols - 0x1A00, // unassigned - 0x1D00, // Phonetic Extensions - 0x1D80, // unassigned - 0x1E00, // Latin Extended Additional - 0x1F00, // Greek Extended - 0x2000, // General Punctuation - 0x2070, // Superscripts and Subscripts - 0x20A0, // Currency Symbols - 0x20D0, // Combining Diacritical Marks for Symbols - 0x2100, // Letterlike Symbols - 0x2150, // Number Forms - 0x2190, // Arrows - 0x2200, // Mathematical Operators - 0x2300, // Miscellaneous Technical - 0x2400, // Control Pictures - 0x2440, // Optical Character Recognition - 0x2460, // Enclosed Alphanumerics - 0x2500, // Box Drawing - 0x2580, // Block Elements - 0x25A0, // Geometric Shapes - 0x2600, // Miscellaneous Symbols - 0x2700, // Dingbats - 0x27C0, // Miscellaneous Mathematical Symbols-A - 0x27F0, // Supplemental Arrows-A - 0x2800, // Braille Patterns - 0x2900, // Supplemental Arrows-B - 0x2980, // Miscellaneous Mathematical Symbols-B - 0x2A00, // Supplemental Mathematical Operators - 0x2B00, // Miscellaneous Symbols and Arrows - 0x2C00, // unassigned - 0x2E80, // CJK Radicals Supplement - 0x2F00, // Kangxi Radicals - 0x2FE0, // unassigned - 0x2FF0, // Ideographic Description Characters - 0x3000, // CJK Symbols and Punctuation - 0x3040, // Hiragana - 0x30A0, // Katakana - 0x3100, // Bopomofo - 0x3130, // Hangul Compatibility Jamo - 0x3190, // Kanbun - 0x31A0, // Bopomofo Extended - 0x31C0, // unassigned - 0x31F0, // Katakana Phonetic Extensions - 0x3200, // Enclosed CJK Letters and Months - 0x3300, // CJK Compatibility - 0x3400, // CJK Unified Ideographs Extension A - 0x4DC0, // Yijing Hexagram Symbols - 0x4E00, // CJK Unified Ideographs - 0xA000, // Yi Syllables - 0xA490, // Yi Radicals - 0xA4D0, // unassigned - 0xAC00, // Hangul Syllables - 0xD7B0, // unassigned - 0xD800, // High Surrogates - 0xDB80, // High Private Use Surrogates - 0xDC00, // Low Surrogates - 0xE000, // Private Use - 0xF900, // CJK Compatibility Ideographs - 0xFB00, // Alphabetic Presentation Forms - 0xFB50, // Arabic Presentation Forms-A - 0xFE00, // Variation Selectors - 0xFE10, // unassigned - 0xFE20, // Combining Half Marks - 0xFE30, // CJK Compatibility Forms - 0xFE50, // Small Form Variants - 0xFE70, // Arabic Presentation Forms-B - 0xFF00, // Halfwidth and Fullwidth Forms - 0xFFF0, // Specials - 0x10000, // Linear B Syllabary - 0x10080, // Linear B Ideograms - 0x10100, // Aegean Numbers - 0x10140, // unassigned - 0x10300, // Old Italic - 0x10330, // Gothic - 0x10350, // unassigned - 0x10380, // Ugaritic - 0x103A0, // unassigned - 0x10400, // Deseret - 0x10450, // Shavian - 0x10480, // Osmanya - 0x104B0, // unassigned - 0x10800, // Cypriot Syllabary - 0x10840, // unassigned - 0x1D000, // Byzantine Musical Symbols - 0x1D100, // Musical Symbols - 0x1D200, // unassigned - 0x1D300, // Tai Xuan Jing Symbols - 0x1D360, // unassigned - 0x1D400, // Mathematical Alphanumeric Symbols - 0x1D800, // unassigned - 0x20000, // CJK Unified Ideographs Extension B - 0x2A6E0, // unassigned - 0x2F800, // CJK Compatibility Ideographs Supplement - 0x2FA20, // unassigned - 0xE0000, // Tags - 0xE0080, // unassigned - 0xE0100, // Variation Selectors Supplement - 0xE01F0, // unassigned - 0xF0000, // Supplementary Private Use Area-A - 0x100000, // Supplementary Private Use Area-B + 0x0000, // 0000..007F; Basic Latin + 0x0080, // 0080..00FF; Latin-1 Supplement + 0x0100, // 0100..017F; Latin Extended-A + 0x0180, // 0180..024F; Latin Extended-B + 0x0250, // 0250..02AF; IPA Extensions + 0x02B0, // 02B0..02FF; Spacing Modifier Letters + 0x0300, // 0300..036F; Combining Diacritical Marks + 0x0370, // 0370..03FF; Greek and Coptic + 0x0400, // 0400..04FF; Cyrillic + 0x0500, // 0500..052F; Cyrillic Supplement + 0x0530, // 0530..058F; Armenian + 0x0590, // 0590..05FF; Hebrew + 0x0600, // 0600..06FF; Arabic + 0x0700, // 0700..074F; Syria + 0x0750, // 0750..077F; Arabic Supplement + 0x0780, // 0780..07BF; Thaana + 0x07C0, // 07C0..07FF; NKo + 0x0800, // unassigned + 0x0900, // 0900..097F; Devanagari + 0x0980, // 0980..09FF; Bengali + 0x0A00, // 0A00..0A7F; Gurmukhi + 0x0A80, // 0A80..0AFF; Gujarati + 0x0B00, // 0B00..0B7F; Oriya + 0x0B80, // 0B80..0BFF; Tamil + 0x0C00, // 0C00..0C7F; Telugu + 0x0C80, // 0C80..0CFF; Kannada + 0x0D00, // 0D00..0D7F; Malayalam + 0x0D80, // 0D80..0DFF; Sinhala + 0x0E00, // 0E00..0E7F; Thai + 0x0E80, // 0E80..0EFF; Lao + 0x0F00, // 0F00..0FFF; Tibetan + 0x1000, // 1000..109F; Myanmar + 0x10A0, // 10A0..10FF; Georgian + 0x1100, // 1100..11FF; Hangul Jamo + 0x1200, // 1200..137F; Ethiopic + 0x1380, // 1380..139F; Ethiopic Supplement + 0x13A0, // 13A0..13FF; Cherokee + 0x1400, // 1400..167F; Unified Canadian Aboriginal Syllabics + 0x1680, // 1680..169F; Ogham + 0x16A0, // 16A0..16FF; Runic + 0x1700, // 1700..171F; Tagalog + 0x1720, // 1720..173F; Hanunoo + 0x1740, // 1740..175F; Buhid + 0x1760, // 1760..177F; Tagbanwa + 0x1780, // 1780..17FF; Khmer + 0x1800, // 1800..18AF; Mongolian + 0x18B0, // unassigned + 0x1900, // 1900..194F; Limbu + 0x1950, // 1950..197F; Tai Le + 0x1980, // 1980..19DF; New Tai Lue + 0x19E0, // 19E0..19FF; Khmer Symbols + 0x1A00, // 1A00..1A1F; Buginese + 0x1A20, // unassigned + 0x1B00, // 1B00..1B7F; Balinese + 0x1B80, // 1B80..1BBF; Sundanese + 0x1BC0, // unassigned + 0x1C00, // 1C00..1C4F; Lepcha + 0x1C50, // 1C50..1C7F; Ol Chiki + 0x1C80, // unassigned + 0x1D00, // 1D00..1D7F; Phonetic Extensions + 0x1D80, // 1D80..1DBF; Phonetic Extensions Supplement + 0x1DC0, // 1DC0..1DFF; Combining Diacritical Marks Supplement + 0x1E00, // 1E00..1EFF; Latin Extended Additional + 0x1F00, // 1F00..1FFF; Greek Extended + 0x2000, // 2000..206F; General Punctuation + 0x2070, // 2070..209F; Superscripts and Subscripts + 0x20A0, // 20A0..20CF; Currency Symbols + 0x20D0, // 20D0..20FF; Combining Diacritical Marks for Symbols + 0x2100, // 2100..214F; Letterlike Symbols + 0x2150, // 2150..218F; Number Forms + 0x2190, // 2190..21FF; Arrows + 0x2200, // 2200..22FF; Mathematical Operators + 0x2300, // 2300..23FF; Miscellaneous Technical + 0x2400, // 2400..243F; Control Pictures + 0x2440, // 2440..245F; Optical Character Recognition + 0x2460, // 2460..24FF; Enclosed Alphanumerics + 0x2500, // 2500..257F; Box Drawing + 0x2580, // 2580..259F; Block Elements + 0x25A0, // 25A0..25FF; Geometric Shapes + 0x2600, // 2600..26FF; Miscellaneous Symbols + 0x2700, // 2700..27BF; Dingbats + 0x27C0, // 27C0..27EF; Miscellaneous Mathematical Symbols-A + 0x27F0, // 27F0..27FF; Supplemental Arrows-A + 0x2800, // 2800..28FF; Braille Patterns + 0x2900, // 2900..297F; Supplemental Arrows-B + 0x2980, // 2980..29FF; Miscellaneous Mathematical Symbols-B + 0x2A00, // 2A00..2AFF; Supplemental Mathematical Operators + 0x2B00, // 2B00..2BFF; Miscellaneous Symbols and Arrows + 0x2C00, // 2C00..2C5F; Glagolitic + 0x2C60, // 2C60..2C7F; Latin Extended-C + 0x2C80, // 2C80..2CFF; Coptic + 0x2D00, // 2D00..2D2F; Georgian Supplement + 0x2D30, // 2D30..2D7F; Tifinagh + 0x2D80, // 2D80..2DDF; Ethiopic Extended + 0x2DE0, // 2DE0..2DFF; Cyrillic Extended-A + 0x2E00, // 2E00..2E7F; Supplemental Punctuation + 0x2E80, // 2E80..2EFF; CJK Radicals Supplement + 0x2F00, // 2F00..2FDF; Kangxi Radicals + 0x2FE0, // unassigned + 0x2FF0, // 2FF0..2FFF; Ideographic Description Characters + 0x3000, // 3000..303F; CJK Symbols and Punctuation + 0x3040, // 3040..309F; Hiragana + 0x30A0, // 30A0..30FF; Katakana + 0x3100, // 3100..312F; Bopomofo + 0x3130, // 3130..318F; Hangul Compatibility Jamo + 0x3190, // 3190..319F; Kanbun + 0x31A0, // 31A0..31BF; Bopomofo Extended + 0x31C0, // 31C0..31EF; CJK Strokes + 0x31F0, // 31F0..31FF; Katakana Phonetic Extensions + 0x3200, // 3200..32FF; Enclosed CJK Letters and Months + 0x3300, // 3300..33FF; CJK Compatibility + 0x3400, // 3400..4DBF; CJK Unified Ideographs Extension A + 0x4DC0, // 4DC0..4DFF; Yijing Hexagram Symbols + 0x4E00, // 4E00..9FFF; CJK Unified Ideograph + 0xA000, // A000..A48F; Yi Syllables + 0xA490, // A490..A4CF; Yi Radicals + 0xA4D0, // unassigned + 0xA500, // A500..A63F; Vai + 0xA640, // A640..A69F; Cyrillic Extended-B + 0xA6A0, // unassigned + 0xA700, // A700..A71F; Modifier Tone Letters + 0xA720, // A720..A7FF; Latin Extended-D + 0xA800, // A800..A82F; Syloti Nagri + 0xA830, // unassigned + 0xA840, // A840..A87F; Phags-pa + 0xA880, // A880..A8DF; Saurashtra + 0xA8E0, // unassigned + 0xA900, // A900..A92F; Kayah Li + 0xA930, // A930..A95F; Rejang + 0xA960, // unassigned + 0xAA00, // AA00..AA5F; Cham + 0xAA60, // unassigned + 0xAC00, // AC00..D7AF; Hangul Syllables + 0xD7B0, // unassigned + 0xD800, // D800..DB7F; High Surrogates + 0xDB80, // DB80..DBFF; High Private Use Surrogates + 0xDC00, // DC00..DFFF; Low Surrogates + 0xE000, // E000..F8FF; Private Use Area + 0xF900, // F900..FAFF; CJK Compatibility Ideographs + 0xFB00, // FB00..FB4F; Alphabetic Presentation Forms + 0xFB50, // FB50..FDFF; Arabic Presentation Forms-A + 0xFE00, // FE00..FE0F; Variation Selectors + 0xFE10, // FE10..FE1F; Vertical Forms + 0xFE20, // FE20..FE2F; Combining Half Marks + 0xFE30, // FE30..FE4F; CJK Compatibility Forms + 0xFE50, // FE50..FE6F; Small Form Variants + 0xFE70, // FE70..FEFF; Arabic Presentation Forms-B + 0xFF00, // FF00..FFEF; Halfwidth and Fullwidth Forms + 0xFFF0, // FFF0..FFFF; Specials + 0x10000, // 10000..1007F; Linear B Syllabary + 0x10080, // 10080..100FF; Linear B Ideograms + 0x10100, // 10100..1013F; Aegean Numbers + 0x10140, // 10140..1018F; Ancient Greek Numbers + 0x10190, // 10190..101CF; Ancient Symbols + 0x101D0, // 101D0..101FF; Phaistos Disc + 0x10200, // unassigned + 0x10280, // 10280..1029F; Lycian + 0x102A0, // 102A0..102DF; Carian + 0x102E0, // unassigned + 0x10300, // 10300..1032F; Old Italic + 0x10330, // 10330..1034F; Gothic + 0x10350, // unassigned + 0x10380, // 10380..1039F; Ugaritic + 0x103A0, // 103A0..103DF; Old Persian + 0x103E0, // unassigned + 0x10400, // 10400..1044F; Desere + 0x10450, // 10450..1047F; Shavian + 0x10480, // 10480..104AF; Osmanya + 0x104B0, // unassigned + 0x10800, // 10800..1083F; Cypriot Syllabary + 0x10840, // unassigned + 0x10900, // 10900..1091F; Phoenician + 0x10920, // 10920..1093F; Lydian + 0x10940, // unassigned + 0x10A00, // 10A00..10A5F; Kharoshthi + 0x10A60, // unassigned + 0x12000, // 12000..123FF; Cuneiform + 0x12400, // 12400..1247F; Cuneiform Numbers and Punctuation + 0x12480, // unassigned + 0x1D000, // 1D000..1D0FF; Byzantine Musical Symbols + 0x1D100, // 1D100..1D1FF; Musical Symbols + 0x1D200, // 1D200..1D24F; Ancient Greek Musical Notation + 0x1D250, // unassigned + 0x1D300, // 1D300..1D35F; Tai Xuan Jing Symbols + 0x1D360, // 1D360..1D37F; Counting Rod Numerals + 0x1D380, // unassigned + 0x1D400, // 1D400..1D7FF; Mathematical Alphanumeric Symbols + 0x1D800, // unassigned + 0x1F000, // 1F000..1F02F; Mahjong Tiles + 0x1F030, // 1F030..1F09F; Domino Tiles + 0x1F0A0, // unassigned + 0x20000, // 20000..2A6DF; CJK Unified Ideographs Extension B + 0x2A6E0, // unassigned + 0x2F800, // 2F800..2FA1F; CJK Compatibility Ideographs Supplement + 0x2FA20, // unassigned + 0xE0000, // E0000..E007F; Tags + 0xE0080, // unassigned + 0xE0100, // E0100..E01EF; Variation Selectors Supplement + 0xE01F0, // unassigned + 0xF0000, // F0000..FFFFF; Supplementary Private Use Area-A + 0x100000, // 100000..10FFFF; Supplementary Private Use Area-B }; private static final UnicodeBlock[] blocks = { @@ -1809,8 +2234,9 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara HEBREW, ARABIC, SYRIAC, - null, + ARABIC_SUPPLEMENT, THAANA, + NKO, null, DEVANAGARI, BENGALI, @@ -1829,7 +2255,7 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara GEORGIAN, HANGUL_JAMO, ETHIOPIC, - null, + ETHIOPIC_SUPPLEMENT, CHEROKEE, UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS, OGHAM, @@ -1843,11 +2269,19 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara null, LIMBU, TAI_LE, - null, + NEW_TAI_LUE, KHMER_SYMBOLS, + BUGINESE, + null, + BALINESE, + SUNDANESE, + null, + LEPCHA, + OL_CHIKI, null, PHONETIC_EXTENSIONS, - null, + PHONETIC_EXTENSIONS_SUPPLEMENT, + COMBINING_DIACRITICAL_MARKS_SUPPLEMENT, LATIN_EXTENDED_ADDITIONAL, GREEK_EXTENDED, GENERAL_PUNCTUATION, @@ -1874,7 +2308,14 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara MISCELLANEOUS_MATHEMATICAL_SYMBOLS_B, SUPPLEMENTAL_MATHEMATICAL_OPERATORS, MISCELLANEOUS_SYMBOLS_AND_ARROWS, - null, + GLAGOLITIC, + LATIN_EXTENDED_C, + COPTIC, + GEORGIAN_SUPPLEMENT, + TIFINAGH, + ETHIOPIC_EXTENDED, + CYRILLIC_EXTENDED_A, + SUPPLEMENTAL_PUNCTUATION, CJK_RADICALS_SUPPLEMENT, KANGXI_RADICALS, null, @@ -1886,7 +2327,7 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara HANGUL_COMPATIBILITY_JAMO, KANBUN, BOPOMOFO_EXTENDED, - null, + CJK_STROKES, KATAKANA_PHONETIC_EXTENSIONS, ENCLOSED_CJK_LETTERS_AND_MONTHS, CJK_COMPATIBILITY, @@ -1896,6 +2337,21 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara YI_SYLLABLES, YI_RADICALS, null, + VAI, + CYRILLIC_EXTENDED_B, + null, + MODIFIER_TONE_LETTERS, + LATIN_EXTENDED_D, + SYLOTI_NAGRI, + null, + PHAGS_PA, + SAURASHTRA, + null, + KAYAH_LI, + REJANG, + null, + CHAM, + null, HANGUL_SYLLABLES, null, HIGH_SURROGATES, @@ -1906,7 +2362,7 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara ALPHABETIC_PRESENTATION_FORMS, ARABIC_PRESENTATION_FORMS_A, VARIATION_SELECTORS, - null, + VERTICAL_FORMS, COMBINING_HALF_MARKS, CJK_COMPATIBILITY_FORMS, SMALL_FORM_VARIANTS, @@ -1916,11 +2372,18 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara LINEAR_B_SYLLABARY, LINEAR_B_IDEOGRAMS, AEGEAN_NUMBERS, + ANCIENT_GREEK_NUMBERS, + ANCIENT_SYMBOLS, + PHAISTOS_DISC, + null, + LYCIAN, + CARIAN, null, OLD_ITALIC, GOTHIC, null, UGARITIC, + OLD_PERSIAN, null, DESERET, SHAVIAN, @@ -1928,13 +2391,26 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara null, CYPRIOT_SYLLABARY, null, + PHOENICIAN, + LYDIAN, + null, + KHAROSHTHI, + null, + CUNEIFORM, + CUNEIFORM_NUMBERS_AND_PUNCTUATION, + null, BYZANTINE_MUSICAL_SYMBOLS, MUSICAL_SYMBOLS, + ANCIENT_GREEK_MUSICAL_NOTATION, null, TAI_XUAN_JING_SYMBOLS, + COUNTING_ROD_NUMERALS, null, MATHEMATICAL_ALPHANUMERIC_SYMBOLS, null, + MAHJONG_TILES, + DOMINO_TILES, + null, CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B, null, CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT, diff --git a/jdk/src/share/classes/java/lang/ConditionalSpecialCasing.java b/jdk/src/share/classes/java/lang/ConditionalSpecialCasing.java index d81e550eef5..0e66326069c 100644 --- a/jdk/src/share/classes/java/lang/ConditionalSpecialCasing.java +++ b/jdk/src/share/classes/java/lang/ConditionalSpecialCasing.java @@ -74,6 +74,7 @@ final class ConditionalSpecialCasing { new Entry(0x00CC, new char[]{0x0069, 0x0307, 0x0300}, new char[]{0x00CC}, "lt", 0), // # LATIN CAPITAL LETTER I WITH GRAVE new Entry(0x00CD, new char[]{0x0069, 0x0307, 0x0301}, new char[]{0x00CD}, "lt", 0), // # LATIN CAPITAL LETTER I WITH ACUTE new Entry(0x0128, new char[]{0x0069, 0x0307, 0x0303}, new char[]{0x0128}, "lt", 0), // # LATIN CAPITAL LETTER I WITH TILDE + new Entry(0x0130, new char[]{0x0069, 0x0307}, new char[]{0x0130}, "lt", 0), // # LATIN CAPITAL LETTER I WITH DOT ABOVE //# ================================================================================ //# Turkish and Azeri @@ -84,7 +85,10 @@ final class ConditionalSpecialCasing { new Entry(0x0049, new char[]{0x0131}, new char[]{0x0049}, "tr", NOT_BEFORE_DOT), // # LATIN CAPITAL LETTER I new Entry(0x0049, new char[]{0x0131}, new char[]{0x0049}, "az", NOT_BEFORE_DOT), // # LATIN CAPITAL LETTER I new Entry(0x0069, new char[]{0x0069}, new char[]{0x0130}, "tr", 0), // # LATIN SMALL LETTER I - new Entry(0x0069, new char[]{0x0069}, new char[]{0x0130}, "az", 0) // # LATIN SMALL LETTER I + new Entry(0x0069, new char[]{0x0069}, new char[]{0x0130}, "az", 0), // # LATIN SMALL LETTER I + //# ================================================================================ + //# Other + new Entry(0x0130, new char[]{0x0069, 0x0307}, new char[]{0x0130}, "en", 0), // # LATIN CAPITALLETTER I WITH DOT ABOVE }; // A hash table that contains the above entries diff --git a/jdk/src/share/classes/java/lang/String.java b/jdk/src/share/classes/java/lang/String.java index 28d96de741b..316da645f3c 100644 --- a/jdk/src/share/classes/java/lang/String.java +++ b/jdk/src/share/classes/java/lang/String.java @@ -2451,14 +2451,21 @@ public final class String } if (localeDependent || srcChar == '\u03A3') { // GREEK CAPITAL LETTER SIGMA lowerChar = ConditionalSpecialCasing.toLowerCaseEx(this, i, locale); + } else if (srcChar == '\u0130') { // LATIN CAPITAL LETTER I DOT + lowerChar = Character.ERROR; } else { lowerChar = Character.toLowerCase(srcChar); } if ((lowerChar == Character.ERROR) || (lowerChar >= Character.MIN_SUPPLEMENTARY_CODE_POINT)) { if (lowerChar == Character.ERROR) { - lowerCharArray = - ConditionalSpecialCasing.toLowerCaseCharArray(this, i, locale); + if (!localeDependent && srcChar == '\u0130') { + lowerCharArray = + ConditionalSpecialCasing.toLowerCaseCharArray(this, i, Locale.ENGLISH); + } else { + lowerCharArray = + ConditionalSpecialCasing.toLowerCaseCharArray(this, i, locale); + } } else if (srcCount == 2) { resultOffset += Character.toChars(lowerChar, result, i + resultOffset) - srcCount; continue; diff --git a/jdk/src/share/classes/sun/text/normalizer/CharTrie.java b/jdk/src/share/classes/sun/text/normalizer/CharTrie.java index 3069de8650e..eadbce37c22 100644 --- a/jdk/src/share/classes/sun/text/normalizer/CharTrie.java +++ b/jdk/src/share/classes/sun/text/normalizer/CharTrie.java @@ -1,5 +1,5 @@ /* - * Portions Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2005-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 @@ -22,10 +22,9 @@ * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ - /* ******************************************************************************* - * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved * + * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved * * * * The original version of this source code and documentation is copyrighted * * and owned by IBM, These materials are provided under terms of a License * @@ -77,6 +76,66 @@ public class CharTrie extends Trie m_friendAgent_ = new FriendAgent(); } + /** + * Make a dummy CharTrie. + * A dummy trie is an empty runtime trie, used when a real data trie cannot + * be loaded. + * + * The trie always returns the initialValue, + * or the leadUnitValue for lead surrogate code points. + * The Latin-1 part is always set up to be linear. + * + * @param initialValue the initial value that is set for all code points + * @param leadUnitValue the value for lead surrogate code _units_ that do not + * have associated supplementary data + * @param dataManipulate object which provides methods to parse the char data + */ + public CharTrie(int initialValue, int leadUnitValue, DataManipulate dataManipulate) { + super(new char[BMP_INDEX_LENGTH+SURROGATE_BLOCK_COUNT], HEADER_OPTIONS_LATIN1_IS_LINEAR_MASK_, dataManipulate); + + int dataLength, latin1Length, i, limit; + char block; + + /* calculate the actual size of the dummy trie data */ + + /* max(Latin-1, block 0) */ + dataLength=latin1Length= INDEX_STAGE_1_SHIFT_<=8 ? 256 : DATA_BLOCK_LENGTH; + if(leadUnitValue!=initialValue) { + dataLength+=DATA_BLOCK_LENGTH; + } + m_data_=new char[dataLength]; + m_dataLength_=dataLength; + + m_initialValue_=(char)initialValue; + + /* fill the index and data arrays */ + + /* indexes are preset to 0 (block 0) */ + + /* Latin-1 data */ + for(i=0; i<latin1Length; ++i) { + m_data_[i]=(char)initialValue; + } + + if(leadUnitValue!=initialValue) { + /* indexes for lead surrogate code units to the block after Latin-1 */ + block=(char)(latin1Length>>INDEX_STAGE_2_SHIFT_); + i=0xd800>>INDEX_STAGE_1_SHIFT_; + limit=0xdc00>>INDEX_STAGE_1_SHIFT_; + for(; i<limit; ++i) { + m_index_[i]=block; + } + + /* data for lead surrogate code units */ + limit=latin1Length+DATA_BLOCK_LENGTH; + for(i=latin1Length; i<limit; ++i) { + m_data_[i]=(char)leadUnitValue; + } + } + + m_friendAgent_ = new FriendAgent(); + } + /** * Java friend implementation */ @@ -130,7 +189,18 @@ public class CharTrie extends Trie */ public final char getCodePointValue(int ch) { - int offset = getCodePointOffset(ch); + int offset; + + // fastpath for U+0000..U+D7FF + if(0 <= ch && ch < UTF16.LEAD_SURROGATE_MIN_VALUE) { + // copy of getRawOffset() + offset = (m_index_[ch >> INDEX_STAGE_1_SHIFT_] << INDEX_STAGE_2_SHIFT_) + + (ch & INDEX_STAGE_3_MASK_); + return m_data_[offset]; + } + + // handle U+D800..U+10FFFF + offset = getCodePointOffset(ch); // return -1 if there is an error, in this case we return the default // value: m_initialValue_ diff --git a/jdk/src/share/classes/sun/text/normalizer/NormalizerBase.java b/jdk/src/share/classes/sun/text/normalizer/NormalizerBase.java index c2fc1ab291d..a82475c6009 100644 --- a/jdk/src/share/classes/sun/text/normalizer/NormalizerBase.java +++ b/jdk/src/share/classes/sun/text/normalizer/NormalizerBase.java @@ -1,5 +1,5 @@ /* - * Portions Copyright 2001-2006 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2005-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 @@ -22,10 +22,9 @@ * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ - /* ******************************************************************************* - * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved * + * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved * * * * The original version of this source code and documentation is copyrighted * * and owned by IBM, These materials are provided under terms of a License * @@ -127,7 +126,7 @@ import java.text.Normalizer; * normalize(FCD) may be implemented with NFD. * * For more details on FCD see the collation design document: - * http://oss.software.ibm.com/cvs/icu/~checkout~/icuhtml/design/collation/ICU_collation_design.htm + * http://source.icu-project.org/repos/icu/icuhtml/trunk/design/collation/ICU_collation_design.htm * * ICU collation performs either NFD or FCD normalization automatically if * normalization is turned on for the collator object. Beyond collation and diff --git a/jdk/src/share/classes/sun/text/normalizer/NormalizerDataReader.java b/jdk/src/share/classes/sun/text/normalizer/NormalizerDataReader.java index 0378d5b5923..69b120d36e4 100644 --- a/jdk/src/share/classes/sun/text/normalizer/NormalizerDataReader.java +++ b/jdk/src/share/classes/sun/text/normalizer/NormalizerDataReader.java @@ -1,5 +1,5 @@ /* - * Portions Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2005-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 @@ -22,10 +22,9 @@ * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ - /* ******************************************************************************* - * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved * + * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved * * * * The original version of this source code and documentation is copyrighted * * and owned by IBM, These materials are provided under terms of a License * @@ -331,7 +330,7 @@ final class NormalizerDataReader implements ICUBinary.Authenticate { throws IOException{ //Read the bytes that make up the normTrie - dataInputStream.read(normBytes); + dataInputStream.readFully(normBytes); //normTrieStream= new ByteArrayInputStream(normBytes); @@ -346,11 +345,11 @@ final class NormalizerDataReader implements ICUBinary.Authenticate { } //Read the fcdTrie - dataInputStream.read(fcdBytes); + dataInputStream.readFully(fcdBytes); //Read the AuxTrie - dataInputStream.read(auxBytes); + dataInputStream.readFully(auxBytes); } public byte[] getDataFormatVersion(){ diff --git a/jdk/src/share/classes/sun/text/normalizer/NormalizerImpl.java b/jdk/src/share/classes/sun/text/normalizer/NormalizerImpl.java index cd4669063c6..112afb0dac0 100644 --- a/jdk/src/share/classes/sun/text/normalizer/NormalizerImpl.java +++ b/jdk/src/share/classes/sun/text/normalizer/NormalizerImpl.java @@ -1,5 +1,5 @@ /* - * Portions Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2005-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 @@ -22,10 +22,9 @@ * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ - /* ******************************************************************************* - * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved * + * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved * * * * The original version of this source code and documentation is copyrighted * * and owned by IBM, These materials are provided under terms of a License * @@ -102,7 +101,7 @@ public final class NormalizerImpl { private static final long MIN_SPECIAL = (long)(0xfc000000 & UNSIGNED_INT_MASK); private static final long SURROGATES_TOP = (long)(0xfff00000 & UNSIGNED_INT_MASK); private static final long MIN_HANGUL = (long)(0xfff00000 & UNSIGNED_INT_MASK); - private static final long MIN_JAMO_V = (long)(0xfff20000 & UNSIGNED_INT_MASK); +// private static final long MIN_JAMO_V = (long)(0xfff20000 & UNSIGNED_INT_MASK); private static final long JAMO_V_TOP = (long)(0xfff30000 & UNSIGNED_INT_MASK); @@ -908,7 +907,7 @@ public final class NormalizerImpl { buffer = composePart(args,prevStarter,src,srcStart,srcLimit,options,nx); // compare the normalized version with the original - if(0!=strCompare(buffer,0,args.length,src,prevStarter,(srcStart-prevStarter), false)) { + if(0!=strCompare(buffer,0,args.length,src,prevStarter,srcStart, false)) { result=NormalizerBase.NO; // normalization differs break; } @@ -2291,7 +2290,7 @@ public final class NormalizerImpl { private static final int OPTIONS_NX_MASK=0x1f; private static final int OPTIONS_UNICODE_MASK=0xe0; public static final int OPTIONS_SETS_MASK=0xff; - private static final int OPTIONS_UNICODE_SHIFT=5; +// private static final int OPTIONS_UNICODE_SHIFT=5; private static final UnicodeSet[] nxCache = new UnicodeSet[OPTIONS_SETS_MASK+1]; /* Constants for options flags for normalization.*/ diff --git a/jdk/src/share/classes/sun/text/normalizer/Trie.java b/jdk/src/share/classes/sun/text/normalizer/Trie.java index 378a6005c1c..16c0f921089 100644 --- a/jdk/src/share/classes/sun/text/normalizer/Trie.java +++ b/jdk/src/share/classes/sun/text/normalizer/Trie.java @@ -1,5 +1,5 @@ /* - * Portions Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2005-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 @@ -22,10 +22,9 @@ * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ - /* ******************************************************************************* - * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved * + * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved * * * * The original version of this source code and documentation is copyrighted * * and owned by IBM, These materials are provided under terms of a License * @@ -37,10 +36,9 @@ package sun.text.normalizer; -import java.io.InputStream; import java.io.DataInputStream; +import java.io.InputStream; import java.io.IOException; -import java.util.Arrays; /** * <p>A trie is a kind of compressed, serializable table of values @@ -81,7 +79,6 @@ public abstract class Trie * This interface specifies methods to be implemented in order for * com.ibm.impl.Trie, to surrogate offset information encapsulated within * the data. - * @draft 2.1 */ public static interface DataManipulate { @@ -92,11 +89,17 @@ public abstract class Trie * @param value data value for a surrogate from the trie, including the * folding offset * @return data offset or 0 if there is no data for the lead surrogate - * @draft 2.1 */ public int getFoldingOffset(int value); } + // default implementation + private static class DefaultGetFoldingOffset implements DataManipulate { + public int getFoldingOffset(int value) { + return value; + } + } + // protected constructor ------------------------------------------- /** @@ -107,7 +110,6 @@ public abstract class Trie * trie data * @throws IOException thrown when input stream does not have the * right header. - * @draft 2.1 */ protected Trie(InputStream inputStream, DataManipulate dataManipulate) throws IOException @@ -121,7 +123,11 @@ public abstract class Trie throw new IllegalArgumentException("ICU data file error: Trie header authentication failed, please check if you have the most updated ICU data file"); } - m_dataManipulate_ = dataManipulate; + if(dataManipulate != null) { + m_dataManipulate_ = dataManipulate; + } else { + m_dataManipulate_ = new DefaultGetFoldingOffset(); + } m_isLatin1Linear_ = (m_options_ & HEADER_OPTIONS_LATIN1_IS_LINEAR_MASK_) != 0; m_dataOffset_ = input.readInt(); @@ -135,19 +141,21 @@ public abstract class Trie * @param options used by the trie * @param dataManipulate object containing the information to parse the * trie data - * @draft 2.2 */ protected Trie(char index[], int options, DataManipulate dataManipulate) { m_options_ = options; - m_dataManipulate_ = dataManipulate; + if(dataManipulate != null) { + m_dataManipulate_ = dataManipulate; + } else { + m_dataManipulate_ = new DefaultGetFoldingOffset(); + } m_isLatin1Linear_ = (m_options_ & HEADER_OPTIONS_LATIN1_IS_LINEAR_MASK_) != 0; m_index_ = index; m_dataOffset_ = m_index_.length; } - // protected data members ------------------------------------------ /** @@ -158,7 +166,6 @@ public abstract class Trie protected static final int LEAD_INDEX_OFFSET_ = 0x2800 >> 5; /** * Shift size for shifting right the input index. 1..9 - * @draft 2.1 */ protected static final int INDEX_STAGE_1_SHIFT_ = 5; /** @@ -168,31 +175,39 @@ public abstract class Trie * This requires blocks of stage 2 data to be aligned by * DATA_GRANULARITY. * 0..INDEX_STAGE_1_SHIFT - * @draft 2.1 */ protected static final int INDEX_STAGE_2_SHIFT_ = 2; + /** + * Number of data values in a stage 2 (data array) block. + */ + protected static final int DATA_BLOCK_LENGTH=1<<INDEX_STAGE_1_SHIFT_; /** * Mask for getting the lower bits from the input index. - * DATA_BLOCK_LENGTH_ - 1. - * @draft 2.1 + * DATA_BLOCK_LENGTH - 1. */ - protected static final int INDEX_STAGE_3_MASK_ = - (1 << INDEX_STAGE_1_SHIFT_) - 1; + protected static final int INDEX_STAGE_3_MASK_ = DATA_BLOCK_LENGTH - 1; + /** Number of bits of a trail surrogate that are used in index table lookups. */ + protected static final int SURROGATE_BLOCK_BITS=10-INDEX_STAGE_1_SHIFT_; + /** + * Number of index (stage 1) entries per lead surrogate. + * Same as number of index entries for 1024 trail surrogates, + * ==0x400>>INDEX_STAGE_1_SHIFT_ + */ + protected static final int SURROGATE_BLOCK_COUNT=(1<<SURROGATE_BLOCK_BITS); + /** Length of the BMP portion of the index (stage 1) array. */ + protected static final int BMP_INDEX_LENGTH=0x10000>>INDEX_STAGE_1_SHIFT_; /** * Surrogate mask to use when shifting offset to retrieve supplementary * values - * @draft 2.1 */ protected static final int SURROGATE_MASK_ = 0x3FF; /** * Index or UTF16 characters - * @draft 2.1 */ protected char m_index_[]; /** * Internal TrieValue which handles the parsing of the data value. * This class is to be implemented by the user - * @draft 2.1 */ protected DataManipulate m_dataManipulate_; /** @@ -200,7 +215,6 @@ public abstract class Trie * index and data into a char array, so this is used to indicate the * initial offset to the data portion. * Note this index always points to the initial value. - * @draft 2.1 */ protected int m_dataOffset_; /** @@ -215,7 +229,6 @@ public abstract class Trie * @param lead lead surrogate * @param trail trailing surrogate * @return offset to data - * @draft 2.1 */ protected abstract int getSurrogateOffset(char lead, char trail); @@ -223,14 +236,12 @@ public abstract class Trie * Gets the value at the argument index * @param index value at index will be retrieved * @return 32 bit value - * @draft 2.1 */ protected abstract int getValue(int index); /** * Gets the default initial value * @return 32 bit value - * @draft 2.1 */ protected abstract int getInitialValue(); @@ -247,7 +258,6 @@ public abstract class Trie * @param offset index offset which ch is to start from * @param ch index to be used after offset * @return offset to the data - * @draft 2.1 */ protected final int getRawOffset(int offset, char ch) { @@ -261,7 +271,6 @@ public abstract class Trie * Treats a lead surrogate as a normal code point. * @param ch BMP character * @return offset to data - * @draft 2.1 */ protected final int getBMPOffset(char ch) { @@ -279,7 +288,6 @@ public abstract class Trie * the next trailing surrogate character. * @param ch lead surrogate character * @return offset to data - * @draft 2.1 */ protected final int getLeadOffset(char ch) { @@ -293,26 +301,27 @@ public abstract class Trie * Gets the offset to data which the codepoint points to * @param ch codepoint * @return offset to data - * @draft 2.1 */ protected final int getCodePointOffset(int ch) { // if ((ch >> 16) == 0) slower - if (ch >= UTF16.CODEPOINT_MIN_VALUE - && ch < UTF16.SUPPLEMENTARY_MIN_VALUE) { + if (ch < 0) { + return -1; + } else if (ch < UTF16.LEAD_SURROGATE_MIN_VALUE) { + // fastpath for the part of the BMP below surrogates (D800) where getRawOffset() works + return getRawOffset(0, (char)ch); + } else if (ch < UTF16.SUPPLEMENTARY_MIN_VALUE) { // BMP codepoint return getBMPOffset((char)ch); - } - // for optimization - if (ch >= UTF16.CODEPOINT_MIN_VALUE - && ch <= UCharacter.MAX_VALUE) { + } else if (ch <= UCharacter.MAX_VALUE) { // look at the construction of supplementary characters // trail forms the ends of it. return getSurrogateOffset(UTF16.getLeadSurrogate(ch), (char)(ch & SURROGATE_MASK_)); + } else { + // return -1 // if there is an error, in this case we return + return -1; } - // return -1 if there is an error, in this case we return - return -1; } /** @@ -320,7 +329,6 @@ public abstract class Trie * <p>This is overwritten by the child classes. * @param inputStream input stream containing the trie information * @exception IOException thrown when data reading fails. - * @draft 2.1 */ protected void unserialize(InputStream inputStream) throws IOException { @@ -335,7 +343,6 @@ public abstract class Trie /** * Determines if this is a 32 bit trie * @return true if options specifies this is a 32 bit trie - * @draft 2.1 */ protected final boolean isIntTrie() { @@ -345,7 +352,6 @@ public abstract class Trie /** * Determines if this is a 16 bit trie * @return true if this is a 16 bit trie - * @draft 2.1 */ protected final boolean isCharTrie() { @@ -354,40 +360,20 @@ public abstract class Trie // private data members -------------------------------------------- - /** - * Signature index - */ - private static final int HEADER_SIGNATURE_INDEX_ = 0; - /** - * Options index - */ - private static final int HEADER_OPTIONS_INDEX_ = 1 << 1; - /** - * Index length index - */ - private static final int HEADER_INDEX_LENGTH_INDEX_ = 2 << 1; - /** - * Data length index - */ - private static final int HEADER_DATA_LENGTH_INDEX_ = 3 << 1; - /** - * Size of header - */ - private static final int HEADER_LENGTH_ = 4 << 1; /** * Latin 1 option mask */ - private static final int HEADER_OPTIONS_LATIN1_IS_LINEAR_MASK_ = 0x200; + protected static final int HEADER_OPTIONS_LATIN1_IS_LINEAR_MASK_ = 0x200; /** * Constant number to authenticate the byte block */ - private static final int HEADER_SIGNATURE_ = 0x54726965; + protected static final int HEADER_SIGNATURE_ = 0x54726965; /** * Header option formatting */ private static final int HEADER_OPTIONS_SHIFT_MASK_ = 0xF; - private static final int HEADER_OPTIONS_INDEX_SHIFT_ = 4; - private static final int HEADER_OPTIONS_DATA_IS_32_BIT_ = 0x100; + protected static final int HEADER_OPTIONS_INDEX_SHIFT_ = 4; + protected static final int HEADER_OPTIONS_DATA_IS_32_BIT_ = 0x100; /** * Flag indicator for Latin quick access data block @@ -409,9 +395,8 @@ public abstract class Trie /** * Authenticates raw data header. * Checking the header information, signature and options. - * @param rawdata array of char data to be checked + * @param signature This contains the options and type of a Trie * @return true if the header is authenticated valid - * @draft 2.1 */ private final boolean checkHeader(int signature) { diff --git a/jdk/src/share/classes/sun/text/normalizer/TrieIterator.java b/jdk/src/share/classes/sun/text/normalizer/TrieIterator.java index 9810c1002cb..b29ab1c569b 100644 --- a/jdk/src/share/classes/sun/text/normalizer/TrieIterator.java +++ b/jdk/src/share/classes/sun/text/normalizer/TrieIterator.java @@ -1,5 +1,5 @@ /* - * Portions Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2005-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 @@ -22,10 +22,9 @@ * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ - /* ******************************************************************************* - * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved * + * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved * * * * The original version of this source code and documentation is copyrighted * * and owned by IBM, These materials are provided under terms of a License * @@ -108,15 +107,14 @@ package sun.text.normalizer; * @since release 2.1, Jan 17 2002 */ public class TrieIterator implements RangeValueIterator - { + // public constructor --------------------------------------------- /** * TrieEnumeration constructor * @param trie to be used * @exception IllegalArgumentException throw when argument is null. - * @draft 2.1 */ public TrieIterator(Trie trie) { @@ -141,7 +139,6 @@ public class TrieIterator implements RangeValueIterator * @return true if we are not at the end of the iteration, false otherwise. * @exception NoSuchElementException - if no more elements exist. * @see com.ibm.icu.util.RangeValueIterator.Element - * @draft 2.1 */ public final boolean next(Element element) { @@ -158,7 +155,6 @@ public class TrieIterator implements RangeValueIterator /** * Resets the iterator to the beginning of the iteration - * @draft 2.1 */ public final void reset() { @@ -186,7 +182,6 @@ public class TrieIterator implements RangeValueIterator * The default function is to return the value as it is. * @param value a value from the trie * @return extracted value - * @draft 2.1 */ protected int extract(int value) { @@ -278,7 +273,6 @@ public class TrieIterator implements RangeValueIterator * Note, if there are no more iterations, it will never get to here. * Blocked out by next(). * @param element return result object - * @draft 2.1 */ private final void calculateNextSupplementaryElement(Element element) { @@ -516,10 +510,6 @@ public class TrieIterator implements RangeValueIterator */ private static final int TRAIL_SURROGATE_MIN_VALUE_ = 0xDC00; /** - * Trail surrogate maximum value - */ - private static final int TRAIL_SURROGATE_MAX_VALUE_ = 0xDFFF; - /** * Number of trail surrogate */ private static final int TRAIL_SURROGATE_COUNT_ = 0x400; @@ -538,11 +528,6 @@ public class TrieIterator implements RangeValueIterator private static final int DATA_BLOCK_LENGTH_ = 1 << Trie.INDEX_STAGE_1_SHIFT_; /** - * Number of codepoints in a stage 2 block - */ - private static final int DATA_BLOCK_SUPPLEMENTARY_LENGTH_ = - DATA_BLOCK_LENGTH_ << 10; - /** * Trie instance */ private Trie m_trie_; @@ -560,10 +545,4 @@ public class TrieIterator implements RangeValueIterator private int m_nextBlock_; private int m_nextBlockIndex_; private int m_nextTrailIndexOffset_; - /** - * This is the return result element - */ - private int m_start_; - private int m_limit_; - private int m_value_; } diff --git a/jdk/src/share/classes/sun/text/normalizer/UBiDiProps.java b/jdk/src/share/classes/sun/text/normalizer/UBiDiProps.java new file mode 100644 index 00000000000..0f5d9600203 --- /dev/null +++ b/jdk/src/share/classes/sun/text/normalizer/UBiDiProps.java @@ -0,0 +1,179 @@ +/* + * Portions Copyright 2005-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. 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. + */ +/* + ******************************************************************************* + * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved * + * * + * The original version of this source code and documentation is copyrighted * + * and owned by IBM, These materials are provided under terms of a License * + * Agreement between IBM and Sun. This technology is protected by multiple * + * US and International patents. This notice and attribution to IBM may not * + * to removed. * + ******************************************************************************* +* file name: UBiDiProps.java +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2005jan16 +* created by: Markus W. Scherer +* +* Low-level Unicode bidi/shaping properties access. +* Java port of ubidi_props.h/.c. +*/ + +package sun.text.normalizer; + +import java.io.BufferedInputStream; +import java.io.DataInputStream; +import java.io.InputStream; +import java.io.IOException; + +public final class UBiDiProps { + // constructors etc. --------------------------------------------------- *** + + // port of ubidi_openProps() + public UBiDiProps() throws IOException{ + InputStream is=ICUData.getStream(DATA_FILE_NAME); + BufferedInputStream b=new BufferedInputStream(is, 4096 /* data buffer size */); + readData(b); + b.close(); + is.close(); + + } + + private void readData(InputStream is) throws IOException { + DataInputStream inputStream=new DataInputStream(is); + + // read the header + ICUBinary.readHeader(inputStream, FMT, new IsAcceptable()); + + // read indexes[] + int i, count; + count=inputStream.readInt(); + if(count<IX_INDEX_TOP) { + throw new IOException("indexes[0] too small in "+DATA_FILE_NAME); + } + indexes=new int[count]; + + indexes[0]=count; + for(i=1; i<count; ++i) { + indexes[i]=inputStream.readInt(); + } + + // read the trie + trie=new CharTrie(inputStream, null); + + // read mirrors[] + count=indexes[IX_MIRROR_LENGTH]; + if(count>0) { + mirrors=new int[count]; + for(i=0; i<count; ++i) { + mirrors[i]=inputStream.readInt(); + } + } + + // read jgArray[] + count=indexes[IX_JG_LIMIT]-indexes[IX_JG_START]; + jgArray=new byte[count]; + for(i=0; i<count; ++i) { + jgArray[i]=inputStream.readByte(); + } + } + + // implement ICUBinary.Authenticate + private final class IsAcceptable implements ICUBinary.Authenticate { + public boolean isDataVersionAcceptable(byte version[]) { + return version[0]==1 && + version[2]==Trie.INDEX_STAGE_1_SHIFT_ && version[3]==Trie.INDEX_STAGE_2_SHIFT_; + } + } + + // UBiDiProps singleton + private static UBiDiProps gBdp=null; + + // port of ubidi_getSingleton() + public static final synchronized UBiDiProps getSingleton() throws IOException { + if(gBdp==null) { + gBdp=new UBiDiProps(); + } + return gBdp; + } + + // UBiDiProps dummy singleton + private static UBiDiProps gBdpDummy=null; + + private UBiDiProps(boolean makeDummy) { // ignore makeDummy, only creates a unique signature + indexes=new int[IX_TOP]; + indexes[0]=IX_TOP; + trie=new CharTrie(0, 0, null); // dummy trie, always returns 0 + } + + /** + * Get a singleton dummy object, one that works with no real data. + * This can be used when the real data is not available. + * Using the dummy can reduce checks for available data after an initial failure. + * Port of ucase_getDummy(). + */ + public static final synchronized UBiDiProps getDummy() { + if(gBdpDummy==null) { + gBdpDummy=new UBiDiProps(true); + } + return gBdpDummy; + } + + public final int getClass(int c) { + return getClassFromProps(trie.getCodePointValue(c)); + } + + // data members -------------------------------------------------------- *** + private int indexes[]; + private int mirrors[]; + private byte jgArray[]; + + private CharTrie trie; + + // data format constants ----------------------------------------------- *** + private static final String DATA_FILE_NAME = "/sun/text/resources/ubidi.icu"; + + /* format "BiDi" */ + private static final byte FMT[]={ 0x42, 0x69, 0x44, 0x69 }; + + /* indexes into indexes[] */ + private static final int IX_INDEX_TOP=0; + private static final int IX_MIRROR_LENGTH=3; + + private static final int IX_JG_START=4; + private static final int IX_JG_LIMIT=5; + + private static final int IX_TOP=16; + + private static final int CLASS_MASK= 0x0000001f; + + private static final int getClassFromProps(int props) { + return props&CLASS_MASK; + } + +} diff --git a/jdk/src/share/classes/sun/text/normalizer/UCharacter.java b/jdk/src/share/classes/sun/text/normalizer/UCharacter.java index 26a5eca99fc..8225517f07c 100644 --- a/jdk/src/share/classes/sun/text/normalizer/UCharacter.java +++ b/jdk/src/share/classes/sun/text/normalizer/UCharacter.java @@ -1,5 +1,5 @@ /* - * Portions Copyright 2005 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2005-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 @@ -24,7 +24,7 @@ */ /* ******************************************************************************* - * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved * + * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved * * * * The original version of this source code and documentation is copyrighted * * and owned by IBM, These materials are provided under terms of a License * @@ -36,19 +36,18 @@ package sun.text.normalizer; -import java.lang.ref.SoftReference; -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; +import java.io.IOException; +import java.util.MissingResourceException; /** * <p> * The UCharacter class provides extensions to the - * <a href=http://java.sun.com/j2se/1.3/docs/api/java/lang/Character.html> + * <a href="http://java.sun.com/j2se/1.5/docs/api/java/lang/Character.html"> * java.lang.Character</a> class. These extensions provide support for - * Unicode 3.2 properties and together with the <a href=../text/UTF16.html>UTF16</a> + * more Unicode properties and together with the <a href=../text/UTF16.html>UTF16</a> * class, provide support for supplementary characters (those with code * points above U+FFFF). + * Each ICU release supports the latest version of Unicode available at that time. * </p> * <p> * Code points are represented in these API using ints. While it would be @@ -67,7 +66,7 @@ import java.util.Map; * <i>$ICU4J_CLASS/com.ibm.icu.impl.data</i>. * </p> * <p> - * Aside from the additions for UTF-16 support, and the updated Unicode 3.1 + * Aside from the additions for UTF-16 support, and the updated Unicode * properties, the main differences between UCharacter and Character are: * <ul> * <li> UCharacter is not designed to be a char wrapper and does not have @@ -77,7 +76,7 @@ import java.util.Map; * <li> char charValue(), * <li> int compareTo(java.lang.Character, java.lang.Character), etc. * </ul> - * <li> UCharacter does not include Character APIs that are deprecated, not + * <li> UCharacter does not include Character APIs that are deprecated, nor * does it include the Java-specific character information, such as * boolean isJavaIdentifierPart(char ch). * <li> Character maps characters 'A' - 'Z' and 'a' - 'z' to the numeric @@ -89,10 +88,75 @@ import java.util.Map; * </ul> * <p> * Further detail differences can be determined from the program - * <a href = http://oss.software.ibm.com/developerworks/opensource/cvs/icu4j/~checkout~/icu4j/src/com/ibm/icu/dev/test/lang/UCharacterCompare.java> + * <a href="http://source.icu-project.org/repos/icu/icu4j/trunk/src/com/ibm/icu/dev/test/lang/UCharacterCompare.java"> * com.ibm.icu.dev.test.lang.UCharacterCompare</a> * </p> * <p> + * In addition to Java compatibility functions, which calculate derived properties, + * this API provides low-level access to the Unicode Character Database. + * </p> + * <p> + * Unicode assigns each code point (not just assigned character) values for + * many properties. + * Most of them are simple boolean flags, or constants from a small enumerated list. + * For some properties, values are strings or other relatively more complex types. + * </p> + * <p> + * For more information see + * "About the Unicode Character Database" (http://www.unicode.org/ucd/) + * and the ICU User Guide chapter on Properties (http://www.icu-project.org/userguide/properties.html). + * </p> + * <p> + * There are also functions that provide easy migration from C/POSIX functions + * like isblank(). Their use is generally discouraged because the C/POSIX + * standards do not define their semantics beyond the ASCII range, which means + * that different implementations exhibit very different behavior. + * Instead, Unicode properties should be used directly. + * </p> + * <p> + * There are also only a few, broad C/POSIX character classes, and they tend + * to be used for conflicting purposes. For example, the "isalpha()" class + * is sometimes used to determine word boundaries, while a more sophisticated + * approach would at least distinguish initial letters from continuation + * characters (the latter including combining marks). + * (In ICU, BreakIterator is the most sophisticated API for word boundaries.) + * Another example: There is no "istitle()" class for titlecase characters. + * </p> + * <p> + * ICU 3.4 and later provides API access for all twelve C/POSIX character classes. + * ICU implements them according to the Standard Recommendations in + * Annex C: Compatibility Properties of UTS #18 Unicode Regular Expressions + * (http://www.unicode.org/reports/tr18/#Compatibility_Properties). + * </p> + * <p> + * API access for C/POSIX character classes is as follows: + * - alpha: isUAlphabetic(c) or hasBinaryProperty(c, UProperty.ALPHABETIC) + * - lower: isULowercase(c) or hasBinaryProperty(c, UProperty.LOWERCASE) + * - upper: isUUppercase(c) or hasBinaryProperty(c, UProperty.UPPERCASE) + * - punct: ((1<<getType(c)) & ((1<<DASH_PUNCTUATION)|(1<<START_PUNCTUATION)|(1<<END_PUNCTUATION)|(1<<CONNECTOR_PUNCTUATION)|(1<<OTHER_PUNCTUATION)|(1<<INITIAL_PUNCTUATION)|(1<<FINAL_PUNCTUATION)))!=0 + * - digit: isDigit(c) or getType(c)==DECIMAL_DIGIT_NUMBER + * - xdigit: hasBinaryProperty(c, UProperty.POSIX_XDIGIT) + * - alnum: hasBinaryProperty(c, UProperty.POSIX_ALNUM) + * - space: isUWhiteSpace(c) or hasBinaryProperty(c, UProperty.WHITE_SPACE) + * - blank: hasBinaryProperty(c, UProperty.POSIX_BLANK) + * - cntrl: getType(c)==CONTROL + * - graph: hasBinaryProperty(c, UProperty.POSIX_GRAPH) + * - print: hasBinaryProperty(c, UProperty.POSIX_PRINT) + * </p> + * <p> + * The C/POSIX character classes are also available in UnicodeSet patterns, + * using patterns like [:graph:] or \p{graph}. + * </p> + * <p> + * Note: There are several ICU (and Java) whitespace functions. + * Comparison: + * - isUWhiteSpace=UCHAR_WHITE_SPACE: Unicode White_Space property; + * most of general categories "Z" (separators) + most whitespace ISO controls + * (including no-break spaces, but excluding IS1..IS4 and ZWSP) + * - isWhitespace: Java isWhitespace; Z + whitespace ISO controls but excluding no-break spaces + * - isSpaceChar: just Z (including no-break spaces) + * </p> + * <p> * This class is not subclassable * </p> * @author Syn Wee Quek @@ -110,95 +174,10 @@ public final class UCharacter */ public static interface NumericType { - /** - * @stable ICU 2.4 - */ - public static final int NONE = 0; /** * @stable ICU 2.4 */ public static final int DECIMAL = 1; - /** - * @stable ICU 2.4 - */ - public static final int DIGIT = 2; - /** - * @stable ICU 2.4 - */ - public static final int NUMERIC = 3; - /** - * @stable ICU 2.4 - */ - public static final int COUNT = 4; - } - - /** - * Hangul Syllable Type constants. - * - * @see UProperty#HANGUL_SYLLABLE_TYPE - * @stable ICU 2.6 - */ - public static interface HangulSyllableType - { - /** - * @stable ICU 2.6 - */ - public static final int NOT_APPLICABLE = 0; /*[NA]*/ /*See note !!*/ - /** - * @stable ICU 2.6 - */ - public static final int LEADING_JAMO = 1; /*[L]*/ - /** - * @stable ICU 2.6 - */ - public static final int VOWEL_JAMO = 2; /*[V]*/ - /** - * @stable ICU 2.6 - */ - public static final int TRAILING_JAMO = 3; /*[T]*/ - /** - * @stable ICU 2.6 - */ - public static final int LV_SYLLABLE = 4; /*[LV]*/ - /** - * @stable ICU 2.6 - */ - public static final int LVT_SYLLABLE = 5; /*[LVT]*/ - /** - * @stable ICU 2.6 - */ - public static final int COUNT = 6; - } - - /** - * [Sun] This interface moved from UCharacterEnums.java. - * - * 'Enum' for the CharacterCategory constants. These constants are - * compatible in name <b>but not in value</b> with those defined in - * <code>java.lang.Character</code>. - * @see UCharacterCategory - * @draft ICU 3.0 - * @deprecated This is a draft API and might change in a future release of ICU. - */ - public static interface ECharacterCategory - { - /** - * Character type Lu - * @stable ICU 2.1 - */ - public static final int UPPERCASE_LETTER = 1; - - /** - * Character type Lt - * @stable ICU 2.1 - */ - public static final int TITLECASE_LETTER = 3; - - /** - * Character type Lo - * @stable ICU 2.1 - */ - public static final int OTHER_LETTER = 5; } // public data members ----------------------------------------------- @@ -225,14 +204,6 @@ public final class UCharacter public static final int SUPPLEMENTARY_MIN_VALUE = UTF16.SUPPLEMENTARY_MIN_VALUE; - /** - * Special value that is returned by getUnicodeNumericValue(int) when no - * numeric value is defined for a code point. - * @stable ICU 2.4 - * @see #getUnicodeNumericValue - */ - public static final double NO_NUMERIC_VALUE = -123456789; - // public methods ---------------------------------------------------- /** @@ -262,160 +233,15 @@ public final class UCharacter { // when ch is out of bounds getProperty == 0 int props = getProperty(ch); - if (getNumericType(props) != NumericType.DECIMAL) { - return (radix <= 10) ? -1 : getEuropeanDigit(ch); + int value; + if (getNumericType(props) == NumericType.DECIMAL) { + value = UCharacterProperty.getUnsignedValue(props); + } else { + value = getEuropeanDigit(ch); } - // if props == 0, it will just fall through and return -1 - if (isNotExceptionIndicator(props)) { - // not contained in exception data - // getSignedValue is just shifting so we can check for the sign - // first - // Optimization - // int result = UCharacterProperty.getSignedValue(props); - // if (result >= 0) { - // return result; - // } - if (props >= 0) { - return UCharacterProperty.getSignedValue(props); - } - } - else { - int index = UCharacterProperty.getExceptionIndex(props); - if (PROPERTY_.hasExceptionValue(index, - UCharacterProperty.EXC_NUMERIC_VALUE_)) { - int result = PROPERTY_.getException(index, - UCharacterProperty.EXC_NUMERIC_VALUE_); - if (result >= 0) { - return result; - } - } - } - - if (radix > 10) { - int result = getEuropeanDigit(ch); - if (result >= 0 && result < radix) { - return result; - } - } - return -1; + return (0 <= value && value < radix) ? value : -1; } - /** - * <p>Get the numeric value for a Unicode code point as defined in the - * Unicode Character Database.</p> - * <p>A "double" return type is necessary because some numeric values are - * fractions, negative, or too large for int.</p> - * <p>For characters without any numeric values in the Unicode Character - * Database, this function will return NO_NUMERIC_VALUE.</p> - * <p><em>API Change:</em> In release 2.2 and prior, this API has a - * return type int and returns -1 when the argument ch does not have a - * corresponding numeric value. This has been changed to synch with ICU4C - * </p> - * This corresponds to the ICU4C function u_getNumericValue. - * @param ch Code point to get the numeric value for. - * @return numeric value of ch, or NO_NUMERIC_VALUE if none is defined. - * @stable ICU 2.4 - */ - public static double getUnicodeNumericValue(int ch) - { - // equivalent to c version double u_getNumericValue(UChar32 c) - int props = PROPERTY_.getProperty(ch); - int numericType = getNumericType(props); - if (numericType > NumericType.NONE && numericType < NumericType.COUNT) { - if (isNotExceptionIndicator(props)) { - return UCharacterProperty.getSignedValue(props); - } - else { - int index = UCharacterProperty.getExceptionIndex(props); - boolean nex = false; - boolean dex = false; - double numerator = 0; - if (PROPERTY_.hasExceptionValue(index, - UCharacterProperty.EXC_NUMERIC_VALUE_)) { - int num = PROPERTY_.getException(index, - UCharacterProperty.EXC_NUMERIC_VALUE_); - // There are special values for huge numbers that are - // powers of ten. genprops/store.c documents: - // if numericValue = 0x7fffff00 + x then - // numericValue = 10 ^ x - if (num >= NUMERATOR_POWER_LIMIT_) { - num &= 0xff; - // 10^x without math.h - numerator = Math.pow(10, num); - } - else { - numerator = num; - } - nex = true; - } - double denominator = 0; - if (PROPERTY_.hasExceptionValue(index, - UCharacterProperty.EXC_DENOMINATOR_VALUE_)) { - denominator = PROPERTY_.getException(index, - UCharacterProperty.EXC_DENOMINATOR_VALUE_); - // faster path not in c - if (numerator != 0) { - return numerator / denominator; - } - dex = true; - } - - if (nex) { - if (dex) { - return numerator / denominator; - } - return numerator; - } - if (dex) { - return 1 / denominator; - } - } - } - return NO_NUMERIC_VALUE; - } - - /** - * Returns a value indicating a code point's Unicode category. - * Up-to-date Unicode implementation of java.lang.Character.getType() - * except for the above mentioned code points that had their category - * changed.<br> - * Return results are constants from the interface - * <a href=UCharacterCategory.html>UCharacterCategory</a><br> - * <em>NOTE:</em> the UCharacterCategory values are <em>not</em> compatible with - * those returned by java.lang.Character.getType. UCharacterCategory values - * match the ones used in ICU4C, while java.lang.Character type - * values, though similar, skip the value 17.</p> - * @param ch code point whose type is to be determined - * @return category which is a value of UCharacterCategory - * @stable ICU 2.1 - */ - public static int getType(int ch) - { - return getProperty(ch) & UCharacterProperty.TYPE_MASK; - } - - //// for StringPrep - /** - * Returns a code point corresponding to the two UTF16 characters. - * @param lead the lead char - * @param trail the trail char - * @return code point if surrogate characters are valid. - * @exception IllegalArgumentException thrown when argument characters do - * not form a valid codepoint - * @stable ICU 2.1 - */ - public static int getCodePoint(char lead, char trail) - { - if (lead >= UTF16.LEAD_SURROGATE_MIN_VALUE && - lead <= UTF16.LEAD_SURROGATE_MAX_VALUE && - trail >= UTF16.TRAIL_SURROGATE_MIN_VALUE && - trail <= UTF16.TRAIL_SURROGATE_MAX_VALUE) { - return UCharacterProperty.getRawSupplementary(lead, trail); - } - throw new IllegalArgumentException("Illegal surrogate characters"); - } - - //// for StringPrep /** * Returns the Bidirection property of a code point. * For example, 0x0041 (letter A) has the LEFT_TO_RIGHT directional @@ -428,111 +254,24 @@ public final class UCharacter */ public static int getDirection(int ch) { - // when ch is out of bounds getProperty == 0 - return (getProperty(ch) >> BIDI_SHIFT_) & BIDI_MASK_AFTER_SHIFT_; + return gBdp.getClass(ch); } /** - * The given string is mapped to its case folding equivalent according to - * UnicodeData.txt and CaseFolding.txt; if any character has no case - * folding equivalent, the character itself is returned. - * "Full", multiple-code point case folding mappings are returned here. - * For "simple" single-code point mappings use the API - * foldCase(int ch, boolean defaultmapping). - * @param str the String to be converted - * @param defaultmapping Indicates if all mappings defined in - * CaseFolding.txt is to be used, otherwise the - * mappings for dotted I and dotless i marked with - * 'I' in CaseFolding.txt will be skipped. - * @return the case folding equivalent of the character, if - * any; otherwise the character itself. - * @see #foldCase(int, boolean) + * Returns a code point corresponding to the two UTF16 characters. + * @param lead the lead char + * @param trail the trail char + * @return code point if surrogate characters are valid. + * @exception IllegalArgumentException thrown when argument characters do + * not form a valid codepoint * @stable ICU 2.1 */ - public static String foldCase(String str, boolean defaultmapping) + public static int getCodePoint(char lead, char trail) { - int size = str.length(); - StringBuffer result = new StringBuffer(size); - int offset = 0; - int ch; - - // case mapping loop - while (offset < size) { - ch = UTF16.charAt(str, offset); - offset += UTF16.getCharCount(ch); - int props = PROPERTY_.getProperty(ch); - if (isNotExceptionIndicator(props)) { - int type = UCharacterProperty.TYPE_MASK & props; - if (type == ECharacterCategory.UPPERCASE_LETTER || - type == ECharacterCategory.TITLECASE_LETTER) { - ch += UCharacterProperty.getSignedValue(props); - } - } - else { - int index = UCharacterProperty.getExceptionIndex(props); - if (PROPERTY_.hasExceptionValue(index, - UCharacterProperty.EXC_CASE_FOLDING_)) { - int exception = PROPERTY_.getException(index, - UCharacterProperty.EXC_CASE_FOLDING_); - if (exception != 0) { - PROPERTY_.getFoldCase(exception & LAST_CHAR_MASK_, - exception >> SHIFT_24_, result); - } - else { - // special case folding mappings, hardcoded - if (ch != 0x49 && ch != 0x130) { - // return ch itself because there is no special - // mapping for it - UTF16.append(result, ch); - continue; - } - if (defaultmapping) { - // default mappings - if (ch == 0x49) { - // 0049; C; 0069; # LATIN CAPITAL LETTER I - result.append( - UCharacterProperty.LATIN_SMALL_LETTER_I_); - } - else if (ch == 0x130) { - // 0130; F; 0069 0307; - // # LATIN CAPITAL LETTER I WITH DOT ABOVE - result.append( - UCharacterProperty.LATIN_SMALL_LETTER_I_); - result.append((char)0x307); - } - } - else { - // Turkic mappings - if (ch == 0x49) { - // 0049; T; 0131; # LATIN CAPITAL LETTER I - result.append((char)0x131); - } - else if (ch == 0x130) { - // 0130; T; 0069; - // # LATIN CAPITAL LETTER I WITH DOT ABOVE - result.append( - UCharacterProperty.LATIN_SMALL_LETTER_I_); - } - } - } - // do not fall through to the output of c - continue; - } - else { - if (PROPERTY_.hasExceptionValue(index, - UCharacterProperty.EXC_LOWERCASE_)) { - ch = PROPERTY_.getException(index, - UCharacterProperty.EXC_LOWERCASE_); - } - } - - } - - // handle 1:1 code point mappings from UnicodeData.txt - UTF16.append(result, ch); + if (UTF16.isLeadSurrogate(lead) && UTF16.isTrailSurrogate(trail)) { + return UCharacterProperty.getRawSupplementary(lead, trail); } - - return result.toString(); + throw new IllegalArgumentException("Illegal surrogate characters"); } /** @@ -555,83 +294,6 @@ public final class UCharacter return PROPERTY_.getAge(ch); } - /** - * <p>Gets the property value for an Unicode property type of a code point. - * Also returns binary and mask property values.</p> - * <p>Unicode, especially in version 3.2, defines many more properties than - * the original set in UnicodeData.txt.</p> - * <p>The properties APIs are intended to reflect Unicode properties as - * defined in the Unicode Character Database (UCD) and Unicode Technical - * Reports (UTR). For details about the properties see - * http://www.unicode.org/.</p> - * <p>For names of Unicode properties see the UCD file PropertyAliases.txt. - * </p> - * <pre> - * Sample usage: - * int ea = UCharacter.getIntPropertyValue(c, UProperty.EAST_ASIAN_WIDTH); - * int ideo = UCharacter.getIntPropertyValue(c, UProperty.IDEOGRAPHIC); - * boolean b = (ideo == 1) ? true : false; - * </pre> - * @param ch code point to test. - * @param type UProperty selector constant, identifies which binary - * property to check. Must be - * UProperty.BINARY_START <= type < UProperty.BINARY_LIMIT or - * UProperty.INT_START <= type < UProperty.INT_LIMIT or - * UProperty.MASK_START <= type < UProperty.MASK_LIMIT. - * @return numeric value that is directly the property value or, - * for enumerated properties, corresponds to the numeric value of - * the enumerated constant of the respective property value - * enumeration type (cast to enum type if necessary). - * Returns 0 or 1 (for false / true) for binary Unicode properties. - * Returns a bit-mask for mask properties. - * Returns 0 if 'type' is out of bounds or if the Unicode version - * does not have data for the property at all, or not for this code - * point. - * @see UProperty - * @see #hasBinaryProperty - * @see #getIntPropertyMinValue - * @see #getIntPropertyMaxValue - * @see #getUnicodeVersion - * @stable ICU 2.4 - */ - public static int getIntPropertyValue(int ch, int type) - { - /* - * For Normalizer with Unicode 3.2, this method is called only for - * HANGUL_SYLLABLE_TYPE in UnicodeSet.addPropertyStarts(). - */ - if (type == UProperty.HANGUL_SYLLABLE_TYPE) { - /* purely algorithmic; hardcode known characters, check for assigned new ones */ - if(ch<NormalizerImpl.JAMO_L_BASE) { - /* NA */ - } else if(ch<=0x11ff) { - /* Jamo range */ - if(ch<=0x115f) { - /* Jamo L range, HANGUL CHOSEONG ... */ - if(ch==0x115f || ch<=0x1159 || getType(ch)==ECharacterCategory.OTHER_LETTER) { - return HangulSyllableType.LEADING_JAMO; - } - } else if(ch<=0x11a7) { - /* Jamo V range, HANGUL JUNGSEONG ... */ - if(ch<=0x11a2 || getType(ch)==ECharacterCategory.OTHER_LETTER) { - return HangulSyllableType.VOWEL_JAMO; - } - } else { - /* Jamo T range */ - if(ch<=0x11f9 || getType(ch)==ECharacterCategory.OTHER_LETTER) { - return HangulSyllableType.TRAILING_JAMO; - } - } - } else if((ch-=NormalizerImpl.HANGUL_BASE)<0) { - /* NA */ - } else if(ch<NormalizerImpl.HANGUL_COUNT) { - /* Hangul syllable */ - return ch%NormalizerImpl.JAMO_T_COUNT==0 ? HangulSyllableType.LV_SYLLABLE : HangulSyllableType.LVT_SYLLABLE; - } - } - return 0; /* NA */ - } - // private variables ------------------------------------------------- /** @@ -643,143 +305,43 @@ public final class UCharacter */ private static final char[] PROPERTY_TRIE_INDEX_; private static final char[] PROPERTY_TRIE_DATA_; - private static final int[] PROPERTY_DATA_; private static final int PROPERTY_INITIAL_VALUE_; + private static final UBiDiProps gBdp; + // block to initialise character property database static { try { - PROPERTY_ = UCharacterProperty.getInstance(); - PROPERTY_TRIE_INDEX_ = PROPERTY_.m_trieIndex_; - PROPERTY_TRIE_DATA_ = PROPERTY_.m_trieData_; - PROPERTY_DATA_ = PROPERTY_.m_property_; - PROPERTY_INITIAL_VALUE_ - = PROPERTY_DATA_[PROPERTY_.m_trieInitialValue_]; + PROPERTY_ = UCharacterProperty.getInstance(); + PROPERTY_TRIE_INDEX_ = PROPERTY_.m_trieIndex_; + PROPERTY_TRIE_DATA_ = PROPERTY_.m_trieData_; + PROPERTY_INITIAL_VALUE_ = PROPERTY_.m_trieInitialValue_; } catch (Exception e) { - throw new RuntimeException(e.getMessage()); + throw new MissingResourceException(e.getMessage(),"",""); } + + UBiDiProps bdp; + try { + bdp=UBiDiProps.getSingleton(); + } catch(IOException e) { + bdp=UBiDiProps.getDummy(); + } + gBdp=bdp; } - /** - * To get the last character out from a data type - */ - private static final int LAST_CHAR_MASK_ = 0xFFFF; - - /** - * To get the last byte out from a data type - */ -// private static final int LAST_BYTE_MASK_ = 0xFF; - - /** - * Shift 16 bits - */ -// private static final int SHIFT_16_ = 16; - - /** - * Shift 24 bits - */ - private static final int SHIFT_24_ = 24; - /** * Shift to get numeric type */ - private static final int NUMERIC_TYPE_SHIFT_ = 12; + private static final int NUMERIC_TYPE_SHIFT_ = 5; /** * Mask to get numeric type */ private static final int NUMERIC_TYPE_MASK_ = 0x7 << NUMERIC_TYPE_SHIFT_; - /** - * Shift to get bidi bits - */ - private static final int BIDI_SHIFT_ = 6; - /** - * Mask to be applied after shifting to get bidi bits - */ - private static final int BIDI_MASK_AFTER_SHIFT_ = 0x1F; - - /** - * <p>Numerator power limit. - * There are special values for huge numbers that are powers of ten.</p> - * <p>c version genprops/store.c documents: - * if numericValue = 0x7fffff00 + x then numericValue = 10 ^ x</p> - */ - private static final int NUMERATOR_POWER_LIMIT_ = 0x7fffff00; - /** - * Integer properties mask and shift values for joining type. - * Equivalent to icu4c UPROPS_JT_MASK. - */ - private static final int JOINING_TYPE_MASK_ = 0x00003800; - /** - * Integer properties mask and shift values for joining type. - * Equivalent to icu4c UPROPS_JT_SHIFT. - */ - private static final int JOINING_TYPE_SHIFT_ = 11; - /** - * Integer properties mask and shift values for joining group. - * Equivalent to icu4c UPROPS_JG_MASK. - */ - private static final int JOINING_GROUP_MASK_ = 0x000007e0; - /** - * Integer properties mask and shift values for joining group. - * Equivalent to icu4c UPROPS_JG_SHIFT. - */ - private static final int JOINING_GROUP_SHIFT_ = 5; - /** - * Integer properties mask for decomposition type. - * Equivalent to icu4c UPROPS_DT_MASK. - */ - private static final int DECOMPOSITION_TYPE_MASK_ = 0x0000001f; - /** - * Integer properties mask and shift values for East Asian cell width. - * Equivalent to icu4c UPROPS_EA_MASK - */ - private static final int EAST_ASIAN_MASK_ = 0x00038000; - /** - * Integer properties mask and shift values for East Asian cell width. - * Equivalent to icu4c UPROPS_EA_SHIFT - */ - private static final int EAST_ASIAN_SHIFT_ = 15; - - /** - * Integer properties mask and shift values for line breaks. - * Equivalent to icu4c UPROPS_LB_MASK - */ - private static final int LINE_BREAK_MASK_ = 0x007C0000; - /** - * Integer properties mask and shift values for line breaks. - * Equivalent to icu4c UPROPS_LB_SHIFT - */ - private static final int LINE_BREAK_SHIFT_ = 18; - /** - * Integer properties mask and shift values for blocks. - * Equivalent to icu4c UPROPS_BLOCK_MASK - */ - private static final int BLOCK_MASK_ = 0x00007f80; - /** - * Integer properties mask and shift values for blocks. - * Equivalent to icu4c UPROPS_BLOCK_SHIFT - */ - private static final int BLOCK_SHIFT_ = 7; - /** - * Integer properties mask and shift values for scripts. - * Equivalent to icu4c UPROPS_SHIFT_MASK - */ - private static final int SCRIPT_MASK_ = 0x0000007f; - - // private constructor ----------------------------------------------- - ///CLOVER:OFF - /** - * Private constructor to prevent instantiation - */ - private UCharacter() - { - } - ///CLOVER:ON // private methods --------------------------------------------------- /** @@ -818,17 +380,6 @@ public final class UCharacter return (props & NUMERIC_TYPE_MASK_) >> NUMERIC_TYPE_SHIFT_; } - /** - * Checks if the property value has a exception indicator - * @param props 32 bit property value - * @return true if property does not have a exception indicator, false - * otherwise - */ - private static boolean isNotExceptionIndicator(int props) - { - return (props & UCharacterProperty.EXCEPTION_MASK) == 0; - } - /** * Gets the property value at the index. * This is optimized. @@ -841,35 +392,34 @@ public final class UCharacter * @return property value of code point * @stable ICU 2.6 */ - private static int getProperty(int ch) + private static final int getProperty(int ch) { if (ch < UTF16.LEAD_SURROGATE_MIN_VALUE || (ch > UTF16.LEAD_SURROGATE_MAX_VALUE && ch < UTF16.SUPPLEMENTARY_MIN_VALUE)) { - // BMP codepoint - try { // using try for < 0 ch is faster than using an if statement - return PROPERTY_DATA_[ - PROPERTY_TRIE_DATA_[ + // BMP codepoint 0000..D7FF or DC00..FFFF + try { // using try for ch < 0 is faster than using an if statement + return PROPERTY_TRIE_DATA_[ (PROPERTY_TRIE_INDEX_[ch >> 5] << 2) - + (ch & 0x1f)]]; + + (ch & 0x1f)]; } catch (ArrayIndexOutOfBoundsException e) { return PROPERTY_INITIAL_VALUE_; } } if (ch <= UTF16.LEAD_SURROGATE_MAX_VALUE) { - // surrogate - return PROPERTY_DATA_[ - PROPERTY_TRIE_DATA_[ + // lead surrogate D800..DBFF + return PROPERTY_TRIE_DATA_[ (PROPERTY_TRIE_INDEX_[(0x2800 >> 5) + (ch >> 5)] << 2) - + (ch & 0x1f)]]; + + (ch & 0x1f)]; } // for optimization if (ch <= UTF16.CODEPOINT_MAX_VALUE) { + // supplementary code point 10000..10FFFF // look at the construction of supplementary characters // trail forms the ends of it. - return PROPERTY_DATA_[PROPERTY_.m_trie_.getSurrogateValue( + return PROPERTY_.m_trie_.getSurrogateValue( UTF16.getLeadSurrogate(ch), - (char)(ch & 0x3ff))]; + (char)(ch & 0x3ff)); } // return m_dataOffset_ if there is an error, in this case we return // the default value: m_initialValue_ @@ -877,4 +427,5 @@ public final class UCharacter // this is for optimization. return PROPERTY_INITIAL_VALUE_; } + } diff --git a/jdk/src/share/classes/sun/text/normalizer/UCharacterProperty.java b/jdk/src/share/classes/sun/text/normalizer/UCharacterProperty.java index 1a748ff1731..a7412588ec1 100644 --- a/jdk/src/share/classes/sun/text/normalizer/UCharacterProperty.java +++ b/jdk/src/share/classes/sun/text/normalizer/UCharacterProperty.java @@ -1,5 +1,5 @@ /* - * Portions Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2005-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 @@ -22,10 +22,9 @@ * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ - /* ******************************************************************************* - * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved * + * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved * * * * The original version of this source code and documentation is copyrighted * * and owned by IBM, These materials are provided under terms of a License * @@ -40,8 +39,7 @@ package sun.text.normalizer; import java.io.BufferedInputStream; import java.io.InputStream; import java.io.IOException; -import java.text.BreakIterator; -import java.util.Locale; +import java.util.MissingResourceException; /** * <p>Internal class used for Unicode character property database.</p> @@ -56,10 +54,9 @@ import java.util.Locale; * <a href=UCharacter.html>UCharacter</a>.</p> * @author Syn Wee Quek * @since release 2.1, february 1st 2002 -* @draft 2.1 */ -public final class UCharacterProperty implements Trie.DataManipulate +public final class UCharacterProperty { // public data members ----------------------------------------------- @@ -83,68 +80,16 @@ public final class UCharacterProperty implements Trie.DataManipulate */ public int m_trieInitialValue_; /** - * Character property table - */ - public int m_property_[]; - /** * Unicode version */ public VersionInfo m_unicodeVersion_; - /** - * Exception indicator for uppercase type - */ - public static final int EXC_UPPERCASE_ = 0; - /** - * Exception indicator for lowercase type - */ - public static final int EXC_LOWERCASE_ = 1; - /** - * Exception indicator for titlecase type - */ - public static final int EXC_TITLECASE_ = 2; - /** - * Exception indicator for digit type - */ - public static final int EXC_UNUSED_ = 3; - /** - * Exception indicator for numeric type - */ - public static final int EXC_NUMERIC_VALUE_ = 4; - /** - * Exception indicator for denominator type - */ - public static final int EXC_DENOMINATOR_VALUE_ = 5; - /** - * Exception indicator for mirror type - */ - public static final int EXC_MIRROR_MAPPING_ = 6; - /** - * Exception indicator for special casing type - */ - public static final int EXC_SPECIAL_CASING_ = 7; - /** - * Exception indicator for case folding type - */ - public static final int EXC_CASE_FOLDING_ = 8; - /** - * EXC_COMBINING_CLASS_ is not found in ICU. - * Used to retrieve the combining class of the character in the exception - * value - */ - public static final int EXC_COMBINING_CLASS_ = 9; - /** - * Latin lowercase i - */ - public static final char LATIN_SMALL_LETTER_I_ = 0x69; - /** - * Character type mask - */ - public static final int TYPE_MASK = 0x1F; - /** - * Exception test mask - */ - public static final int EXCEPTION_MASK = 0x20; + // uprops.h enum UPropertySource --------------------------------------- *** + + /** From uchar.c/uprops.icu properties vectors trie */ + public static final int SRC_PROPSVEC=2; + /** One more than the highest UPropertySource (SRC_) constant. */ + public static final int SRC_COUNT=9; // public methods ---------------------------------------------------- @@ -158,23 +103,6 @@ public final class UCharacterProperty implements Trie.DataManipulate m_trieInitialValue_ = friendagent.getPrivateInitialValue(); } - /** - * Called by com.ibm.icu.util.Trie to extract from a lead surrogate's - * data the index array offset of the indexes for that lead surrogate. - * @param value data value for a surrogate from the trie, including the - * folding offset - * @return data offset or 0 if there is no data for the lead surrogate - */ - public int getFoldingOffset(int value) - { - if ((value & SUPPLEMENTARY_FOLD_INDICATOR_MASK_) != 0) { - return (value & SUPPLEMENTARY_FOLD_OFFSET_MASK_); - } - else { - return 0; - } - } - /** * Gets the property value at the index. * This is optimized. @@ -183,129 +111,79 @@ public final class UCharacterProperty implements Trie.DataManipulate * @param ch code point whose property value is to be retrieved * @return property value of code point */ - public int getProperty(int ch) + public final int getProperty(int ch) { if (ch < UTF16.LEAD_SURROGATE_MIN_VALUE || (ch > UTF16.LEAD_SURROGATE_MAX_VALUE && ch < UTF16.SUPPLEMENTARY_MIN_VALUE)) { - // BMP codepoint + // BMP codepoint 0000..D7FF or DC00..FFFF // optimized - try { - return m_property_[ - m_trieData_[ + try { // using try for ch < 0 is faster than using an if statement + return m_trieData_[ (m_trieIndex_[ch >> Trie.INDEX_STAGE_1_SHIFT_] << Trie.INDEX_STAGE_2_SHIFT_) - + (ch & Trie.INDEX_STAGE_3_MASK_)]]; + + (ch & Trie.INDEX_STAGE_3_MASK_)]; } catch (ArrayIndexOutOfBoundsException e) { - return m_property_[m_trieInitialValue_]; + return m_trieInitialValue_; } } if (ch <= UTF16.LEAD_SURROGATE_MAX_VALUE) { - return m_property_[ - m_trieData_[ + // lead surrogate D800..DBFF + return m_trieData_[ (m_trieIndex_[Trie.LEAD_INDEX_OFFSET_ + (ch >> Trie.INDEX_STAGE_1_SHIFT_)] << Trie.INDEX_STAGE_2_SHIFT_) - + (ch & Trie.INDEX_STAGE_3_MASK_)]]; + + (ch & Trie.INDEX_STAGE_3_MASK_)]; } - // for optimization if (ch <= UTF16.CODEPOINT_MAX_VALUE) { + // supplementary code point 10000..10FFFF // look at the construction of supplementary characters // trail forms the ends of it. - return m_property_[m_trie_.getSurrogateValue( + return m_trie_.getSurrogateValue( UTF16.getLeadSurrogate(ch), - (char)(ch & Trie.SURROGATE_MASK_))]; + (char)(ch & Trie.SURROGATE_MASK_)); } + // ch is out of bounds // return m_dataOffset_ if there is an error, in this case we return // the default value: m_initialValue_ // we cannot assume that m_initialValue_ is at offset 0 // this is for optimization. - return m_property_[m_trieInitialValue_]; - // return m_property_[m_trie_.getCodePointValue(ch)]; + return m_trieInitialValue_; + + // this all is an inlined form of return m_trie_.getCodePointValue(ch); } /** - * Getting the signed numeric value of a character embedded in the property + * Getting the unsigned numeric value of a character embedded in the property * argument * @param prop the character - * @return signed numberic value + * @return unsigned numberic value */ - public static int getSignedValue(int prop) - { - return (prop >> VALUE_SHIFT_); - } - - /** - * Getting the exception index for argument property - * @param prop character property - * @return exception index - */ - public static int getExceptionIndex(int prop) + public static int getUnsignedValue(int prop) { return (prop >> VALUE_SHIFT_) & UNSIGNED_VALUE_MASK_AFTER_SHIFT_; } - /** - * Determines if the exception value passed in has the kind of information - * which the indicator wants, e.g if the exception value contains the digit - * value of the character - * @param index exception index - * @param indicator type indicator - * @return true if type value exist - */ - public boolean hasExceptionValue(int index, int indicator) - { - return (m_exception_[index] & (1 << indicator)) != 0; - } - - /** - * Gets the exception value at the index, assuming that data type is - * available. Result is undefined if data is not available. Use - * hasExceptionValue() to determine data's availability. - * @param index - * @param etype exception data type - * @return exception data type value at index - */ - public int getException(int index, int etype) - { - // contained in exception data - if (etype == EXC_COMBINING_CLASS_) { - return m_exception_[index]; - } - // contained in the exception digit address - index = addExceptionOffset(m_exception_[index], etype, ++ index); - return m_exception_[index]; - } - - /** - * Gets the folded case value at the index - * @param index of the case value to be retrieved - * @param count number of characters to retrieve - * @param str string buffer to which to append the result - */ - public void getFoldCase(int index, int count, StringBuffer str) - { - // first 2 chars are for the simple mappings - index += 2; - while (count > 0) { - str.append(m_case_[index]); - index ++; - count --; - } - } - /** * Gets the unicode additional properties. * C version getUnicodeProperties. * @param codepoint codepoint whose additional properties is to be * retrieved + * @param column * @return unicode properties */ - public int getAdditional(int codepoint) { - return m_additionalVectors_[m_additionalTrie_.getCodePointValue(codepoint)]; + public int getAdditional(int codepoint, int column) { + if (column == -1) { + return getProperty(codepoint); + } + if (column < 0 || column >= m_additionalColumnsCount_) { + return 0; + } + return m_additionalVectors_[ + m_additionalTrie_.getCodePointValue(codepoint) + column]; } - /** + /** * <p>Get the "age" of the code point.</p> * <p>The "age" is the Unicode version when the code point was first * designated (as a non-character or for Private Use) or assigned a @@ -316,11 +194,10 @@ public final class UCharacterProperty implements Trie.DataManipulate * <p>This API does not check the validity of the codepoint.</p> * @param codepoint The code point. * @return the Unicode version number - * @draft ICU 2.1 */ public VersionInfo getAge(int codepoint) { - int version = getAdditional(codepoint) >> AGE_SHIFT_; + int version = getAdditional(codepoint, 0) >> AGE_SHIFT_; return VersionInfo.getInstance( (version >> FIRST_NIBBLE_SHIFT_) & LAST_NIBBLE_MASK_, version & LAST_NIBBLE_MASK_, 0, 0); @@ -341,16 +218,16 @@ public final class UCharacterProperty implements Trie.DataManipulate /** * Loads the property data and initialize the UCharacterProperty instance. - * @throws RuntimeException when data is missing or data has been corrupted + * @throws MissingResourceException when data is missing or data has been corrupted */ - public static UCharacterProperty getInstance() throws RuntimeException + public static UCharacterProperty getInstance() { - if (INSTANCE_ == null) { + if(INSTANCE_ == null) { try { INSTANCE_ = new UCharacterProperty(); } catch (Exception e) { - throw new RuntimeException(e.getMessage()); + throw new MissingResourceException(e.getMessage(),"",""); } } return INSTANCE_; @@ -359,6 +236,9 @@ public final class UCharacterProperty implements Trie.DataManipulate /** * Checks if the argument c is to be treated as a white space in ICU * rules. Usually ICU rule white spaces are ignored unless quoted. + * Equivalent to test for Pattern_White_Space Unicode property. + * Stable set of characters, won't change. + * See UAX #31 Identifier and Pattern Syntax: http://www.unicode.org/reports/tr31/ * @param c codepoint to check * @return true if c is a ICU white space */ @@ -366,8 +246,9 @@ public final class UCharacterProperty implements Trie.DataManipulate { /* "white space" in the sense of ICU rule parsers This is a FIXED LIST that is NOT DEPENDENT ON UNICODE PROPERTIES. - See UTR #31: http://www.unicode.org/reports/tr31/. + See UAX #31 Identifier and Pattern Syntax: http://www.unicode.org/reports/tr31/ U+0009..U+000D, U+0020, U+0085, U+200E..U+200F, and U+2028..U+2029 + Equivalent to test for Pattern_White_Space Unicode property. */ return (c >= 0x0009 && c <= 0x2029 && (c <= 0x000D || c == 0x0020 || c == 0x0085 || @@ -376,15 +257,6 @@ public final class UCharacterProperty implements Trie.DataManipulate // protected variables ----------------------------------------------- - /** - * Case table - */ - char m_case_[]; - - /** - * Exception property table - */ - int m_exception_[]; /** * Extra property trie */ @@ -426,78 +298,20 @@ public final class UCharacterProperty implements Trie.DataManipulate */ private static final int DATA_BUFFER_SIZE_ = 25000; - /** - * This, from what i infer is the max size of the indicators used for the - * exception values. - * Number of bits in an 8-bit integer value - */ - private static final int EXC_GROUP_ = 8; - - /** - * Mask to get the group - */ - private static final int EXC_GROUP_MASK_ = 255; - - /** - * Mask to get the digit value in the exception result - */ - private static final int EXC_DIGIT_MASK_ = 0xFFFF; - - /** - * Offset table for data in exception block.<br> - * Table formed by the number of bits used for the index, e.g. 0 = 0 bits, - * 1 = 1 bits. - */ - private static final byte FLAGS_OFFSET_[] = - { - 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, - 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, - 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, - 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, - 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, - 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, - 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, - 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, - 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, - 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 - }; - /** * Numeric value shift */ - private static final int VALUE_SHIFT_ = 20; + private static final int VALUE_SHIFT_ = 8; /** * Mask to be applied after shifting to obtain an unsigned numeric value */ - private static final int UNSIGNED_VALUE_MASK_AFTER_SHIFT_ = 0x7FF; - - /** - * - */ - private static final int NUMERIC_TYPE_SHIFT = 12; - - /** - * Folding indicator mask - */ - private static final int SUPPLEMENTARY_FOLD_INDICATOR_MASK_ = 0x8000; - - /** - * Folding offset mask - */ - private static final int SUPPLEMENTARY_FOLD_OFFSET_MASK_ = 0x7FFF; + private static final int UNSIGNED_VALUE_MASK_AFTER_SHIFT_ = 0xFF; /** * Shift value for lead surrogate to form a supplementary character. */ private static final int LEAD_SURROGATE_SHIFT_ = 10; - /** * Offset to add to combined surrogate pair to avoid msking. */ @@ -507,16 +321,12 @@ public final class UCharacterProperty implements Trie.DataManipulate LEAD_SURROGATE_SHIFT_) - UTF16.TRAIL_SURROGATE_MIN_VALUE; - /** - * To get the last character out from a data type - */ - private static final int LAST_CHAR_MASK_ = 0xFFFF; + // additional properties ---------------------------------------------- /** * First nibble shift */ private static final int FIRST_NIBBLE_SHIFT_ = 0x4; - /** * Second nibble mask */ @@ -530,7 +340,7 @@ public final class UCharacterProperty implements Trie.DataManipulate /** * Constructor - * @exception thrown when data reading fails or data corrupted + * @exception IOException thrown when data reading fails or data corrupted */ private UCharacterProperty() throws IOException { @@ -544,275 +354,16 @@ public final class UCharacterProperty implements Trie.DataManipulate m_trie_.putIndexData(this); } - /* Is followed by {case-ignorable}* cased ? */ - /** - * Getting the correct address for data in the exception value - * @param evalue exception value - * @param indicator type of data to retrieve - * @param address current address to move from - * @return the correct address - */ - private int addExceptionOffset(int evalue, int indicator, int address) - { - int result = address; - if (indicator >= EXC_GROUP_) { - result += FLAGS_OFFSET_[evalue & EXC_GROUP_MASK_]; - evalue >>= EXC_GROUP_; - indicator -= EXC_GROUP_; - } - int mask = (1 << indicator) - 1; - result += FLAGS_OFFSET_[evalue & mask]; - return result; - } - - private static final int TAB = 0x0009; - private static final int LF = 0x000a; - private static final int FF = 0x000c; - private static final int CR = 0x000d; - private static final int U_A = 0x0041; - private static final int U_Z = 0x005a; - private static final int U_a = 0x0061; - private static final int U_z = 0x007a; - private static final int DEL = 0x007f; - private static final int NL = 0x0085; - private static final int NBSP = 0x00a0; - private static final int CGJ = 0x034f; - private static final int FIGURESP= 0x2007; - private static final int HAIRSP = 0x200a; - private static final int ZWNJ = 0x200c; - private static final int ZWJ = 0x200d; - private static final int RLM = 0x200f; - private static final int NNBSP = 0x202f; - private static final int WJ = 0x2060; - private static final int INHSWAP = 0x206a; - private static final int NOMDIG = 0x206f; - private static final int ZWNBSP = 0xfeff; - - public UnicodeSet addPropertyStarts(UnicodeSet set) { - int c; - - /* add the start code point of each same-value range of each trie */ - //utrie_enum(&normTrie, NULL, _enumPropertyStartsRange, set); - TrieIterator propsIter = new TrieIterator(m_trie_); - RangeValueIterator.Element propsResult = new RangeValueIterator.Element(); - while(propsIter.next(propsResult)){ - set.add(propsResult.start); - } - //utrie_enum(&propsVectorsTrie, NULL, _enumPropertyStartsRange, set); - TrieIterator propsVectorsIter = new TrieIterator(m_additionalTrie_); - RangeValueIterator.Element propsVectorsResult = new RangeValueIterator.Element(); - while(propsVectorsIter.next(propsVectorsResult)){ - set.add(propsVectorsResult.start); - } - - - /* add code points with hardcoded properties, plus the ones following them */ - - /* add for IS_THAT_CONTROL_SPACE() */ - set.add(TAB); /* range TAB..CR */ - set.add(CR+1); - set.add(0x1c); - set.add(0x1f+1); - set.add(NL); - set.add(NL+1); - - /* add for u_isIDIgnorable() what was not added above */ - set.add(DEL); /* range DEL..NBSP-1, NBSP added below */ - set.add(HAIRSP); - set.add(RLM+1); - set.add(INHSWAP); - set.add(NOMDIG+1); - set.add(ZWNBSP); - set.add(ZWNBSP+1); - - /* add no-break spaces for u_isWhitespace() what was not added above */ - set.add(NBSP); - set.add(NBSP+1); - set.add(FIGURESP); - set.add(FIGURESP+1); - set.add(NNBSP); - set.add(NNBSP+1); - - /* add for u_charDigitValue() */ - set.add(0x3007); - set.add(0x3008); - set.add(0x4e00); - set.add(0x4e01); - set.add(0x4e8c); - set.add(0x4e8d); - set.add(0x4e09); - set.add(0x4e0a); - set.add(0x56db); - set.add(0x56dc); - set.add(0x4e94); - set.add(0x4e95); - set.add(0x516d); - set.add(0x516e); - set.add(0x4e03); - set.add(0x4e04); - set.add(0x516b); - set.add(0x516c); - set.add(0x4e5d); - set.add(0x4e5e); - - /* add for u_digit() */ - set.add(U_a); - set.add(U_z+1); - set.add(U_A); - set.add(U_Z+1); - - /* add for UCHAR_DEFAULT_IGNORABLE_CODE_POINT what was not added above */ - set.add(WJ); /* range WJ..NOMDIG */ - set.add(0xfff0); - set.add(0xfffb+1); - set.add(0xe0000); - set.add(0xe0fff+1); - - /* add for UCHAR_GRAPHEME_BASE and others */ - set.add(CGJ); - set.add(CGJ+1); - - /* add for UCHAR_JOINING_TYPE */ - set.add(ZWNJ); /* range ZWNJ..ZWJ */ - set.add(ZWJ+1); - - /* add Jamo type boundaries for UCHAR_HANGUL_SYLLABLE_TYPE */ - set.add(0x1100); - int value= UCharacter.HangulSyllableType.LEADING_JAMO; - int value2; - for(c=0x115a; c<=0x115f; ++c) { - value2= UCharacter.getIntPropertyValue(c, UProperty.HANGUL_SYLLABLE_TYPE); - if(value!=value2) { - value=value2; - set.add(c); + public void upropsvec_addPropertyStarts(UnicodeSet set) { + /* add the start code point of each same-value range of the properties vectors trie */ + if(m_additionalColumnsCount_>0) { + /* if m_additionalColumnsCount_==0 then the properties vectors trie may not be there at all */ + TrieIterator propsVectorsIter = new TrieIterator(m_additionalTrie_); + RangeValueIterator.Element propsVectorsResult = new RangeValueIterator.Element(); + while(propsVectorsIter.next(propsVectorsResult)){ + set.add(propsVectorsResult.start); } } - - set.add(0x1160); - value=UCharacter.HangulSyllableType.VOWEL_JAMO; - for(c=0x11a3; c<=0x11a7; ++c) { - value2=UCharacter.getIntPropertyValue(c, UProperty.HANGUL_SYLLABLE_TYPE); - if(value!=value2) { - value=value2; - set.add(c); - } - } - - set.add(0x11a8); - value=UCharacter.HangulSyllableType.TRAILING_JAMO; - for(c=0x11fa; c<=0x11ff; ++c) { - value2=UCharacter.getIntPropertyValue(c, UProperty.HANGUL_SYLLABLE_TYPE); - if(value!=value2) { - value=value2; - set.add(c); - } - } - - - /* - * Omit code points for u_charCellWidth() because - * - it is deprecated and not a real Unicode property - * - they are probably already set from the trie enumeration - */ - - /* - * Omit code points with hardcoded specialcasing properties - * because we do not build property UnicodeSets for them right now. - */ - return set; // for chaining - } -/*---------------------------------------------------------------- - * Inclusions list - *----------------------------------------------------------------*/ - - /* - * Return a set of characters for property enumeration. - * The set implicitly contains 0x110000 as well, which is one more than the highest - * Unicode code point. - * - * This set is used as an ordered list - its code points are ordered, and - * consecutive code points (in Unicode code point order) in the set define a range. - * For each two consecutive characters (start, limit) in the set, - * all of the UCD/normalization and related properties for - * all code points start..limit-1 are all the same, - * except for character names and ISO comments. - * - * All Unicode code points U+0000..U+10ffff are covered by these ranges. - * The ranges define a partition of the Unicode code space. - * ICU uses the inclusions set to enumerate properties for generating - * UnicodeSets containing all code points that have a certain property value. - * - * The Inclusion List is generated from the UCD. It is generated - * by enumerating the data tries, and code points for hardcoded properties - * are added as well. - * - * -------------------------------------------------------------------------- - * - * The following are ideas for getting properties-unique code point ranges, - * with possible optimizations beyond the current implementation. - * These optimizations would require more code and be more fragile. - * The current implementation generates one single list (set) for all properties. - * - * To enumerate properties efficiently, one needs to know ranges of - * repetitive values, so that the value of only each start code point - * can be applied to the whole range. - * This information is in principle available in the uprops.icu/unorm.icu data. - * - * There are two obstacles: - * - * 1. Some properties are computed from multiple data structures, - * making it necessary to get repetitive ranges by intersecting - * ranges from multiple tries. - * - * 2. It is not economical to write code for getting repetitive ranges - * that are precise for each of some 50 properties. - * - * Compromise ideas: - * - * - Get ranges per trie, not per individual property. - * Each range contains the same values for a whole group of properties. - * This would generate currently five range sets, two for uprops.icu tries - * and three for unorm.icu tries. - * - * - Combine sets of ranges for multiple tries to get sufficient sets - * for properties, e.g., the uprops.icu main and auxiliary tries - * for all non-normalization properties. - * - * Ideas for representing ranges and combining them: - * - * - A UnicodeSet could hold just the start code points of ranges. - * Multiple sets are easily combined by or-ing them together. - * - * - Alternatively, a UnicodeSet could hold each even-numbered range. - * All ranges could be enumerated by using each start code point - * (for the even-numbered ranges) as well as each limit (end+1) code point - * (for the odd-numbered ranges). - * It should be possible to combine two such sets by xor-ing them, - * but no more than two. - * - * The second way to represent ranges may(?!) yield smaller UnicodeSet arrays, - * but the first one is certainly simpler and applicable for combining more than - * two range sets. - * - * It is possible to combine all range sets for all uprops/unorm tries into one - * set that can be used for all properties. - * As an optimization, there could be less-combined range sets for certain - * groups of properties. - * The relationship of which less-combined range set to use for which property - * depends on the implementation of the properties and must be hardcoded - * - somewhat error-prone and higher maintenance but can be tested easily - * by building property sets "the simple way" in test code. - * - * --- - * - * Do not use a UnicodeSet pattern because that causes infinite recursion; - * UnicodeSet depends on the inclusions set. - */ - public UnicodeSet getInclusions() { - UnicodeSet set = new UnicodeSet(); - NormalizerImpl.addPropertyStarts(set); - addPropertyStarts(set); - return set; } } diff --git a/jdk/src/share/classes/sun/text/normalizer/UCharacterPropertyReader.java b/jdk/src/share/classes/sun/text/normalizer/UCharacterPropertyReader.java index bb44a8f9b4c..60cb327c4d8 100644 --- a/jdk/src/share/classes/sun/text/normalizer/UCharacterPropertyReader.java +++ b/jdk/src/share/classes/sun/text/normalizer/UCharacterPropertyReader.java @@ -1,5 +1,5 @@ /* - * Portions Copyright 2005 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2005-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 @@ -22,10 +22,9 @@ * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ - /* ******************************************************************************* - * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved * + * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved * * * * The original version of this source code and documentation is copyrighted * * and owned by IBM, These materials are provided under terms of a License * @@ -37,8 +36,8 @@ package sun.text.normalizer; -import java.io.InputStream; import java.io.DataInputStream; +import java.io.InputStream; import java.io.IOException; /** @@ -50,254 +49,13 @@ import java.io.IOException; * </p> * <p>uprops.icu which is in big-endian format is jared together with this * package.</p> +* +* Unicode character properties file format see +* (ICU4C)/source/tools/genprops/store.c +* * @author Syn Wee Quek * @since release 2.1, February 1st 2002 -* @draft 2.1 */ -/* Unicode character properties file format ------------------------------------ - -The file format prepared and written here contains several data -structures that store indexes or data. - - - -The following is a description of format version 3 . - -Data contents: - -The contents is a parsed, binary form of several Unicode character -database files, most prominently UnicodeData.txt. - -Any Unicode code point from 0 to 0x10ffff can be looked up to get -the properties, if any, for that code point. This means that the input -to the lookup are 21-bit unsigned integers, with not all of the -21-bit range used. - -It is assumed that client code keeps a uint32_t pointer -to the beginning of the data: - - const uint32_t *p32; - -Formally, the file contains the following structures: - - const int32_t indexes[16] with values i0..i15: - - i0 propsIndex; -- 32-bit unit index to the table of 32-bit properties words - i1 exceptionsIndex; -- 32-bit unit index to the table of 32-bit exception words - i2 exceptionsTopIndex; -- 32-bit unit index to the array of UChars for special mappings - - i3 additionalTrieIndex; -- 32-bit unit index to the additional trie for more properties - i4 additionalVectorsIndex; -- 32-bit unit index to the table of properties vectors - i5 additionalVectorsColumns; -- number of 32-bit words per properties vector - - i6 reservedItemIndex; -- 32-bit unit index to the top of the properties vectors table - i7..i9 reservedIndexes; -- reserved values; 0 for now - - i10 maxValues; -- maximum code values for vector word 0, see uprops.h (format version 3.1+) - i11 maxValues2; -- maximum code values for vector word 2, see uprops.h (format version 3.2) - i12..i15 reservedIndexes; -- reserved values; 0 for now - - PT serialized properties trie, see utrie.h (byte size: 4*(i0-16)) - - P const uint32_t props32[i1-i0]; - E const uint32_t exceptions[i2-i1]; - U const UChar uchars[2*(i3-i2)]; - - AT serialized trie for additional properties (byte size: 4*(i4-i3)) - PV const uint32_t propsVectors[(i6-i4)/i5][i5]==uint32_t propsVectors[i6-i4]; - -Trie lookup and properties: - -In order to condense the data for the 21-bit code space, several properties of -the Unicode code assignment are exploited: -- The code space is sparse. -- There are several 10k of consecutive codes with the same properties. -- Characters and scripts are allocated in groups of 16 code points. -- Inside blocks for scripts the properties are often repetitive. -- The 21-bit space is not fully used for Unicode. - -The lookup of properties for a given code point is done with a trie lookup, -using the UTrie implementation. -The trie lookup result is a 16-bit index in the props32[] table where the -actual 32-bit properties word is stored. This is done to save space. - -(There are thousands of 16-bit entries in the trie data table, but -only a few hundred unique 32-bit properties words. -If the trie data table contained 32-bit words directly, then that would be -larger because the length of the table would be the same as now but the -width would be 32 bits instead of 16. This saves more than 10kB.) - -With a given Unicode code point - - UChar32 c; - -and 0<=c<0x110000, the lookup is done like this: - - uint16_t i; - UTRIE_GET16(c, i); - uint32_t props=p32[i]; - -For some characters, not all of the properties can be efficiently encoded -using 32 bits. For them, the 32-bit word contains an index into the exceptions[] -array: - - if(props&EXCEPTION_BIT)) { - uint16_t e=(uint16_t)(props>>VALUE_SHIFT); - ... - } - -The exception values are a variable number of uint32_t starting at - - const uint32_t *pe=p32+exceptionsIndex+e; - -The first uint32_t there contains flags about what values actually follow it. -Some of the exception values are UChar32 code points for the case mappings, -others are numeric values etc. - -32-bit properties sets: - -Each 32-bit properties word contains: - - 0.. 4 general category - 5 has exception values - 6..10 BiDi category -11 is mirrored -12..14 numericType: - 0 no numeric value - 1 decimal digit value - 2 digit value - 3 numeric value - ### TODO: type 4 for Han digits & numbers?! -15..19 reserved -20..31 value according to bits 0..5: - if(has exception) { - exception index; - } else switch(general category) { - case Ll: delta to uppercase; -- same as titlecase - case Lu: -delta to lowercase; -- titlecase is same as c - case Lt: -delta to lowercase; -- uppercase is same as c - default: - if(is mirrored) { - delta to mirror; - } else if(numericType!=0) { - numericValue; - } else { - 0; - }; - } - -Exception values: - -In the first uint32_t exception word for a code point, -bits -31..16 reserved -15..0 flags that indicate which values follow: - -bit - 0 has uppercase mapping - 1 has lowercase mapping - 2 has titlecase mapping - 3 unused - 4 has numeric value (numerator) - if numericValue=0x7fffff00+x then numericValue=10^x - 5 has denominator value - 6 has a mirror-image Unicode code point - 7 has SpecialCasing.txt entries - 8 has CaseFolding.txt entries - -According to the flags in this word, one or more uint32_t words follow it -in the sequence of the bit flags in the flags word; if a flag is not set, -then the value is missing or 0: - -For the case mappings and the mirror-image Unicode code point, -one uint32_t or UChar32 each is the code point. -If the titlecase mapping is missing, then it is the same as the uppercase mapping. - -For the digit values, bits 31..16 contain the decimal digit value, and -bits 15..0 contain the digit value. A value of -1 indicates that -this value is missing. - -For the numeric/numerator value, an int32_t word contains the value directly, -except for when there is no numerator but a denominator, then the numerator -is implicitly 1. This means: - numerator denominator result - none none none - x none x - none y 1/y - x y x/y - -If the numerator value is 0x7fffff00+x then it is replaced with 10^x. - -For the denominator value, a uint32_t word contains the value directly. - -For special casing mappings, the 32-bit exception word contains: -31 if set, this character has complex, conditional mappings - that are not stored; - otherwise, the mappings are stored according to the following bits -30..24 number of UChars used for mappings -23..16 reserved -15.. 0 UChar offset from the beginning of the UChars array where the - UChars for the special case mappings are stored in the following format: - -Format of special casing UChars: -One UChar value with lengths as follows: -14..10 number of UChars for titlecase mapping - 9.. 5 number of UChars for uppercase mapping - 4.. 0 number of UChars for lowercase mapping - -Followed by the UChars for lowercase, uppercase, titlecase mappings in this order. - -For case folding mappings, the 32-bit exception word contains: -31..24 number of UChars used for the full mapping -23..16 reserved -15.. 0 UChar offset from the beginning of the UChars array where the - UChars for the special case mappings are stored in the following format: - -Format of case folding UChars: -Two UChars contain the simple mapping as follows: - 0, 0 no simple mapping - BMP,0 a simple mapping to a BMP code point - s1, s2 a simple mapping to a supplementary code point stored as two surrogates -This is followed by the UChars for the full case folding mappings. - -Example: -U+2160, ROMAN NUMERAL ONE, needs an exception because it has a lowercase -mapping and a numeric value. -Its exception values would be stored as 3 uint32_t words: - -- flags=0x0a (see above) with combining class 0 -- lowercase mapping 0x2170 -- numeric value=1 - ---- Additional properties (new in format version 2.1) --- - -The second trie for additional properties (AT) is also a UTrie with 16-bit data. -The data words consist of 32-bit unit indexes (not row indexes!) into the -table of unique properties vectors (PV). -Each vector contains a set of properties. -The width of a vector (number of uint32_t per row) may change -with the formatVersion, it is stored in i5. - -Current properties: see icu/source/common/uprops.h - ---- Changes in format version 3.1 --- - -See i10 maxValues above, contains only UBLOCK_COUNT and USCRIPT_CODE_LIMIT. - ---- Changes in format version 3.2 --- - -- The tries use linear Latin-1 ranges. -- The additional properties bits store full properties XYZ instead - of partial Other_XYZ, so that changes in the derivation formulas - need not be tracked in runtime library code. -- Joining Type and Line Break are also stored completely, so that uprops.c - needs no runtime formulas for enumerated properties either. -- Store the case-sensitive flag in the main properties word. -- i10 also contains U_LB_COUNT and U_EA_COUNT. -- i11 contains maxValues2 for vector word 2. - ------------------------------------------------------------------------------ */ - final class UCharacterPropertyReader implements ICUBinary.Authenticate { // public methods ---------------------------------------------------- @@ -315,7 +73,6 @@ final class UCharacterPropertyReader implements ICUBinary.Authenticate * <p>Protected constructor.</p> * @param inputStream ICU uprop.dat file input stream * @exception IOException throw if data file fails authentication - * @draft 2.1 */ protected UCharacterPropertyReader(InputStream inputStream) throws IOException @@ -331,8 +88,7 @@ final class UCharacterPropertyReader implements ICUBinary.Authenticate * <p>Reads uprops.icu, parse it into blocks of data to be stored in * UCharacterProperty.</P * @param ucharppty UCharacterProperty instance - * @exception thrown when data reading fails - * @draft 2.1 + * @exception IOException thrown when data reading fails */ protected void read(UCharacterProperty ucharppty) throws IOException { @@ -362,38 +118,30 @@ final class UCharacterPropertyReader implements ICUBinary.Authenticate // read the trie index block // m_props_index_ in terms of ints - ucharppty.m_trie_ = new CharTrie(m_dataInputStream_, ucharppty); + ucharppty.m_trie_ = new CharTrie(m_dataInputStream_, null); - // reads the 32 bit properties block + // skip the 32 bit properties block int size = m_exceptionOffset_ - m_propertyOffset_; - ucharppty.m_property_ = new int[size]; - for (int i = 0; i < size; i ++) { - ucharppty.m_property_[i] = m_dataInputStream_.readInt(); - } + m_dataInputStream_.skipBytes(size * 4); // reads the 32 bit exceptions block size = m_caseOffset_ - m_exceptionOffset_; - ucharppty.m_exception_ = new int[size]; - for (int i = 0; i < size; i ++) { - ucharppty.m_exception_[i] = m_dataInputStream_.readInt(); - } + m_dataInputStream_.skipBytes(size * 4); // reads the 32 bit case block size = (m_additionalOffset_ - m_caseOffset_) << 1; - ucharppty.m_case_ = new char[size]; - for (int i = 0; i < size; i ++) { - ucharppty.m_case_[i] = m_dataInputStream_.readChar(); - } + m_dataInputStream_.skipBytes(size * 2); - // reads the additional property block - ucharppty.m_additionalTrie_ = new CharTrie(m_dataInputStream_, - ucharppty); + if(m_additionalColumnsCount_ > 0) { + // reads the additional property block + ucharppty.m_additionalTrie_ = new CharTrie(m_dataInputStream_, null); - // additional properties - size = m_reservedOffset_ - m_additionalVectorsOffset_; - ucharppty.m_additionalVectors_ = new int[size]; - for (int i = 0; i < size; i ++) { - ucharppty.m_additionalVectors_[i] = m_dataInputStream_.readInt(); + // additional properties + size = m_reservedOffset_ - m_additionalVectorsOffset_; + ucharppty.m_additionalVectors_ = new int[size]; + for (int i = 0; i < size; i ++) { + ucharppty.m_additionalVectors_[i] = m_dataInputStream_.readInt(); + } } m_dataInputStream_.close(); @@ -428,12 +176,15 @@ final class UCharacterPropertyReader implements ICUBinary.Authenticate private byte m_unicodeVersion_[]; /** - * File format version that this class understands. - * No guarantees are made if a older version is used + * Data format "UPro". */ private static final byte DATA_FORMAT_ID_[] = {(byte)0x55, (byte)0x50, (byte)0x72, (byte)0x6F}; - private static final byte DATA_FORMAT_VERSION_[] = {(byte)0x3, (byte)0x1, + /** + * Format version; this code works with all versions with the same major + * version number and the same Trie bit distribution. + */ + private static final byte DATA_FORMAT_VERSION_[] = {(byte)0x5, (byte)0, (byte)Trie.INDEX_STAGE_1_SHIFT_, (byte)Trie.INDEX_STAGE_2_SHIFT_}; } diff --git a/jdk/src/share/classes/sun/text/normalizer/UProperty.java b/jdk/src/share/classes/sun/text/normalizer/UProperty.java deleted file mode 100644 index 3b8c097f43a..00000000000 --- a/jdk/src/share/classes/sun/text/normalizer/UProperty.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Portions Copyright 2005 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. - */ - -/* - ******************************************************************************* - * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved * - * * - * The original version of this source code and documentation is copyrighted * - * and owned by IBM, These materials are provided under terms of a License * - * Agreement between IBM and Sun. This technology is protected by multiple * - * US and International patents. This notice and attribution to IBM may not * - * to removed. * - ******************************************************************************* - */ - -package sun.text.normalizer; - -/** - * <p>Selection constants for Unicode properties. </p> - * <p>These constants are used in functions like - * UCharacter.hasBinaryProperty(int) to select one of the Unicode properties. - * </p> - * <p>The properties APIs are intended to reflect Unicode properties as - * defined in the Unicode Character Database (UCD) and Unicode Technical - * Reports (UTR).</p> - * <p>For details about the properties see <a href=http://www.unicode.org> - * http://www.unicode.org</a>.</p> - * <p>For names of Unicode properties see the UCD file PropertyAliases.txt. - * </p> - * <p>Important: If ICU is built with UCD files from Unicode versions below - * 3.2, then properties marked with "new" are not or not fully - * available. Check UCharacter.getUnicodeVersion() to be sure.</p> - * @author Syn Wee Quek - * @stable ICU 2.6 - * @see com.ibm.icu.lang.UCharacter - */ -public interface UProperty -{ - // public data member -------------------------------------------------- - - /** - * Enumerated property Hangul_Syllable_Type, new in Unicode 4. - * Returns HangulSyllableType values. - * @stable ICU 2.6 - */ - public static final int HANGUL_SYLLABLE_TYPE = 0x100B; - - /** - * Bitmask property General_Category_Mask. - * This is the General_Category property returned as a bit mask. - * When used in UCharacter.getIntPropertyValue(c), - * returns bit masks for UCharacterCategory values where exactly one bit is set. - * When used with UCharacter.getPropertyValueName() and UCharacter.getPropertyValueEnum(), - * a multi-bit mask is used for sets of categories like "Letters". - * @stable ICU 2.4 - */ - public static final int GENERAL_CATEGORY_MASK = 0x2000; -} diff --git a/jdk/src/share/classes/sun/text/normalizer/UTF16.java b/jdk/src/share/classes/sun/text/normalizer/UTF16.java index 3b872a6063f..2aa7c6d3571 100644 --- a/jdk/src/share/classes/sun/text/normalizer/UTF16.java +++ b/jdk/src/share/classes/sun/text/normalizer/UTF16.java @@ -1,5 +1,5 @@ /* - * Portions Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2005-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 @@ -22,10 +22,9 @@ * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ - /* ******************************************************************************* - * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved * + * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved * * * * The original version of this source code and documentation is copyrighted * * and owned by IBM, These materials are provided under terms of a License * @@ -184,15 +183,16 @@ public final class UTF16 * bounds. * @stable ICU 2.1 */ - public static int charAt(String source, int offset16) - { - if (offset16 < 0 || offset16 >= source.length()) { - throw new StringIndexOutOfBoundsException(offset16); - } - + public static int charAt(String source, int offset16) { char single = source.charAt(offset16); - if (single < LEAD_SURROGATE_MIN_VALUE || - single > TRAIL_SURROGATE_MAX_VALUE) { + if (single < LEAD_SURROGATE_MIN_VALUE) { + return single; + } + return _charAt(source, offset16, single); + } + + private static int _charAt(String source, int offset16, char single) { + if (single > TRAIL_SURROGATE_MAX_VALUE) { return single; } @@ -201,29 +201,23 @@ public final class UTF16 // low, look both directions. if (single <= LEAD_SURROGATE_MAX_VALUE) { - ++ offset16; + ++offset16; if (source.length() != offset16) { char trail = source.charAt(offset16); - if (trail >= TRAIL_SURROGATE_MIN_VALUE && - trail <= TRAIL_SURROGATE_MAX_VALUE) { - return UCharacterProperty.getRawSupplementary(single, - trail); + if (trail >= TRAIL_SURROGATE_MIN_VALUE && trail <= TRAIL_SURROGATE_MAX_VALUE) { + return UCharacterProperty.getRawSupplementary(single, trail); + } + } + } else { + --offset16; + if (offset16 >= 0) { + // single is a trail surrogate so + char lead = source.charAt(offset16); + if (lead >= LEAD_SURROGATE_MIN_VALUE && lead <= LEAD_SURROGATE_MAX_VALUE) { + return UCharacterProperty.getRawSupplementary(lead, single); } } } - else - { - -- offset16; - if (offset16 >= 0) { - // single is a trail surrogate so - char lead = source.charAt(offset16); - if (lead >= LEAD_SURROGATE_MIN_VALUE && - lead <= LEAD_SURROGATE_MAX_VALUE) { - return UCharacterProperty.getRawSupplementary(lead, - single); - } - } - } return single; // return unmatched surrogate } diff --git a/jdk/src/share/classes/sun/text/normalizer/UnicodeSet.java b/jdk/src/share/classes/sun/text/normalizer/UnicodeSet.java index eaffb7c8b44..21ab0c883de 100644 --- a/jdk/src/share/classes/sun/text/normalizer/UnicodeSet.java +++ b/jdk/src/share/classes/sun/text/normalizer/UnicodeSet.java @@ -1,5 +1,5 @@ /* - * Portions Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2005-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 @@ -22,10 +22,9 @@ * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ - /* ******************************************************************************* - * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved * + * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved * * * * The original version of this source code and documentation is copyrighted * * and owned by IBM, These materials are provided under terms of a License * @@ -38,11 +37,8 @@ package sun.text.normalizer; import java.text.ParsePosition; -import java.util.Map; -import java.util.HashMap; -import java.util.TreeSet; import java.util.Iterator; -import java.util.Collection; +import java.util.TreeSet; /** * A mutable set of Unicode characters and multicharacter strings. Objects of this class @@ -130,8 +126,8 @@ import java.util.Collection; * "[:Lu:]" and the Perl-like syntax "\p{Lu}" are recognized. For a * complete list of supported property patterns, see the User's Guide * for UnicodeSet at - * <a href="http://oss.software.ibm.com/icu/userguide/unicodeSet.html"> - * http://oss.software.ibm.com/icu/userguide/unicodeSet.html</a>. + * <a href="http://www.icu-project.org/userguide/unicodeSet.html"> + * http://www.icu-project.org/userguide/unicodeSet.html</a>. * Actual determination of property data is defined by the underlying * Unicode database as implemented by UCharacter. * @@ -271,9 +267,11 @@ import java.util.Collection; * </tr> * </table> * </blockquote> + * <p>To iterate over contents of UnicodeSet, use UnicodeSetIterator class. * * @author Alan Liu * @stable ICU 2.0 + * @see UnicodeSetIterator */ public class UnicodeSet implements UnicodeMatcher { @@ -322,7 +320,7 @@ public class UnicodeSet implements UnicodeMatcher { * properties are all exactly alike, e.g. CJK Ideographs from * U+4E00 to U+9FA5. */ - private static UnicodeSet INCLUSIONS = null; + private static UnicodeSet INCLUSIONS[] = null; //---------------------------------------------------------------- // Public API @@ -471,17 +469,18 @@ public class UnicodeSet implements UnicodeMatcher { return result; } - return _generatePattern(result, escapeUnprintable); + return _generatePattern(result, escapeUnprintable, true); } /** * Generate and append a string representation of this set to result. * This does not use this.pat, the cleaned up copy of the string * passed to applyPattern(). - * @stable ICU 2.0 + * @param includeStrings if false, doesn't include the strings. + * @stable ICU 3.8 */ public StringBuffer _generatePattern(StringBuffer result, - boolean escapeUnprintable) { + boolean escapeUnprintable, boolean includeStrings) { result.append('['); int count = getRangeCount(); @@ -524,7 +523,7 @@ public class UnicodeSet implements UnicodeMatcher { } } - if (strings.size() > 0) { + if (includeStrings && strings.size() > 0) { Iterator it = strings.iterator(); while (it.hasNext()) { result.append('{'); @@ -535,19 +534,8 @@ public class UnicodeSet implements UnicodeMatcher { return result.append(']'); } - /** - * Adds the specified range to this set if it is not already - * present. If this set already contains the specified range, - * the call leaves this set unchanged. If <code>end > start</code> - * then an empty range is added, leaving the set unchanged. - * - * @param start first character, inclusive, of range to be added - * to this set. - * @param end last character, inclusive, of range to be added - * to this set. - * @stable ICU 2.0 - */ - public UnicodeSet add(int start, int end) { + // for internal use, after checkFrozen has been called + private UnicodeSet add_unchecked(int start, int end) { if (start < MIN_VALUE || start > MAX_VALUE) { throw new IllegalArgumentException("Invalid code point U+" + Utility.hex(start, 6)); } @@ -569,6 +557,11 @@ public class UnicodeSet implements UnicodeMatcher { * @stable ICU 2.0 */ public final UnicodeSet add(int c) { + return add_unchecked(c); + } + + // for internal use only, after checkFrozen has been called + private final UnicodeSet add_unchecked(int c) { if (c < MIN_VALUE || c > MAX_VALUE) { throw new IllegalArgumentException("Invalid code point U+" + Utility.hex(c, 6)); } @@ -663,13 +656,12 @@ public class UnicodeSet implements UnicodeMatcher { * @stable ICU 2.0 */ public final UnicodeSet add(String s) { - int cp = getSingleCP(s); if (cp < 0) { strings.add(s); pat = null; } else { - add(cp, cp); + add_unchecked(cp, cp); } return this; } @@ -981,7 +973,6 @@ public class UnicodeSet implements UnicodeMatcher { */ void applyPattern(RuleCharacterIterator chars, SymbolTable symbols, StringBuffer rebuiltPat, int options) { - // Syntax characters: [ ] ^ - & { } // Recognized special forms for chars, sets: c-c s-s s&s @@ -992,7 +983,7 @@ public class UnicodeSet implements UnicodeMatcher { opts |= RuleCharacterIterator.SKIP_WHITESPACE; } - StringBuffer pat = new StringBuffer(), buf = null; + StringBuffer patBuf = new StringBuffer(), buf = null; boolean usePat = false; UnicodeSet scratch = null; Object backup = null; @@ -1049,13 +1040,13 @@ public class UnicodeSet implements UnicodeMatcher { } else { // Handle opening '[' delimiter mode = 1; - pat.append('['); + patBuf.append('['); backup = chars.getPos(backup); // prepare to backup c = chars.next(opts); literal = chars.isEscaped(); if (c == '^' && !literal) { invert = true; - pat.append('^'); + patBuf.append('^'); backup = chars.getPos(backup); // prepare to backup c = chars.next(opts); literal = chars.isEscaped(); @@ -1093,13 +1084,13 @@ public class UnicodeSet implements UnicodeMatcher { if (op != 0) { syntaxError(chars, "Char expected after operator"); } - add(lastChar, lastChar); - _appendToPat(pat, lastChar, false); + add_unchecked(lastChar, lastChar); + _appendToPat(patBuf, lastChar, false); lastItem = op = 0; } if (op == '-' || op == '&') { - pat.append(op); + patBuf.append(op); } if (nested == null) { @@ -1108,14 +1099,14 @@ public class UnicodeSet implements UnicodeMatcher { } switch (setMode) { case 1: - nested.applyPattern(chars, symbols, pat, options); + nested.applyPattern(chars, symbols, patBuf, options); break; case 2: chars.skipIgnored(opts); - nested.applyPropertyPattern(chars, pat, symbols); + nested.applyPropertyPattern(chars, patBuf, symbols); break; case 3: // `nested' already parsed - nested._toPattern(pat, false); + nested._toPattern(patBuf, false); break; } @@ -1158,17 +1149,17 @@ public class UnicodeSet implements UnicodeMatcher { switch (c) { case ']': if (lastItem == 1) { - add(lastChar, lastChar); - _appendToPat(pat, lastChar, false); + add_unchecked(lastChar, lastChar); + _appendToPat(patBuf, lastChar, false); } // Treat final trailing '-' as a literal if (op == '-') { - add(op, op); - pat.append(op); + add_unchecked(op, op); + patBuf.append(op); } else if (op == '&') { syntaxError(chars, "Trailing '&'"); } - pat.append(']'); + patBuf.append(']'); mode = 2; continue; case '-': @@ -1178,11 +1169,11 @@ public class UnicodeSet implements UnicodeMatcher { continue; } else { // Treat final trailing '-' as a literal - add(c, c); + add_unchecked(c, c); c = chars.next(opts); literal = chars.isEscaped(); if (c == ']' && !literal) { - pat.append("-]"); + patBuf.append("-]"); mode = 2; continue; } @@ -1202,8 +1193,8 @@ public class UnicodeSet implements UnicodeMatcher { syntaxError(chars, "Missing operand after operator"); } if (lastItem == 1) { - add(lastChar, lastChar); - _appendToPat(pat, lastChar, false); + add_unchecked(lastChar, lastChar); + _appendToPat(patBuf, lastChar, false); } lastItem = 0; if (buf == null) { @@ -1228,9 +1219,9 @@ public class UnicodeSet implements UnicodeMatcher { // we don't need to drop through to the further // processing add(buf.toString()); - pat.append('{'); - _appendToPat(pat, buf.toString(), false); - pat.append('}'); + patBuf.append('{'); + _appendToPat(patBuf, buf.toString(), false); + patBuf.append('}'); continue; case SymbolTable.SYMBOL_REF: // symbols nosymbols @@ -1250,12 +1241,12 @@ public class UnicodeSet implements UnicodeMatcher { } if (anchor && op == 0) { if (lastItem == 1) { - add(lastChar, lastChar); - _appendToPat(pat, lastChar, false); + add_unchecked(lastChar, lastChar); + _appendToPat(patBuf, lastChar, false); } - add(UnicodeMatcher.ETHER); + add_unchecked(UnicodeMatcher.ETHER); usePat = true; - pat.append(SymbolTable.SYMBOL_REF).append(']'); + patBuf.append(SymbolTable.SYMBOL_REF).append(']'); mode = 2; continue; } @@ -1281,14 +1272,14 @@ public class UnicodeSet implements UnicodeMatcher { // these are most likely typos. syntaxError(chars, "Invalid range"); } - add(lastChar, c); - _appendToPat(pat, lastChar, false); - pat.append(op); - _appendToPat(pat, c, false); + add_unchecked(lastChar, c); + _appendToPat(patBuf, lastChar, false); + patBuf.append(op); + _appendToPat(patBuf, c, false); lastItem = op = 0; } else { - add(lastChar, lastChar); - _appendToPat(pat, lastChar, false); + add_unchecked(lastChar, lastChar); + _appendToPat(patBuf, lastChar, false); lastChar = c; } break; @@ -1315,9 +1306,9 @@ public class UnicodeSet implements UnicodeMatcher { // Use the rebuilt pattern (pat) only if necessary. Prefer the // generated pattern. if (usePat) { - rebuiltPat.append(pat.toString()); + rebuiltPat.append(patBuf.toString()); } else { - _generatePattern(rebuiltPat, false); + _generatePattern(rebuiltPat, false, true); } } @@ -1590,7 +1581,9 @@ public class UnicodeSet implements UnicodeMatcher { private static class VersionFilter implements Filter { VersionInfo version; + VersionFilter(VersionInfo version) { this.version = version; } + public boolean contains(int ch) { VersionInfo v = UCharacter.getAge(ch); // Reference comparison ok; VersionInfo caches and reuses @@ -1600,18 +1593,28 @@ public class UnicodeSet implements UnicodeMatcher { } } - private static synchronized UnicodeSet getInclusions() { + private static synchronized UnicodeSet getInclusions(int src) { if (INCLUSIONS == null) { - UCharacterProperty property = UCharacterProperty.getInstance(); - INCLUSIONS = property.getInclusions(); + INCLUSIONS = new UnicodeSet[UCharacterProperty.SRC_COUNT]; } - return INCLUSIONS; + if(INCLUSIONS[src] == null) { + UnicodeSet incl = new UnicodeSet(); + switch(src) { + case UCharacterProperty.SRC_PROPSVEC: + UCharacterProperty.getInstance().upropsvec_addPropertyStarts(incl); + break; + default: + throw new IllegalStateException("UnicodeSet.getInclusions(unknown src "+src+")"); + } + INCLUSIONS[src] = incl; + } + return INCLUSIONS[src]; } /** * Generic filter-based scanning code for UCD property UnicodeSets. */ - private UnicodeSet applyFilter(Filter filter) { + private UnicodeSet applyFilter(Filter filter, int src) { // Walk through all Unicode characters, noting the start // and end of each range for which filter.contain(c) is // true. Add each range to a set. @@ -1629,7 +1632,7 @@ public class UnicodeSet implements UnicodeMatcher { clear(); int startHasProperty = -1; - UnicodeSet inclusions = getInclusions(); + UnicodeSet inclusions = getInclusions(src); int limitRange = inclusions.getRangeCount(); for (int j=0; j<limitRange; ++j) { @@ -1646,19 +1649,18 @@ public class UnicodeSet implements UnicodeMatcher { startHasProperty = ch; } } else if (startHasProperty >= 0) { - add(startHasProperty, ch-1); + add_unchecked(startHasProperty, ch-1); startHasProperty = -1; } } } if (startHasProperty >= 0) { - add(startHasProperty, 0x10FFFF); + add_unchecked(startHasProperty, 0x10FFFF); } return this; } - /** * Remove leading and trailing rule white space and compress * internal rule white space to a single space character. @@ -1686,10 +1688,6 @@ public class UnicodeSet implements UnicodeMatcher { return buf.toString(); } - //---------------------------------------------------------------- - // Property set API - //---------------------------------------------------------------- - /** * Modifies this set to contain those code points which have the * given value for the given property. Prior contents of this @@ -1699,22 +1697,21 @@ public class UnicodeSet implements UnicodeMatcher { * @param symbols if not null, then symbols are first called to see if a property * is available. If true, then everything else is skipped. * @return this set - * @draft ICU 3.2 - * @deprecated This is a draft API and might change in a future release of ICU. + * @stable ICU 3.2 */ public UnicodeSet applyPropertyAlias(String propertyAlias, String valueAlias, SymbolTable symbols) { - if (propertyAlias.equals("Age")) - { - // Must munge name, since - // VersionInfo.getInstance() does not do - // 'loose' matching. - VersionInfo version = VersionInfo.getInstance(mungeCharName(valueAlias)); - applyFilter(new VersionFilter(version)); - return this; - } - else - throw new IllegalArgumentException("Unsupported property"); + if (valueAlias.length() > 0) { + if (propertyAlias.equals("Age")) { + // Must munge name, since + // VersionInfo.getInstance() does not do + // 'loose' matching. + VersionInfo version = VersionInfo.getInstance(mungeCharName(valueAlias)); + applyFilter(new VersionFilter(version), UCharacterProperty.SRC_PROPSVEC); + return this; + } + } + throw new IllegalArgumentException("Unsupported property: " + propertyAlias); } /** @@ -1840,14 +1837,14 @@ public class UnicodeSet implements UnicodeMatcher { */ private void applyPropertyPattern(RuleCharacterIterator chars, StringBuffer rebuiltPat, SymbolTable symbols) { - String pat = chars.lookahead(); + String patStr = chars.lookahead(); ParsePosition pos = new ParsePosition(0); - applyPropertyPattern(pat, pos, symbols); + applyPropertyPattern(patStr, pos, symbols); if (pos.getIndex() == 0) { syntaxError(chars, "Invalid property pattern"); } chars.jumpahead(pos.getIndex()); - rebuiltPat.append(pat.substring(0, pos.getIndex())); + rebuiltPat.append(patStr.substring(0, pos.getIndex())); } //---------------------------------------------------------------- @@ -1860,8 +1857,9 @@ public class UnicodeSet implements UnicodeMatcher { * which UCharacterProperty.isRuleWhiteSpace() returns true, * unless they are quoted or escaped. This may be ORed together * with other selectors. - * @internal + * @stable ICU 3.8 */ public static final int IGNORE_SPACE = 1; } + diff --git a/jdk/src/share/classes/sun/text/normalizer/UnicodeSetIterator.java b/jdk/src/share/classes/sun/text/normalizer/UnicodeSetIterator.java index 4d558da18dd..0d8ffe84f2d 100644 --- a/jdk/src/share/classes/sun/text/normalizer/UnicodeSetIterator.java +++ b/jdk/src/share/classes/sun/text/normalizer/UnicodeSetIterator.java @@ -1,5 +1,5 @@ /* - * Portions Copyright 2005 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2005-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 @@ -22,10 +22,9 @@ * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ - /* ******************************************************************************* - * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved * + * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved * * * * The original version of this source code and documentation is copyrighted * * and owned by IBM, These materials are provided under terms of a License * @@ -167,8 +166,8 @@ public class UnicodeSetIterator { * @param set the set to iterate over. * @stable ICU 2.0 */ - public void reset(UnicodeSet set) { - this.set = set; + public void reset(UnicodeSet uset) { + set = uset; reset(); } @@ -213,8 +212,8 @@ public class UnicodeSetIterator { /** * @internal */ - protected void loadRange(int range) { - nextElement = set.getRangeStart(range); - endElement = set.getRangeEnd(range); + protected void loadRange(int aRange) { + nextElement = set.getRangeStart(aRange); + endElement = set.getRangeEnd(aRange); } } diff --git a/jdk/src/share/classes/sun/text/normalizer/Utility.java b/jdk/src/share/classes/sun/text/normalizer/Utility.java index 895097f13d2..7d8b33b9d59 100644 --- a/jdk/src/share/classes/sun/text/normalizer/Utility.java +++ b/jdk/src/share/classes/sun/text/normalizer/Utility.java @@ -1,5 +1,5 @@ /* - * Portions Copyright 2005 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2005-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 @@ -24,7 +24,7 @@ */ /* ******************************************************************************* - * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved * + * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved * * * * The original version of this source code and documentation is copyrighted * * and owned by IBM, These materials are provided under terms of a License * @@ -36,10 +36,27 @@ package sun.text.normalizer; -// This class contains utility functions so testing not needed -///CLOVER:OFF public final class Utility { + /** + * Convenience utility to compare two Object[]s + * Ought to be in System. + * @param len the length to compare. + * The start indices and start+len must be valid. + */ + public final static boolean arrayRegionMatches(char[] source, int sourceStart, + char[] target, int targetStart, + int len) + { + int sourceEnd = sourceStart + len; + int delta = targetStart - sourceStart; + for (int i = sourceStart; i < sourceEnd; i++) { + if (source[i]!=target[i + delta]) + return false; + } + return true; + } + /** * Convert characters outside the range U+0020 to U+007F to * Unicode escapes, and convert backslash to a double backslash. @@ -344,7 +361,6 @@ public final class Utility { return false; } - //// for StringPrep /** * Similar to StringBuffer.getChars, version 1.3. * Since JDK 1.2 implements StringBuffer.getChars differently, this method @@ -356,7 +372,6 @@ public final class Utility { * @param dst char array to store the retrieved chars * @param dstBegin offset to the start of the destination char array to * store the retrieved chars - * @draft since ICU4J 2.0 */ public static void getChars(StringBuffer src, int srcBegin, int srcEnd, char dst[], int dstBegin) @@ -367,23 +382,4 @@ public final class Utility { src.getChars(srcBegin, srcEnd, dst, dstBegin); } - /** - * Convenience utility to compare two char[]s. - * @param len the length to compare. - * The start indices and start+len must be valid. - */ - public final static boolean arrayRegionMatches(char[] source, int sourceStart, - char[] target, int targetStart, - int len) - { - int sourceEnd = sourceStart + len; - int delta = targetStart - sourceStart; - for (int i = sourceStart; i < sourceEnd; i++) { - if (source[i] != target[i + delta]) - return false; - } - return true; - } - } -///CLOVER:ON diff --git a/jdk/src/share/classes/sun/text/normalizer/VersionInfo.java b/jdk/src/share/classes/sun/text/normalizer/VersionInfo.java index e1a0d92ddb5..2b0f7c7918b 100644 --- a/jdk/src/share/classes/sun/text/normalizer/VersionInfo.java +++ b/jdk/src/share/classes/sun/text/normalizer/VersionInfo.java @@ -1,5 +1,5 @@ /* - * Portions Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2005-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 @@ -24,7 +24,7 @@ */ /* ******************************************************************************* - * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved * + * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved * * * * The original version of this source code and documentation is copyrighted * * and owned by IBM, These materials are provided under terms of a License * diff --git a/jdk/src/share/classes/sun/text/resources/ubidi.icu b/jdk/src/share/classes/sun/text/resources/ubidi.icu new file mode 100644 index 0000000000000000000000000000000000000000..e4a2d8194077ab61854c6137d99294cca071a401 GIT binary patch literal 17248 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 RA@shDkMG{y7#$sC?7s;i5v%|J literal 0 HcmV?d00001 diff --git a/jdk/src/share/classes/sun/text/resources/unorm.icu b/jdk/src/share/classes/sun/text/resources/unorm.icu index 5d56aa22fc2d496f555fa7ccab2c4d42b3363972..96560e6dcfbe398ac577a9017acf6359017d6138 100644 GIT binary patch delta 43073 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 delta 42033 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 diff --git a/jdk/src/share/classes/sun/text/resources/uprops.icu b/jdk/src/share/classes/sun/text/resources/uprops.icu index 610ad5abee0bb4f0d30b18adb3c4591f473a0c80..0140aa29928e3a10a42fbf93dc8a46c2d708852a 100644 GIT binary patch literal 81008 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 G`TT#RMOkV9 literal 76176 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ⅈf^+C4vw)J-HgKY0@--p&^&->Co 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 U+Z<!#cecWINj*N>>Fxag0m*ibc>n+a diff --git a/jdk/test/java/lang/String/ToLowerCase.java b/jdk/test/java/lang/String/ToLowerCase.java index 84d5d5af208..5d43b45ee06 100644 --- a/jdk/test/java/lang/String/ToLowerCase.java +++ b/jdk/test/java/lang/String/ToLowerCase.java @@ -72,7 +72,7 @@ public class ToLowerCase { // I-dot tests (Turkish and Azeri) test("\u0130", turkish, "i"); test("\u0130", az, "i"); - test("\u0130", Locale.US, "i"); + test("\u0130", Locale.US, "i\u0307"); // Remove dot_above in the sequence I + dot_above (Turkish and Azeri) test("I\u0307", turkish, "i"); From 23d8c5ddc1154207f5fbb1a00d23c76ace2443bd Mon Sep 17 00:00:00 2001 From: Weijun Wang <weijun@openjdk.org> Date: Fri, 10 Apr 2009 11:21:31 +0800 Subject: [PATCH 274/292] 6587676: Krb5LoginModule failure if useTicketCache=true on Vista Reviewed-by: valeriep --- .../native/sun/security/krb5/NativeCreds.c | 258 ++++++++++-------- 1 file changed, 149 insertions(+), 109 deletions(-) diff --git a/jdk/src/windows/native/sun/security/krb5/NativeCreds.c b/jdk/src/windows/native/sun/security/krb5/NativeCreds.c index e112b86e9c3..968ff119153 100644 --- a/jdk/src/windows/native/sun/security/krb5/NativeCreds.c +++ b/jdk/src/windows/native/sun/security/krb5/NativeCreds.c @@ -73,6 +73,7 @@ jmethodID setRealmMethod = 0; * Function prototypes for internal routines * */ +BOOL DEBUG = 0; BOOL PackageConnectLookup(PHANDLE,PULONG); @@ -113,208 +114,221 @@ JNIEXPORT jint JNICALL JNI_OnLoad( jclass cls; JNIEnv *env; + jfieldID fldDEBUG; if ((*jvm)->GetEnv(jvm, (void **)&env, JNI_VERSION_1_2)) { return JNI_EVERSION; /* JNI version not supported */ } + cls = (*env)->FindClass(env,"sun/security/krb5/internal/Krb5"); + if (cls == NULL) { + printf("LSA: Couldn't find Krb5\n"); + return JNI_ERR; + } + fldDEBUG = (*env)->GetStaticFieldID(env, cls, "DEBUG", "Z"); + if (fldDEBUG == NULL) { + printf("LSA: Krb5 has no DEBUG field\n"); + return JNI_ERR; + } + DEBUG = (*env)->GetStaticBooleanField(env, cls, fldDEBUG); + cls = (*env)->FindClass(env,"sun/security/krb5/internal/Ticket"); if (cls == NULL) { - printf("Couldn't find Ticket\n"); + printf("LSA: Couldn't find Ticket\n"); return JNI_ERR; } - #ifdef DEBUG - printf("Found Ticket\n"); - #endif /* DEBUG */ + if (DEBUG) { + printf("LSA: Found Ticket\n"); + } /* DEBUG */ ticketClass = (*env)->NewWeakGlobalRef(env,cls); if (ticketClass == NULL) { return JNI_ERR; } - #ifdef DEBUG - printf("Made NewWeakGlobalRef\n"); - #endif /* DEBUG */ + if (DEBUG) { + printf("LSA: Made NewWeakGlobalRef\n"); + } /* DEBUG */ cls = (*env)->FindClass(env, "sun/security/krb5/PrincipalName"); if (cls == NULL) { - printf("Couldn't find PrincipalName\n"); + printf("LSA: Couldn't find PrincipalName\n"); return JNI_ERR; } - #ifdef DEBUG - printf("Found PrincipalName\n"); - #endif /* DEBUG */ + if (DEBUG) { + printf("LSA: Found PrincipalName\n"); + } /* DEBUG */ principalNameClass = (*env)->NewWeakGlobalRef(env,cls); if (principalNameClass == NULL) { return JNI_ERR; } - #ifdef DEBUG - printf("Made NewWeakGlobalRef\n"); - #endif /* DEBUG */ + if (DEBUG) { + printf("LSA: Made NewWeakGlobalRef\n"); + } /* DEBUG */ cls = (*env)->FindClass(env,"sun/security/util/DerValue"); if (cls == NULL) { - printf("Couldn't find DerValue\n"); + printf("LSA: Couldn't find DerValue\n"); return JNI_ERR; } - #ifdef DEBUG - printf("Found DerValue\n"); - #endif /* DEBUG */ + if (DEBUG) { + printf("LSA: Found DerValue\n"); + } /* DEBUG */ derValueClass = (*env)->NewWeakGlobalRef(env,cls); if (derValueClass == NULL) { return JNI_ERR; } - #ifdef DEBUG - printf("Made NewWeakGlobalRef\n"); - #endif /* DEBUG */ + if (DEBUG) { + printf("LSA: Made NewWeakGlobalRef\n"); + } /* DEBUG */ cls = (*env)->FindClass(env,"sun/security/krb5/EncryptionKey"); if (cls == NULL) { - printf("Couldn't find EncryptionKey\n"); + printf("LSA: Couldn't find EncryptionKey\n"); return JNI_ERR; } - #ifdef DEBUG - printf("Found EncryptionKey\n"); - #endif /* DEBUG */ + if (DEBUG) { + printf("LSA: Found EncryptionKey\n"); + } /* DEBUG */ encryptionKeyClass = (*env)->NewWeakGlobalRef(env,cls); if (encryptionKeyClass == NULL) { return JNI_ERR; } - #ifdef DEBUG - printf("Made NewWeakGlobalRef\n"); - #endif /* DEBUG */ + if (DEBUG) { + printf("LSA: Made NewWeakGlobalRef\n"); + } /* DEBUG */ cls = (*env)->FindClass(env,"sun/security/krb5/internal/TicketFlags"); if (cls == NULL) { - printf("Couldn't find TicketFlags\n"); + printf("LSA: Couldn't find TicketFlags\n"); return JNI_ERR; } - #ifdef DEBUG - printf("Found TicketFlags\n"); - #endif /* DEBUG */ + if (DEBUG) { + printf("LSA: Found TicketFlags\n"); + } /* DEBUG */ ticketFlagsClass = (*env)->NewWeakGlobalRef(env,cls); if (ticketFlagsClass == NULL) { return JNI_ERR; } - #ifdef DEBUG - printf("Made NewWeakGlobalRef\n"); - #endif /* DEBUG */ + if (DEBUG) { + printf("LSA: Made NewWeakGlobalRef\n"); + } /* DEBUG */ cls = (*env)->FindClass(env,"sun/security/krb5/internal/KerberosTime"); if (cls == NULL) { - printf("Couldn't find KerberosTime\n"); + printf("LSA: Couldn't find KerberosTime\n"); return JNI_ERR; } - #ifdef DEBUG - printf("Found KerberosTime\n"); - #endif /* DEBUG */ + if (DEBUG) { + printf("LSA: Found KerberosTime\n"); + } /* DEBUG */ kerberosTimeClass = (*env)->NewWeakGlobalRef(env,cls); if (kerberosTimeClass == NULL) { return JNI_ERR; } - #ifdef DEBUG - printf("Made NewWeakGlobalRef\n"); - #endif /* DEBUG */ + if (DEBUG) { + printf("LSA: Made NewWeakGlobalRef\n"); + } /* DEBUG */ cls = (*env)->FindClass(env,"java/lang/String"); if (cls == NULL) { - printf("Couldn't find String\n"); + printf("LSA: Couldn't find String\n"); return JNI_ERR; } - #ifdef DEBUG - printf("Found String\n"); - #endif /* DEBUG */ + if (DEBUG) { + printf("LSA: Found String\n"); + } /* DEBUG */ javaLangStringClass = (*env)->NewWeakGlobalRef(env,cls); if (javaLangStringClass == NULL) { return JNI_ERR; } - #ifdef DEBUG - printf("Made NewWeakGlobalRef\n"); - #endif /* DEBUG */ + if (DEBUG) { + printf("LSA: Made NewWeakGlobalRef\n"); + } /* DEBUG */ derValueConstructor = (*env)->GetMethodID(env, derValueClass, "<init>", "([B)V"); if (derValueConstructor == 0) { - printf("Couldn't find DerValue constructor\n"); + printf("LSA: Couldn't find DerValue constructor\n"); return JNI_ERR; } - #ifdef DEBUG - printf("Found DerValue constructor\n"); - #endif /* DEBUG */ + if (DEBUG) { + printf("LSA: Found DerValue constructor\n"); + } /* DEBUG */ ticketConstructor = (*env)->GetMethodID(env, ticketClass, "<init>", "(Lsun/security/util/DerValue;)V"); if (ticketConstructor == 0) { - printf("Couldn't find Ticket constructor\n"); + printf("LSA: Couldn't find Ticket constructor\n"); return JNI_ERR; } - #ifdef DEBUG - printf("Found Ticket constructor\n"); - #endif /* DEBUG */ + if (DEBUG) { + printf("LSA: Found Ticket constructor\n"); + } /* DEBUG */ principalNameConstructor = (*env)->GetMethodID(env, principalNameClass, "<init>", "([Ljava/lang/String;)V"); if (principalNameConstructor == 0) { - printf("Couldn't find PrincipalName constructor\n"); + printf("LSA: Couldn't find PrincipalName constructor\n"); return JNI_ERR; } - #ifdef DEBUG - printf("Found PrincipalName constructor\n"); - #endif /* DEBUG */ + if (DEBUG) { + printf("LSA: Found PrincipalName constructor\n"); + } /* DEBUG */ encryptionKeyConstructor = (*env)->GetMethodID(env, encryptionKeyClass, "<init>", "(I[B)V"); if (encryptionKeyConstructor == 0) { - printf("Couldn't find EncryptionKey constructor\n"); + printf("LSA: Couldn't find EncryptionKey constructor\n"); return JNI_ERR; } - #ifdef DEBUG - printf("Found EncryptionKey constructor\n"); - #endif /* DEBUG */ + if (DEBUG) { + printf("LSA: Found EncryptionKey constructor\n"); + } /* DEBUG */ ticketFlagsConstructor = (*env)->GetMethodID(env, ticketFlagsClass, "<init>", "(I[B)V"); if (ticketFlagsConstructor == 0) { - printf("Couldn't find TicketFlags constructor\n"); + printf("LSA: Couldn't find TicketFlags constructor\n"); return JNI_ERR; } - #ifdef DEBUG - printf("Found TicketFlags constructor\n"); - #endif /* DEBUG */ + if (DEBUG) { + printf("LSA: Found TicketFlags constructor\n"); + } /* DEBUG */ kerberosTimeConstructor = (*env)->GetMethodID(env, kerberosTimeClass, "<init>", "(Ljava/lang/String;)V"); if (kerberosTimeConstructor == 0) { - printf("Couldn't find KerberosTime constructor\n"); + printf("LSA: Couldn't find KerberosTime constructor\n"); return JNI_ERR; } - #ifdef DEBUG - printf("Found KerberosTime constructor\n"); - #endif /* DEBUG */ + if (DEBUG) { + printf("LSA: Found KerberosTime constructor\n"); + } /* DEBUG */ // load the setRealm method in PrincipalName setRealmMethod = (*env)->GetMethodID(env, principalNameClass, "setRealm", "(Ljava/lang/String;)V"); if (setRealmMethod == 0) { - printf("Couldn't find setRealm in PrincipalName\n"); + printf("LSA: Couldn't find setRealm in PrincipalName\n"); return JNI_ERR; } - #ifdef DEBUG - printf("Finished OnLoad processing\n"); - #endif /* DEBUG */ + if (DEBUG) { + printf("LSA: Finished OnLoad processing\n"); + } /* DEBUG */ return JNI_VERSION_1_2; } @@ -389,16 +403,25 @@ JNIEXPORT jobject JNICALL Java_sun_security_krb5_Credentials_acquireDefaultNativ if (krbcredsConstructor == 0) { krbcredsConstructor = (*env)->GetMethodID(env, krbcredsClass, "<init>", - "(Lsun/security/krb5/internal/Ticket;Lsun/security/krb5/PrincipalName;Lsun/security/krb5/PrincipalName;Lsun/security/krb5/EncryptionKey;Lsun/security/krb5/internal/TicketFlags;Lsun/security/krb5/internal/KerberosTime;Lsun/security/krb5/internal/KerberosTime;Lsun/security/krb5/internal/KerberosTime;Lsun/security/krb5/internal/KerberosTime;Lsun/security/krb5/internal/HostAddresses;)V"); + "(Lsun/security/krb5/internal/Ticket;" + "Lsun/security/krb5/PrincipalName;" + "Lsun/security/krb5/PrincipalName;" + "Lsun/security/krb5/EncryptionKey;" + "Lsun/security/krb5/internal/TicketFlags;" + "Lsun/security/krb5/internal/KerberosTime;" + "Lsun/security/krb5/internal/KerberosTime;" + "Lsun/security/krb5/internal/KerberosTime;" + "Lsun/security/krb5/internal/KerberosTime;" + "Lsun/security/krb5/internal/HostAddresses;)V"); if (krbcredsConstructor == 0) { - printf("Couldn't find sun.security.krb5.Credentials constructor\n"); + printf("LSA: Couldn't find sun.security.krb5.Credentials constructor\n"); break; } } - #ifdef DEBUG - printf("Found KrbCreds constructor\n"); - #endif + if (DEBUG) { + printf("LSA: Found KrbCreds constructor\n"); + } // // Get the logon handle and package ID from the @@ -407,9 +430,9 @@ JNIEXPORT jobject JNICALL Java_sun_security_krb5_Credentials_acquireDefaultNativ if (!PackageConnectLookup(&LogonHandle, &PackageId)) break; - #ifdef DEBUG - printf("Got handle to Kerberos package\n"); - #endif /* DEBUG */ + if (DEBUG) { + printf("LSA: Got handle to Kerberos package\n"); + } /* DEBUG */ // Get the MS TGT from cache CacheRequest.MessageType = KerbRetrieveTicketMessage; @@ -426,9 +449,9 @@ JNIEXPORT jobject JNICALL Java_sun_security_krb5_Credentials_acquireDefaultNativ &SubStatus ); - #ifdef DEBUG - printf("Response size is %d\n", rspSize); - #endif + if (DEBUG) { + printf("LSA: Response size is %d\n", rspSize); + } if (!LSA_SUCCESS(Status) || !LSA_SUCCESS(SubStatus)) { if (!LSA_SUCCESS(Status)) { @@ -467,9 +490,9 @@ JNIEXPORT jobject JNICALL Java_sun_security_krb5_Credentials_acquireDefaultNativ } if (ignore_cache) { - #ifdef DEBUG - printf("MS TGT in cache is invalid/not supported; request new ticket\n"); - #endif /* DEBUG */ + if (DEBUG) { + printf("LSA: MS TGT in cache is invalid/not supported; request new ticket\n"); + } /* DEBUG */ // use domain to request Ticket Status = ConstructTicketRequest(msticket->TargetDomainName, @@ -493,9 +516,9 @@ JNIEXPORT jobject JNICALL Java_sun_security_krb5_Credentials_acquireDefaultNativ &SubStatus ); - #ifdef DEBUG - printf("Response size is %d\n", responseSize); - #endif /* DEBUG */ + if (DEBUG) { + printf("LSA: Response size is %d\n", responseSize); + } /* DEBUG */ if (!LSA_SUCCESS(Status) || !LSA_SUCCESS(SubStatus)) { if (!LSA_SUCCESS(Status)) { @@ -788,7 +811,9 @@ ShowLastError( static WCHAR szMsgBuf[MAX_MSG_SIZE]; DWORD dwRes; - printf("Error calling function %s: %lu\n", szAPI, dwError); + if (DEBUG) { + printf("LSA: Error calling function %s: %lu\n", szAPI, dwError); + } dwRes = FormatMessage ( FORMAT_MESSAGE_FROM_SYSTEM, @@ -798,11 +823,13 @@ ShowLastError( szMsgBuf, MAX_MSG_SIZE, NULL); - if (0 == dwRes) { - printf("FormatMessage failed with %d\n", GetLastError()); - // ExitProcess(EXIT_FAILURE); - } else { - printf("%S",szMsgBuf); + if (DEBUG) { + if (0 == dwRes) { + printf("LSA: FormatMessage failed with %d\n", GetLastError()); + // ExitProcess(EXIT_FAILURE); + } else { + printf("LSA: %S",szMsgBuf); + } } } @@ -896,17 +923,19 @@ jobject BuildPrincipal(JNIEnv *env, PKERB_EXTERNAL_NAME principalName, ((domainName.Length)*sizeof(WCHAR) + sizeof(UNICODE_NULL))); wcsncpy(realm, domainName.Buffer, domainName.Length/sizeof(WCHAR)); - #ifdef DEBUG - printf("Principal domain is %S\n", realm); - printf("Name type is %x\n", principalName->NameType); - printf("Name count is %x\n", principalName->NameCount); - #endif + if (DEBUG) { + printf("LSA: Principal domain is %S\n", realm); + printf("LSA: Name type is %x\n", principalName->NameType); + printf("LSA: Name count is %x\n", principalName->NameCount); + } nameCount = principalName->NameCount; stringArray = (*env)->NewObjectArray(env, nameCount, javaLangStringClass, NULL); if (stringArray == NULL) { - printf("Can't allocate String array for Principal\n"); + if (DEBUG) { + printf("LSA: Can't allocate String array for Principal\n"); + } LocalFree(realm); return principal; } @@ -941,6 +970,17 @@ jobject BuildEncryptionKey(JNIEnv *env, PKERB_CRYPTO_KEY cryptoKey) { // First, need to build a byte array jbyteArray ary; jobject encryptionKey = NULL; + unsigned int i; + + for (i=0; i<cryptoKey->Length; i++) { + if (cryptoKey->Value[i]) break; + } + if (i == cryptoKey->Length) { + if (DEBUG) { + printf("LSA: Session key all zero. Stop.\n"); + } + return NULL; + } ary = (*env)->NewByteArray(env,cryptoKey->Length); (*env)->SetByteArrayRegion(env, ary, (jsize) 0, cryptoKey->Length, @@ -1005,9 +1045,9 @@ jobject BuildKerberosTime(JNIEnv *env, PLARGE_INTEGER kerbtime) { hour, minute, second ); - #ifdef DEBUG - printf("%S\n", (wchar_t *)timeString); - #endif /* DEBUG */ + if (DEBUG) { + printf("LSA: %S\n", (wchar_t *)timeString); + } /* DEBUG */ stringTime = (*env)->NewString(env, timeString, (sizeof(timeString)/sizeof(WCHAR))-1); if (stringTime != NULL) { // everything's OK so far From e8f11acb077a7cdf7e6ac06f7978d9224099acd1 Mon Sep 17 00:00:00 2001 From: Martin Buchholz <martin@openjdk.org> Date: Sun, 12 Apr 2009 20:21:43 -0700 Subject: [PATCH 275/292] 6827153: Miscellaneous typos in javadoc Reviewed-by: alanb --- .../share/classes/java/lang/NoSuchFieldError.java | 4 ++-- .../nio/channels/AsynchronousDatagramChannel.java | 2 +- jdk/src/share/classes/java/nio/file/Path.java | 12 ++++++------ .../classes/java/nio/file/SecureDirectoryStream.java | 2 +- .../classes/java/security/AccessController.java | 2 +- .../java/security/AlgorithmParametersSpi.java | 2 +- .../java/security/PrivilegedActionException.java | 2 +- jdk/src/share/classes/java/security/Security.java | 2 +- .../classes/java/security/SecurityPermission.java | 2 +- .../share/classes/java/security/SignatureSpi.java | 2 +- .../java/security/cert/CertificateFactory.java | 2 +- .../java/security/cert/CertificateFactorySpi.java | 4 ++-- 12 files changed, 19 insertions(+), 19 deletions(-) diff --git a/jdk/src/share/classes/java/lang/NoSuchFieldError.java b/jdk/src/share/classes/java/lang/NoSuchFieldError.java index 8b77c71b18c..8adebca0dfd 100644 --- a/jdk/src/share/classes/java/lang/NoSuchFieldError.java +++ b/jdk/src/share/classes/java/lang/NoSuchFieldError.java @@ -41,14 +41,14 @@ class NoSuchFieldError extends IncompatibleClassChangeError { private static final long serialVersionUID = -3456430195886129035L; /** - * Constructs a <code>NoSuchFieldException</code> with no detail message. + * Constructs a <code>NoSuchFieldError</code> with no detail message. */ public NoSuchFieldError() { super(); } /** - * Constructs a <code>NoSuchFieldException</code> with the specified + * Constructs a <code>NoSuchFieldError</code> with the specified * detail message. * * @param s the detail message. diff --git a/jdk/src/share/classes/java/nio/channels/AsynchronousDatagramChannel.java b/jdk/src/share/classes/java/nio/channels/AsynchronousDatagramChannel.java index 6a9d9f09715..65b90d0f29d 100644 --- a/jdk/src/share/classes/java/nio/channels/AsynchronousDatagramChannel.java +++ b/jdk/src/share/classes/java/nio/channels/AsynchronousDatagramChannel.java @@ -443,7 +443,7 @@ public abstract class AsynchronousDatagramChannel * at least care must be taken to ensure that the buffer is not accessed * while the channel remains open. * - * <p> If there is a security manager installed and the the channel is not + * <p> If there is a security manager installed and the channel is not * connected then this method verifies that the target address and port number * are permitted by the security manager's {@link SecurityManager#checkConnect * checkConnect} method. The overhead of this security check can be avoided diff --git a/jdk/src/share/classes/java/nio/file/Path.java b/jdk/src/share/classes/java/nio/file/Path.java index 55bf8fd2675..8f796b6c32e 100644 --- a/jdk/src/share/classes/java/nio/file/Path.java +++ b/jdk/src/share/classes/java/nio/file/Path.java @@ -494,7 +494,7 @@ public abstract class Path * @throws IOException * if an I/O error occurs * @throws SecurityException - * In the case of the the default provider, and a security manager + * In the case of the default provider, and a security manager * is installed, it denies {@link LinkPermission}<tt>("symbolic")</tt> * or its {@link SecurityManager#checkWrite(String) checkWrite} * method denies write access to the path of the symbolic link. @@ -531,7 +531,7 @@ public abstract class Path * @throws IOException * if an I/O error occurs * @throws SecurityException - * In the case of the the default provider, and a security manager + * In the case of the default provider, and a security manager * is installed, it denies {@link LinkPermission}<tt>("hard")</tt> * or its {@link SecurityManager#checkWrite(String) checkWrite} * method denies write access to both this path and the path of the @@ -560,7 +560,7 @@ public abstract class Path * @throws IOException * if an I/O error occurs * @throws SecurityException - * In the case of the the default provider, and a security manager + * In the case of the default provider, and a security manager * is installed, it checks that {@code FilePermission} has been * granted with the "{@code readlink}" action to read the link. */ @@ -615,7 +615,7 @@ public abstract class Path * obtained * * @throws SecurityException - * In the case of the the default provider, and a security manager + * In the case of the default provider, and a security manager * is installed, the {@link #toAbsolutePath toAbsolutePath} method * throws a security exception. */ @@ -636,7 +636,7 @@ public abstract class Path * @throws IOError * if an I/O error occurs * @throws SecurityException - * In the case of the the default provider, and a security manager + * In the case of the default provider, and a security manager * is installed, its {@link SecurityManager#checkPropertyAccess(String) * checkPropertyAccess} method is invoked to check access to the * system property {@code user.dir} @@ -677,7 +677,7 @@ public abstract class Path * @throws IOException * if the file does not exist or an I/O error occurs * @throws SecurityException - * In the case of the the default provider, and a security manager + * In the case of the default provider, and a security manager * is installed, its {@link SecurityManager#checkRead(String) checkRead} * method is invoked to check read access to the file, and where * this path is not absolute, its {@link SecurityManager#checkPropertyAccess(String) diff --git a/jdk/src/share/classes/java/nio/file/SecureDirectoryStream.java b/jdk/src/share/classes/java/nio/file/SecureDirectoryStream.java index b2555c14185..7268c41c54d 100644 --- a/jdk/src/share/classes/java/nio/file/SecureDirectoryStream.java +++ b/jdk/src/share/classes/java/nio/file/SecureDirectoryStream.java @@ -208,7 +208,7 @@ public abstract class SecureDirectoryStream * @throws ClosedDirectoryStreamException * if the directory stream is closed * @throws NoSuchFileException - * if the the directory does not exist <i>(optional specific exception)</i> + * if the directory does not exist <i>(optional specific exception)</i> * @throws DirectoryNotEmptyException * if the directory could not otherwise be deleted because it is * not empty <i>(optional specific exception)</i> diff --git a/jdk/src/share/classes/java/security/AccessController.java b/jdk/src/share/classes/java/security/AccessController.java index dd49271ef87..47b8a93dc0e 100644 --- a/jdk/src/share/classes/java/security/AccessController.java +++ b/jdk/src/share/classes/java/security/AccessController.java @@ -425,7 +425,7 @@ public final class AccessController { * Performs the specified <code>PrivilegedExceptionAction</code> with * privileges enabled and restricted by the specified * <code>AccessControlContext</code>. The action is performed with the - * intersection of the the permissions possessed by the caller's + * intersection of the permissions possessed by the caller's * protection domain, and those possessed by the domains represented by the * specified <code>AccessControlContext</code>. * <p> diff --git a/jdk/src/share/classes/java/security/AlgorithmParametersSpi.java b/jdk/src/share/classes/java/security/AlgorithmParametersSpi.java index 4bff86ded5c..a70faf376c3 100644 --- a/jdk/src/share/classes/java/security/AlgorithmParametersSpi.java +++ b/jdk/src/share/classes/java/security/AlgorithmParametersSpi.java @@ -102,7 +102,7 @@ public abstract class AlgorithmParametersSpi { * parameters should be returned in an instance of the * <code>DSAParameterSpec</code> class. * - * @param paramSpec the the specification class in which + * @param paramSpec the specification class in which * the parameters should be returned. * * @return the parameter specification. diff --git a/jdk/src/share/classes/java/security/PrivilegedActionException.java b/jdk/src/share/classes/java/security/PrivilegedActionException.java index 4f42c02b2f8..d17d21a528a 100644 --- a/jdk/src/share/classes/java/security/PrivilegedActionException.java +++ b/jdk/src/share/classes/java/security/PrivilegedActionException.java @@ -87,7 +87,7 @@ public class PrivilegedActionException extends Exception { } /** - * Returns the the cause of this exception (the exception thrown by + * Returns the cause of this exception (the exception thrown by * the privileged computation that resulted in this * <code>PrivilegedActionException</code>). * diff --git a/jdk/src/share/classes/java/security/Security.java b/jdk/src/share/classes/java/security/Security.java index 7ed79566a1c..c7d69501711 100644 --- a/jdk/src/share/classes/java/security/Security.java +++ b/jdk/src/share/classes/java/security/Security.java @@ -501,7 +501,7 @@ public final class Security { * <li> <i><crypto_service>.<algorithm_or_type> * <attribute_name>:< attribute_value></i> * <p> The cryptographic service name must not contain any dots. There - * must be one or more space charaters between the the + * must be one or more space charaters between the * <i><algorithm_or_type></i> and the <i><attribute_name></i>. * <p> A provider satisfies this selection criterion iff the * provider implements the specified algorithm or type for the specified diff --git a/jdk/src/share/classes/java/security/SecurityPermission.java b/jdk/src/share/classes/java/security/SecurityPermission.java index 41744ae73e8..1d9049d5bec 100644 --- a/jdk/src/share/classes/java/security/SecurityPermission.java +++ b/jdk/src/share/classes/java/security/SecurityPermission.java @@ -118,7 +118,7 @@ import java.util.StringTokenizer; * <td>setProperty.{key}</td> * <td>Setting of the security property with the specified key</td> * <td>This could include setting a security provider or defining - * the location of the the system-wide security policy. Malicious + * the location of the system-wide security policy. Malicious * code that has permission to set a new security provider may * set a rogue provider that steals confidential information such * as cryptographic private keys. In addition, malicious code with diff --git a/jdk/src/share/classes/java/security/SignatureSpi.java b/jdk/src/share/classes/java/security/SignatureSpi.java index 4b6049c192f..b6bf347d655 100644 --- a/jdk/src/share/classes/java/security/SignatureSpi.java +++ b/jdk/src/share/classes/java/security/SignatureSpi.java @@ -316,7 +316,7 @@ public abstract class SignatureSpi { * overridden by a provider * * @exception InvalidAlgorithmParameterException if this method is - * overridden by a provider and the the given parameters + * overridden by a provider and the given parameters * are inappropriate for this signature engine */ protected void engineSetParameter(AlgorithmParameterSpec params) diff --git a/jdk/src/share/classes/java/security/cert/CertificateFactory.java b/jdk/src/share/classes/java/security/cert/CertificateFactory.java index 961e15de30e..f1059d1c5ff 100644 --- a/jdk/src/share/classes/java/security/cert/CertificateFactory.java +++ b/jdk/src/share/classes/java/security/cert/CertificateFactory.java @@ -460,7 +460,7 @@ public class CertificateFactory { * {@link java.io.InputStream#reset() reset}, this method will * consume the entire input stream. Otherwise, each call to this * method consumes one CRL and the read position of the input stream - * is positioned to the next available byte after the the inherent + * is positioned to the next available byte after the inherent * end-of-CRL marker. If the data in the * input stream does not contain an inherent end-of-CRL marker (other * than EOF) and there is trailing data after the CRL is parsed, a diff --git a/jdk/src/share/classes/java/security/cert/CertificateFactorySpi.java b/jdk/src/share/classes/java/security/cert/CertificateFactorySpi.java index 5c24027a440..29eb74bfae8 100644 --- a/jdk/src/share/classes/java/security/cert/CertificateFactorySpi.java +++ b/jdk/src/share/classes/java/security/cert/CertificateFactorySpi.java @@ -88,7 +88,7 @@ public abstract class CertificateFactorySpi { * {@link java.io.InputStream#reset() reset}, this method will * consume the entire input stream. Otherwise, each call to this * method consumes one certificate and the read position of the input stream - * is positioned to the next available byte after the the inherent + * is positioned to the next available byte after the inherent * end-of-certificate marker. If the data in the * input stream does not contain an inherent end-of-certificate marker (other * than EOF) and there is trailing data after the certificate is parsed, a @@ -261,7 +261,7 @@ public abstract class CertificateFactorySpi { * {@link java.io.InputStream#reset() reset}, this method will * consume the entire input stream. Otherwise, each call to this * method consumes one CRL and the read position of the input stream - * is positioned to the next available byte after the the inherent + * is positioned to the next available byte after the inherent * end-of-CRL marker. If the data in the * input stream does not contain an inherent end-of-CRL marker (other * than EOF) and there is trailing data after the CRL is parsed, a From 29e370d911041125288b008ad97ca76b22d64d9a Mon Sep 17 00:00:00 2001 From: Dmitry Cherepanov <dcherepanov@openjdk.org> Date: Mon, 13 Apr 2009 15:22:12 +0400 Subject: [PATCH 276/292] 6829326: Getting java.lang.NullPointerException: null pData while opening a File,Print,Page Dialog in Win Reviewed-by: art, yan --- jdk/src/windows/classes/sun/awt/windows/WFileDialogPeer.java | 1 + jdk/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java | 2 ++ 2 files changed, 3 insertions(+) diff --git a/jdk/src/windows/classes/sun/awt/windows/WFileDialogPeer.java b/jdk/src/windows/classes/sun/awt/windows/WFileDialogPeer.java index 1c90ae2e566..979308ab545 100644 --- a/jdk/src/windows/classes/sun/awt/windows/WFileDialogPeer.java +++ b/jdk/src/windows/classes/sun/awt/windows/WFileDialogPeer.java @@ -225,6 +225,7 @@ public class WFileDialogPeer extends WWindowPeer implements FileDialogPeer { public void addDropTarget(DropTarget dt) {} public void removeDropTarget(DropTarget dt) {} public void updateFocusableWindowState() {} + public void setZOrder(ComponentPeer above) {} /** * Initialize JNI field and method ids diff --git a/jdk/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java b/jdk/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java index 90ca88279fc..db1bedc9118 100644 --- a/jdk/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java +++ b/jdk/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java @@ -27,6 +27,7 @@ package sun.awt.windows; import java.awt.*; import java.awt.peer.DialogPeer; +import java.awt.peer.ComponentPeer; import java.awt.dnd.DropTarget; import java.util.Vector; import sun.awt.AppContext; @@ -137,6 +138,7 @@ public class WPrintDialogPeer extends WWindowPeer implements DialogPeer { void invalidate(int x, int y, int width, int height) {} public void addDropTarget(DropTarget dt) {} public void removeDropTarget(DropTarget dt) {} + public void setZOrder(ComponentPeer above) {} /** * Initialize JNI field and method ids From bca01e082666c5c45b0828ea0f1a52c89c6e2e0a Mon Sep 17 00:00:00 2001 From: Valerie Peng <valeriep@openjdk.org> Date: Mon, 13 Apr 2009 18:20:51 -0700 Subject: [PATCH 277/292] 6829098: Regression test java/security/Security/ClassLoaderDeadlock/Deadlock2.java error - missing ";" Added back the missing ";" Reviewed-by: weijun --- .../java/security/Security/ClassLoaderDeadlock/Deadlock2.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jdk/test/java/security/Security/ClassLoaderDeadlock/Deadlock2.java b/jdk/test/java/security/Security/ClassLoaderDeadlock/Deadlock2.java index b5938d1de88..3ab228045b4 100644 --- a/jdk/test/java/security/Security/ClassLoaderDeadlock/Deadlock2.java +++ b/jdk/test/java/security/Security/ClassLoaderDeadlock/Deadlock2.java @@ -56,7 +56,7 @@ public class Deadlock2 { e.printStackTrace(); } } - } + }; Thread thread1 = new Thread(readObjectRunnable, "Read Object"); Thread thread2 = new Thread(xmlRunnable, "XML"); From 9e2590b7bf321030927385d637a333d45e1e633e Mon Sep 17 00:00:00 2001 From: Alan Bateman <alanb@openjdk.org> Date: Wed, 15 Apr 2009 14:53:34 +0100 Subject: [PATCH 278/292] 6795561: (bf) CharBuffer.subSequence() uses wrong capacity value for new buffer Reviewed-by: sherman, iris --- .../share/classes/java/nio/ByteBufferAs-X-Buffer.java | 10 ++++++---- jdk/src/share/classes/java/nio/Direct-X-Buffer.java | 10 ++++++---- jdk/src/share/classes/java/nio/Heap-X-Buffer.java | 9 ++++++--- jdk/src/share/classes/java/nio/StringCharBuffer.java | 6 ++++-- jdk/test/java/nio/Buffer/Basic-X.java | 9 +++++++-- jdk/test/java/nio/Buffer/Basic.java | 2 +- jdk/test/java/nio/Buffer/BasicByte.java | 5 +++++ jdk/test/java/nio/Buffer/BasicChar.java | 9 +++++++-- jdk/test/java/nio/Buffer/BasicDouble.java | 5 +++++ jdk/test/java/nio/Buffer/BasicFloat.java | 5 +++++ jdk/test/java/nio/Buffer/BasicInt.java | 5 +++++ jdk/test/java/nio/Buffer/BasicLong.java | 5 +++++ jdk/test/java/nio/Buffer/BasicShort.java | 5 +++++ 13 files changed, 67 insertions(+), 18 deletions(-) diff --git a/jdk/src/share/classes/java/nio/ByteBufferAs-X-Buffer.java b/jdk/src/share/classes/java/nio/ByteBufferAs-X-Buffer.java index 15626425a0e..60be7479c49 100644 --- a/jdk/src/share/classes/java/nio/ByteBufferAs-X-Buffer.java +++ b/jdk/src/share/classes/java/nio/ByteBufferAs-X-Buffer.java @@ -196,10 +196,12 @@ class ByteBufferAs$Type$Buffer$RW$$BO$ // package-private if ((start < 0) || (end > len) || (start > end)) throw new IndexOutOfBoundsException(); - int sublen = end - start; - int off = offset + ((pos + start) << $LG_BYTES_PER_VALUE$); - assert (off >= 0); - return new ByteBufferAsCharBuffer$RW$$BO$(bb, -1, 0, sublen, sublen, off); + return new ByteBufferAsCharBuffer$RW$$BO$(bb, + -1, + pos + start, + pos + end, + capacity(), + offset); } #end[char] diff --git a/jdk/src/share/classes/java/nio/Direct-X-Buffer.java b/jdk/src/share/classes/java/nio/Direct-X-Buffer.java index 5f738b7811e..a977626351e 100644 --- a/jdk/src/share/classes/java/nio/Direct-X-Buffer.java +++ b/jdk/src/share/classes/java/nio/Direct-X-Buffer.java @@ -412,10 +412,12 @@ class Direct$Type$Buffer$RW$$BO$ if ((start < 0) || (end > len) || (start > end)) throw new IndexOutOfBoundsException(); - int sublen = end - start; - int off = (pos + start) << $LG_BYTES_PER_VALUE$; - assert (off >= 0); - return new DirectCharBuffer$RW$$BO$(this, -1, 0, sublen, sublen, off); + return new DirectCharBuffer$RW$$BO$(this, + -1, + pos + start, + pos + end, + capacity(), + offset); } #end[char] diff --git a/jdk/src/share/classes/java/nio/Heap-X-Buffer.java b/jdk/src/share/classes/java/nio/Heap-X-Buffer.java index b615ba3c633..864161fa02e 100644 --- a/jdk/src/share/classes/java/nio/Heap-X-Buffer.java +++ b/jdk/src/share/classes/java/nio/Heap-X-Buffer.java @@ -572,10 +572,13 @@ class Heap$Type$Buffer$RW$ || (end > length()) || (start > end)) throw new IndexOutOfBoundsException(); - int len = end - start; + int pos = position(); return new HeapCharBuffer$RW$(hb, - -1, 0, len, len, - offset + position() + start); + -1, + pos + start, + pos + end, + capacity(), + offset); } #end[char] diff --git a/jdk/src/share/classes/java/nio/StringCharBuffer.java b/jdk/src/share/classes/java/nio/StringCharBuffer.java index 648b1986fca..8871b943f41 100644 --- a/jdk/src/share/classes/java/nio/StringCharBuffer.java +++ b/jdk/src/share/classes/java/nio/StringCharBuffer.java @@ -102,10 +102,12 @@ class StringCharBuffer // package-private public final CharBuffer subSequence(int start, int end) { try { int pos = position(); - return new StringCharBuffer(str, -1, + return new StringCharBuffer(str, + -1, pos + checkIndex(start, pos), pos + checkIndex(end, pos), - remaining(), offset); + capacity(), + offset); } catch (IllegalArgumentException x) { throw new IndexOutOfBoundsException(); } diff --git a/jdk/test/java/nio/Buffer/Basic-X.java b/jdk/test/java/nio/Buffer/Basic-X.java index d4e1a2762f1..6612771def4 100644 --- a/jdk/test/java/nio/Buffer/Basic-X.java +++ b/jdk/test/java/nio/Buffer/Basic-X.java @@ -365,8 +365,11 @@ public class Basic$Type$ b.position(2); ck(b, b.charAt(1), 'd'); - CharBuffer c = (CharBuffer)b.subSequence(1, 4); - ck(b, b.subSequence(1, 4).toString().equals("def")); + CharBuffer c = b.subSequence(1, 4); + ck(c, c.capacity(), b.capacity()); + ck(c, c.position(), b.position()+1); + ck(c, c.limit(), b.position()+4); + ck(c, b.subSequence(1, 4).toString().equals("def")); // 4938424 b.position(4); @@ -722,6 +725,8 @@ public class Basic$Type$ ck(b, start, b.position()); ck(b, end, b.limit()); ck(b, s.length(), b.capacity()); + b.position(6); + ck(b, b.subSequence(0,3).toString().equals("ghi")); // The index, relative to the position, must be non-negative and // smaller than remaining(). diff --git a/jdk/test/java/nio/Buffer/Basic.java b/jdk/test/java/nio/Buffer/Basic.java index c0c420f8495..b8ed89bb30d 100644 --- a/jdk/test/java/nio/Buffer/Basic.java +++ b/jdk/test/java/nio/Buffer/Basic.java @@ -25,7 +25,7 @@ * @summary Unit test for buffers * @bug 4413135 4414911 4416536 4416562 4418782 4471053 4472779 4490253 4523725 * 4526177 4463011 4660660 4661219 4663521 4782970 4804304 4938424 6231529 - * 6221101 6234263 6535542 6591971 6593946 + * 6221101 6234263 6535542 6591971 6593946 6795561 * @author Mark Reinhold */ diff --git a/jdk/test/java/nio/Buffer/BasicByte.java b/jdk/test/java/nio/Buffer/BasicByte.java index 0f5ac6f6e0a..7e259a1416d 100644 --- a/jdk/test/java/nio/Buffer/BasicByte.java +++ b/jdk/test/java/nio/Buffer/BasicByte.java @@ -371,6 +371,9 @@ public class BasicByte + + + @@ -783,6 +786,8 @@ public class BasicByte + + diff --git a/jdk/test/java/nio/Buffer/BasicChar.java b/jdk/test/java/nio/Buffer/BasicChar.java index 28eb49fb560..a0df9fcf3a9 100644 --- a/jdk/test/java/nio/Buffer/BasicChar.java +++ b/jdk/test/java/nio/Buffer/BasicChar.java @@ -365,8 +365,11 @@ public class BasicChar b.position(2); ck(b, b.charAt(1), 'd'); - CharBuffer c = (CharBuffer)b.subSequence(1, 4); - ck(b, b.subSequence(1, 4).toString().equals("def")); + CharBuffer c = b.subSequence(1, 4); + ck(c, c.capacity(), b.capacity()); + ck(c, c.position(), b.position()+1); + ck(c, c.limit(), b.position()+4); + ck(c, b.subSequence(1, 4).toString().equals("def")); // 4938424 b.position(4); @@ -722,6 +725,8 @@ public class BasicChar ck(b, start, b.position()); ck(b, end, b.limit()); ck(b, s.length(), b.capacity()); + b.position(6); + ck(b, b.subSequence(0,3).toString().equals("ghi")); // The index, relative to the position, must be non-negative and // smaller than remaining(). diff --git a/jdk/test/java/nio/Buffer/BasicDouble.java b/jdk/test/java/nio/Buffer/BasicDouble.java index b2a1be65ad7..a627d0e9194 100644 --- a/jdk/test/java/nio/Buffer/BasicDouble.java +++ b/jdk/test/java/nio/Buffer/BasicDouble.java @@ -371,6 +371,9 @@ public class BasicDouble + + + @@ -783,6 +786,8 @@ public class BasicDouble + + diff --git a/jdk/test/java/nio/Buffer/BasicFloat.java b/jdk/test/java/nio/Buffer/BasicFloat.java index b6b5ea0dbdf..730dcbeac95 100644 --- a/jdk/test/java/nio/Buffer/BasicFloat.java +++ b/jdk/test/java/nio/Buffer/BasicFloat.java @@ -371,6 +371,9 @@ public class BasicFloat + + + @@ -783,6 +786,8 @@ public class BasicFloat + + diff --git a/jdk/test/java/nio/Buffer/BasicInt.java b/jdk/test/java/nio/Buffer/BasicInt.java index 938ada29571..b20e4bb1056 100644 --- a/jdk/test/java/nio/Buffer/BasicInt.java +++ b/jdk/test/java/nio/Buffer/BasicInt.java @@ -371,6 +371,9 @@ public class BasicInt + + + @@ -783,6 +786,8 @@ public class BasicInt + + diff --git a/jdk/test/java/nio/Buffer/BasicLong.java b/jdk/test/java/nio/Buffer/BasicLong.java index 17537a71ffc..0d4c568e1e3 100644 --- a/jdk/test/java/nio/Buffer/BasicLong.java +++ b/jdk/test/java/nio/Buffer/BasicLong.java @@ -371,6 +371,9 @@ public class BasicLong + + + @@ -783,6 +786,8 @@ public class BasicLong + + diff --git a/jdk/test/java/nio/Buffer/BasicShort.java b/jdk/test/java/nio/Buffer/BasicShort.java index dc9c7db3803..58e5a3e6d68 100644 --- a/jdk/test/java/nio/Buffer/BasicShort.java +++ b/jdk/test/java/nio/Buffer/BasicShort.java @@ -371,6 +371,9 @@ public class BasicShort + + + @@ -783,6 +786,8 @@ public class BasicShort + + From 26dc2b8949b950c8624b4c963bd219942736a119 Mon Sep 17 00:00:00 2001 From: Alan Bateman <alanb@openjdk.org> Date: Wed, 15 Apr 2009 16:16:35 +0100 Subject: [PATCH 279/292] 6543863: (fc) FileLock.release can deadlock with FileChannel.close 6429910: (fc) FileChannel.lock() IOException: Bad file number, not AsynchronousCloseException 6814948: (fc) test/java/nio/channels/AsynchronousFileChannel/Lock.java failed intermittently 6822643: (fc) AsynchronousFileChannel.close does not invalidate FileLocks Reviewed-by: sherman --- .../nio/ch/AsynchronousFileChannelImpl.java | 34 +++++-- .../classes/sun/nio/ch/FileChannelImpl.java | 63 ++++++------ .../classes/sun/nio/ch/FileLockImpl.java | 10 +- .../classes/sun/nio/ch/FileLockTable.java | 29 ++---- .../ch/SimpleAsynchronousFileChannelImpl.java | 38 +++---- .../WindowsAsynchronousFileChannelImpl.java | 11 +-- .../native/sun/nio/ch/FileDispatcherImpl.c | 2 +- .../AsynchronousFileChannel/Basic.java | 81 ++++++++------- .../AsynchronousFileChannel/Lock.java | 2 +- .../FileChannel/ReleaseOnCloseDeadlock.java | 98 +++++++++++++++++++ 10 files changed, 229 insertions(+), 139 deletions(-) create mode 100644 jdk/test/java/nio/channels/FileChannel/ReleaseOnCloseDeadlock.java diff --git a/jdk/src/share/classes/sun/nio/ch/AsynchronousFileChannelImpl.java b/jdk/src/share/classes/sun/nio/ch/AsynchronousFileChannelImpl.java index 2735a5a29cd..180238d8413 100644 --- a/jdk/src/share/classes/sun/nio/ch/AsynchronousFileChannelImpl.java +++ b/jdk/src/share/classes/sun/nio/ch/AsynchronousFileChannelImpl.java @@ -113,16 +113,16 @@ abstract class AsynchronousFileChannelImpl } } - final void invalidateAllLocks() { + final void invalidateAllLocks() throws IOException { if (fileLockTable != null) { - try { - fileLockTable.removeAll( new FileLockTable.Releaser() { - public void release(FileLock fl) { - ((FileLockImpl)fl).invalidate(); + for (FileLock fl: fileLockTable.removeAll()) { + synchronized (fl) { + if (fl.isValid()) { + FileLockImpl fli = (FileLockImpl)fl; + implRelease(fli); + fli.invalidate(); } - }); - } catch (IOException e) { - throw new AssertionError(e); + } } } } @@ -158,7 +158,21 @@ abstract class AsynchronousFileChannelImpl } /** - * Invoked by FileLockImpl to release lock acquired by this channel. + * Releases the given file lock. */ - abstract void release(FileLockImpl fli) throws IOException; + protected abstract void implRelease(FileLockImpl fli) throws IOException; + + /** + * Invoked by FileLockImpl to release the given file lock and remove it + * from the lock table. + */ + final void release(FileLockImpl fli) throws IOException { + try { + begin(); + implRelease(fli); + removeFromFileLockTable(fli); + } finally { + end(); + } + } } diff --git a/jdk/src/share/classes/sun/nio/ch/FileChannelImpl.java b/jdk/src/share/classes/sun/nio/ch/FileChannelImpl.java index 1d60e9615ff..d0461b30b9a 100644 --- a/jdk/src/share/classes/sun/nio/ch/FileChannelImpl.java +++ b/jdk/src/share/classes/sun/nio/ch/FileChannelImpl.java @@ -33,8 +33,6 @@ import java.nio.BufferPoolMXBean; import java.nio.channels.*; import java.util.ArrayList; import java.util.List; -import java.util.Iterator; -import java.lang.reflect.Field; import java.security.AccessController; import javax.management.ObjectName; import javax.management.MalformedObjectNameException; @@ -95,14 +93,16 @@ public class FileChannelImpl // -- Standard channel operations -- protected void implCloseChannel() throws IOException { - // Invalidate and release any locks that we still hold + // Release and invalidate any locks that we still hold if (fileLockTable != null) { - fileLockTable.removeAll( new FileLockTable.Releaser() { - public void release(FileLock fl) throws IOException { - ((FileLockImpl)fl).invalidate(); - nd.release(fd, fl.position(), fl.size()); + for (FileLock fl: fileLockTable.removeAll()) { + synchronized (fl) { + if (fl.isValid()) { + nd.release(fd, fl.position(), fl.size()); + ((FileLockImpl)fl).invalidate(); + } } - }); + } } nd.preClose(fd); @@ -912,32 +912,33 @@ public class FileChannelImpl FileLockImpl fli = new FileLockImpl(this, position, size, shared); FileLockTable flt = fileLockTable(); flt.add(fli); - boolean i = true; + boolean completed = false; int ti = -1; try { begin(); ti = threads.add(); if (!isOpen()) return null; - int result = nd.lock(fd, true, position, size, shared); - if (result == FileDispatcher.RET_EX_LOCK) { - assert shared; - FileLockImpl fli2 = new FileLockImpl(this, position, size, - false); - flt.replace(fli, fli2); - return fli2; + int n; + do { + n = nd.lock(fd, true, position, size, shared); + } while ((n == FileDispatcher.INTERRUPTED) && isOpen()); + if (isOpen()) { + if (n == FileDispatcher.RET_EX_LOCK) { + assert shared; + FileLockImpl fli2 = new FileLockImpl(this, position, size, + false); + flt.replace(fli, fli2); + fli = fli2; + } + completed = true; } - if (result == FileDispatcher.INTERRUPTED || result == FileDispatcher.NO_LOCK) { - flt.remove(fli); - i = false; - } - } catch (IOException e) { - flt.remove(fli); - throw e; } finally { + if (!completed) + flt.remove(fli); threads.remove(ti); try { - end(i); + end(completed); } catch (ClosedByInterruptException e) { throw new FileLockInterruptionException(); } @@ -985,7 +986,6 @@ public class FileChannelImpl } void release(FileLockImpl fli) throws IOException { - ensureOpen(); int ti = threads.add(); try { ensureOpen(); @@ -1005,7 +1005,7 @@ public class FileChannelImpl */ private static class SimpleFileLockTable extends FileLockTable { // synchronize on list for access - private List<FileLock> lockList = new ArrayList<FileLock>(2); + private final List<FileLock> lockList = new ArrayList<FileLock>(2); public SimpleFileLockTable() { } @@ -1034,14 +1034,11 @@ public class FileChannelImpl } } - public void removeAll(Releaser releaser) throws IOException { + public List<FileLock> removeAll() { synchronized(lockList) { - Iterator<FileLock> i = lockList.iterator(); - while (i.hasNext()) { - FileLock fl = i.next(); - releaser.release(fl); - i.remove(); - } + List<FileLock> result = new ArrayList<FileLock>(lockList); + lockList.clear(); + return result; } } diff --git a/jdk/src/share/classes/sun/nio/ch/FileLockImpl.java b/jdk/src/share/classes/sun/nio/ch/FileLockImpl.java index 9efd1532b50..8f12bcf0fdb 100644 --- a/jdk/src/share/classes/sun/nio/ch/FileLockImpl.java +++ b/jdk/src/share/classes/sun/nio/ch/FileLockImpl.java @@ -31,25 +31,24 @@ import java.nio.channels.*; public class FileLockImpl extends FileLock { - boolean valid; + private volatile boolean valid = true; FileLockImpl(FileChannel channel, long position, long size, boolean shared) { super(channel, position, size, shared); - this.valid = true; } FileLockImpl(AsynchronousFileChannel channel, long position, long size, boolean shared) { super(channel, position, size, shared); - this.valid = true; } - public synchronized boolean isValid() { + public boolean isValid() { return valid; } - synchronized void invalidate() { + void invalidate() { + assert Thread.holdsLock(this); valid = false; } @@ -66,5 +65,4 @@ public class FileLockImpl valid = false; } } - } diff --git a/jdk/src/share/classes/sun/nio/ch/FileLockTable.java b/jdk/src/share/classes/sun/nio/ch/FileLockTable.java index 137ab88872b..39cee5abfe8 100644 --- a/jdk/src/share/classes/sun/nio/ch/FileLockTable.java +++ b/jdk/src/share/classes/sun/nio/ch/FileLockTable.java @@ -60,23 +60,12 @@ abstract class FileLockTable { */ public abstract void remove(FileLock fl); - /** - * An implementation of this interface releases a given file lock. - * Used with removeAll. - */ - public abstract interface Releaser { - void release(FileLock fl) throws IOException; - } - /** * Removes all file locks from the table. - * <p> - * The Releaser#release method is invoked for each file lock before - * it is removed. * - * @throws IOException if the release method throws IOException + * @return The list of file locks removed */ - public abstract void removeAll(Releaser r) throws IOException; + public abstract List<FileLock> removeAll(); /** * Replaces an existing file lock in the table. @@ -195,7 +184,7 @@ class SharedFileLockTable extends FileLockTable { FileLockReference ref = list.get(index); FileLock lock = ref.get(); if (lock == fl) { - assert (lock != null) && (lock.channel() == channel); + assert (lock != null) && (lock.acquiredBy() == channel); ref.clear(); list.remove(index); break; @@ -206,7 +195,8 @@ class SharedFileLockTable extends FileLockTable { } @Override - public void removeAll(Releaser releaser) throws IOException { + public List<FileLock> removeAll() { + List<FileLock> result = new ArrayList<FileLock>(); List<FileLockReference> list = lockMap.get(fileKey); if (list != null) { synchronized (list) { @@ -216,13 +206,13 @@ class SharedFileLockTable extends FileLockTable { FileLock lock = ref.get(); // remove locks obtained by this channel - if (lock != null && lock.channel() == channel) { - // invoke the releaser to invalidate/release the lock - releaser.release(lock); - + if (lock != null && lock.acquiredBy() == channel) { // remove the lock from the list ref.clear(); list.remove(index); + + // add to result + result.add(lock); } else { index++; } @@ -232,6 +222,7 @@ class SharedFileLockTable extends FileLockTable { removeKeyIfEmpty(fileKey, list); } } + return result; } @Override diff --git a/jdk/src/share/classes/sun/nio/ch/SimpleAsynchronousFileChannelImpl.java b/jdk/src/share/classes/sun/nio/ch/SimpleAsynchronousFileChannelImpl.java index 52fe5a2802f..fb82f330be4 100644 --- a/jdk/src/share/classes/sun/nio/ch/SimpleAsynchronousFileChannelImpl.java +++ b/jdk/src/share/classes/sun/nio/ch/SimpleAsynchronousFileChannelImpl.java @@ -97,6 +97,9 @@ public class SimpleAsynchronousFileChannelImpl // then it will throw ClosedChannelException } + // Invalidate and release any locks that we still hold + invalidateAllLocks(); + // signal any threads blocked on this channel nd.preClose(fdObj); threads.signalAndWait(); @@ -109,9 +112,6 @@ public class SimpleAsynchronousFileChannelImpl closeLock.writeLock().unlock(); } - // Invalidate and release any locks that we still hold - invalidateAllLocks(); - // close file nd.close(fdObj); @@ -226,11 +226,9 @@ public class SimpleAsynchronousFileChannelImpl do { n = nd.lock(fdObj, true, position, size, shared); } while ((n == FileDispatcher.INTERRUPTED) && isOpen()); - if (n == FileDispatcher.LOCKED) { + if (n == FileDispatcher.LOCKED && isOpen()) { result.setResult(fli); } else { - if (n != FileDispatcher.INTERRUPTED) - throw new AssertionError(); throw new AsynchronousCloseException(); } } catch (IOException x) { @@ -279,16 +277,16 @@ public class SimpleAsynchronousFileChannelImpl do { n = nd.lock(fdObj, false, position, size, shared); } while ((n == FileDispatcher.INTERRUPTED) && isOpen()); - if (n != FileDispatcher.LOCKED) { - if (n == FileDispatcher.NO_LOCK) - return null; // locked by someone else - if (n == FileDispatcher.INTERRUPTED) - throw new AsynchronousCloseException(); - // should not get here - throw new AssertionError(); + if (n == FileDispatcher.LOCKED && isOpen()) { + gotLock = true; + return fli; // lock acquired } - gotLock = true; - return fli; + if (n == FileDispatcher.NO_LOCK) + return null; // locked by someone else + if (n == FileDispatcher.INTERRUPTED) + throw new AsynchronousCloseException(); + // should not get here + throw new AssertionError(); } finally { if (!gotLock) removeFromFileLockTable(fli); @@ -298,14 +296,8 @@ public class SimpleAsynchronousFileChannelImpl } @Override - void release(FileLockImpl fli) throws IOException { - try { - begin(); - nd.release(fdObj, fli.position(), fli.size()); - removeFromFileLockTable(fli); - } finally { - end(); - } + protected void implRelease(FileLockImpl fli) throws IOException { + nd.release(fdObj, fli.position(), fli.size()); } @Override diff --git a/jdk/src/windows/classes/sun/nio/ch/WindowsAsynchronousFileChannelImpl.java b/jdk/src/windows/classes/sun/nio/ch/WindowsAsynchronousFileChannelImpl.java index ef668648d67..e08f460d919 100644 --- a/jdk/src/windows/classes/sun/nio/ch/WindowsAsynchronousFileChannelImpl.java +++ b/jdk/src/windows/classes/sun/nio/ch/WindowsAsynchronousFileChannelImpl.java @@ -354,16 +354,9 @@ public class WindowsAsynchronousFileChannelImpl } } - // invoke by FileFileImpl to release lock @Override - void release(FileLockImpl fli) throws IOException { - try { - begin(); - nd.release(fdObj, fli.position(), fli.size()); - removeFromFileLockTable(fli); - } finally { - end(); - } + protected void implRelease(FileLockImpl fli) throws IOException { + nd.release(fdObj, fli.position(), fli.size()); } /** diff --git a/jdk/src/windows/native/sun/nio/ch/FileDispatcherImpl.c b/jdk/src/windows/native/sun/nio/ch/FileDispatcherImpl.c index a65ad90e24d..7b41d86fad1 100644 --- a/jdk/src/windows/native/sun/nio/ch/FileDispatcherImpl.c +++ b/jdk/src/windows/native/sun/nio/ch/FileDispatcherImpl.c @@ -414,7 +414,7 @@ Java_sun_nio_ch_FileDispatcherImpl_release0(JNIEnv *env, jobject this, o.Offset = lowPos; o.OffsetHigh = highPos; result = UnlockFileEx(h, 0, lowNumBytes, highNumBytes, &o); - if (result == 0) { + if (result == 0 && GetLastError() != ERROR_NOT_LOCKED) { JNU_ThrowIOExceptionWithLastError(env, "Release failed"); } } diff --git a/jdk/test/java/nio/channels/AsynchronousFileChannel/Basic.java b/jdk/test/java/nio/channels/AsynchronousFileChannel/Basic.java index 5ffb42c0b8b..ea9a5415923 100644 --- a/jdk/test/java/nio/channels/AsynchronousFileChannel/Basic.java +++ b/jdk/test/java/nio/channels/AsynchronousFileChannel/Basic.java @@ -22,7 +22,7 @@ */ /* @test - * @bug 4607272 + * @bug 4607272 6822643 * @summary Unit test for AsynchronousFileChannel */ @@ -51,7 +51,6 @@ public class Basic { // run tests testUsingCompletionHandlers(ch); testUsingWaitOnResult(ch); - testLocking(ch); testInterruptHandlerThread(ch); // close channel and invoke test that expects channel to be closed @@ -59,6 +58,7 @@ public class Basic { testClosedChannel(ch); // these tests open the file themselves + testLocking(blah.toPath()); testCustomThreadPool(blah.toPath()); testAsynchronousClose(blah.toPath()); testCancel(blah.toPath()); @@ -160,47 +160,54 @@ public class Basic { } // exercise lock methods - static void testLocking(AsynchronousFileChannel ch) - throws IOException - { + static void testLocking(Path file) throws IOException { System.out.println("testLocking"); - // test 1 - acquire lock and check that tryLock throws - // OverlappingFileLockException + AsynchronousFileChannel ch = AsynchronousFileChannel + .open(file, READ, WRITE); FileLock fl; try { - fl = ch.lock().get(); - } catch (ExecutionException x) { - throw new RuntimeException(x); - } catch (InterruptedException x) { - throw new RuntimeException("Should not be interrupted"); - } - if (!fl.acquiredBy().equals(ch)) - throw new RuntimeException("FileLock#acquiredBy returned incorrect channel"); - try { - ch.tryLock(); - throw new RuntimeException("OverlappingFileLockException expected"); - } catch (OverlappingFileLockException x) { - } - fl.release(); + // test 1 - acquire lock and check that tryLock throws + // OverlappingFileLockException + try { + fl = ch.lock().get(); + } catch (ExecutionException x) { + throw new RuntimeException(x); + } catch (InterruptedException x) { + throw new RuntimeException("Should not be interrupted"); + } + if (!fl.acquiredBy().equals(ch)) + throw new RuntimeException("FileLock#acquiredBy returned incorrect channel"); + try { + ch.tryLock(); + throw new RuntimeException("OverlappingFileLockException expected"); + } catch (OverlappingFileLockException x) { + } + fl.release(); - // test 2 - acquire try and check that lock throws OverlappingFileLockException - fl = ch.tryLock(); - if (fl == null) - throw new RuntimeException("Unable to acquire lock"); - try { - ch.lock(null, new CompletionHandler<FileLock,Void> () { - public void completed(FileLock result, Void att) { - } - public void failed(Throwable exc, Void att) { - } - public void cancelled(Void att) { - } - }); - throw new RuntimeException("OverlappingFileLockException expected"); - } catch (OverlappingFileLockException x) { + // test 2 - acquire try and check that lock throws OverlappingFileLockException + fl = ch.tryLock(); + if (fl == null) + throw new RuntimeException("Unable to acquire lock"); + try { + ch.lock(null, new CompletionHandler<FileLock,Void> () { + public void completed(FileLock result, Void att) { + } + public void failed(Throwable exc, Void att) { + } + public void cancelled(Void att) { + } + }); + throw new RuntimeException("OverlappingFileLockException expected"); + } catch (OverlappingFileLockException x) { + } + } finally { + ch.close(); } - fl.release(); + + // test 3 - channel is closed so FileLock should no longer be valid + if (fl.isValid()) + throw new RuntimeException("FileLock expected to be invalid"); } // interrupt should not close channel diff --git a/jdk/test/java/nio/channels/AsynchronousFileChannel/Lock.java b/jdk/test/java/nio/channels/AsynchronousFileChannel/Lock.java index 38c0f7d0c6e..f8b55cc44f8 100644 --- a/jdk/test/java/nio/channels/AsynchronousFileChannel/Lock.java +++ b/jdk/test/java/nio/channels/AsynchronousFileChannel/Lock.java @@ -23,7 +23,7 @@ /* @test - * @bug 4607272 + * @bug 4607272 6814948 * @summary Unit test for AsynchronousFileChannel#lock method */ diff --git a/jdk/test/java/nio/channels/FileChannel/ReleaseOnCloseDeadlock.java b/jdk/test/java/nio/channels/FileChannel/ReleaseOnCloseDeadlock.java new file mode 100644 index 00000000000..c7ed16a9204 --- /dev/null +++ b/jdk/test/java/nio/channels/FileChannel/ReleaseOnCloseDeadlock.java @@ -0,0 +1,98 @@ +/* + * Copyright 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 6543863 + * @summary Try to cause a deadlock between (Asynchronous)FileChannel.close + * and FileLock.release + */ + +import java.io.*; +import java.nio.file.Path; +import static java.nio.file.StandardOpenOption.*; +import java.nio.channels.*; +import java.util.concurrent.*; + +public class ReleaseOnCloseDeadlock { + private static final int LOCK_COUNT = 1024; + + public static void main(String[] args) throws IOException { + File blah = File.createTempFile("blah", null); + blah.deleteOnExit(); + for (int i=0; i<100; i++) { + test(blah.toPath()); + } + } + + static void test(Path file) throws IOException { + FileLock[] locks = new FileLock[LOCK_COUNT]; + + FileChannel fc = FileChannel.open(file, READ, WRITE); + for (int i=0; i<LOCK_COUNT; i++) { + locks[i] = fc.lock(i, 1, true); + } + tryToDeadlock(fc, locks); + + AsynchronousFileChannel ch = AsynchronousFileChannel.open(file, READ, WRITE); + for (int i=0; i<LOCK_COUNT; i++) { + try { + locks[i] = ch.lock(i, 1, true, null, null).get(); + } catch (InterruptedException x) { + throw new RuntimeException(x); + } catch (ExecutionException x) { + throw new RuntimeException(x); + } + } + tryToDeadlock(ch, locks); + } + + static void tryToDeadlock(final Channel channel, FileLock[] locks) + throws IOException + { + // start thread to close the file (and invalidate the locks) + Thread closer = new Thread( + new Runnable() { + public void run() { + try { + channel.close(); + } catch (IOException ignore) { + ignore.printStackTrace(); + } + }}); + closer.start(); + + // release the locks explicitly + for (int i=0; i<locks.length; i++) { + try { + locks[i].release(); + } catch (ClosedChannelException ignore) { } + } + + // we are done when closer has terminated + while (closer.isAlive()) { + try { + closer.join(); + } catch (InterruptedException ignore) { } + } + } +} From 3119cce77df6252950b1a7ac8ee6f81b86967eaf Mon Sep 17 00:00:00 2001 From: Weijun Wang <weijun@openjdk.org> Date: Thu, 16 Apr 2009 11:16:40 +0800 Subject: [PATCH 280/292] 6830658: Changeset ec64fd74aa69 breaks the fastdebug build in NativeCreds.c Reviewed-by: tbell --- .../native/sun/security/krb5/NativeCreds.c | 120 +++++++++--------- 1 file changed, 60 insertions(+), 60 deletions(-) diff --git a/jdk/src/windows/native/sun/security/krb5/NativeCreds.c b/jdk/src/windows/native/sun/security/krb5/NativeCreds.c index 968ff119153..c910c62be4a 100644 --- a/jdk/src/windows/native/sun/security/krb5/NativeCreds.c +++ b/jdk/src/windows/native/sun/security/krb5/NativeCreds.c @@ -1,5 +1,5 @@ /* - * Portions Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2000-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 @@ -73,7 +73,7 @@ jmethodID setRealmMethod = 0; * Function prototypes for internal routines * */ -BOOL DEBUG = 0; +BOOL native_debug = 0; BOOL PackageConnectLookup(PHANDLE,PULONG); @@ -130,7 +130,7 @@ JNIEXPORT jint JNICALL JNI_OnLoad( printf("LSA: Krb5 has no DEBUG field\n"); return JNI_ERR; } - DEBUG = (*env)->GetStaticBooleanField(env, cls, fldDEBUG); + native_debug = (*env)->GetStaticBooleanField(env, cls, fldDEBUG); cls = (*env)->FindClass(env,"sun/security/krb5/internal/Ticket"); @@ -138,17 +138,17 @@ JNIEXPORT jint JNICALL JNI_OnLoad( printf("LSA: Couldn't find Ticket\n"); return JNI_ERR; } - if (DEBUG) { + if (native_debug) { printf("LSA: Found Ticket\n"); - } /* DEBUG */ + } ticketClass = (*env)->NewWeakGlobalRef(env,cls); if (ticketClass == NULL) { return JNI_ERR; } - if (DEBUG) { + if (native_debug) { printf("LSA: Made NewWeakGlobalRef\n"); - } /* DEBUG */ + } cls = (*env)->FindClass(env, "sun/security/krb5/PrincipalName"); @@ -156,17 +156,17 @@ JNIEXPORT jint JNICALL JNI_OnLoad( printf("LSA: Couldn't find PrincipalName\n"); return JNI_ERR; } - if (DEBUG) { + if (native_debug) { printf("LSA: Found PrincipalName\n"); - } /* DEBUG */ + } principalNameClass = (*env)->NewWeakGlobalRef(env,cls); if (principalNameClass == NULL) { return JNI_ERR; } - if (DEBUG) { + if (native_debug) { printf("LSA: Made NewWeakGlobalRef\n"); - } /* DEBUG */ + } cls = (*env)->FindClass(env,"sun/security/util/DerValue"); @@ -174,17 +174,17 @@ JNIEXPORT jint JNICALL JNI_OnLoad( printf("LSA: Couldn't find DerValue\n"); return JNI_ERR; } - if (DEBUG) { + if (native_debug) { printf("LSA: Found DerValue\n"); - } /* DEBUG */ + } derValueClass = (*env)->NewWeakGlobalRef(env,cls); if (derValueClass == NULL) { return JNI_ERR; } - if (DEBUG) { + if (native_debug) { printf("LSA: Made NewWeakGlobalRef\n"); - } /* DEBUG */ + } cls = (*env)->FindClass(env,"sun/security/krb5/EncryptionKey"); @@ -192,17 +192,17 @@ JNIEXPORT jint JNICALL JNI_OnLoad( printf("LSA: Couldn't find EncryptionKey\n"); return JNI_ERR; } - if (DEBUG) { + if (native_debug) { printf("LSA: Found EncryptionKey\n"); - } /* DEBUG */ + } encryptionKeyClass = (*env)->NewWeakGlobalRef(env,cls); if (encryptionKeyClass == NULL) { return JNI_ERR; } - if (DEBUG) { + if (native_debug) { printf("LSA: Made NewWeakGlobalRef\n"); - } /* DEBUG */ + } cls = (*env)->FindClass(env,"sun/security/krb5/internal/TicketFlags"); @@ -210,17 +210,17 @@ JNIEXPORT jint JNICALL JNI_OnLoad( printf("LSA: Couldn't find TicketFlags\n"); return JNI_ERR; } - if (DEBUG) { + if (native_debug) { printf("LSA: Found TicketFlags\n"); - } /* DEBUG */ + } ticketFlagsClass = (*env)->NewWeakGlobalRef(env,cls); if (ticketFlagsClass == NULL) { return JNI_ERR; } - if (DEBUG) { + if (native_debug) { printf("LSA: Made NewWeakGlobalRef\n"); - } /* DEBUG */ + } cls = (*env)->FindClass(env,"sun/security/krb5/internal/KerberosTime"); @@ -228,17 +228,17 @@ JNIEXPORT jint JNICALL JNI_OnLoad( printf("LSA: Couldn't find KerberosTime\n"); return JNI_ERR; } - if (DEBUG) { + if (native_debug) { printf("LSA: Found KerberosTime\n"); - } /* DEBUG */ + } kerberosTimeClass = (*env)->NewWeakGlobalRef(env,cls); if (kerberosTimeClass == NULL) { return JNI_ERR; } - if (DEBUG) { + if (native_debug) { printf("LSA: Made NewWeakGlobalRef\n"); - } /* DEBUG */ + } cls = (*env)->FindClass(env,"java/lang/String"); @@ -246,17 +246,17 @@ JNIEXPORT jint JNICALL JNI_OnLoad( printf("LSA: Couldn't find String\n"); return JNI_ERR; } - if (DEBUG) { + if (native_debug) { printf("LSA: Found String\n"); - } /* DEBUG */ + } javaLangStringClass = (*env)->NewWeakGlobalRef(env,cls); if (javaLangStringClass == NULL) { return JNI_ERR; } - if (DEBUG) { + if (native_debug) { printf("LSA: Made NewWeakGlobalRef\n"); - } /* DEBUG */ + } derValueConstructor = (*env)->GetMethodID(env, derValueClass, "<init>", "([B)V"); @@ -264,9 +264,9 @@ JNIEXPORT jint JNICALL JNI_OnLoad( printf("LSA: Couldn't find DerValue constructor\n"); return JNI_ERR; } - if (DEBUG) { + if (native_debug) { printf("LSA: Found DerValue constructor\n"); - } /* DEBUG */ + } ticketConstructor = (*env)->GetMethodID(env, ticketClass, "<init>", "(Lsun/security/util/DerValue;)V"); @@ -274,9 +274,9 @@ JNIEXPORT jint JNICALL JNI_OnLoad( printf("LSA: Couldn't find Ticket constructor\n"); return JNI_ERR; } - if (DEBUG) { + if (native_debug) { printf("LSA: Found Ticket constructor\n"); - } /* DEBUG */ + } principalNameConstructor = (*env)->GetMethodID(env, principalNameClass, "<init>", "([Ljava/lang/String;)V"); @@ -284,9 +284,9 @@ JNIEXPORT jint JNICALL JNI_OnLoad( printf("LSA: Couldn't find PrincipalName constructor\n"); return JNI_ERR; } - if (DEBUG) { + if (native_debug) { printf("LSA: Found PrincipalName constructor\n"); - } /* DEBUG */ + } encryptionKeyConstructor = (*env)->GetMethodID(env, encryptionKeyClass, "<init>", "(I[B)V"); @@ -294,9 +294,9 @@ JNIEXPORT jint JNICALL JNI_OnLoad( printf("LSA: Couldn't find EncryptionKey constructor\n"); return JNI_ERR; } - if (DEBUG) { + if (native_debug) { printf("LSA: Found EncryptionKey constructor\n"); - } /* DEBUG */ + } ticketFlagsConstructor = (*env)->GetMethodID(env, ticketFlagsClass, "<init>", "(I[B)V"); @@ -304,9 +304,9 @@ JNIEXPORT jint JNICALL JNI_OnLoad( printf("LSA: Couldn't find TicketFlags constructor\n"); return JNI_ERR; } - if (DEBUG) { + if (native_debug) { printf("LSA: Found TicketFlags constructor\n"); - } /* DEBUG */ + } kerberosTimeConstructor = (*env)->GetMethodID(env, kerberosTimeClass, "<init>", "(Ljava/lang/String;)V"); @@ -314,9 +314,9 @@ JNIEXPORT jint JNICALL JNI_OnLoad( printf("LSA: Couldn't find KerberosTime constructor\n"); return JNI_ERR; } - if (DEBUG) { + if (native_debug) { printf("LSA: Found KerberosTime constructor\n"); - } /* DEBUG */ + } // load the setRealm method in PrincipalName setRealmMethod = (*env)->GetMethodID(env, principalNameClass, @@ -326,9 +326,9 @@ JNIEXPORT jint JNICALL JNI_OnLoad( return JNI_ERR; } - if (DEBUG) { + if (native_debug) { printf("LSA: Finished OnLoad processing\n"); - } /* DEBUG */ + } return JNI_VERSION_1_2; } @@ -419,7 +419,7 @@ JNIEXPORT jobject JNICALL Java_sun_security_krb5_Credentials_acquireDefaultNativ } } - if (DEBUG) { + if (native_debug) { printf("LSA: Found KrbCreds constructor\n"); } @@ -430,9 +430,9 @@ JNIEXPORT jobject JNICALL Java_sun_security_krb5_Credentials_acquireDefaultNativ if (!PackageConnectLookup(&LogonHandle, &PackageId)) break; - if (DEBUG) { + if (native_debug) { printf("LSA: Got handle to Kerberos package\n"); - } /* DEBUG */ + } // Get the MS TGT from cache CacheRequest.MessageType = KerbRetrieveTicketMessage; @@ -449,7 +449,7 @@ JNIEXPORT jobject JNICALL Java_sun_security_krb5_Credentials_acquireDefaultNativ &SubStatus ); - if (DEBUG) { + if (native_debug) { printf("LSA: Response size is %d\n", rspSize); } @@ -490,9 +490,9 @@ JNIEXPORT jobject JNICALL Java_sun_security_krb5_Credentials_acquireDefaultNativ } if (ignore_cache) { - if (DEBUG) { + if (native_debug) { printf("LSA: MS TGT in cache is invalid/not supported; request new ticket\n"); - } /* DEBUG */ + } // use domain to request Ticket Status = ConstructTicketRequest(msticket->TargetDomainName, @@ -516,9 +516,9 @@ JNIEXPORT jobject JNICALL Java_sun_security_krb5_Credentials_acquireDefaultNativ &SubStatus ); - if (DEBUG) { + if (native_debug) { printf("LSA: Response size is %d\n", responseSize); - } /* DEBUG */ + } if (!LSA_SUCCESS(Status) || !LSA_SUCCESS(SubStatus)) { if (!LSA_SUCCESS(Status)) { @@ -811,7 +811,7 @@ ShowLastError( static WCHAR szMsgBuf[MAX_MSG_SIZE]; DWORD dwRes; - if (DEBUG) { + if (native_debug) { printf("LSA: Error calling function %s: %lu\n", szAPI, dwError); } @@ -823,7 +823,7 @@ ShowLastError( szMsgBuf, MAX_MSG_SIZE, NULL); - if (DEBUG) { + if (native_debug) { if (0 == dwRes) { printf("LSA: FormatMessage failed with %d\n", GetLastError()); // ExitProcess(EXIT_FAILURE); @@ -923,7 +923,7 @@ jobject BuildPrincipal(JNIEnv *env, PKERB_EXTERNAL_NAME principalName, ((domainName.Length)*sizeof(WCHAR) + sizeof(UNICODE_NULL))); wcsncpy(realm, domainName.Buffer, domainName.Length/sizeof(WCHAR)); - if (DEBUG) { + if (native_debug) { printf("LSA: Principal domain is %S\n", realm); printf("LSA: Name type is %x\n", principalName->NameType); printf("LSA: Name count is %x\n", principalName->NameCount); @@ -933,7 +933,7 @@ jobject BuildPrincipal(JNIEnv *env, PKERB_EXTERNAL_NAME principalName, stringArray = (*env)->NewObjectArray(env, nameCount, javaLangStringClass, NULL); if (stringArray == NULL) { - if (DEBUG) { + if (native_debug) { printf("LSA: Can't allocate String array for Principal\n"); } LocalFree(realm); @@ -976,7 +976,7 @@ jobject BuildEncryptionKey(JNIEnv *env, PKERB_CRYPTO_KEY cryptoKey) { if (cryptoKey->Value[i]) break; } if (i == cryptoKey->Length) { - if (DEBUG) { + if (native_debug) { printf("LSA: Session key all zero. Stop.\n"); } return NULL; @@ -1045,9 +1045,9 @@ jobject BuildKerberosTime(JNIEnv *env, PLARGE_INTEGER kerbtime) { hour, minute, second ); - if (DEBUG) { + if (native_debug) { printf("LSA: %S\n", (wchar_t *)timeString); - } /* DEBUG */ + } stringTime = (*env)->NewString(env, timeString, (sizeof(timeString)/sizeof(WCHAR))-1); if (stringTime != NULL) { // everything's OK so far From 78cace065277859faf36068fcf9d0d3b896bc7c7 Mon Sep 17 00:00:00 2001 From: "J. Duke" <duke@openjdk.org> Date: Wed, 5 Jul 2017 16:48:21 +0200 Subject: [PATCH 281/292] Added tag jdk7-b50 for changeset 5da0e6b9f4f1 --- .hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/.hgtags b/.hgtags index 722b0b67512..d3656515f9e 100644 --- a/.hgtags +++ b/.hgtags @@ -24,3 +24,4 @@ caf58ffa084568990cbb3441f9ae188e36b31770 jdk7-b42 0c4657194eec95c08ba478aee9cfc3c295e41657 jdk7-b47 1bf51a4c2627c2f0e0cbcc2cf0421bdb37f1f2b2 jdk7-b48 6b84b04a80afe23262377c60913eebfc898f14c4 jdk7-b49 +5da0e6b9f4f18ef483c977337214b12ee0e1fc8f jdk7-b50 From 0f6b9a919bf6fee6c2aebf512cbfeb071935ed1f Mon Sep 17 00:00:00 2001 From: "J. Duke" <duke@openjdk.org> Date: Wed, 5 Jul 2017 16:49:08 +0200 Subject: [PATCH 282/292] Added tag jdk7-b51 for changeset a25c5ec5e40e --- .hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/.hgtags b/.hgtags index d3656515f9e..89f5f016035 100644 --- a/.hgtags +++ b/.hgtags @@ -25,3 +25,4 @@ caf58ffa084568990cbb3441f9ae188e36b31770 jdk7-b42 1bf51a4c2627c2f0e0cbcc2cf0421bdb37f1f2b2 jdk7-b48 6b84b04a80afe23262377c60913eebfc898f14c4 jdk7-b49 5da0e6b9f4f18ef483c977337214b12ee0e1fc8f jdk7-b50 +a25c5ec5e40e07733d1ff9898a0abe36159288ff jdk7-b51 From fd20a6a950c588757419824103aff4d0f2b636a4 Mon Sep 17 00:00:00 2001 From: "J. Duke" <duke@openjdk.org> Date: Wed, 5 Jul 2017 16:49:29 +0200 Subject: [PATCH 283/292] Added tag jdk7-b52 for changeset 7a90e89e36d1 --- .hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/.hgtags b/.hgtags index 89f5f016035..6d54fecdbfa 100644 --- a/.hgtags +++ b/.hgtags @@ -26,3 +26,4 @@ caf58ffa084568990cbb3441f9ae188e36b31770 jdk7-b42 6b84b04a80afe23262377c60913eebfc898f14c4 jdk7-b49 5da0e6b9f4f18ef483c977337214b12ee0e1fc8f jdk7-b50 a25c5ec5e40e07733d1ff9898a0abe36159288ff jdk7-b51 +7a90e89e36d103038f8667f6a7daae34ecfa1ad8 jdk7-b52 From 1fcb5893bd7f30a067db966cffc735bec114715a Mon Sep 17 00:00:00 2001 From: "J. Duke" <duke@openjdk.org> Date: Wed, 5 Jul 2017 16:50:04 +0200 Subject: [PATCH 284/292] Added tag jdk7-b53 for changeset d52186ee770d --- .hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/.hgtags b/.hgtags index 6d54fecdbfa..d0000317c40 100644 --- a/.hgtags +++ b/.hgtags @@ -27,3 +27,4 @@ caf58ffa084568990cbb3441f9ae188e36b31770 jdk7-b42 5da0e6b9f4f18ef483c977337214b12ee0e1fc8f jdk7-b50 a25c5ec5e40e07733d1ff9898a0abe36159288ff jdk7-b51 7a90e89e36d103038f8667f6a7daae34ecfa1ad8 jdk7-b52 +d52186ee770dac57950536cd00ccbfdef360b04c jdk7-b53 From 2e266fe5dee783861f1e125558153e00c577c4c4 Mon Sep 17 00:00:00 2001 From: "J. Duke" <duke@openjdk.org> Date: Wed, 5 Jul 2017 16:50:37 +0200 Subject: [PATCH 285/292] Added tag jdk7-b54 for changeset 15096652c4d4 --- .hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/.hgtags b/.hgtags index d0000317c40..b71e2cc2927 100644 --- a/.hgtags +++ b/.hgtags @@ -28,3 +28,4 @@ caf58ffa084568990cbb3441f9ae188e36b31770 jdk7-b42 a25c5ec5e40e07733d1ff9898a0abe36159288ff jdk7-b51 7a90e89e36d103038f8667f6a7daae34ecfa1ad8 jdk7-b52 d52186ee770dac57950536cd00ccbfdef360b04c jdk7-b53 +15096652c4d48dfb9fc0b2cb135304db94c65ba0 jdk7-b54 From 6451f9b113eadd4ecfbeccecc07df9cc81184593 Mon Sep 17 00:00:00 2001 From: Xiomara Jayasena <xdono@openjdk.org> Date: Thu, 16 Apr 2009 11:22:52 -0700 Subject: [PATCH 286/292] Added tag jdk7-b55 for changeset 357e7d58ea2f --- jdk/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/jdk/.hgtags b/jdk/.hgtags index eeef1fce75e..f3ad419b9a7 100644 --- a/jdk/.hgtags +++ b/jdk/.hgtags @@ -29,3 +29,4 @@ fea0898259ae41c73620b1815aa48f036216155c jdk7-b51 bcbeadb4a5d759b29e876ee2c83401e91ff22f60 jdk7-b52 a2033addca678f9e4c0d92ffa1e389171cc9321d jdk7-b53 d1c43d1f5676a24ba86221ac7cad5694f3a9afda jdk7-b54 +522bb5aa17e0c0cff00b1ed7d1b51bc4db2cfef9 jdk7-b55 From c435a0905dfae827687ed46015269f9c1b36c239 Mon Sep 17 00:00:00 2001 From: Xueming Shen <sherman@openjdk.org> Date: Thu, 16 Apr 2009 21:00:42 -0700 Subject: [PATCH 287/292] 4244499: ZipEntry() does not convert filenames from Unicode to platform 4532049: IllegalArgumentException in ZipInputStream while reading unicode file 5030283: Incorrect implementation of UTF-8 in zip package 4700978: ZipFile can't treat Japanese name in a zipfile properly 4980042: Cannot use Surrogates in zip file metadata like filenames 4820807: java.util.zip.ZipInputStream cannot extract files with Chinese chars in name Add new constructors for zip classes to support non-UTF-8 encoded names/comments in ZIP file Reviewed-by: alanb, martin --- jdk/make/java/zip/FILES_c.gmk | 1 - jdk/make/java/zip/mapfile-vers | 12 +- jdk/make/java/zip/reorder-i586 | 12 +- jdk/make/java/zip/reorder-sparc | 12 +- jdk/make/java/zip/reorder-sparcv9 | 12 +- .../share/classes/java/util/zip/ZipCoder.java | 139 ++++ .../classes/java/util/zip/ZipConstants64.java | 7 + .../share/classes/java/util/zip/ZipEntry.java | 39 +- .../share/classes/java/util/zip/ZipFile.java | 208 ++++- .../classes/java/util/zip/ZipInputStream.java | 105 +-- .../java/util/zip/ZipOutputStream.java | 132 ++-- .../share/classes/java/util/zip/package.html | 5 + jdk/src/share/native/java/util/zip/ZipEntry.c | 105 --- jdk/src/share/native/java/util/zip/ZipFile.c | 74 +- jdk/src/share/native/java/util/zip/zip_util.c | 3 +- jdk/src/share/native/java/util/zip/zip_util.h | 1 + jdk/test/java/util/zip/ZipCoding.java | 133 ++++ jdk/test/java/util/zip/zip.java | 743 ++++++++++++++++++ 18 files changed, 1386 insertions(+), 357 deletions(-) create mode 100644 jdk/src/share/classes/java/util/zip/ZipCoder.java delete mode 100644 jdk/src/share/native/java/util/zip/ZipEntry.c create mode 100644 jdk/test/java/util/zip/ZipCoding.java create mode 100644 jdk/test/java/util/zip/zip.java diff --git a/jdk/make/java/zip/FILES_c.gmk b/jdk/make/java/zip/FILES_c.gmk index 6426cea2ced..f88386c8ee9 100644 --- a/jdk/make/java/zip/FILES_c.gmk +++ b/jdk/make/java/zip/FILES_c.gmk @@ -29,7 +29,6 @@ FILES_c = \ Deflater.c \ Inflater.c \ ZipFile.c \ - ZipEntry.c \ zadler32.c \ zcrc32.c \ deflate.c \ diff --git a/jdk/make/java/zip/mapfile-vers b/jdk/make/java/zip/mapfile-vers index 443ea67c83e..096fa35e434 100644 --- a/jdk/make/java/zip/mapfile-vers +++ b/jdk/make/java/zip/mapfile-vers @@ -50,15 +50,17 @@ SUNWprivate_1.1 { Java_java_util_zip_Inflater_initIDs; Java_java_util_zip_Inflater_reset; Java_java_util_zip_Inflater_setDictionary; - Java_java_util_zip_ZipEntry_initFields; - Java_java_util_zip_ZipEntry_initIDs; Java_java_util_zip_ZipFile_close; Java_java_util_zip_ZipFile_freeEntry; - Java_java_util_zip_ZipFile_getCSize; Java_java_util_zip_ZipFile_getEntry; - Java_java_util_zip_ZipFile_getMethod; + Java_java_util_zip_ZipFile_getEntryBytes; + Java_java_util_zip_ZipFile_getEntryCrc; + Java_java_util_zip_ZipFile_getEntryCSize; + Java_java_util_zip_ZipFile_getEntryFlag; + Java_java_util_zip_ZipFile_getEntryMethod; + Java_java_util_zip_ZipFile_getEntrySize; + Java_java_util_zip_ZipFile_getEntryTime; Java_java_util_zip_ZipFile_getNextEntry; - Java_java_util_zip_ZipFile_getSize; Java_java_util_zip_ZipFile_getZipMessage; Java_java_util_zip_ZipFile_getTotal; Java_java_util_zip_ZipFile_initIDs; diff --git a/jdk/make/java/zip/reorder-i586 b/jdk/make/java/zip/reorder-i586 index d1af81c9d7a..d9e90ead435 100644 --- a/jdk/make/java/zip/reorder-i586 +++ b/jdk/make/java/zip/reorder-i586 @@ -20,12 +20,14 @@ text: .text%Java_java_util_zip_ZipFile_initIDs; text: .text%Java_java_util_zip_ZipFile_open; text: .text%Java_java_util_zip_ZipFile_getTotal; text: .text%Java_java_util_zip_ZipFile_getEntry; -text: .text%Java_java_util_zip_ZipEntry_initIDs; -text: .text%Java_java_util_zip_ZipEntry_initFields; text: .text%Java_java_util_zip_ZipFile_freeEntry; -text: .text%Java_java_util_zip_ZipFile_getCSize; -text: .text%Java_java_util_zip_ZipFile_getSize; -text: .text%Java_java_util_zip_ZipFile_getMethod; +text: .text%Java_java_util_zip_ZipFile_getEntryTime; +text: .text%Java_java_util_zip_ZipFile_getEntryCrc; +text: .text%Java_java_util_zip_ZipFile_getEntryCSize; +text: .text%Java_java_util_zip_ZipFile_getEntrySize; +text: .text%Java_java_util_zip_ZipFile_getEntryFlag; +text: .text%Java_java_util_zip_ZipFile_getEntryMethod; +text: .text%Java_java_util_zip_ZipFile_getEntryBytes; text: .text%Java_java_util_zip_Inflater_initIDs; text: .text%Java_java_util_zip_Inflater_init; text: .text%inflateInit2_; diff --git a/jdk/make/java/zip/reorder-sparc b/jdk/make/java/zip/reorder-sparc index b004b3c7d0c..82cc81b6322 100644 --- a/jdk/make/java/zip/reorder-sparc +++ b/jdk/make/java/zip/reorder-sparc @@ -19,12 +19,14 @@ text: .text%Java_java_util_zip_ZipFile_initIDs; text: .text%Java_java_util_zip_ZipFile_open; text: .text%Java_java_util_zip_ZipFile_getTotal; text: .text%Java_java_util_zip_ZipFile_getEntry; -text: .text%Java_java_util_zip_ZipEntry_initIDs; -text: .text%Java_java_util_zip_ZipEntry_initFields; text: .text%Java_java_util_zip_ZipFile_freeEntry; -text: .text%Java_java_util_zip_ZipFile_getCSize; -text: .text%Java_java_util_zip_ZipFile_getSize; -text: .text%Java_java_util_zip_ZipFile_getMethod; +text: .text%Java_java_util_zip_ZipFile_getEntryTime; +text: .text%Java_java_util_zip_ZipFile_getEntryCrc; +text: .text%Java_java_util_zip_ZipFile_getEntryCSize; +text: .text%Java_java_util_zip_ZipFile_getEntrySize; +text: .text%Java_java_util_zip_ZipFile_getEntryFlag; +text: .text%Java_java_util_zip_ZipFile_getEntryMethod; +text: .text%Java_java_util_zip_ZipFile_getEntryBytes; text: .text%Java_java_util_zip_Inflater_initIDs; text: .text%Java_java_util_zip_Inflater_init; text: .text%inflateInit2_; diff --git a/jdk/make/java/zip/reorder-sparcv9 b/jdk/make/java/zip/reorder-sparcv9 index e1061f8ebae..a2b0f467df0 100644 --- a/jdk/make/java/zip/reorder-sparcv9 +++ b/jdk/make/java/zip/reorder-sparcv9 @@ -20,12 +20,14 @@ text: .text%Java_java_util_zip_ZipFile_initIDs; text: .text%Java_java_util_zip_ZipFile_open; text: .text%Java_java_util_zip_ZipFile_getTotal; text: .text%Java_java_util_zip_ZipFile_getEntry; -text: .text%Java_java_util_zip_ZipEntry_initIDs; -text: .text%Java_java_util_zip_ZipEntry_initFields; text: .text%Java_java_util_zip_ZipFile_freeEntry; -text: .text%Java_java_util_zip_ZipFile_getCSize; -text: .text%Java_java_util_zip_ZipFile_getSize; -text: .text%Java_java_util_zip_ZipFile_getMethod; +text: .text%Java_java_util_zip_ZipFile_getEntryTime; +text: .text%Java_java_util_zip_ZipFile_getEntryCrc; +text: .text%Java_java_util_zip_ZipFile_getEntryCSize; +text: .text%Java_java_util_zip_ZipFile_getEntrySize; +text: .text%Java_java_util_zip_ZipFile_getEntryFlag; +text: .text%Java_java_util_zip_ZipFile_getEntryMethod; +text: .text%Java_java_util_zip_ZipFile_getEntryBytes; text: .text%Java_java_util_zip_Inflater_initIDs; text: .text%Java_java_util_zip_Inflater_init; text: .text%inflateInit2_; diff --git a/jdk/src/share/classes/java/util/zip/ZipCoder.java b/jdk/src/share/classes/java/util/zip/ZipCoder.java new file mode 100644 index 00000000000..6442bea819d --- /dev/null +++ b/jdk/src/share/classes/java/util/zip/ZipCoder.java @@ -0,0 +1,139 @@ +/* + * Copyright 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. 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. + */ + +package java.util.zip; + +import java.nio.ByteBuffer; +import java.nio.CharBuffer; +import java.nio.charset.Charset; +import java.nio.charset.CharsetDecoder; +import java.nio.charset.CharsetEncoder; +import java.nio.charset.CoderResult; +import java.nio.charset.CodingErrorAction; +import java.util.Arrays; + +/** + * Utility class for zipfile name and comment decoding and encoding + */ + +final class ZipCoder { + + String toString(byte[] ba, int length) { + CharsetDecoder cd = decoder().reset(); + int len = (int)(length * cd.maxCharsPerByte()); + char[] ca = new char[len]; + if (len == 0) + return new String(ca); + ByteBuffer bb = ByteBuffer.wrap(ba, 0, length); + CharBuffer cb = CharBuffer.wrap(ca); + CoderResult cr = cd.decode(bb, cb, true); + if (!cr.isUnderflow()) + throw new IllegalArgumentException(cr.toString()); + cr = cd.flush(cb); + if (!cr.isUnderflow()) + throw new IllegalArgumentException(cr.toString()); + return new String(ca, 0, cb.position()); + } + + String toString(byte[] ba) { + return toString(ba, ba.length); + } + + byte[] getBytes(String s) { + CharsetEncoder ce = encoder().reset(); + char[] ca = s.toCharArray(); + int len = (int)(ca.length * ce.maxBytesPerChar()); + byte[] ba = new byte[len]; + if (len == 0) + return ba; + ByteBuffer bb = ByteBuffer.wrap(ba); + CharBuffer cb = CharBuffer.wrap(ca); + CoderResult cr = ce.encode(cb, bb, true); + if (!cr.isUnderflow()) + throw new IllegalArgumentException(cr.toString()); + cr = ce.flush(bb); + if (!cr.isUnderflow()) + throw new IllegalArgumentException(cr.toString()); + if (bb.position() == ba.length) // defensive copy? + return ba; + else + return Arrays.copyOf(ba, bb.position()); + } + + // assume invoked only if "this" is not utf8 + byte[] getBytesUTF8(String s) { + if (isutf8) + return getBytes(s); + if (utf8 == null) + utf8 = new ZipCoder(Charset.forName("UTF-8")); + return utf8.getBytes(s); + } + + + String toStringUTF8(byte[] ba, int len) { + if (isutf8) + return toString(ba, len); + if (utf8 == null) + utf8 = new ZipCoder(Charset.forName("UTF-8")); + return utf8.toString(ba, len); + } + + boolean isUTF8() { + return isutf8; + } + + private Charset cs; + private CharsetDecoder dec; + private CharsetEncoder enc; + private boolean isutf8; + private ZipCoder utf8; + + private ZipCoder(Charset cs) { + this.cs = cs; + this.isutf8 = cs.name().equals("UTF-8"); + } + + static ZipCoder get(Charset charset) { + return new ZipCoder(charset); + } + + private CharsetDecoder decoder() { + if (dec == null) { + dec = cs.newDecoder() + .onMalformedInput(CodingErrorAction.REPORT) + .onUnmappableCharacter(CodingErrorAction.REPORT); + } + return dec; + } + + private CharsetEncoder encoder() { + if (enc == null) { + enc = cs.newEncoder() + .onMalformedInput(CodingErrorAction.REPORT) + .onUnmappableCharacter(CodingErrorAction.REPORT); + } + return enc; + } +} diff --git a/jdk/src/share/classes/java/util/zip/ZipConstants64.java b/jdk/src/share/classes/java/util/zip/ZipConstants64.java index 1bf3b1841b4..b844b2cccee 100644 --- a/jdk/src/share/classes/java/util/zip/ZipConstants64.java +++ b/jdk/src/share/classes/java/util/zip/ZipConstants64.java @@ -73,5 +73,12 @@ class ZipConstants64 { static final int ZIP64_EXTSIZ = 8; // compressed size, 8-byte static final int ZIP64_EXTLEN = 16; // uncompressed size, 8-byte + /* + * Language encoding flag EFS + */ + static final int EFS = 0x800; // If this bit is set the filename and + // comment fields for this file must be + // encoded using UTF-8. + private ZipConstants64() {} } diff --git a/jdk/src/share/classes/java/util/zip/ZipEntry.java b/jdk/src/share/classes/java/util/zip/ZipEntry.java index 6c16a9adb15..96e3b4d828e 100644 --- a/jdk/src/share/classes/java/util/zip/ZipEntry.java +++ b/jdk/src/share/classes/java/util/zip/ZipEntry.java @@ -40,6 +40,7 @@ class ZipEntry implements ZipConstants, Cloneable { long size = -1; // uncompressed size of entry data long csize = -1; // compressed size of entry data int method = -1; // compression method + int flag = 0; // general purpose flag byte[] extra; // optional extra field data for entry String comment; // optional comment string for entry @@ -53,13 +54,6 @@ class ZipEntry implements ZipConstants, Cloneable { */ public static final int DEFLATED = 8; - static { - /* Zip library is loaded from System.initializeSystemClass */ - initIDs(); - } - - private static native void initIDs(); - /** * Creates a new zip entry with the specified name. * @@ -90,28 +84,15 @@ class ZipEntry implements ZipConstants, Cloneable { size = e.size; csize = e.csize; method = e.method; + flag = e.flag; extra = e.extra; comment = e.comment; } /* - * Creates a new zip entry for the given name with fields initialized - * from the specified jzentry data. + * Creates a new un-initialized zip entry */ - ZipEntry(String name, long jzentry) { - this.name = name; - initFields(jzentry); - } - - private native void initFields(long jzentry); - - /* - * Creates a new zip entry with fields initialized from the specified - * jzentry data. - */ - ZipEntry(long jzentry) { - initFields(jzentry); - } + ZipEntry() {} /** * Returns the name of the entry. @@ -258,16 +239,16 @@ class ZipEntry implements ZipConstants, Cloneable { /** * Sets the optional comment string for the entry. + * + * <p>ZIP entry comments have maximum length of 0xffff. If the length of the + * specified comment string is greater than 0xFFFF bytes after encoding, only + * the first 0xFFFF bytes are output to the ZIP file entry. + * * @param comment the comment string - * @exception IllegalArgumentException if the length of the specified - * comment string is greater than 0xFFFF bytes + * * @see #getComment() */ public void setComment(String comment) { - if (comment != null && comment.length() > 0xffff/3 - && ZipOutputStream.getUTF8Length(comment) > 0xffff) { - throw new IllegalArgumentException("invalid entry comment length"); - } this.comment = comment; } diff --git a/jdk/src/share/classes/java/util/zip/ZipFile.java b/jdk/src/share/classes/java/util/zip/ZipFile.java index 37e92ddecb7..8ee0bc2eb57 100644 --- a/jdk/src/share/classes/java/util/zip/ZipFile.java +++ b/jdk/src/share/classes/java/util/zip/ZipFile.java @@ -29,9 +29,11 @@ import java.io.InputStream; import java.io.IOException; import java.io.EOFException; import java.io.File; +import java.nio.charset.Charset; import java.util.Vector; import java.util.Enumeration; import java.util.NoSuchElementException; +import static java.util.zip.ZipConstants64.*; /** * This class is used to read entries from a zip file. @@ -76,16 +78,19 @@ class ZipFile implements ZipConstants { /** * Opens a zip file for reading. * - * <p>First, if there is a security - * manager, its <code>checkRead</code> method - * is called with the <code>name</code> argument - * as its argument to ensure the read is allowed. + * <p>First, if there is a security manager, its <code>checkRead</code> + * method is called with the <code>name</code> argument as its argument + * to ensure the read is allowed. + * + * <p>The UTF-8 {@link java.nio.charset.Charset charset} is used to + * decode the entry names and comments. * * @param name the name of the zip file * @throws ZipException if a ZIP format error has occurred * @throws IOException if an I/O error has occurred * @throws SecurityException if a security manager exists and its * <code>checkRead</code> method doesn't allow read access to the file. + * * @see SecurityManager#checkRead(java.lang.String) */ public ZipFile(String name) throws IOException { @@ -101,6 +106,9 @@ class ZipFile implements ZipConstants { * method is called with the <code>name</code> argument as its argument to * ensure the read is allowed. * + * <p>The UTF-8 {@link java.nio.charset.Charset charset} is used to + * decode the entry names and comments + * * @param file the ZIP file to be opened for reading * @param mode the mode in which the file is to be opened * @throws ZipException if a ZIP format error has occurred @@ -115,6 +123,59 @@ class ZipFile implements ZipConstants { * @since 1.3 */ public ZipFile(File file, int mode) throws IOException { + this(file, mode, Charset.forName("UTF-8")); + } + + /** + * Opens a ZIP file for reading given the specified File object. + * + * <p>The UTF-8 {@link java.nio.charset.Charset charset} is used to + * decode the entry names and comments. + * + * @param file the ZIP file to be opened for reading + * @throws ZipException if a ZIP format error has occurred + * @throws IOException if an I/O error has occurred + */ + public ZipFile(File file) throws ZipException, IOException { + this(file, OPEN_READ); + } + + private ZipCoder zc; + + /** + * Opens a new <code>ZipFile</code> to read from the specified + * <code>File</code> object in the specified mode. The mode argument + * must be either <tt>OPEN_READ</tt> or <tt>OPEN_READ | OPEN_DELETE</tt>. + * + * <p>First, if there is a security manager, its <code>checkRead</code> + * method is called with the <code>name</code> argument as its argument to + * ensure the read is allowed. + * + * @param file the ZIP file to be opened for reading + * @param mode the mode in which the file is to be opened + * @param charset + * the {@link java.nio.charset.Charset {@code charset}} to + * be used to decode the ZIP entry name and comment that are not + * encoded by using UTF-8 encoding (indicated by entry's general + * purpose flag). + * + * @throws ZipException if a ZIP format error has occurred + * @throws IOException if an I/O error has occurred + * + * @throws SecurityException + * if a security manager exists and its <code>checkRead</code> + * method doesn't allow read access to the file,or its + * <code>checkDelete</code> method doesn't allow deleting the + * file when the <tt>OPEN_DELETE</tt> flag is set + * + * @throws IllegalArgumentException if the <tt>mode</tt> argument is invalid + * + * @see SecurityManager#checkRead(java.lang.String) + * + * @since 1.7 + */ + public ZipFile(File file, int mode, Charset charset) throws IOException + { if (((mode & OPEN_READ) == 0) || ((mode & ~(OPEN_READ | OPEN_DELETE)) != 0)) { throw new IllegalArgumentException("Illegal mode: 0x"+ @@ -128,24 +189,61 @@ class ZipFile implements ZipConstants { sm.checkDelete(name); } } + if (charset == null) + throw new NullPointerException("charset is null"); + this.zc = ZipCoder.get(charset); jzfile = open(name, mode, file.lastModified()); - this.name = name; this.total = getTotal(jzfile); } - private static native long open(String name, int mode, long lastModified); - private static native int getTotal(long jzfile); - + /** + * Opens a zip file for reading. + * + * <p>First, if there is a security manager, its <code>checkRead</code> + * method is called with the <code>name</code> argument as its argument + * to ensure the read is allowed. + * + * @param name the name of the zip file + * @param charset + * the {@link java.nio.charset.Charset {@code charset}} to + * be used to decode the ZIP entry name and comment that are not + * encoded by using UTF-8 encoding (indicated by entry's general + * purpose flag). + * + * @throws ZipException if a ZIP format error has occurred + * @throws IOException if an I/O error has occurred + * @throws SecurityException + * if a security manager exists and its <code>checkRead</code> + * method doesn't allow read access to the file + * + * @see SecurityManager#checkRead(java.lang.String) + * + * @since 1.7 + */ + public ZipFile(String name, Charset charset) throws IOException + { + this(new File(name), OPEN_READ, charset); + } /** * Opens a ZIP file for reading given the specified File object. * @param file the ZIP file to be opened for reading - * @throws ZipException if a ZIP error has occurred + * @param charset + * The {@link java.nio.charset.Charset {@code charset}} to be + * used to decode the ZIP entry name and comment (ignored if + * the <a href="package-summary.html#lang_encoding"> language + * encoding bit</a> of the ZIP entry's general purpose bit + * flag is set). + * + * @throws ZipException if a ZIP format error has occurred * @throws IOException if an I/O error has occurred + * + * @since 1.7 */ - public ZipFile(File file) throws ZipException, IOException { - this(file, OPEN_READ); + public ZipFile(File file, Charset charset) throws IOException + { + this(file, OPEN_READ, charset); } /** @@ -163,9 +261,9 @@ class ZipFile implements ZipConstants { long jzentry = 0; synchronized (this) { ensureOpen(); - jzentry = getEntry(jzfile, name, true); + jzentry = getEntry(jzfile, zc.getBytes(name), true); if (jzentry != 0) { - ZipEntry ze = new ZipEntry(name, jzentry); + ZipEntry ze = getZipEntry(name, jzentry); freeEntry(jzfile, jzentry); return ze; } @@ -173,7 +271,7 @@ class ZipFile implements ZipConstants { return null; } - private static native long getEntry(long jzfile, String name, + private static native long getEntry(long jzfile, byte[] name, boolean addSlash); // freeEntry releases the C jzentry struct. @@ -194,36 +292,30 @@ class ZipFile implements ZipConstants { * @throws IllegalStateException if the zip file has been closed */ public InputStream getInputStream(ZipEntry entry) throws IOException { - return getInputStream(entry.name); - } - - /** - * Returns an input stream for reading the contents of the specified - * entry, or null if the entry was not found. - */ - private InputStream getInputStream(String name) throws IOException { - if (name == null) { - throw new NullPointerException("name"); + if (entry == null) { + throw new NullPointerException("entry"); } long jzentry = 0; ZipFileInputStream in = null; synchronized (this) { ensureOpen(); - jzentry = getEntry(jzfile, name, false); + if (!zc.isUTF8() && (entry.flag & EFS) != 0) { + jzentry = getEntry(jzfile, zc.getBytesUTF8(entry.name), false); + } else { + jzentry = getEntry(jzfile, zc.getBytes(entry.name), false); + } if (jzentry == 0) { return null; } - in = new ZipFileInputStream(jzentry); - } final ZipFileInputStream zfin = in; - switch (getMethod(jzentry)) { + switch (getEntryMethod(jzentry)) { case STORED: return zfin; case DEFLATED: // MORE: Compute good size for inflater stream: - long size = getSize(jzentry) + 2; // Inflater likes a bit of slack + long size = getEntrySize(jzentry) + 2; // Inflater likes a bit of slack if (size > 65536) size = 8192; if (size <= 0) size = 4096; return new InflaterInputStream(zfin, getInflater(), (int)size) { @@ -267,8 +359,6 @@ class ZipFile implements ZipConstants { } } - private static native int getMethod(long jzentry); - /* * Gets an inflater from the list of available inflaters or allocates * a new one. @@ -343,7 +433,7 @@ class ZipFile implements ZipConstants { ",\n message = " + message ); } - ZipEntry ze = new ZipEntry(jzentry); + ZipEntry ze = getZipEntry(null, jzentry); freeEntry(jzfile, jzentry); return ze; } @@ -351,6 +441,38 @@ class ZipFile implements ZipConstants { }; } + private ZipEntry getZipEntry(String name, long jzentry) { + ZipEntry e = new ZipEntry(); + e.flag = getEntryFlag(jzentry); // get the flag first + if (name != null) { + e.name = name; + } else { + byte[] bname = getEntryBytes(jzentry, JZENTRY_NAME); + if (!zc.isUTF8() && (e.flag & EFS) != 0) { + e.name = zc.toStringUTF8(bname, bname.length); + } else { + e.name = zc.toString(bname, bname.length); + } + } + e.time = getEntryTime(jzentry); + e.crc = getEntryCrc(jzentry); + e.size = getEntrySize(jzentry); + e. csize = getEntryCSize(jzentry); + e.method = getEntryMethod(jzentry); + e.extra = getEntryBytes(jzentry, JZENTRY_EXTRA); + byte[] bcomm = getEntryBytes(jzentry, JZENTRY_COMMENT); + if (bcomm == null) { + e.comment = null; + } else { + if (!zc.isUTF8() && (e.flag & EFS) != 0) { + e.comment = zc.toStringUTF8(bcomm, bcomm.length); + } else { + e.comment = zc.toString(bcomm, bcomm.length); + } + } + return e; + } + private static native long getNextEntry(long jzfile, int i); /** @@ -443,8 +565,8 @@ class ZipFile implements ZipConstants { ZipFileInputStream(long jzentry) { pos = 0; - rem = getCSize(jzentry); - size = getSize(jzentry); + rem = getEntryCSize(jzentry); + size = getEntrySize(jzentry); this.jzentry = jzentry; } @@ -514,13 +636,25 @@ class ZipFile implements ZipConstants { } + + private static native long open(String name, int mode, long lastModified) + throws IOException; + private static native int getTotal(long jzfile); private static native int read(long jzfile, long jzentry, long pos, byte[] b, int off, int len); - private static native long getCSize(long jzentry); + // access to the native zentry object + private static native long getEntryTime(long jzentry); + private static native long getEntryCrc(long jzentry); + private static native long getEntryCSize(long jzentry); + private static native long getEntrySize(long jzentry); + private static native int getEntryMethod(long jzentry); + private static native int getEntryFlag(long jzentry); - private static native long getSize(long jzentry); + private static final int JZENTRY_NAME = 0; + private static final int JZENTRY_EXTRA = 1; + private static final int JZENTRY_COMMENT = 2; + private static native byte[] getEntryBytes(long jzentry, int type); - // Temporary add on for bug troubleshooting private static native String getZipMessage(long jzfile); } diff --git a/jdk/src/share/classes/java/util/zip/ZipInputStream.java b/jdk/src/share/classes/java/util/zip/ZipInputStream.java index 1b9b93415cb..83f9ad4b753 100644 --- a/jdk/src/share/classes/java/util/zip/ZipInputStream.java +++ b/jdk/src/share/classes/java/util/zip/ZipInputStream.java @@ -29,6 +29,7 @@ import java.io.InputStream; import java.io.IOException; import java.io.EOFException; import java.io.PushbackInputStream; +import java.nio.charset.Charset; import static java.util.zip.ZipConstants64.*; /** @@ -54,6 +55,8 @@ class ZipInputStream extends InflaterInputStream implements ZipConstants { // one entry private boolean entryEOF = false; + private ZipCoder zc; + /** * Check to make sure that this stream has not been closed */ @@ -65,14 +68,39 @@ class ZipInputStream extends InflaterInputStream implements ZipConstants { /** * Creates a new ZIP input stream. + * + * <p>The UTF-8 {@link java.nio.charset.Charset charset} is used to + * decode the entry names. + * * @param in the actual input stream */ public ZipInputStream(InputStream in) { + this(in, Charset.forName("UTF-8")); + } + + /** + * Creates a new ZIP input stream. + * + * @param in the actual input stream + * + * @param charset + * The {@link java.nio.charset.Charset {@code charset}} to be + * used to decode the ZIP entry name (ignored if the + * <a href="package-summary.html#lang_encoding"> language + * encoding bit</a> of the ZIP entry's general purpose bit + * flag is set). + * + * @since 1.7 + */ + public ZipInputStream(InputStream in, Charset charset) { super(new PushbackInputStream(in, 512), new Inflater(true), 512); usesDefaultInflater = true; if(in == null) { throw new NullPointerException("in is null"); } + if (charset == null) + throw new NullPointerException("charset is null"); + this.zc = ZipCoder.get(charset); } /** @@ -141,8 +169,8 @@ class ZipInputStream extends InflaterInputStream implements ZipConstants { * @param len the maximum number of bytes read * @return the actual number of bytes read, or -1 if the end of the * entry is reached - * @exception NullPointerException If <code>b</code> is <code>null</code>. - * @exception IndexOutOfBoundsException If <code>off</code> is negative, + * @exception NullPointerException if <code>b</code> is <code>null</code>. + * @exception IndexOutOfBoundsException if <code>off</code> is negative, * <code>len</code> is negative, or <code>len</code> is greater than * <code>b.length - off</code> * @exception ZipException if a ZIP file error has occurred @@ -252,6 +280,8 @@ class ZipInputStream extends InflaterInputStream implements ZipConstants { if (get32(tmpbuf, 0) != LOCSIG) { return null; } + // get flag first, we need check EFS. + flag = get16(tmpbuf, LOCFLG); // get the entry name and create the ZipEntry first int len = get16(tmpbuf, LOCNAM); int blen = b.length; @@ -262,9 +292,11 @@ class ZipInputStream extends InflaterInputStream implements ZipConstants { b = new byte[blen]; } readFully(b, 0, len); - ZipEntry e = createZipEntry(getUTF8String(b, 0, len)); + // Force to use UTF-8 if the EFS bit is ON, even the cs is NOT UTF-8 + ZipEntry e = createZipEntry(((flag & EFS) != 0) + ? zc.toStringUTF8(b, len) + : zc.toString(b, len)); // now get the remaining fields for the entry - flag = get16(tmpbuf, LOCFLG); if ((flag & 1) == 1) { throw new ZipException("encrypted ZIP entry not supported"); } @@ -313,71 +345,6 @@ class ZipInputStream extends InflaterInputStream implements ZipConstants { return e; } - /* - * Fetches a UTF8-encoded String from the specified byte array. - */ - private static String getUTF8String(byte[] b, int off, int len) { - // First, count the number of characters in the sequence - int count = 0; - int max = off + len; - int i = off; - while (i < max) { - int c = b[i++] & 0xff; - switch (c >> 4) { - case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: - // 0xxxxxxx - count++; - break; - case 12: case 13: - // 110xxxxx 10xxxxxx - if ((b[i++] & 0xc0) != 0x80) { - throw new IllegalArgumentException(); - } - count++; - break; - case 14: - // 1110xxxx 10xxxxxx 10xxxxxx - if (((b[i++] & 0xc0) != 0x80) || - ((b[i++] & 0xc0) != 0x80)) { - throw new IllegalArgumentException(); - } - count++; - break; - default: - // 10xxxxxx, 1111xxxx - throw new IllegalArgumentException(); - } - } - if (i != max) { - throw new IllegalArgumentException(); - } - // Now decode the characters... - char[] cs = new char[count]; - i = 0; - while (off < max) { - int c = b[off++] & 0xff; - switch (c >> 4) { - case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: - // 0xxxxxxx - cs[i++] = (char)c; - break; - case 12: case 13: - // 110xxxxx 10xxxxxx - cs[i++] = (char)(((c & 0x1f) << 6) | (b[off++] & 0x3f)); - break; - case 14: - // 1110xxxx 10xxxxxx 10xxxxxx - int t = (b[off++] & 0x3f) << 6; - cs[i++] = (char)(((c & 0x0f) << 12) | t | (b[off++] & 0x3f)); - break; - default: - // 10xxxxxx, 1111xxxx - throw new IllegalArgumentException(); - } - } - return new String(cs, 0, count); - } - /** * Creates a new <code>ZipEntry</code> object for the specified * entry name. diff --git a/jdk/src/share/classes/java/util/zip/ZipOutputStream.java b/jdk/src/share/classes/java/util/zip/ZipOutputStream.java index bd44d3213cf..da35ed97f14 100644 --- a/jdk/src/share/classes/java/util/zip/ZipOutputStream.java +++ b/jdk/src/share/classes/java/util/zip/ZipOutputStream.java @@ -27,6 +27,7 @@ package java.util.zip; import java.io.OutputStream; import java.io.IOException; +import java.nio.charset.Charset; import java.util.Vector; import java.util.HashSet; import static java.util.zip.ZipConstants64.*; @@ -44,19 +45,9 @@ class ZipOutputStream extends DeflaterOutputStream implements ZipConstants { private static class XEntry { public final ZipEntry entry; public final long offset; - public final int flag; public XEntry(ZipEntry entry, long offset) { this.entry = entry; this.offset = offset; - this.flag = (entry.method == DEFLATED && - (entry.size == -1 || - entry.csize == -1 || - entry.crc == -1)) - // store size, compressed size, and crc-32 in data descriptor - // immediately following the compressed entry data - ? 8 - // store size, compressed size, and crc-32 in LOC header - : 0; } } @@ -66,12 +57,14 @@ class ZipOutputStream extends DeflaterOutputStream implements ZipConstants { private CRC32 crc = new CRC32(); private long written = 0; private long locoff = 0; - private String comment; + private byte[] comment; private int method = DEFLATED; private boolean finished; private boolean closed = false; + private final ZipCoder zc; + private static int version(ZipEntry e) throws ZipException { switch (e.method) { case DEFLATED: return 20; @@ -100,10 +93,31 @@ class ZipOutputStream extends DeflaterOutputStream implements ZipConstants { /** * Creates a new ZIP output stream. + * + * <p>The UTF-8 {@link java.nio.charset.Charset charset} is used + * to encode the entry names and comments. + * * @param out the actual output stream */ public ZipOutputStream(OutputStream out) { + this(out, Charset.forName("UTF-8")); + } + + /** + * Creates a new ZIP output stream. + * + * @param out the actual output stream + * + * @param charset the {@link java.nio.charset.Charset </code>charset<code>} + * to be used to encode the entry names and comments + * + * @since 1.7 + */ + public ZipOutputStream(OutputStream out, Charset charset) { super(out, new Deflater(Deflater.DEFAULT_COMPRESSION, true)); + if (charset == null) + throw new NullPointerException("charset is null"); + this.zc = ZipCoder.get(charset); usesDefaultDeflater = true; } @@ -114,11 +128,11 @@ class ZipOutputStream extends DeflaterOutputStream implements ZipConstants { * ZIP file comment is greater than 0xFFFF bytes */ public void setComment(String comment) { - if (comment != null && comment.length() > 0xffff/3 - && getUTF8Length(comment) > 0xffff) { - throw new IllegalArgumentException("ZIP file comment too long."); + if (comment != null) { + this.comment = zc.getBytes(comment); + if (this.comment.length > 0xffff) + throw new IllegalArgumentException("ZIP file comment too long."); } - this.comment = comment; } /** @@ -167,8 +181,15 @@ class ZipOutputStream extends DeflaterOutputStream implements ZipConstants { if (e.method == -1) { e.method = method; // use default method } + // store size, compressed size, and crc-32 in LOC header + e.flag = 0; switch (e.method) { case DEFLATED: + // store size, compressed size, and crc-32 in data descriptor + // immediately following the compressed entry data + if (e.size == -1 || e.csize == -1 || e.crc == -1) + e.flag = 8; + break; case STORED: // compressed size, uncompressed size, and crc-32 must all be @@ -192,6 +213,8 @@ class ZipOutputStream extends DeflaterOutputStream implements ZipConstants { if (! names.add(e.name)) { throw new ZipException("duplicate entry: " + e.name); } + if (zc.isUTF8()) + e.flag |= EFS; current = new XEntry(e, written); xentries.add(current); writeLOC(current); @@ -213,7 +236,7 @@ class ZipOutputStream extends DeflaterOutputStream implements ZipConstants { while (!def.finished()) { deflate(); } - if ((current.flag & 8) == 0) { + if ((e.flag & 8) == 0) { // verify size, compressed size, and crc-32 settings if (e.size != def.getBytesRead()) { throw new ZipException( @@ -343,11 +366,11 @@ class ZipOutputStream extends DeflaterOutputStream implements ZipConstants { */ private void writeLOC(XEntry xentry) throws IOException { ZipEntry e = xentry.entry; - int flag = xentry.flag; + int flag = e.flag; int elen = (e.extra != null) ? e.extra.length : 0; boolean hasZip64 = false; - writeInt(LOCSIG); // LOC header signature + writeInt(LOCSIG); // LOC header signature if ((flag & 8) == 8) { writeShort(version(e)); // version needed to extract @@ -380,7 +403,7 @@ class ZipOutputStream extends DeflaterOutputStream implements ZipConstants { writeInt(e.size); // uncompressed size } } - byte[] nameBytes = getUTF8Bytes(e.name); + byte[] nameBytes = zc.getBytes(e.name); writeShort(nameBytes.length); writeShort(elen); writeBytes(nameBytes, 0, nameBytes.length); @@ -417,7 +440,7 @@ class ZipOutputStream extends DeflaterOutputStream implements ZipConstants { */ private void writeCEN(XEntry xentry) throws IOException { ZipEntry e = xentry.entry; - int flag = xentry.flag; + int flag = e.flag; int version = version(e); long csize = e.csize; @@ -454,7 +477,7 @@ class ZipOutputStream extends DeflaterOutputStream implements ZipConstants { writeInt(e.crc); // crc-32 writeInt(csize); // compressed size writeInt(size); // uncompressed size - byte[] nameBytes = getUTF8Bytes(e.name); + byte[] nameBytes = zc.getBytes(e.name); writeShort(nameBytes.length); if (hasZip64) { // + headid(2) + datasize(2) @@ -464,8 +487,8 @@ class ZipOutputStream extends DeflaterOutputStream implements ZipConstants { } byte[] commentBytes; if (e.comment != null) { - commentBytes = getUTF8Bytes(e.comment); - writeShort(commentBytes.length); + commentBytes = zc.getBytes(e.comment); + writeShort(Math.min(commentBytes.length, 0xffff)); } else { commentBytes = null; writeShort(0); @@ -489,7 +512,7 @@ class ZipOutputStream extends DeflaterOutputStream implements ZipConstants { writeBytes(e.extra, 0, e.extra.length); } if (commentBytes != null) { - writeBytes(commentBytes, 0, commentBytes.length); + writeBytes(commentBytes, 0, Math.min(commentBytes.length, 0xffff)); } } @@ -541,9 +564,8 @@ class ZipOutputStream extends DeflaterOutputStream implements ZipConstants { writeInt(xlen); // length of central directory writeInt(xoff); // offset of central directory if (comment != null) { // zip file comment - byte[] b = getUTF8Bytes(comment); - writeShort(b.length); - writeBytes(b, 0, b.length); + writeShort(comment.length); + writeBytes(comment, 0, comment.length); } else { writeShort(0); } @@ -594,60 +616,4 @@ class ZipOutputStream extends DeflaterOutputStream implements ZipConstants { super.out.write(b, off, len); written += len; } - - /* - * Returns the length of String's UTF8 encoding. - */ - static int getUTF8Length(String s) { - int count = 0; - for (int i = 0; i < s.length(); i++) { - char ch = s.charAt(i); - if (ch <= 0x7f) { - count++; - } else if (ch <= 0x7ff) { - count += 2; - } else { - count += 3; - } - } - return count; - } - - /* - * Returns an array of bytes representing the UTF8 encoding - * of the specified String. - */ - private static byte[] getUTF8Bytes(String s) { - char[] c = s.toCharArray(); - int len = c.length; - // Count the number of encoded bytes... - int count = 0; - for (int i = 0; i < len; i++) { - int ch = c[i]; - if (ch <= 0x7f) { - count++; - } else if (ch <= 0x7ff) { - count += 2; - } else { - count += 3; - } - } - // Now return the encoded bytes... - byte[] b = new byte[count]; - int off = 0; - for (int i = 0; i < len; i++) { - int ch = c[i]; - if (ch <= 0x7f) { - b[off++] = (byte)ch; - } else if (ch <= 0x7ff) { - b[off++] = (byte)((ch >> 6) | 0xc0); - b[off++] = (byte)((ch & 0x3f) | 0x80); - } else { - b[off++] = (byte)((ch >> 12) | 0xe0); - b[off++] = (byte)(((ch >> 6) & 0x3f) | 0x80); - b[off++] = (byte)((ch & 0x3f) | 0x80); - } - } - return b; - } } diff --git a/jdk/src/share/classes/java/util/zip/package.html b/jdk/src/share/classes/java/util/zip/package.html index d4b59263678..83d117de55e 100644 --- a/jdk/src/share/classes/java/util/zip/package.html +++ b/jdk/src/share/classes/java/util/zip/package.html @@ -52,6 +52,11 @@ input streams. <a href="http://www.pkware.com/documents/casestudies/APPNOTE.TXT"> PKWARE ZIP File Format Specification</a>. The ZIP64(tm) format extensions are used to overcome the size limitations of the original ZIP format. +<p> + <a name="lang_encoding"> + <li>APPENDIX D of <a href="http://www.pkware.com/documents/casestudies/APPNOTE.TXT"> + PKWARE ZIP File Format Specification</a> - Language Encoding Flag (EFS) to + encode ZIP entry filename and comment fields using UTF-8. <p> <li><a href="http://www.isi.edu/in-notes/rfc1950.txt"> ZLIB Compressed Data Format Specification version 3.3</a> diff --git a/jdk/src/share/native/java/util/zip/ZipEntry.c b/jdk/src/share/native/java/util/zip/ZipEntry.c deleted file mode 100644 index 94cd68e1b12..00000000000 --- a/jdk/src/share/native/java/util/zip/ZipEntry.c +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright 1998 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. - */ - -/* - * Native method support for java.util.zip.ZipEntry - */ - -#include <stdio.h> -#include <stdlib.h> -#include "jlong.h" -#include "jvm.h" -#include "jni.h" -#include "jni_util.h" -#include "zip_util.h" - -#include "java_util_zip_ZipEntry.h" - -#define DEFLATED 8 -#define STORED 0 - -static jfieldID nameID; -static jfieldID timeID; -static jfieldID crcID; -static jfieldID sizeID; -static jfieldID csizeID; -static jfieldID methodID; -static jfieldID extraID; -static jfieldID commentID; - -JNIEXPORT void JNICALL -Java_java_util_zip_ZipEntry_initIDs(JNIEnv *env, jclass cls) -{ - nameID = (*env)->GetFieldID(env, cls, "name", "Ljava/lang/String;"); - timeID = (*env)->GetFieldID(env, cls, "time", "J"); - crcID = (*env)->GetFieldID(env, cls, "crc", "J"); - sizeID = (*env)->GetFieldID(env, cls, "size", "J"); - csizeID = (*env)->GetFieldID(env, cls, "csize", "J"); - methodID = (*env)->GetFieldID(env, cls, "method", "I"); - extraID = (*env)->GetFieldID(env, cls, "extra", "[B"); - commentID = (*env)->GetFieldID(env, cls, "comment", "Ljava/lang/String;"); -} - -JNIEXPORT void JNICALL -Java_java_util_zip_ZipEntry_initFields(JNIEnv *env, jobject obj, jlong zentry) -{ - jzentry *ze = jlong_to_ptr(zentry); - jstring name = (*env)->GetObjectField(env, obj, nameID); - - if (name == 0) { - name = (*env)->NewStringUTF(env, ze->name); - if (name == 0) { - return; - } - (*env)->SetObjectField(env, obj, nameID, name); - } - (*env)->SetLongField(env, obj, timeID, (jlong)ze->time & 0xffffffffUL); - (*env)->SetLongField(env, obj, crcID, (jlong)ze->crc & 0xffffffffUL); - (*env)->SetLongField(env, obj, sizeID, (jlong)ze->size); - if (ze->csize == 0) { - (*env)->SetLongField(env, obj, csizeID, (jlong)ze->size); - (*env)->SetIntField(env, obj, methodID, STORED); - } else { - (*env)->SetLongField(env, obj, csizeID, (jlong)ze->csize); - (*env)->SetIntField(env, obj, methodID, DEFLATED); - } - if (ze->extra != 0) { - unsigned char *bp = (unsigned char *)&ze->extra[0]; - jsize len = (bp[0] | (bp[1] << 8)); - jbyteArray extra = (*env)->NewByteArray(env, len); - if (extra == 0) { - return; - } - (*env)->SetByteArrayRegion(env, extra, 0, len, &ze->extra[2]); - (*env)->SetObjectField(env, obj, extraID, extra); - } - if (ze->comment != 0) { - jstring comment = (*env)->NewStringUTF(env, ze->comment); - if (comment == 0) { - return; - } - (*env)->SetObjectField(env, obj, commentID, comment); - } -} diff --git a/jdk/src/share/native/java/util/zip/ZipFile.c b/jdk/src/share/native/java/util/zip/ZipFile.c index 0c20536b49a..d5cb1ecac8b 100644 --- a/jdk/src/share/native/java/util/zip/ZipFile.c +++ b/jdk/src/share/native/java/util/zip/ZipFile.c @@ -141,12 +141,11 @@ Java_java_util_zip_ZipFile_close(JNIEnv *env, jclass cls, jlong zfile) JNIEXPORT jlong JNICALL Java_java_util_zip_ZipFile_getEntry(JNIEnv *env, jclass cls, jlong zfile, - jstring name, jboolean addSlash) + jbyteArray name, jboolean addSlash) { #define MAXNAME 1024 jzfile *zip = jlong_to_ptr(zfile); - jsize slen = (*env)->GetStringLength(env, name); - jsize ulen = (*env)->GetStringUTFLength(env, name); + jsize ulen = (*env)->GetArrayLength(env, name); char buf[MAXNAME+2], *path; jzentry *ze; @@ -159,7 +158,7 @@ Java_java_util_zip_ZipFile_getEntry(JNIEnv *env, jclass cls, jlong zfile, } else { path = buf; } - (*env)->GetStringUTFRegion(env, name, 0, slen, path); + (*env)->GetByteArrayRegion(env, name, 0, ulen, (jbyte *)path); path[ulen] = '\0'; if (addSlash == JNI_FALSE) { ze = ZIP_GetEntry(zip, path, 0); @@ -186,34 +185,87 @@ Java_java_util_zip_ZipFile_getNextEntry(JNIEnv *env, jclass cls, jlong zfile, jint n) { jzentry *ze = ZIP_GetNextEntry(jlong_to_ptr(zfile), n); - return ptr_to_jlong(ze); } JNIEXPORT jint JNICALL -Java_java_util_zip_ZipFile_getMethod(JNIEnv *env, jclass cls, jlong zentry) +Java_java_util_zip_ZipFile_getEntryMethod(JNIEnv *env, jclass cls, jlong zentry) { jzentry *ze = jlong_to_ptr(zentry); - return ze->csize != 0 ? DEFLATED : STORED; } -JNIEXPORT jlong JNICALL -Java_java_util_zip_ZipFile_getCSize(JNIEnv *env, jclass cls, jlong zentry) +JNIEXPORT jint JNICALL +Java_java_util_zip_ZipFile_getEntryFlag(JNIEnv *env, jclass cls, jlong zentry) { jzentry *ze = jlong_to_ptr(zentry); + return ze->flag; +} +JNIEXPORT jlong JNICALL +Java_java_util_zip_ZipFile_getEntryCSize(JNIEnv *env, jclass cls, jlong zentry) +{ + jzentry *ze = jlong_to_ptr(zentry); return ze->csize != 0 ? ze->csize : ze->size; } JNIEXPORT jlong JNICALL -Java_java_util_zip_ZipFile_getSize(JNIEnv *env, jclass cls, jlong zentry) +Java_java_util_zip_ZipFile_getEntrySize(JNIEnv *env, jclass cls, jlong zentry) { jzentry *ze = jlong_to_ptr(zentry); - return ze->size; } +JNIEXPORT jlong JNICALL +Java_java_util_zip_ZipFile_getEntryTime(JNIEnv *env, jclass cls, jlong zentry) +{ + jzentry *ze = jlong_to_ptr(zentry); + return (jlong)ze->time & 0xffffffffUL; +} + +JNIEXPORT jlong JNICALL +Java_java_util_zip_ZipFile_getEntryCrc(JNIEnv *env, jclass cls, jlong zentry) +{ + jzentry *ze = jlong_to_ptr(zentry); + return (jlong)ze->crc & 0xffffffffUL; +} + +JNIEXPORT jbyteArray JNICALL +Java_java_util_zip_ZipFile_getEntryBytes(JNIEnv *env, jclass cls, jlong zentry, jint type) +{ + jzentry *ze = jlong_to_ptr(zentry); + int len = 0; + jbyteArray jba = NULL; + switch (type) { + case java_util_zip_ZipFile_JZENTRY_NAME: + if (ze->name != 0) { + len = (int)strlen(ze->name); + if (len == 0 || (jba = (*env)->NewByteArray(env, len)) == NULL) + break; + (*env)->SetByteArrayRegion(env, jba, 0, len, (jbyte *)ze->name); + } + break; + case java_util_zip_ZipFile_JZENTRY_EXTRA: + if (ze->extra != 0) { + unsigned char *bp = (unsigned char *)&ze->extra[0]; + len = (bp[0] | (bp[1] << 8)); + if (len <= 0 || (jba = (*env)->NewByteArray(env, len)) == NULL) + break; + (*env)->SetByteArrayRegion(env, jba, 0, len, &ze->extra[2]); + } + break; + case java_util_zip_ZipFile_JZENTRY_COMMENT: + if (ze->comment != 0) { + len = (int)strlen(ze->comment); + if (len == 0 || (jba = (*env)->NewByteArray(env, len)) == NULL) + break; + (*env)->SetByteArrayRegion(env, jba, 0, len, (jbyte*)ze->comment); + } + break; + } + return jba; +} + JNIEXPORT jint JNICALL Java_java_util_zip_ZipFile_read(JNIEnv *env, jclass cls, jlong zfile, jlong zentry, jlong pos, jbyteArray bytes, diff --git a/jdk/src/share/native/java/util/zip/zip_util.c b/jdk/src/share/native/java/util/zip/zip_util.c index 89f52ae3bcc..626d4118f75 100644 --- a/jdk/src/share/native/java/util/zip/zip_util.c +++ b/jdk/src/share/native/java/util/zip/zip_util.c @@ -512,7 +512,6 @@ readCEN(jzfile *zip, jint knownTotal) /* Clear previous zip error */ zip->msg = NULL; - /* Get position of END header */ if ((endpos = findEND(zip, endbuf)) == -1) return -1; /* no END header or system error */ @@ -520,7 +519,6 @@ readCEN(jzfile *zip, jint knownTotal) if (endpos == 0) return 0; /* only END header present */ freeCEN(zip); - /* Get position and length of central directory */ cenlen = ENDSIZ(endbuf); cenoff = ENDOFF(endbuf); @@ -935,6 +933,7 @@ newEntry(jzfile *zip, jzcell *zc, AccessHint accessHint) ze->crc = CENCRC(cen); locoff = CENOFF(cen); ze->pos = -(zip->locpos + locoff); + ze->flag = CENFLG(cen); if ((ze->name = malloc(nlen + 1)) == NULL) goto Catch; memcpy(ze->name, cen + CENHDR, nlen); diff --git a/jdk/src/share/native/java/util/zip/zip_util.h b/jdk/src/share/native/java/util/zip/zip_util.h index 7ad11715e5a..311a9fcd9de 100644 --- a/jdk/src/share/native/java/util/zip/zip_util.h +++ b/jdk/src/share/native/java/util/zip/zip_util.h @@ -168,6 +168,7 @@ typedef struct jzentry { /* Zip file entry */ char *comment; /* optional zip file comment */ jbyte *extra; /* optional extra data */ jlong pos; /* position of LOC header or entry data */ + jint flag; /* general purpose flag */ } jzentry; /* diff --git a/jdk/test/java/util/zip/ZipCoding.java b/jdk/test/java/util/zip/ZipCoding.java new file mode 100644 index 00000000000..baedc449bfb --- /dev/null +++ b/jdk/test/java/util/zip/ZipCoding.java @@ -0,0 +1,133 @@ +/* + * Copyright 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 4244499 4532049 4700978 4820807 4980042 + * @summary Test ZipInputStream, ZipOutputStream and ZipFile with non-UTF8 encoding + */ + +import java.io.*; +import java.nio.charset.*; +import java.util.*; +import java.util.zip.*; + +public class ZipCoding { + + public static void main(String[] args) throws Exception { + + test("MS932", + "\u4e00\u4e01", "\uff67\uff68\uff69\uff6a\uff6b\uff6c"); + + test("ibm437", + "\u00e4\u00fc", "German Umlaut \u00fc in comment"); + + test("utf-8", + "\u4e00\u4e01", "\uff67\uff68\uff69\uff6a\uff6b\uff6c"); + + test("utf-8", + "\u00e4\u00fc", "German Umlaut \u00fc in comment"); + + test("utf-8", + "Surrogate\ud801\udc01", "Surrogates \ud800\udc00 in comment"); + + } + + static void testZipInputStream(InputStream is, Charset cs, + String name, String comment, byte[] bb) + throws Exception + { + ZipInputStream zis = new ZipInputStream(is, cs); + ZipEntry e = zis.getNextEntry(); + if (e == null || ! name.equals(e.getName())) + throw new RuntimeException("ZipIS name doesn't match!"); + byte[] bBuf = new byte[bb.length << 1]; + int n = zis.read(bBuf, 0, bBuf.length); + if (n != bb.length || + !Arrays.equals(bb, Arrays.copyOf(bBuf, n))) { + throw new RuntimeException("ZipIS content doesn't match!"); + } + zis.close(); + } + + static void testZipFile(File f, Charset cs, + String name, String comment, byte[] bb) + throws Exception + { + ZipFile zf = new ZipFile(f, cs); + Enumeration<? extends ZipEntry> zes = zf.entries(); + ZipEntry e = (ZipEntry)zes.nextElement(); + if (! name.equals(e.getName()) || + ! comment.equals(e.getComment())) + throw new RuntimeException("ZipFile: name/comment doesn't match!"); + InputStream is = zf.getInputStream(e); + if (is == null) + throw new RuntimeException("ZipFile: getIS failed!"); + byte[] bBuf = new byte[bb.length << 1]; + int n = 0; + int nn =0; + while ((nn = is.read(bBuf, n, bBuf.length-n)) != -1) { + n += nn; + } + if (n != bb.length || + !Arrays.equals(bb, Arrays.copyOf(bBuf, n))) { + throw new RuntimeException("ZipFile content doesn't match!"); + } + zf.close(); + } + + static void test(String csn, String name, String comment) + throws Exception + { + byte[] bb = "This is the conent of the zipfile".getBytes("ISO-8859-1"); + Charset cs = Charset.forName(csn); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ZipOutputStream zos = new ZipOutputStream(baos, cs); + + ZipEntry e = new ZipEntry(name); + e.setComment(comment); + zos.putNextEntry(e); + zos.write(bb, 0, bb.length); + zos.closeEntry(); + zos.close(); + ByteArrayInputStream bis = new ByteArrayInputStream(baos.toByteArray()); + testZipInputStream(bis, cs, name, comment, bb); + + if ("utf-8".equals(csn)) { + // EFS should be set + bis.reset(); + testZipInputStream(bis, Charset.forName("MS932"), name, comment, bb); + } + + File f = new File(new File(System.getProperty("test.dir", ".")), + "zfcoding.zip"); + FileOutputStream fos = new FileOutputStream(f); + baos.writeTo(fos); + fos.close(); + testZipFile(f, cs, name, comment, bb); + if ("utf-8".equals(csn)) { + testZipFile(f, Charset.forName("MS932"), name, comment, bb); + } + f.delete(); + } +} diff --git a/jdk/test/java/util/zip/zip.java b/jdk/test/java/util/zip/zip.java new file mode 100644 index 00000000000..33eccf9496d --- /dev/null +++ b/jdk/test/java/util/zip/zip.java @@ -0,0 +1,743 @@ +/* + * Copyright 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. 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. + */ + +import java.io.*; +import java.nio.charset.Charset; +import java.util.*; +import java.util.zip.*; +import java.text.MessageFormat; + +/** + * A stripped-down version of Jar tool with a "-encoding" option to + * support non-UTF8 encoidng for entry name and comment. + */ +public class zip { + String program; + PrintStream out, err; + String fname; + String zname = ""; + String[] files; + Charset cs = Charset.forName("UTF-8"); + + Map<String, File> entryMap = new HashMap<String, File>(); + Set<File> entries = new LinkedHashSet<File>(); + List<String> paths = new ArrayList<String>(); + + CRC32 crc32 = new CRC32(); + /* + * cflag: create + * uflag: update + * xflag: xtract + * tflag: table + * vflag: verbose + * flag0: no zip compression (store only) + */ + boolean cflag, uflag, xflag, tflag, vflag, flag0; + + private static ResourceBundle rsrc; + static { + try { + // just use the jar message + rsrc = ResourceBundle.getBundle("sun.tools.jar.resources.jar"); + } catch (MissingResourceException e) { + throw new Error("Fatal: Resource for jar is missing"); + } + } + + public zip(PrintStream out, PrintStream err, String program) { + this.out = out; + this.err = err; + this.program = program; + } + + private boolean ok; + + public synchronized boolean run(String args[]) { + ok = true; + if (!parseArgs(args)) { + return false; + } + try { + if (cflag || uflag) { + if (fname != null) { + zname = fname.replace(File.separatorChar, '/'); + if (zname.startsWith("./")) { + zname = zname.substring(2); + } + } + } + if (cflag) { + OutputStream out; + if (fname != null) { + out = new FileOutputStream(fname); + } else { + out = new FileOutputStream(FileDescriptor.out); + if (vflag) { + vflag = false; + } + } + expand(null, files, false); + create(new BufferedOutputStream(out, 4096)); + out.close(); + } else if (uflag) { + File inputFile = null, tmpFile = null; + FileInputStream in; + FileOutputStream out; + if (fname != null) { + inputFile = new File(fname); + String path = inputFile.getParent(); + tmpFile = File.createTempFile("tmp", null, + new File((path == null) ? "." : path)); + in = new FileInputStream(inputFile); + out = new FileOutputStream(tmpFile); + } else { + in = new FileInputStream(FileDescriptor.in); + out = new FileOutputStream(FileDescriptor.out); + vflag = false; + } + expand(null, files, true); + boolean updateOk = update(in, new BufferedOutputStream(out)); + if (ok) { + ok = updateOk; + } + in.close(); + out.close(); + if (fname != null) { + inputFile.delete(); + if (!tmpFile.renameTo(inputFile)) { + tmpFile.delete(); + throw new IOException(getMsg("error.write.file")); + } + tmpFile.delete(); + } + } else if (tflag) { + replaceFSC(files); + if (fname != null) { + list(fname, files); + } else { + InputStream in = new FileInputStream(FileDescriptor.in); + try{ + list(new BufferedInputStream(in), files); + } finally { + in.close(); + } + } + } else if (xflag) { + replaceFSC(files); + if (fname != null && files != null) { + extract(fname, files); + } else { + InputStream in = (fname == null) + ? new FileInputStream(FileDescriptor.in) + : new FileInputStream(fname); + try { + extract(new BufferedInputStream(in), files); + } finally { + in.close(); + } + } + } + } catch (IOException e) { + fatalError(e); + ok = false; + } catch (Error ee) { + ee.printStackTrace(); + ok = false; + } catch (Throwable t) { + t.printStackTrace(); + ok = false; + } + out.flush(); + err.flush(); + return ok; + } + + + boolean parseArgs(String args[]) { + try { + args = parse(args); + } catch (FileNotFoundException e) { + fatalError(formatMsg("error.cant.open", e.getMessage())); + return false; + } catch (IOException e) { + fatalError(e); + return false; + } + int count = 1; + try { + String flags = args[0]; + if (flags.startsWith("-")) { + flags = flags.substring(1); + } + for (int i = 0; i < flags.length(); i++) { + switch (flags.charAt(i)) { + case 'c': + if (xflag || tflag || uflag) { + usageError(); + return false; + } + cflag = true; + break; + case 'u': + if (cflag || xflag || tflag) { + usageError(); + return false; + } + uflag = true; + break; + case 'x': + if (cflag || uflag || tflag) { + usageError(); + return false; + } + xflag = true; + break; + case 't': + if (cflag || uflag || xflag) { + usageError(); + return false; + } + tflag = true; + break; + case 'v': + vflag = true; + break; + case 'f': + fname = args[count++]; + break; + case '0': + flag0 = true; + break; + default: + error(formatMsg("error.illegal.option", + String.valueOf(flags.charAt(i)))); + usageError(); + return false; + } + } + } catch (ArrayIndexOutOfBoundsException e) { + usageError(); + return false; + } + if (!cflag && !tflag && !xflag && !uflag) { + error(getMsg("error.bad.option")); + usageError(); + return false; + } + /* parse file arguments */ + int n = args.length - count; + if (n > 0) { + int k = 0; + String[] nameBuf = new String[n]; + try { + for (int i = count; i < args.length; i++) { + if (args[i].equals("-encoding")) { + cs = Charset.forName(args[++i]); + } else if (args[i].equals("-C")) { + /* change the directory */ + String dir = args[++i]; + dir = (dir.endsWith(File.separator) ? + dir : (dir + File.separator)); + dir = dir.replace(File.separatorChar, '/'); + while (dir.indexOf("//") > -1) { + dir = dir.replace("//", "/"); + } + paths.add(dir.replace(File.separatorChar, '/')); + nameBuf[k++] = dir + args[++i]; + } else { + nameBuf[k++] = args[i]; + } + } + } catch (ArrayIndexOutOfBoundsException e) { + e.printStackTrace(); + usageError(); + return false; + } + if (k != 0) { + files = new String[k]; + System.arraycopy(nameBuf, 0, files, 0, k); + } + } else if (cflag || uflag) { + error(getMsg("error.bad.uflag")); + usageError(); + return false; + } + return true; + } + + void expand(File dir, String[] files, boolean isUpdate) { + if (files == null) { + return; + } + for (int i = 0; i < files.length; i++) { + File f; + if (dir == null) { + f = new File(files[i]); + } else { + f = new File(dir, files[i]); + } + if (f.isFile()) { + if (entries.add(f)) { + if (isUpdate) + entryMap.put(entryName(f.getPath()), f); + } + } else if (f.isDirectory()) { + if (entries.add(f)) { + if (isUpdate) { + String dirPath = f.getPath(); + dirPath = (dirPath.endsWith(File.separator)) ? dirPath : + (dirPath + File.separator); + entryMap.put(entryName(dirPath), f); + } + expand(f, f.list(), isUpdate); + } + } else { + error(formatMsg("error.nosuch.fileordir", String.valueOf(f))); + ok = false; + } + } + } + + void create(OutputStream out) throws IOException + { + ZipOutputStream zos = new ZipOutputStream(out, cs); + if (flag0) { + zos.setMethod(ZipOutputStream.STORED); + } + for (File file: entries) { + addFile(zos, file); + } + zos.close(); + } + + boolean update(InputStream in, OutputStream out) throws IOException + { + ZipInputStream zis = new ZipInputStream(in, cs); + ZipOutputStream zos = new ZipOutputStream(out, cs); + ZipEntry e = null; + byte[] buf = new byte[1024]; + int n = 0; + boolean updateOk = true; + + // put the old entries first, replace if necessary + while ((e = zis.getNextEntry()) != null) { + String name = e.getName(); + if (!entryMap.containsKey(name)) { // copy the old stuff + // do our own compression + ZipEntry e2 = new ZipEntry(name); + e2.setMethod(e.getMethod()); + e2.setTime(e.getTime()); + e2.setComment(e.getComment()); + e2.setExtra(e.getExtra()); + if (e.getMethod() == ZipEntry.STORED) { + e2.setSize(e.getSize()); + e2.setCrc(e.getCrc()); + } + zos.putNextEntry(e2); + while ((n = zis.read(buf, 0, buf.length)) != -1) { + zos.write(buf, 0, n); + } + } else { // replace with the new files + File f = entryMap.get(name); + addFile(zos, f); + entryMap.remove(name); + entries.remove(f); + } + } + + // add the remaining new files + for (File f: entries) { + addFile(zos, f); + } + zis.close(); + zos.close(); + return updateOk; + } + + private String entryName(String name) { + name = name.replace(File.separatorChar, '/'); + String matchPath = ""; + for (String path : paths) { + if (name.startsWith(path) && (path.length() > matchPath.length())) { + matchPath = path; + } + } + name = name.substring(matchPath.length()); + + if (name.startsWith("/")) { + name = name.substring(1); + } else if (name.startsWith("./")) { + name = name.substring(2); + } + return name; + } + + void addFile(ZipOutputStream zos, File file) throws IOException { + String name = file.getPath(); + boolean isDir = file.isDirectory(); + if (isDir) { + name = name.endsWith(File.separator) ? name : + (name + File.separator); + } + name = entryName(name); + + if (name.equals("") || name.equals(".") || name.equals(zname)) { + return; + } + + long size = isDir ? 0 : file.length(); + + if (vflag) { + out.print(formatMsg("out.adding", name)); + } + ZipEntry e = new ZipEntry(name); + e.setTime(file.lastModified()); + if (size == 0) { + e.setMethod(ZipEntry.STORED); + e.setSize(0); + e.setCrc(0); + } else if (flag0) { + e.setSize(size); + e.setMethod(ZipEntry.STORED); + crc32File(e, file); + } + zos.putNextEntry(e); + if (!isDir) { + byte[] buf = new byte[8192]; + int len; + InputStream is = new BufferedInputStream(new FileInputStream(file)); + while ((len = is.read(buf, 0, buf.length)) != -1) { + zos.write(buf, 0, len); + } + is.close(); + } + zos.closeEntry(); + /* report how much compression occurred. */ + if (vflag) { + size = e.getSize(); + long csize = e.getCompressedSize(); + out.print(formatMsg2("out.size", String.valueOf(size), + String.valueOf(csize))); + if (e.getMethod() == ZipEntry.DEFLATED) { + long ratio = 0; + if (size != 0) { + ratio = ((size - csize) * 100) / size; + } + output(formatMsg("out.deflated", String.valueOf(ratio))); + } else { + output(getMsg("out.stored")); + } + } + } + + private void crc32File(ZipEntry e, File f) throws IOException { + InputStream is = new BufferedInputStream(new FileInputStream(f)); + byte[] buf = new byte[8192]; + crc32.reset(); + int r = 0; + int nread = 0; + long len = f.length(); + while ((r = is.read(buf)) != -1) { + nread += r; + crc32.update(buf, 0, r); + } + is.close(); + if (nread != (int) len) { + throw new ZipException(formatMsg( + "error.incorrect.length", f.getPath())); + } + e.setCrc(crc32.getValue()); + } + + void replaceFSC(String files[]) { + if (files != null) { + for (String file : files) { + file = file.replace(File.separatorChar, '/'); + } + } + } + + Set<ZipEntry> newDirSet() { + return new HashSet<ZipEntry>() { + public boolean add(ZipEntry e) { + return (e == null || super.add(e)); + }}; + } + + void updateLastModifiedTime(Set<ZipEntry> zes) throws IOException { + for (ZipEntry ze : zes) { + long lastModified = ze.getTime(); + if (lastModified != -1) { + File f = new File(ze.getName().replace('/', File.separatorChar)); + f.setLastModified(lastModified); + } + } + } + + void extract(InputStream in, String files[]) throws IOException { + ZipInputStream zis = new ZipInputStream(in, cs); + ZipEntry e; + Set<ZipEntry> dirs = newDirSet(); + while ((e = zis.getNextEntry()) != null) { + if (files == null) { + dirs.add(extractFile(zis, e)); + } else { + String name = e.getName(); + for (String file : files) { + if (name.startsWith(file)) { + dirs.add(extractFile(zis, e)); + break; + } + } + } + } + updateLastModifiedTime(dirs); + } + + void extract(String fname, String files[]) throws IOException { + ZipFile zf = new ZipFile(fname, cs); + Set<ZipEntry> dirs = newDirSet(); + Enumeration<? extends ZipEntry> zes = zf.entries(); + while (zes.hasMoreElements()) { + ZipEntry e = zes.nextElement(); + InputStream is; + if (files == null) { + dirs.add(extractFile(zf.getInputStream(e), e)); + } else { + String name = e.getName(); + for (String file : files) { + if (name.startsWith(file)) { + dirs.add(extractFile(zf.getInputStream(e), e)); + break; + } + } + } + } + zf.close(); + updateLastModifiedTime(dirs); + } + + ZipEntry extractFile(InputStream is, ZipEntry e) throws IOException { + ZipEntry rc = null; + String name = e.getName(); + File f = new File(e.getName().replace('/', File.separatorChar)); + if (e.isDirectory()) { + if (f.exists()) { + if (!f.isDirectory()) { + throw new IOException(formatMsg("error.create.dir", + f.getPath())); + } + } else { + if (!f.mkdirs()) { + throw new IOException(formatMsg("error.create.dir", + f.getPath())); + } else { + rc = e; + } + } + if (vflag) { + output(formatMsg("out.create", name)); + } + } else { + if (f.getParent() != null) { + File d = new File(f.getParent()); + if (!d.exists() && !d.mkdirs() || !d.isDirectory()) { + throw new IOException(formatMsg( + "error.create.dir", d.getPath())); + } + } + OutputStream os = new FileOutputStream(f); + byte[] b = new byte[8192]; + int len; + try { + while ((len = is.read(b, 0, b.length)) != -1) { + os.write(b, 0, len); + } + } finally { + if (is instanceof ZipInputStream) + ((ZipInputStream)is).closeEntry(); + else + is.close(); + os.close(); + } + if (vflag) { + if (e.getMethod() == ZipEntry.DEFLATED) { + output(formatMsg("out.inflated", name)); + } else { + output(formatMsg("out.extracted", name)); + } + } + } + long lastModified = e.getTime(); + if (lastModified != -1) { + f.setLastModified(lastModified); + } + return rc; + } + + void list(InputStream in, String files[]) throws IOException { + ZipInputStream zis = new ZipInputStream(in, cs); + ZipEntry e; + while ((e = zis.getNextEntry()) != null) { + zis.closeEntry(); + printEntry(e, files); + } + } + + void list(String fname, String files[]) throws IOException { + ZipFile zf = new ZipFile(fname, cs); + Enumeration<? extends ZipEntry> zes = zf.entries(); + while (zes.hasMoreElements()) { + printEntry(zes.nextElement(), files); + } + zf.close(); + } + + void printEntry(ZipEntry e, String[] files) throws IOException { + if (files == null) { + printEntry(e); + } else { + String name = e.getName(); + for (String file : files) { + if (name.startsWith(file)) { + printEntry(e); + return; + } + } + } + } + + void printEntry(ZipEntry e) throws IOException { + if (vflag) { + StringBuilder sb = new StringBuilder(); + String s = Long.toString(e.getSize()); + for (int i = 6 - s.length(); i > 0; --i) { + sb.append(' '); + } + sb.append(s).append(' ').append(new Date(e.getTime()).toString()); + sb.append(' ').append(e.getName()); + output(sb.toString()); + } else { + output(e.getName()); + } + } + + void usageError() { + error( + "Usage: zip {ctxu}[vf0] [zip-file] [-encoding encname][-C dir] files ...\n" + + "Options:\n" + + " -c create new archive\n" + + " -t list table of contents for archive\n" + + " -x extract named (or all) files from archive\n" + + " -u update existing archive\n" + + " -v generate verbose output on standard output\n" + + " -f specify archive file name\n" + + " -0 store only; use no ZIP compression\n" + + " -C change to the specified directory and include the following file\n" + + "If any file is a directory then it is processed recursively.\n"); + } + + void fatalError(Exception e) { + e.printStackTrace(); + } + + + void fatalError(String s) { + error(program + ": " + s); + } + + + protected void output(String s) { + out.println(s); + } + + protected void error(String s) { + err.println(s); + } + + private String getMsg(String key) { + try { + return (rsrc.getString(key)); + } catch (MissingResourceException e) { + throw new Error("Error in message file"); + } + } + + private String formatMsg(String key, String arg) { + String msg = getMsg(key); + String[] args = new String[1]; + args[0] = arg; + return MessageFormat.format(msg, (Object[]) args); + } + + private String formatMsg2(String key, String arg, String arg1) { + String msg = getMsg(key); + String[] args = new String[2]; + args[0] = arg; + args[1] = arg1; + return MessageFormat.format(msg, (Object[]) args); + } + + public static String[] parse(String[] args) throws IOException + { + ArrayList<String> newArgs = new ArrayList<String>(args.length); + for (int i = 0; i < args.length; i++) { + String arg = args[i]; + if (arg.length() > 1 && arg.charAt(0) == '@') { + arg = arg.substring(1); + if (arg.charAt(0) == '@') { + newArgs.add(arg); + } else { + loadCmdFile(arg, newArgs); + } + } else { + newArgs.add(arg); + } + } + return newArgs.toArray(new String[newArgs.size()]); + } + + private static void loadCmdFile(String name, List<String> args) throws IOException + { + Reader r = new BufferedReader(new FileReader(name)); + StreamTokenizer st = new StreamTokenizer(r); + st.resetSyntax(); + st.wordChars(' ', 255); + st.whitespaceChars(0, ' '); + st.commentChar('#'); + st.quoteChar('"'); + st.quoteChar('\''); + while (st.nextToken() != st.TT_EOF) { + args.add(st.sval); + } + r.close(); + } + + public static void main(String args[]) { + zip z = new zip(System.out, System.err, "zip"); + System.exit(z.run(args) ? 0 : 1); + } +} + From cab29c9b7a89da716082c83f0ef6e1b33b32953b Mon Sep 17 00:00:00 2001 From: Alan Bateman <alanb@openjdk.org> Date: Mon, 20 Apr 2009 09:30:50 +0100 Subject: [PATCH 288/292] 6830721: (fc) test/java/nio/channels/AsynchronousFileChannel/Basic.java intermittent failure Reviewed-by: sherman --- .../nio/channels/AsynchronousFileChannel/Basic.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/jdk/test/java/nio/channels/AsynchronousFileChannel/Basic.java b/jdk/test/java/nio/channels/AsynchronousFileChannel/Basic.java index ea9a5415923..1f37d4be11c 100644 --- a/jdk/test/java/nio/channels/AsynchronousFileChannel/Basic.java +++ b/jdk/test/java/nio/channels/AsynchronousFileChannel/Basic.java @@ -22,7 +22,7 @@ */ /* @test - * @bug 4607272 6822643 + * @bug 4607272 6822643 6830721 * @summary Unit test for AsynchronousFileChannel */ @@ -431,10 +431,11 @@ public class Basic { throw new RuntimeException("isCancelled not consistent"); try { res.get(); - if (!cancelled) + if (cancelled) throw new RuntimeException("CancellationException expected"); } catch (CancellationException x) { - // expected + if (!cancelled) + throw new RuntimeException("CancellationException not expected"); } catch (ExecutionException x) { throw new RuntimeException(x); } catch (InterruptedException x) { @@ -442,9 +443,11 @@ public class Basic { } try { res.get(1, TimeUnit.SECONDS); - throw new RuntimeException("CancellationException expected"); + if (cancelled) + throw new RuntimeException("CancellationException expected"); } catch (CancellationException x) { - // expected + if (!cancelled) + throw new RuntimeException("CancellationException not expected"); } catch (ExecutionException x) { throw new RuntimeException(x); } catch (TimeoutException x) { From d4a0d0c66da77942c8bdbb25e1f1eebf36e026c3 Mon Sep 17 00:00:00 2001 From: Alan Bateman <alanb@openjdk.org> Date: Mon, 20 Apr 2009 13:27:23 +0100 Subject: [PATCH 289/292] 6831461: (sample) Copy -r fails with IllegalArgumentexception: 'maxDepth' is negative Reviewed-by: chegar --- jdk/src/share/sample/nio/file/Copy.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/jdk/src/share/sample/nio/file/Copy.java b/jdk/src/share/sample/nio/file/Copy.java index e1d5d044ef5..bcd3af0c682 100644 --- a/jdk/src/share/sample/nio/file/Copy.java +++ b/jdk/src/share/sample/nio/file/Copy.java @@ -52,7 +52,7 @@ public class Copy { /** * Copy source file to target location. If {@code prompt} is true then - * prompted user to overwrite target if it exists. The {@code preserve} + * prompt user to overwrite target if it exists. The {@code preserve} * parameter determines if file attributes should be copied/preserved. */ static void copyFile(Path source, Path target, boolean prompt, boolean preserve) { @@ -63,7 +63,7 @@ public class Copy { try { source.copyTo(target, options); } catch (IOException x) { - System.err.format("Unable to create: %s: %s%n", target, x); + System.err.format("Unable to copy: %s: %s%n", source, x); } } } @@ -124,13 +124,13 @@ public class Copy { public FileVisitResult postVisitDirectory(Path dir, IOException exc) { // fix up modification time of directory when done if (exc == null && preserve) { + Path newdir = target.resolve(source.relativize(dir)); try { BasicFileAttributes attrs = Attributes.readBasicFileAttributes(dir); - Path newdir = target.resolve(source.relativize(dir)); Attributes.setLastModifiedTime(newdir, attrs.lastModifiedTime(), attrs.resolution()); } catch (IOException x) { - // ignore + System.err.format("Unable to copy all attributes to: %s: %s%n", newdir, x); } } return CONTINUE; @@ -191,6 +191,7 @@ public class Copy { try { isDir = Attributes.readBasicFileAttributes(target).isDirectory(); } catch (IOException x) { + // ignore (probably target does not exist) } // copy each source file/directory to target @@ -201,7 +202,7 @@ public class Copy { // follow links when copying files EnumSet<FileVisitOption> opts = EnumSet.of(FileVisitOption.FOLLOW_LINKS); TreeCopier tc = new TreeCopier(source[i], dest, prompt, preserve); - Files.walkFileTree(source[i], opts, -1, tc); + Files.walkFileTree(source[i], opts, Integer.MAX_VALUE, tc); } else { // not recursive so source must not be a directory try { @@ -209,7 +210,9 @@ public class Copy { System.err.format("%s: is a directory%n", source[i]); continue; } - } catch (IOException x) { } + } catch (IOException x) { + // assume not directory + } copyFile(source[i], dest, prompt, preserve); } } From 8d5b9cfad87022634e269142d55c4799cc3d224c Mon Sep 17 00:00:00 2001 From: Jeremy Manson <jeremymanson@google.com> Date: Mon, 20 Apr 2009 21:23:47 -0700 Subject: [PATCH 290/292] 6830220: Logging issues due to regression from bug fix 6797480 Reviewed-by: swamyv --- .../classes/java/util/logging/Logger.java | 2 +- .../java/util/logging/LoggerSubclass.java | 98 +++++++++++++++++++ 2 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 jdk/test/java/util/logging/LoggerSubclass.java diff --git a/jdk/src/share/classes/java/util/logging/Logger.java b/jdk/src/share/classes/java/util/logging/Logger.java index 28f942a0f2a..5ae2b427133 100644 --- a/jdk/src/share/classes/java/util/logging/Logger.java +++ b/jdk/src/share/classes/java/util/logging/Logger.java @@ -477,7 +477,7 @@ public class Logger { Logger logger = this; while (logger != null) { - for (Handler handler : logger.handlers) { + for (Handler handler : logger.getHandlers()) { handler.publish(record); } diff --git a/jdk/test/java/util/logging/LoggerSubclass.java b/jdk/test/java/util/logging/LoggerSubclass.java new file mode 100644 index 00000000000..bd71f11a566 --- /dev/null +++ b/jdk/test/java/util/logging/LoggerSubclass.java @@ -0,0 +1,98 @@ +/* + * Copyright 2009 Google, 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 6830220 + * @summary Test Logger subclasses + */ + +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.logging.LogRecord; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; + +public class LoggerSubclass { + void test(String[] args) { + final String name = "myLogger"; + final String message = "myMessage"; + final AtomicInteger getHandlerCount = new AtomicInteger(0); + final AtomicLong lastSequenceNumber = new AtomicLong(-1L); + final AtomicInteger lastThreadID = new AtomicInteger(-1); + final Logger logger = new Logger(name, null) { + public Handler[] getHandlers() { + getHandlerCount.getAndIncrement(); + return super.getHandlers(); + }}; + equal(logger.getName(), name); + equal(logger.getResourceBundle(), null); + equal(logger.getFilter(), null); + equal(logger.getLevel(), null); + check(logger.isLoggable(Level.WARNING)); + logger.addHandler(new Handler() { + public void close() {} + public void flush() {} + public void publish(LogRecord l) { + equal(l.getLoggerName(), name); + equal(l.getMessage(), message); + equal(l.getResourceBundle(), null); + equal(l.getSourceClassName(), "LoggerSubclass"); + equal(l.getSourceMethodName(), "test"); + equal(l.getThrown(), null); + equal(l.getLevel(), Level.WARNING); + + if (lastSequenceNumber.get() != -1) { + equal(lastSequenceNumber.get() + 1, + l.getSequenceNumber()); + equal(lastThreadID.get(), + l.getThreadID()); + } + lastSequenceNumber.set(l.getSequenceNumber()); + lastThreadID.set(l.getThreadID()); + }}); + for (int i = 1; i < 4; i++) { + logger.warning(message); // Should invoke getHandlers() + equal(i, getHandlerCount.get()); + } + } + + //--------------------- Infrastructure --------------------------- + volatile int passed = 0, failed = 0; + void pass() {passed++;} + void fail() {failed++; Thread.dumpStack();} + void fail(String msg) {System.err.println(msg); fail();} + void unexpected(Throwable t) {failed++; t.printStackTrace();} + void check(boolean cond) {if (cond) pass(); else fail();} + void equal(Object x, Object y) { + if (x == null ? y == null : x.equals(y)) pass(); + else fail(x + " not equal to " + y);} + public static void main(String[] args) throws Throwable { + try {new LoggerSubclass().instanceMain(args);} + catch (Throwable e) {throw e.getCause();}} + public void instanceMain(String[] args) throws Throwable { + try {test(args);} catch (Throwable t) {unexpected(t);} + System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed); + if (failed > 0) throw new AssertionError("Some tests failed");} +} From 4910f50ea29ac5a285490a12c2a20e2c665ff36c Mon Sep 17 00:00:00 2001 From: Martin Buchholz <martin@openjdk.org> Date: Mon, 20 Apr 2009 21:53:38 -0700 Subject: [PATCH 291/292] 6716076: test UTIL_REGRESSION/test/java/util/logging/LoggingDeadlock2.java failed with exit code 1 Reviewed-by: swamyv, mchung --- .../java/util/logging/LoggingDeadlock2.java | 215 +++++++++++++++--- 1 file changed, 183 insertions(+), 32 deletions(-) diff --git a/jdk/test/java/util/logging/LoggingDeadlock2.java b/jdk/test/java/util/logging/LoggingDeadlock2.java index 50de62abfcc..31bccfa5c3e 100644 --- a/jdk/test/java/util/logging/LoggingDeadlock2.java +++ b/jdk/test/java/util/logging/LoggingDeadlock2.java @@ -23,10 +23,9 @@ /* * @test - * @bug 6467152 - * @ignore until 6716076 is fixed + * @bug 6467152 6716076 6829503 * @summary deadlock occurs in LogManager initialization and JVM termination - * @author Serguei Spitsyn / Hittachi + * @author Serguei Spitsyn / Hitachi / Martin Buchholz * * @build LoggingDeadlock2 * @run main/timeout=15 LoggingDeadlock2 @@ -47,43 +46,195 @@ * This is a regression test for this bug. */ +import java.util.Arrays; +import java.util.List; +import java.util.Random; +import java.util.concurrent.CyclicBarrier; +import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.LogManager; +import java.io.File; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; -public class LoggingDeadlock2 implements Runnable { - static final java.io.PrintStream out = System.out; - static Object lock = new Object(); - static int c = 0; - public static void main(String arg[]) { - out.println("\nThis test checks that there is no deadlock."); - out.println("If not crashed or timed-out then it is passed."); +public class LoggingDeadlock2 { + + public static void realMain(String arg[]) throws Throwable { try { - new Thread(new LoggingDeadlock2()).start(); - synchronized(lock) { - c++; - if (c == 2) lock.notify(); - else lock.wait(); - } + System.out.println(javaChildArgs); + ProcessBuilder pb = new ProcessBuilder(javaChildArgs); + ProcessResults r = run(pb.start()); + equal(r.exitValue(), 99); + equal(r.out(), ""); + equal(r.err(), ""); + } catch (Throwable t) { unexpected(t); } + } + + public static class JavaChild { + public static void main(String args[]) throws Throwable { + final CyclicBarrier startingGate = new CyclicBarrier(2); + final Throwable[] thrown = new Throwable[1]; + + // Some random variation, to help tickle races. + final Random rnd = new Random(); + final boolean dojoin = rnd.nextBoolean(); + final int JITTER = 1024; + final int iters1 = rnd.nextInt(JITTER); + final int iters2 = JITTER - iters1; + final AtomicInteger counter = new AtomicInteger(0); + + Thread exiter = new Thread() { + public void run() { + try { + startingGate.await(); + for (int i = 0; i < iters1; i++) + counter.getAndIncrement(); + System.exit(99); + } catch (Throwable t) { + t.printStackTrace(); + System.exit(86); + } + }}; + exiter.start(); + + startingGate.await(); + for (int i = 0; i < iters2; i++) + counter.getAndIncrement(); + // This may or may not result in a first call to + // Runtime.addShutdownHook after shutdown has already + // commenced. LogManager log = LogManager.getLogManager(); - out.println("Test passed"); - } - catch(Exception e) { - e.printStackTrace(); - out.println("Test FAILED"); // Not expected + + if (dojoin) { + exiter.join(); + if (thrown[0] != null) + throw new Error(thrown[0]); + check(counter.get() == JITTER); + } } } - public void run() { - try { - synchronized(lock) { - c++; - if (c == 2) lock.notify(); - else lock.wait(); - } - System.exit(1); + //---------------------------------------------------------------- + // The rest of this test is copied from ProcessBuilder/Basic.java + //---------------------------------------------------------------- + private static final String javaExe = + System.getProperty("java.home") + + File.separator + "bin" + File.separator + "java"; + + private static final String classpath = + System.getProperty("java.class.path"); + + private static final List<String> javaChildArgs = + Arrays.asList(new String[] + { javaExe, "-classpath", classpath, + "LoggingDeadlock2$JavaChild"}); + + private static class ProcessResults { + private final String out; + private final String err; + private final int exitValue; + private final Throwable throwable; + + public ProcessResults(String out, + String err, + int exitValue, + Throwable throwable) { + this.out = out; + this.err = err; + this.exitValue = exitValue; + this.throwable = throwable; } - catch(Exception e) { - e.printStackTrace(); - out.println("Test FAILED"); // Not expected + + public String out() { return out; } + public String err() { return err; } + public int exitValue() { return exitValue; } + public Throwable throwable() { return throwable; } + + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("<STDOUT>\n" + out() + "</STDOUT>\n") + .append("<STDERR>\n" + err() + "</STDERR>\n") + .append("exitValue = " + exitValue + "\n"); + if (throwable != null) + sb.append(throwable.getStackTrace()); + return sb.toString(); } } + + private static class StreamAccumulator extends Thread { + private final InputStream is; + private final StringBuilder sb = new StringBuilder(); + private Throwable throwable = null; + + public String result () throws Throwable { + if (throwable != null) + throw throwable; + return sb.toString(); + } + + StreamAccumulator (InputStream is) { + this.is = is; + } + + public void run() { + try { + Reader r = new InputStreamReader(is); + char[] buf = new char[4096]; + int n; + while ((n = r.read(buf)) > 0) { + sb.append(buf,0,n); + } + } catch (Throwable t) { + throwable = t; + } finally { + try { is.close(); } + catch (Throwable t) { throwable = t; } + } + } + } + + private static ProcessResults run(Process p) { + Throwable throwable = null; + int exitValue = -1; + String out = ""; + String err = ""; + + StreamAccumulator outAccumulator = + new StreamAccumulator(p.getInputStream()); + StreamAccumulator errAccumulator = + new StreamAccumulator(p.getErrorStream()); + + try { + outAccumulator.start(); + errAccumulator.start(); + + exitValue = p.waitFor(); + + outAccumulator.join(); + errAccumulator.join(); + + out = outAccumulator.result(); + err = errAccumulator.result(); + } catch (Throwable t) { + throwable = t; + } + + return new ProcessResults(out, err, exitValue, throwable); + } + + //--------------------- Infrastructure --------------------------- + static volatile int passed = 0, failed = 0; + static void pass() {passed++;} + static void fail() {failed++; Thread.dumpStack();} + static void fail(String msg) {System.out.println(msg); fail();} + static void unexpected(Throwable t) {failed++; t.printStackTrace();} + static void check(boolean cond) {if (cond) pass(); else fail();} + static void check(boolean cond, String m) {if (cond) pass(); else fail(m);} + static void equal(Object x, Object y) { + if (x == null ? y == null : x.equals(y)) pass(); + else fail(x + " not equal to " + y);} + public static void main(String[] args) throws Throwable { + try {realMain(args);} catch (Throwable t) {unexpected(t);} + System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed); + if (failed > 0) throw new AssertionError("Some tests failed");} } From c0b32f4e3c876e60dd935fbfff86984fbf6ba61a Mon Sep 17 00:00:00 2001 From: Martin Buchholz <martin@openjdk.org> Date: Mon, 20 Apr 2009 21:57:01 -0700 Subject: [PATCH 292/292] 6278014: java.util.logging.LogRecord.getThreadID() should provide real thread id Make j.u.l. thread id a copy of Thread's id, for small values of thread id. Reviewed-by: alanb --- .../classes/java/util/logging/LogRecord.java | 51 ++++++++++++++----- .../java/util/logging/LoggerSubclass.java | 4 +- 2 files changed, 42 insertions(+), 13 deletions(-) diff --git a/jdk/src/share/classes/java/util/logging/LogRecord.java b/jdk/src/share/classes/java/util/logging/LogRecord.java index 6eda211f111..0acf9fa78cd 100644 --- a/jdk/src/share/classes/java/util/logging/LogRecord.java +++ b/jdk/src/share/classes/java/util/logging/LogRecord.java @@ -25,6 +25,8 @@ package java.util.logging; import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; import java.io.*; /** @@ -64,9 +66,24 @@ import java.io.*; */ public class LogRecord implements java.io.Serializable { - private static long globalSequenceNumber; - private static int nextThreadId=10; - private static ThreadLocal<Integer> threadIds = new ThreadLocal<Integer>(); + private static final AtomicLong globalSequenceNumber + = new AtomicLong(0); + + /** + * The default value of threadID will be the current thread's + * thread id, for ease of correlation, unless it is greater than + * MIN_SEQUENTIAL_THREAD_ID, in which case we try harder to keep + * our promise to keep threadIDs unique by avoiding collisions due + * to 32-bit wraparound. Unfortunately, LogRecord.getThreadID() + * returns int, while Thread.getId() returns long. + */ + private static final int MIN_SEQUENTIAL_THREAD_ID = Integer.MAX_VALUE / 2; + + private static final AtomicInteger nextThreadId + = new AtomicInteger(MIN_SEQUENTIAL_THREAD_ID); + + private static final ThreadLocal<Integer> threadIds + = new ThreadLocal<Integer>(); /** * @serial Logging message level @@ -122,6 +139,23 @@ public class LogRecord implements java.io.Serializable { private transient Object parameters[]; private transient ResourceBundle resourceBundle; + /** + * Returns the default value for a new LogRecord's threadID. + */ + private int defaultThreadID() { + long tid = Thread.currentThread().getId(); + if (tid < MIN_SEQUENTIAL_THREAD_ID) { + return (int) tid; + } else { + Integer id = threadIds.get(); + if (id == null) { + id = nextThreadId.getAndIncrement(); + threadIds.set(id); + } + return id; + } + } + /** * Construct a LogRecord with the given level and message values. * <p> @@ -144,15 +178,8 @@ public class LogRecord implements java.io.Serializable { this.level = level; message = msg; // Assign a thread ID and a unique sequence number. - synchronized (LogRecord.class) { - sequenceNumber = globalSequenceNumber++; - Integer id = threadIds.get(); - if (id == null) { - id = new Integer(nextThreadId++); - threadIds.set(id); - } - threadID = id.intValue(); - } + sequenceNumber = globalSequenceNumber.getAndIncrement(); + threadID = defaultThreadID(); millis = System.currentTimeMillis(); needToInferCaller = true; } diff --git a/jdk/test/java/util/logging/LoggerSubclass.java b/jdk/test/java/util/logging/LoggerSubclass.java index bd71f11a566..ba18fa36b2e 100644 --- a/jdk/test/java/util/logging/LoggerSubclass.java +++ b/jdk/test/java/util/logging/LoggerSubclass.java @@ -23,7 +23,7 @@ /* * @test - * @bug 6830220 + * @bug 6830220 6278014 * @summary Test Logger subclasses */ @@ -68,6 +68,8 @@ public class LoggerSubclass { l.getSequenceNumber()); equal(lastThreadID.get(), l.getThreadID()); + equal((int) Thread.currentThread().getId(), + l.getThreadID()); } lastSequenceNumber.set(l.getSequenceNumber()); lastThreadID.set(l.getThreadID());
  • " + NL + + "Class Summary" + NL + + "Interface Summary" + NL + + "Enum Summary" + NL + + "Annotation Types Summary" + NL + + "Field Summary" + NL + + "Method Summary" + NL + + "Nested Class Summary" + NL + + "Constructor Summary" + NL + + "Enum Constant Summary" + NL + + "Required Element Summary" + NL + + "Optional Element Summary" + NL + + "Packages that use I1" + NL + + "Fields in pkg2 " + + "declared as " + + "C1" + NL + + "Methods in pkg2 " + + "with parameters of type C1" + NL + + "Fields in pkg1 " + + "declared as " + + "C2" + NL + + "Methods in pkg1 " + + "with parameters of type C2" + NL + + "Methods in pkg2 " + + "that return C2.ModalExclusionType" + NL + + "Packages that use " + + "pkg1" + NL + + "Classes in pkg1 " + + "used by pkg1" + NL + + "Packages that use " + + "pkg2" + NL + + "Classes in pkg2 " + + "used by pkg1" + NL + + "Deprecated Fields" + NL + + "Deprecated Methods" + NL + + "pkg1.C1" + NL + + "Packages
    " + + "ClassDescription" + + "InterfaceDescription" + + "EnumDescription" + + "Annotation TypeDescription" + + "Modifier and TypeField and Description" + + "Modifier and TypeMethod and Description" + + "Modifier and TypeClass and Description" + + "Constructor and Description" + + "Enum Constant and Description" + + "Modifier and TypeRequired Element and Description" + + "Modifier and TypeOptional Element and Description" + + "PackageDescription" + + "Modifier and TypeField and Description" + + "Modifier and TypeMethod and Description" + + "Modifier and TypeField and Description" + + "Modifier and TypeMethod and Description" + + "PackageDescription" + + "Modifier and TypeMethod and Description" + + "PackageDescription" + + "Class and Description" + + "PackageDescription" + + "Class and Description" + + "Field and Description" + + "Method and Description" + + "Modifier and TypeConstant FieldValue" + + "PackageDescription
    " + NL + + "Enum Constant Summary" + NL + + "Required Element Summary" + NL + + "Optional Element Summary
    Classes in pkg2 with type parameters of type Foo
    " + NL + + "Classes in pkg2" + + " with type parameters of type Foo
    ClassUseTest1<T extends Foo & Foo2>" }, {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo.html", - "Methods in pkg2 with type parameters of type Foo
    " + NL + + "Methods in pkg2" + + " with type parameters of type Foo
    ClassUseTest1.method(T t)" }, {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo.html", - "Fields in pkg2 with type parameters of type Foo
    " + NL + + "Fields in pkg2" + + " with type parameters of type Foo
    Fields in pkg2 declared as ParamTest
    " + NL + + "Fields in pkg2" + + " declared as ParamTest
    Classes in pkg2 with type parameters of type Foo2
    " + NL + + "Classes in pkg2" + + " with type parameters of type Foo2
    ClassUseTest1<T extends Foo & Foo2>" }, {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo2.html", - "Methods in pkg2 with type parameters of type Foo2
    " + NL + + "Methods in pkg2" + + " with type parameters of type Foo2
    ClassUseTest1.method(T t)" @@ -326,44 +347,66 @@ public class TestNewLanguageFeatures extends JavadocTester { //ClassUseTest2: > {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "ParamTest.html", - "Classes in pkg2 with type parameters of type ParamTest
    " + NL + + "Classes in pkg2" + + " with type parameters of type ParamTest
    ClassUseTest2<T extends ParamTest<Foo3>>" }, {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "ParamTest.html", - "Methods in pkg2 with type parameters of type ParamTest
    " + NL + + "Methods in pkg2" + + " with type parameters of type ParamTest
    ClassUseTest2.method(T t)" }, {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "ParamTest.html", - "Fields in pkg2 declared as ParamTest
    " + NL + + "Fields in pkg2" + + " declared as ParamTest
    Methods in pkg2 with type parameters of type ParamTest
    " + NL + + "Methods in pkg2" + + " with type parameters of type ParamTest
    Classes in pkg2 with type parameters of type Foo3
    " + NL + + "Classes in pkg2" + + " with type parameters of type Foo3
    ClassUseTest2<T extends ParamTest<Foo3>>" }, {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo3.html", - "Methods in pkg2 with type parameters of type Foo3
    " + NL + + "Methods in pkg2" + + " with type parameters of type Foo3
    ClassUseTest2.method(T t)" }, {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo3.html", - "Methods in pkg2 that return types with arguments of type Foo3
    " + NL + + "Methods in pkg2" + + " that return types with arguments of type " + + "" + + "Foo3
    Classes in pkg2 with type parameters of type ParamTest2
    " + NL + + "Classes in pkg2" + + " with type parameters of type " + + "" + + "ParamTest2
    ClassUseTest3<T extends ParamTest2<java.util.List<? extends Foo4>>>" }, {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "ParamTest2.html", - "Methods in pkg2 with type parameters of type ParamTest2
    " + NL + + "Methods in pkg2" + + " with type parameters of type " + + "" + + "ParamTest2
    ClassUseTest3.method(T t)" }, {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "ParamTest2.html", - "Methods in pkg2 with type parameters of type ParamTest2
    " + NL + + "Methods in pkg2" + + " with type parameters of type " + + "" + + "ParamTest2
    Classes in pkg2 with type parameters of type Foo4
    " + NL + + "Classes in pkg2" + + " with type parameters of type " + + "" + + "Foo4
    ClassUseTest3<T extends ParamTest2<java.util.List<? extends Foo4>>>" }, {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo4.html", - "Methods in pkg2 with type parameters of type Foo4
    " + NL + + "Methods in pkg2" + + " with type parameters of type Foo4
    ClassUseTest3.method(T t)" }, {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo4.html", - "Methods in pkg2 that return types with arguments of type Foo4
    " + NL + + "Methods in pkg2" + + " that return types with arguments of type " + + "" + + "Foo4
    Method parameters in pkg2 with type arguments of type Foo4
    " + NL + - " voidClassUseTest3.method(java.util.Set<Foo4> p)" + "
    " + NL + + "Method parameters in pkg2" + + " with type arguments of type Foo4
    Modifier and Type" + + "Method and Description
    " + NL + + " voidClassUseTest3." + + "" + + "method(java.util.Set<Foo4> p)" }, {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo4.html", - "Constructor parameters in pkg2 with type arguments of type Foo4
    ClassUseTest3(java.util.Set<Foo4> p)" + "
    " + NL + + "Constructor parameters in " + + "pkg2 with type arguments of type Foo4
    Constructor and Description" + + "
    ClassUseTest3(java.util.Set<" + + "" + + "Foo4> p)" }, //================================= // Annotatation Type Usage //================================= {BUG_ID + FS + "pkg" + FS + "class-use" + FS + "AnnotationType.html", - "" + NL + - "Packages with annotations of type AnnotationType" + NL + - "
    pkg
    Package" + + "Description
    pkg" + + "
    " + NL + - " classAnnotationTypeUsage" + "Classes in pkg" + + " with annotations of type AnnotationType" + NL + + "
    Modifier and Type" + + "Class and Description
    " + NL + + " classAnnotationTypeUsage" }, {BUG_ID + FS + "pkg" + FS + "class-use" + FS + "AnnotationType.html", - "Fields in pkg with annotations of type AnnotationType" + NL + - "
    " + NL + - " intAnnotationTypeUsage.field" + "Fields in pkg" + + " with annotations of type AnnotationType" + NL + + "
    Modifier and Type" + + "Field and Description
    " + NL + + " intAnnotationTypeUsage." + + "field" + + "" }, {BUG_ID + FS + "pkg" + FS + "class-use" + FS + "AnnotationType.html", - "Methods in pkg with annotations of type AnnotationType" + NL + - "
    " + NL + - " voidAnnotationTypeUsage.method()" + "Methods in pkg" + + " with annotations of type AnnotationType" + NL + + "
    Modifier and Type" + + "Method and Description
    " + NL + + " voidAnnotationTypeUsage." + + "" + + "method()" }, {BUG_ID + FS + "pkg" + FS + "class-use" + FS + "AnnotationType.html", - "Method parameters in pkg with annotations of type AnnotationType" + NL + - "
    " + NL + - " voidAnnotationTypeUsage.methodWithParams(int documented," + NL + - " int undocmented)" + "Method parameters in pkg" + + " with annotations of type AnnotationType" + NL + + "
    Modifier and Type" + + "Method and Description
    " + NL + + " voidAnnotationTypeUsage." + + "methodWithParams(int documented," + NL + + " int undocmented)" }, {BUG_ID + FS + "pkg" + FS + "class-use" + FS + "AnnotationType.html", - "Constructors in pkg with annotations of type AnnotationType" + NL + - "
    AnnotationTypeUsage()" + "Constructors in pkg" + + " with annotations of type AnnotationType" + NL + + "
    Constructor and Description" + + "
    " + + "AnnotationTypeUsage()" }, {BUG_ID + FS + "pkg" + FS + "class-use" + FS + "AnnotationType.html", - "Constructor parameters in pkg with annotations of type AnnotationType" + NL + - "
    AnnotationTypeUsage(int documented," + NL + - " int undocmented)" + "Constructor parameters in pkg" + + " with annotations of type AnnotationType" + NL + + "
    Constructor and Description" + + "
    " + + "AnnotationTypeUsage(int documented," + NL + + " int undocmented)" }, //================================= diff --git a/langtools/test/com/sun/javadoc/testSummaryHeading/TestSummaryHeading.java b/langtools/test/com/sun/javadoc/testSummaryHeading/TestSummaryHeading.java index 36cd089c32f..49aafe21ffc 100644 --- a/langtools/test/com/sun/javadoc/testSummaryHeading/TestSummaryHeading.java +++ b/langtools/test/com/sun/javadoc/testSummaryHeading/TestSummaryHeading.java @@ -46,7 +46,8 @@ public class TestSummaryHeading extends JavadocTester { //Input for string search tests. private static final String[][] TEST = { - {BUG_ID + FS + "C.html", "Method Summary"} + {BUG_ID + FS + "C.html", "
    " + NL + + "Method Summary